133 lines
4.4 KiB
Plaintext
133 lines
4.4 KiB
Plaintext
|
#!/usr/bin/env ruby
|
||
|
# -*- coding: utf-8 -*-
|
||
|
#
|
||
|
#--
|
||
|
# Copyright (C) 2009-2019 Thomas Leitner <t_leitner@gmx.at>
|
||
|
#
|
||
|
# 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
|