#!/usr/bin/env ruby # -*- coding: utf-8 -*- # #-- # Copyright (C) 2009-2019 Thomas Leitner # # This file is part of kramdown which is licensed under the MIT. #++ # require 'optparse' require 'rbconfig' require 'yaml' require 'kramdown' def add_kramdown_options(opts, parsed_options, banner: [], ignore: []) banner_shown = false defined_options = [] Kramdown::Options.definitions.sort.each do |n, definition| next if ignore.include?(n) unless banner_shown opts.separator("") banner.each {|part| opts.separator(part) } opts.separator("") banner_shown = true end defined_options << n no = n.to_s.tr('_', '-') if definition.type == Kramdown::Options::Boolean opts.on("--[no-]#{no}") {|v| parsed_options[n] = Kramdown::Options.parse(n, v) } else type = definition.type type = String if type == Symbol || type == Object opts.on("--#{no} ARG", type) {|v| parsed_options[n] = Kramdown::Options.parse(n, v) } end definition.desc.split(/\n/).each do |line| opts.separator opts.summary_indent + ' ' * 6 + line end opts.separator '' end defined_options end config_file = nil begin config_dir = case RbConfig::CONFIG['host_os'] when /bccwin|cygwin|djgpp|mingw|mswin|wince/i File.expand_path((ENV['HOME'] || ENV['USERPROFILE'] || "~") + "/AppData/Local") when /darwin|mac os/ File.expand_path("~/Library/Preferences/") else File.expand_path(ENV['XDG_CONFIG_HOME'] || '~/.config') end config_file = File.join(config_dir, "kramdownrc") rescue StandardError end options = {} format = ['html'] defined_options = [] OptionParser.new do |opts| opts.banner = "Usage: kramdown [options] [FILE FILE ...]" opts.summary_indent = ' ' * 4 opts.separator "" opts.separator "Command line options:" opts.separator "" opts.on("-i", "--input ARG", "Specify the input format: kramdown (default), " \ "html, or markdown") {|v| options[:input] = v } opts.on("-o", "--output ARG", Array, "Specify one or more output formats separated by commas: " \ "html (default),", "kramdown, latex, man or remove_html_tags") {|v| format = v } opts.on("-x", "--extension EXT", Array, "Load one or more extensions (without the 'kramdown-' " \ "prefix) separated", "by commas (e.g. parser-gfm,syntax-coderay)", "Note: Use this option before other options!") do |exts| exts.each do |ext| begin require "kramdown-#{ext}" new_options = add_kramdown_options(opts, options, banner: ["#{ext} options:"], ignore: defined_options) defined_options.concat(new_options) rescue LoadError $stderr.puts "Couldn't load extension #{ext}, ignoring" end end end opts.separator "" opts.on("--no-config-file", "Do not read any configuration file. Default behavior is to check " \ "for a", "configuration file and read it if it exists.") { config_file = nil } opts.on("--config-file FILE", "Specify the name of a configuration file with kramdown options " \ "in YAML", "format, e.g. \"auto_id_prefix: ARG\" instead of \"--auto-id-prefix ARG\"", "and \"auto_ids: false\" instead of \"--no-auto-ids\".", "Default: #{config_file}") {|v| config_file = v } opts.separator "" opts.on("-v", "--version", "Show the version of kramdown") do puts Kramdown::VERSION exit end opts.on("-h", "--help", "Show the help") do puts opts.summarize('', 5, 72) exit end new_options = add_kramdown_options(opts, options, banner: ["kramdown options:"]) defined_options.concat(new_options) end.parse! begin if config_file && File.exist?(config_file) config_file_options = YAML.safe_load(File.read(config_file), [Symbol]) case config_file_options when nil # empty configuration file except perhaps YAML header and comments # Nothing to do when Hash options = config_file_options.merge(options) else raise Kramdown::Error, "No YAML map in configuration file \"#{config_file}\"" end end doc = Kramdown::Document.new(ARGF.read, options) result = '' format.each {|f| result = doc.send("to_#{f}") } puts result doc.warnings.each {|warn| $stderr.puts "Warning: #{warn}" } rescue Kramdown::Error => e $stderr.puts "Error: #{e.message}" exit(1) end