class Asciidoctor::Cli::Invoker

Public Invocation class for starting Asciidoctor via CLI

Attributes

code[R]
documents[R]
options[R]

Public Class Methods

new(*options) click to toggle source
# File lib/asciidoctor/cli/invoker.rb, line 9
def initialize *options
  @documents = []
  @out = nil
  @err = nil
  @code = 0
  options = options.flatten
  case (first_option = options[0])
  when Options
    @options = first_option
  when ::Hash
    @options = Options.new options
  else
    if ::Integer === (result = Options.parse! options)
      @code = result
      @options = nil
    else
      @options = result
    end
  end
end

Public Instance Methods

document() click to toggle source
# File lib/asciidoctor/cli/invoker.rb, line 134
def document
  @documents[0]
end
invoke!() { |: STDIN| ... } click to toggle source
# File lib/asciidoctor/cli/invoker.rb, line 30
def invoke!
  old_verbose = -1
  return unless @options

  old_verbose = $VERBOSE
  opts = {}
  infiles = []
  outfile = nil
  err = @err || $stderr
  show_timings = false

  @options.map do |key, val|
    case key
    when :input_files
      infiles = val
    when :output_file
      outfile = val
    when :destination_dir
      opts[:to_dir] = val if val
    when :attributes
      # NOTE processor will dup attributes internally
      opts[:attributes] = val
    when :timings
      show_timings = val
    when :trace
      # currently does nothing
    when :verbose
      case val
      when 0
        $VERBOSE = nil
      when 1
        $VERBOSE = false
      when 2
        $VERBOSE = true
      end
    else
      opts[key] = val unless val.nil?
    end
  end

  stdin = if infiles.size == 1
    if (infile0 = infiles[0]) == '-'
      outfile ||= infile0
      true
    elsif ::File.pipe? infile0
      outfile ||= '-'
      nil
    end
  end

  tofile = if outfile == '-'
    @out || $stdout
  elsif outfile
    opts[:mkdirs] = true
    outfile
  else
    opts[:mkdirs] = true
    nil # automatically calculate outfile based on infile
  end

  if stdin
    # allows use of block to supply stdin, particularly useful for tests
    input = block_given? ? yield : STDIN
    input_opts = opts.merge :to_file => tofile
    if show_timings
      @documents << (::Asciidoctor.convert input, (input_opts.merge :timings => (timings = Timings.new)))
      timings.print_report err, '-'
    else
      @documents << (::Asciidoctor.convert input, input_opts)
    end
  else
    infiles.each do |infile|
      input_opts = opts.merge :to_file => tofile
      if show_timings
        @documents << (::Asciidoctor.convert_file infile, (input_opts.merge :timings => (timings = Timings.new)))
        timings.print_report err, infile
      else
        @documents << (::Asciidoctor.convert_file infile, input_opts)
      end
    end
  end
rescue ::Exception => e
  if ::SignalException === e
    @code = e.signo
    # add extra endline if Ctrl+C is used
    err.puts if ::Interrupt === e
  else
    @code = (e.respond_to? :status) ? e.status : 1
    if @options[:trace]
      raise e
    else
      if ::RuntimeError === e
        err.puts %(#{e.message} (#{e.class}))
      else
        err.puts e.message
      end
      err.puts '  Use --trace for backtrace'
    end
  end
  nil
ensure
  $VERBOSE = old_verbose unless old_verbose == -1
end
read_error() click to toggle source
# File lib/asciidoctor/cli/invoker.rb, line 147
def read_error
  @err ? @err.string : ''
end
read_output() click to toggle source
# File lib/asciidoctor/cli/invoker.rb, line 143
def read_output
  @out ? @out.string : ''
end
redirect_streams(out, err = nil) click to toggle source
# File lib/asciidoctor/cli/invoker.rb, line 138
def redirect_streams out, err = nil
  @out = out
  @err = err
end
reset_streams() click to toggle source
# File lib/asciidoctor/cli/invoker.rb, line 151
def reset_streams
  @out = nil
  @err = nil
end