From 7f706f47fc89c65fdfeff5dc65c591750020c18e Mon Sep 17 00:00:00 2001 From: Tom Bell Date: Mon, 13 Aug 2012 15:03:33 +0100 Subject: [PATCH 1/3] Update redcarpet support to version 2 --- jekyll.gemspec | 2 +- lib/jekyll/converters/markdown.rb | 27 ++++++++++++++++++++++----- test/test_redcarpet.rb | 22 ++++++++++++++++++++-- 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index 55201ae8..f8734af1 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -37,7 +37,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..67f7a06b 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 ||= '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(/
/,'
')
+                code = code.sub(/<\/pre>/,"
") + 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 "

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 "

deleted

", @markdown.convert('~~deleted~~').strip + end + + should "pass redcarpet render options" do + assert_equal "

bad code not here: i am bad

", @markdown.convert('**bad code not here**: ').strip + end + + should "render fenced code blocks" do + assert_equal "
puts "Hello world"\n
\n
", @markdown.convert( + <<-EOS +```ruby +puts "Hello world" +``` +EOS + ).strip + end end end From a78b587e2515729efc86e0540593ff11ea041bb2 Mon Sep 17 00:00:00 2001 From: Tom Bell Date: Tue, 13 Nov 2012 07:54:53 +0000 Subject: [PATCH 2/3] Update pygments.rb version --- jekyll.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jekyll.gemspec b/jekyll.gemspec index f8734af1..425eab76 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -27,7 +27,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") From 38ac55381b6342a3862fe0c353149f2344cdae90 Mon Sep 17 00:00:00 2001 From: Tom Bell Date: Tue, 13 Nov 2012 07:59:36 +0000 Subject: [PATCH 3/3] Only pass first class to Pygments This prevents an exception if something like the following is used: ~~~ {foo bar} some code ~~~ --- lib/jekyll/converters/markdown.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index 67f7a06b..3c6ba539 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -15,7 +15,7 @@ module Jekyll @renderer ||= Class.new(Redcarpet::Render::HTML) do def block_code(code, lang) - lang ||= 'text' + lang = lang && lang.split.first || "text" output = add_code_tags( Pygments.highlight(code, :lexer => lang, :options => { :encoding => 'utf-8' }), lang