diff --git a/jekyll.gemspec b/jekyll.gemspec index 1d39d222..cd395683 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -28,7 +28,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency('directory_watcher', "~> 1.1") s.add_runtime_dependency('maruku', "~> 0.5") s.add_runtime_dependency('kramdown', "~> 0.13.4") - s.add_runtime_dependency('pygments.rb', "~> 0.2.12") + s.add_runtime_dependency('pygments.rb', "~> 0.3.2") s.add_development_dependency('rake', "~> 0.9") s.add_development_dependency('rdoc', "~> 3.11") @@ -38,7 +38,7 @@ Gem::Specification.new do |s| s.add_development_dependency('cucumber', "1.1") s.add_development_dependency('RedCloth', "~> 4.2") s.add_development_dependency('rdiscount', "~> 1.6") - s.add_development_dependency('redcarpet', "~> 1.9") + s.add_development_dependency('redcarpet', "~> 2.1.1") # = MANIFEST = s.files = %w[ diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index cb94c8d0..3c6ba539 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -8,12 +8,28 @@ module Jekyll def setup return if @setup - # Set the Markdown interpreter (and Maruku self.config, if necessary) case @config['markdown'] when 'redcarpet' begin require 'redcarpet' - @redcarpet_extensions = @config['redcarpet']['extensions'].map { |e| e.to_sym } + + @renderer ||= Class.new(Redcarpet::Render::HTML) do + def block_code(code, lang) + lang = lang && lang.split.first || "text" + output = add_code_tags( + Pygments.highlight(code, :lexer => lang, :options => { :encoding => 'utf-8' }), + lang + ) + end + + def add_code_tags(code, lang) + code = code.sub(/
/,'") + end + end + + @redcarpet_extensions = {} + @config['redcarpet']['extensions'].each { |e| @redcarpet_extensions[e.to_sym] = true } rescue LoadError STDERR.puts 'You are missing a library required for Markdown. Please run:' STDERR.puts ' $ [sudo] gem install redcarpet' @@ -30,8 +46,6 @@ module Jekyll when 'rdiscount' begin require 'rdiscount' - - # Load rdiscount extensions @rdiscount_extensions = @config['rdiscount']['extensions'].map { |e| e.to_sym } rescue LoadError STDERR.puts 'You are missing a library required for Markdown. Please run:' @@ -88,7 +102,10 @@ module Jekyll setup case @config['markdown'] when 'redcarpet' - Redcarpet.new(content, *@redcarpet_extensions).to_html + @redcarpet_extensions[:fenced_code_blocks] = !@redcarpet_extensions[:no_fenced_code_blocks] + @renderer.send :include, Redcarpet::Render::SmartyPants if @redcarpet_extensions[:smart] + markdown = Redcarpet::Markdown.new(@renderer.new(@redcarpet_extensions), @redcarpet_extensions) + markdown.render(content) when 'kramdown' # Check for use of coderay if @config['kramdown']['use_coderay'] diff --git a/test/test_redcarpet.rb b/test/test_redcarpet.rb index 05596a92..43ec4331 100644 --- a/test/test_redcarpet.rb +++ b/test/test_redcarpet.rb @@ -4,7 +4,7 @@ class TestRedcarpet < Test::Unit::TestCase context "redcarpet" do setup do config = { - 'redcarpet' => { 'extensions' => ['smart'] }, + 'redcarpet' => { 'extensions' => ['smart', 'strikethrough', 'filter_html'] }, 'markdown' => 'redcarpet' } @markdown = MarkdownConverter.new config @@ -14,8 +14,26 @@ class TestRedcarpet < Test::Unit::TestCase assert_equal "') + code = code.sub(/<\/pre>/,"
Some Header
", @markdown.convert('# Some Header #').strip end - should "pass redcarpet extensions" do + should "pass redcarpet SmartyPants options" do assert_equal "“smart”
", @markdown.convert('"smart"').strip end + + should "pass redcarpet extensions" do + assert_equal "", @markdown.convert('~~deleted~~').strip + end + + should "pass redcarpet render options" do + assert_equal "
deletedbad code not here: i am bad
", @markdown.convert('**bad code not here**: ').strip + end + + should "render fenced code blocks" do + assert_equal "", @markdown.convert( + <<-EOS +```ruby +puts "Hello world" +``` +EOS + ).strip + end end end\nputs "Hello world"\n