lib/tilt/pandoc.rb



require 'tilt/template'
require 'pandoc-ruby'

module Tilt
  # Pandoc markdown implementation. See:
  # http://pandoc.org/
  class PandocTemplate < Template
    self.default_mime_type = 'text/html'

    # turn options hash into an array
    # Map tilt options to pandoc options
    # Replace hash keys with value true with symbol for key
    # Remove hash keys with value false
    # Leave other hash keys untouched
    def pandoc_options
      result = []
      from = "markdown"
      smart_extension = "-smart"
      options.each do |k,v|
        case k
        when :smartypants
          smart_extension = "+smart" if v
        when :escape_html
          from = "markdown-raw_html" if v
        when :commonmark
          from = "commonmark" if v
        when :markdown_strict
          from = "markdown_strict" if v
        else
          case v
          when true
            result << k
          when false
            # do nothing
          else
            result << { k => v }
          end
        end
      end
      result << { :f => from + smart_extension }
      result
    end

    def prepare
      @engine = PandocRuby.new(data, *pandoc_options)
      @output = nil
    end

    def evaluate(scope, locals, &block)
      @output ||= @engine.to_html.strip
    end

    def allows_script?
      false
    end
  end
end