class Kramdown::AsciiDoc::Cli

Public Class Methods

run(args = ARGV) click to toggle source
# File lib/kramdown-asciidoc/cli.rb, line 107
def self.run args = ARGV
  code, options = new.parse (Array args)
  return code unless code == 0 && options
  pipe_in = (input_file = options.delete :input_file) == '-'
  pipe_out = (output_file = options.delete :output_file) == '-'
  if pipe_in
    options[:to] = pipe_out || !output_file ? $stdout : output_file
    ::Kramdoc.convert $stdin, options
  elsif output_file && !pipe_out && (::File.expand_path input_file) == (::File.expand_path output_file)
    $stderr.write %(kramdoc: input and output cannot be the same file: #{input_file}\n)
    return 1
  else
    options[:to] = pipe_out ? $stdout : output_file if output_file
    ::Kramdoc.convert_file input_file, options
  end
  0
rescue ::IOError => e
  $stderr.write %(kramdoc: #{e.message}\n)
  1
end

Public Instance Methods

parse(args) click to toggle source
# File lib/kramdown-asciidoc/cli.rb, line 10
    def parse args
      options = {
        attributes: {},
      }

      opt_parser = ::OptionParser.new do |opts|
        opts.program_name = 'kramdoc'
        opts.banner = <<~EOS
        Usage: #{opts.program_name} [OPTION]... FILE...

        Converts Markdown to AsciiDoc.

        EOS

        opts.on '-o FILE', '--output=FILE', 'Set the output filename or stream' do |file|
          options[:output_file] = file
        end

        opts.on '--format=GFM|kramdown|markdown', %w(kramdown markdown GFM), 'Set the flavor of Markdown to parse (default: GFM)' do |format|
          options[:input] = format
        end

        opts.on '-a KEY[=VALUE]', '--attribute=KEY[=VALUE]', 'Set an attribute in the AsciiDoc document header (accepts: key, key!, or key=value)' do |attr|
          key, val = attr.split '=', 2
          val ||= ''
          options[:attributes][key] = val
        end

        opts.on '--wrap=preserve|none|ventilate', [:none, :preserve, :ventilate], 'Set how lines are wrapped in the AsciiDoc document (default: preserve)' do |wrap|
          options[:wrap] = wrap
        end

        opts.on '--imagesdir=DIR', 'Set the imagesdir attribute in the AsciiDoc document header (also remove the value from the start of image paths)' do |dir|
          options[:imagesdir] = dir
        end

        opts.on '--heading-offset=NUMBER', ::Integer, 'Shift the heading level by the specified number' do |offset|
          options[:heading_offset] = offset
        end

        opts.on '--[no-]html-to-native', 'Set whether to passthrough HTML or convert it to AsciiDoc syntax where possible (default: true)' do |html_to_native|
          options[:html_to_native] = html_to_native
        end

        opts.on '--auto-ids', 'Set whether to auto-generate IDs for all section titles' do |auto_ids|
          options[:auto_ids] = auto_ids
        end

        opts.on '--auto-id-prefix=STRING', 'Set the prefix to use for auto-generated section title IDs' do |string|
          options[:auto_id_prefix] = string
        end

        opts.on '--auto-id-separator=CHAR', 'Set the separator char to use for auto-generated section title IDs' do |char|
          options[:auto_id_separator] = char
        end

        opts.on '--lazy-ids', 'Set whether to drop IDs that match value of auto-generated ID' do |lazy_ids|
          options[:lazy_ids] = lazy_ids
        end

        opts.on '--[no-]auto-links', 'Set whether to automatically convert bare URLs into links (default: true)' do |auto_links|
          options[:auto_links] = auto_links
        end

        opts.on '-h', '--help', 'Display this help text and exit' do
          $stdout.write opts.help
          return 0
        end

        opts.on '-v', '--version', %(Display version information and exit) do
          $stdout.write %(#{opts.program_name} #{::Kramdown::AsciiDoc::VERSION}\n)
          return 0
        end
      end

      args = opt_parser.parse args

      if args.empty?
        opt_parser.warn 'Please specify a Markdown file to convert.'
        $stdout.write opt_parser.help
        return 1
      end

      if args.size == 1
        options[:input_file] = args[0]
        [0, options]
      else
        opt_parser.warn %(extra arguments detected (unparsed arguments: #{(args.drop 1).join ' '}))
        $stdout.write opt_parser.help
        [1, options]
      end
    rescue ::OptionParser::InvalidOption
      $stderr.write %(#{opt_parser.program_name}: #{$!.message}\n)
      $stdout.write opt_parser.help
      1
    end