class PandocRuby

Constants

BINARY_WRITERS

The available binary writers and their corresponding names. The keys are used to generate methods and specify options to Pandoc.

READERS

The available readers and their corresponding names. The keys are used to generate methods and specify options to Pandoc.

STRING_WRITERS

The available string writers and their corresponding names. The keys are used to generate methods and specify options to Pandoc.

WRITERS

All of the available Writers.

Attributes

binary_output[W]
input_files[RW]
input_string[RW]
option_string[W]
options[W]
writer[W]

Public Class Methods

convert(*args) click to toggle source

A shortcut method that creates a new PandocRuby object and immediately calls `#convert`. Options passed to this method are passed directly to `#new` and treated the same as if they were passed directly to the initializer.

# File lib/pandoc-ruby.rb, line 125
def self.convert(*args)
  new(*args).convert
end
new(*args) click to toggle source

Create a new PandocRuby converter object. The first argument contains the input either as string or as an array of filenames.

Any other arguments will be converted to pandoc options.

Usage:

new("# A String", :option1 => :value, :option2)
new(["/path/to/file.md"], :option1 => :value, :option2)
new(["/to/file1.html", "/to/file2.html"], :option1 => :value)
# File lib/pandoc-ruby.rb, line 161
def initialize(*args)
  if args[0].is_a?(String)
    self.input_string = args.shift
  elsif args[0].is_a?(Array)
    self.input_files = args.shift.join(' ')
  end
  self.options = args
end
pandoc_path=(path) click to toggle source

To use run the pandoc command with a custom executable path, the path to the pandoc executable can be set here.

# File lib/pandoc-ruby.rb, line 117
def self.pandoc_path=(path)
  @@pandoc_path = path
end

Public Instance Methods

binary_output() click to toggle source
# File lib/pandoc-ruby.rb, line 130
def binary_output
  @binary_output ||= false
end
convert(*args) click to toggle source

Run the conversion. The convert method can take any number of arguments, which will be converted to pandoc options. If options were already specified in an initializer or reader method, they will be combined with any that are passed to this method.

Returns a string with the converted content.

Example:

PandocRuby.new("# text").convert
# => "<h1 id=\"text\">text</h1>\n"
# File lib/pandoc-ruby.rb, line 181
def convert(*args)
  self.options += args if args
  self.option_string = prepare_options(self.options)
  if self.binary_output
    convert_binary
  else
    convert_string
  end
end
Also aliased as: to_s
option_string() click to toggle source
# File lib/pandoc-ruby.rb, line 140
def option_string
  @option_string ||= ''
end
options() click to toggle source
# File lib/pandoc-ruby.rb, line 135
def options
  @options ||= []
end
to_s(*args)
Alias for: convert
writer() click to toggle source
# File lib/pandoc-ruby.rb, line 145
def writer
  @writer ||= 'html'
end

Private Instance Methods

convert_binary() click to toggle source

Execute the pandoc command for binary writers. A temp file is created and written to, then read back into the program as a string, then the temp file is closed and unlinked.

# File lib/pandoc-ruby.rb, line 230
def convert_binary
  tmp_file = Tempfile.new('pandoc-conversion')
  begin
    self.options += [{ :output => tmp_file.path }]
    self.option_string = "#{self.option_string} --output #{tmp_file.path}"
    execute_pandoc
    return IO.binread(tmp_file)
  ensure
    tmp_file.close
    tmp_file.unlink
  end
end
convert_string() click to toggle source

Execute the pandoc command for string writers.

# File lib/pandoc-ruby.rb, line 244
def convert_string
  execute_pandoc
end
create_option(flag, argument = nil) click to toggle source

Takes a flag and optional argument, uses it to set any relevant options used by the library, and returns string with the option formatted as a command line options. If the option has an argument, it is also included.

# File lib/pandoc-ruby.rb, line 299
def create_option(flag, argument = nil)
  return '' unless flag

  flag = flag.to_s
  set_pandoc_ruby_options(flag, argument)
  return '' if flag == 'timeout' # pandoc doesn't accept timeouts yet

  if argument.nil?
    format_flag(flag)
  elsif argument.to_s =~ /\s/
    "#{format_flag(flag)} \"#{argument}\""
  else
    "#{format_flag(flag)} #{argument}"
  end
end
execute(command) click to toggle source

Run the command and returns the output.

# File lib/pandoc-ruby.rb, line 258
def execute(command)
  output = error = exit_status = nil
  @timeout ||= 31_557_600 # A year should be enough?
  Open3.popen3(command) do |stdin, stdout, stderr, wait_thr|
    begin
      Timeout.timeout(@timeout) do
        stdin.puts self.input_string
        stdin.close
        output = stdout.read
        error = stderr.read
        exit_status = wait_thr.value
      end
    rescue Timeout::Error => ex
      Process.kill 9, wait_thr.pid
      maybe_ex = "\n#{ex}" if ex
      error = "Pandoc timed out after #{@timeout} seconds.#{maybe_ex}"
    end
  end

  raise error unless exit_status && exit_status.success?

  output
end
execute_pandoc() click to toggle source

Wrapper to run pandoc in a consistent, DRY way

# File lib/pandoc-ruby.rb, line 249
def execute_pandoc
  if !self.input_files.nil?
    execute("#{@@pandoc_path} #{self.input_files}#{self.option_string}")
  else
    execute("#{@@pandoc_path}#{self.option_string}")
  end
end
format_flag(flag) click to toggle source

Formats an option flag in order to be used with the pandoc command line tool.

# File lib/pandoc-ruby.rb, line 317
def format_flag(flag)
  if flag.length == 1
    " -#{flag}"
  elsif flag =~ /^-|\+/
    " #{flag}"
  else
    " --#{flag.to_s.tr('_', '-')}"
  end
end
prepare_options(opts = []) click to toggle source

Builds the option string to be passed to pandoc by iterating over the opts passed in. Recursively calls itself in order to handle hash options.

# File lib/pandoc-ruby.rb, line 284
def prepare_options(opts = [])
  opts.inject('') do |string, (option, value)|
    string + if value
               create_option(option, value)
             elsif option.respond_to?(:each_pair)
               prepare_options(option)
             else
               create_option(option)
             end
  end
end
set_pandoc_ruby_options(flag, argument = nil) click to toggle source

Takes an option and optional argument and uses them to set any flags used by PandocRuby.

# File lib/pandoc-ruby.rb, line 329
def set_pandoc_ruby_options(flag, argument = nil)
  case flag
  when 't', 'to'
    self.writer = argument.to_s
    self.binary_output = true if BINARY_WRITERS.key?(self.writer)
  when 'timeout'
    @timeout = argument
  end
end