Merge pull request #1053 from mojombo/redcarpet-respect-pygments

Respect pygments config option in Redcarpet renderer.
This commit is contained in:
Parker Moore 2013-05-07 15:57:17 -07:00
commit cb0054b6d7
2 changed files with 74 additions and 23 deletions

View File

@ -2,28 +2,57 @@ module Jekyll
module Converters
class Markdown
class RedcarpetParser
def initialize(config)
require 'redcarpet'
require 'pygments'
@config = config
@redcarpet_extensions = {}
@config['redcarpet']['extensions'].each { |e| @redcarpet_extensions[e.to_sym] = true }
@renderer ||= Class.new(Redcarpet::Render::HTML) do
module CommonMethods
def add_code_tags(code, lang)
code = code.sub(/<pre>/, "<pre><code class=\"#{lang} language-#{lang}\">")
code = code.sub(/<\/pre>/,"</code></pre>")
end
end
module WithPygments
include CommonMethods
def block_code(code, lang)
require 'pygments'
lang = lang && lang.split.first || "text"
output = add_code_tags(
Pygments.highlight(code, :lexer => lang, :options => { :encoding => 'utf-8' }),
lang
)
end
end
def add_code_tags(code, lang)
code = code.sub(/<pre>/, "<pre><code class=\"#{lang} language-#{lang}\">")
code = code.sub(/<\/pre>/,"</code></pre>")
module WithoutPygments
require 'cgi'
include CommonMethods
def code_wrap(code)
"<div class=\"highlight\"><pre>#{CGI::escapeHTML(code)}</pre></div>"
end
def block_code(code, lang)
lang = lang && lang.split.first || "text"
output = add_code_tags(code_wrap(code), lang)
end
end
rescue LoadError
def initialize(config)
require 'redcarpet'
@config = config
@redcarpet_extensions = {}
@config['redcarpet']['extensions'].each { |e| @redcarpet_extensions[e.to_sym] = true }
@renderer ||= if @config['pygments']
Class.new(Redcarpet::Render::HTML) do
include WithPygments
end
else
Class.new(Redcarpet::Render::HTML) do
include WithoutPygments
end
end
rescue LoadErro
STDERR.puts 'You are missing a library required for Markdown. Please run:'
STDERR.puts ' $ [sudo] gem install redcarpet'
raise FatalException.new("Missing dependency: redcarpet")

View File

@ -3,11 +3,11 @@ require 'helper'
class TestRedcarpet < Test::Unit::TestCase
context "redcarpet" do
setup do
config = {
@config = {
'redcarpet' => { 'extensions' => ['smart', 'strikethrough', 'filter_html'] },
'markdown' => 'redcarpet'
}
@markdown = Converters::Markdown.new config
@markdown = Converters::Markdown.new @config
end
should "pass redcarpet options" do
@ -26,7 +26,12 @@ class TestRedcarpet < Test::Unit::TestCase
assert_equal "<p><strong>bad code not here</strong>: i am bad</p>", @markdown.convert('**bad code not here**: <script>i am bad</script>').strip
end
should "render fenced code blocks" do
context "with pygments enabled" do
setup do
@markdown = Converters::Markdown.new @config.merge({ 'pygments' => true })
end
should "render fenced code blocks with syntax highlighting" do
assert_equal "<div class=\"highlight\"><pre><code class=\"ruby language-ruby\"><span class=\"nb\">puts</span> <span class=\"s2\">&quot;Hello world&quot;</span>\n</code></pre></div>", @markdown.convert(
<<-EOS
```ruby
@ -36,4 +41,21 @@ EOS
).strip
end
end
context "with pygments disabled" do
setup do
@markdown = Converters::Markdown.new @config.merge({ 'pygments' => false })
end
should "render fenced code blocks without syntax highlighting" do
assert_equal "<div class=\"highlight\"><pre><code class=\"ruby language-ruby\">puts &quot;Hello world&quot;\n</code></pre></div>", @markdown.convert(
<<-EOS
```ruby
puts "Hello world"
```
EOS
).strip
end
end
end
end