lib/tilt/markdown.rb in tilt-1.3.2 vs lib/tilt/markdown.rb in tilt-1.3.3

- old
+ new

@@ -40,24 +40,83 @@ end # Upskirt Markdown implementation. See: # https://github.com/tanoku/redcarpet # - # Compatible to RDiscount - class RedcarpetTemplate < RDiscountTemplate - self.default_mime_type = 'text/html' - + # Supports both Redcarpet 1.x and 2.x + class RedcarpetTemplate < Template def self.engine_initialized? - defined? ::RedcarpetCompat + defined? ::Redcarpet end def initialize_engine require_template_library 'redcarpet' end def prepare - @engine = RedcarpetCompat.new(data, *flags) - @output = nil + klass = [Redcarpet1, Redcarpet2].detect { |e| e.engine_initialized? } + @engine = klass.new(file, line, options) { data } + end + + def evaluate(scope, locals, &block) + @engine.evaluate(scope, locals, &block) + end + + # Compatibility mode for Redcarpet 1.x + class Redcarpet1 < RDiscountTemplate + self.default_mime_type = 'text/html' + + def self.engine_initialized? + defined? ::RedcarpetCompat + end + + def prepare + @engine = RedcarpetCompat.new(data, *flags) + @output = nil + end + end + + # Future proof mode for Redcarpet 2.x (not yet released) + class Redcarpet2 < Template + self.default_mime_type = 'text/html' + + def self.engine_initialized? + defined? ::Redcarpet::Render + end + + def generate_renderer + renderer = options.delete(:renderer) || Redcarpet::Render::HTML + return renderer unless options.delete(:smartypants) + return renderer if renderer <= Redcarpet::Render::SmartyPants + + if renderer == Redcarpet::Render::XHTML + Redcarpet::Render::SmartyHTML.new(:xhtml => true) + elsif renderer == Redcarpet::Render::HTML + Redcarpet::Render::SmartyHTML + elsif renderer.is_a? Class + Class.new(renderer) { include Redcarpet::Render::SmartyPants } + else + renderer.extend Redcarpet::Render::SmartyPants + end + end + + def prepare + # try to support the same aliases + RDiscountTemplate::ALIAS.each do |opt, aka| + next if options.key? opt or not options.key? aka + options[opt] = options.delete(aka) + end + + # only raise an exception if someone is trying to enable :escape_html + options.delete(:escape_html) unless options[:escape_html] + + @engine = Redcarpet::Markdown.new(generate_renderer, options) + @output = nil + end + + def evaluate(scope, locals, &block) + @output ||= @engine.render(data) + end end end # BlueCloth Markdown implementation. See: # http://deveiate.org/projects/BlueCloth/