From 63cdd21353bfd047b11998aaa99e6bd23fcacfcb Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 13 Apr 2013 01:47:40 +0200 Subject: [PATCH 1/4] Move initialization of parsers to separate classes --- lib/jekyll.rb | 1 + lib/jekyll/converters/markdown.rb | 76 ++----------------- .../converters/parsers/kramdown_parser.rb | 16 ++++ .../converters/parsers/maruku_parser.rb | 43 +++++++++++ .../converters/parsers/rdiscount_parser.rb | 17 +++++ .../converters/parsers/redcarpet_parser.rb | 35 +++++++++ 6 files changed, 118 insertions(+), 70 deletions(-) create mode 100644 lib/jekyll/converters/parsers/kramdown_parser.rb create mode 100644 lib/jekyll/converters/parsers/maruku_parser.rb create mode 100644 lib/jekyll/converters/parsers/rdiscount_parser.rb create mode 100644 lib/jekyll/converters/parsers/redcarpet_parser.rb diff --git a/lib/jekyll.rb b/lib/jekyll.rb index b3f6b22f..f8a65409 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -46,6 +46,7 @@ require 'jekyll/command' require_all 'jekyll/commands' require_all 'jekyll/converters' +require_all 'jekyll/converters/parsers' require_all 'jekyll/generators' require_all 'jekyll/tags' diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index b345b88c..79c72c4e 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -8,79 +8,15 @@ module Jekyll def setup return if @setup - case @config['markdown'] + @parser = case @config['markdown'] when 'redcarpet' - begin - require 'redcarpet' - - @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(/
/,'
')
-                  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' - raise FatalException.new("Missing dependency: redcarpet") - end + RedcarpetParser.new @config when 'kramdown' - begin - require 'kramdown' - rescue LoadError - STDERR.puts 'You are missing a library required for Markdown. Please run:' - STDERR.puts ' $ [sudo] gem install kramdown' - raise FatalException.new("Missing dependency: kramdown") - end + KramdownParser.new @config when 'rdiscount' - begin - require 'rdiscount' - @rdiscount_extensions = @config['rdiscount']['extensions'].map { |e| e.to_sym } - rescue LoadError - STDERR.puts 'You are missing a library required for Markdown. Please run:' - STDERR.puts ' $ [sudo] gem install rdiscount' - raise FatalException.new("Missing dependency: rdiscount") - end + RDiscountParser.new @config when 'maruku' - begin - require 'maruku' - - if @config['maruku']['use_divs'] - require 'maruku/ext/div' - STDERR.puts 'Maruku: Using extended syntax for div elements.' - end - - if @config['maruku']['use_tex'] - require 'maruku/ext/math' - STDERR.puts "Maruku: Using LaTeX extension. Images in `#{@config['maruku']['png_dir']}`." - - # Switch off MathML output - MaRuKu::Globals[:html_math_output_mathml] = false - MaRuKu::Globals[:html_math_engine] = 'none' - - # Turn on math to PNG support with blahtex - # Resulting PNGs stored in `images/latex` - MaRuKu::Globals[:html_math_output_png] = true - MaRuKu::Globals[:html_png_engine] = @config['maruku']['png_engine'] - MaRuKu::Globals[:html_png_dir] = @config['maruku']['png_dir'] - MaRuKu::Globals[:html_png_url] = @config['maruku']['png_url'] - end - rescue LoadError - STDERR.puts 'You are missing a library required for Markdown. Please run:' - STDERR.puts ' $ [sudo] gem install maruku' - raise FatalException.new("Missing dependency: maruku") - end + MarukuParser.new @config else STDERR.puts "Invalid Markdown processor: #{@config['markdown']}" STDERR.puts " Valid options are [ maruku | rdiscount | kramdown ]" @@ -88,7 +24,7 @@ module Jekyll end @setup = true end - + def matches(ext) rgx = '(' + @config['markdown_ext'].gsub(',','|') +')' ext =~ Regexp.new(rgx, Regexp::IGNORECASE) diff --git a/lib/jekyll/converters/parsers/kramdown_parser.rb b/lib/jekyll/converters/parsers/kramdown_parser.rb new file mode 100644 index 00000000..5f658e55 --- /dev/null +++ b/lib/jekyll/converters/parsers/kramdown_parser.rb @@ -0,0 +1,16 @@ +module Jekyll + module Converters + class Markdown + class KramdownParser + def initialize(config) + require 'kramdown' + @config = config + rescue LoadError + STDERR.puts 'You are missing a library required for Markdown. Please run:' + STDERR.puts ' $ [sudo] gem install kramdown' + raise FatalException.new("Missing dependency: kramdown") + end + end + end + end +end diff --git a/lib/jekyll/converters/parsers/maruku_parser.rb b/lib/jekyll/converters/parsers/maruku_parser.rb new file mode 100644 index 00000000..84d5dca4 --- /dev/null +++ b/lib/jekyll/converters/parsers/maruku_parser.rb @@ -0,0 +1,43 @@ +module Jekyll + module Converters + class Markdown + class MarukuParser + def initialize(config) + require 'maruku' + @config = config + if @config['maruku']['use_divs'] + load_divs_library + end + if @config['maruku']['use_tex'] + load_blahtext_library + end + rescue LoadError + STDERR.puts 'You are missing a library required for Markdown. Please run:' + STDERR.puts ' $ [sudo] gem install maruku' + raise FatalException.new("Missing dependency: maruku") + end + + def load_divs_library + require 'maruku/ext/div' + STDERR.puts 'Maruku: Using extended syntax for div elements.' + end + + def load_blahtext_library + require 'maruku/ext/math' + STDERR.puts "Maruku: Using LaTeX extension. Images in `#{@config['maruku']['png_dir']}`." + + # Switch off MathML output + MaRuKu::Globals[:html_math_output_mathml] = false + MaRuKu::Globals[:html_math_engine] = 'none' + + # Turn on math to PNG support with blahtex + # Resulting PNGs stored in `images/latex` + MaRuKu::Globals[:html_math_output_png] = true + MaRuKu::Globals[:html_png_engine] = @config['maruku']['png_engine'] + MaRuKu::Globals[:html_png_dir] = @config['maruku']['png_dir'] + MaRuKu::Globals[:html_png_url] = @config['maruku']['png_url'] + end + end + end + end +end diff --git a/lib/jekyll/converters/parsers/rdiscount_parser.rb b/lib/jekyll/converters/parsers/rdiscount_parser.rb new file mode 100644 index 00000000..32970ff5 --- /dev/null +++ b/lib/jekyll/converters/parsers/rdiscount_parser.rb @@ -0,0 +1,17 @@ +module Jekyll + module Converters + class Markdown + class RDiscountParser + def initialize(config) + require 'rdiscount' + @config = config + @rdiscount_extensions = @config['rdiscount']['extensions'].map { |e| e.to_sym } + rescue LoadError + STDERR.puts 'You are missing a library required for Markdown. Please run:' + STDERR.puts ' $ [sudo] gem install rdiscount' + raise FatalException.new("Missing dependency: rdiscount") + end + end + end + end +end diff --git a/lib/jekyll/converters/parsers/redcarpet_parser.rb b/lib/jekyll/converters/parsers/redcarpet_parser.rb new file mode 100644 index 00000000..381e1b0e --- /dev/null +++ b/lib/jekyll/converters/parsers/redcarpet_parser.rb @@ -0,0 +1,35 @@ +module Jekyll + module Converters + class Markdown + class RedcarpetParser + def initialize(config) + begin + require 'redcarpet' + @config = config + @redcarpet_extensions = {} + @config['redcarpet']['extensions'].each { |e| @redcarpet_extensions[e.to_sym] = true } + + @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(/
/,'
')
+                code = code.sub(/<\/pre>/,"
") + end + end + rescue LoadError + STDERR.puts 'You are missing a library required for Markdown. Please run:' + STDERR.puts ' $ [sudo] gem install redcarpet' + raise FatalException.new("Missing dependency: redcarpet") + end + end + end + end + end +end From 3bc497c1c9fcffffc9e06099de541b8064d69494 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 13 Apr 2013 01:55:03 +0200 Subject: [PATCH 2/4] Moved out conversion logic --- lib/jekyll/converters/markdown.rb | 44 +------------------ .../converters/parsers/kramdown_parser.rb | 28 ++++++++++++ .../converters/parsers/maruku_parser.rb | 4 ++ .../converters/parsers/rdiscount_parser.rb | 9 ++++ .../converters/parsers/redcarpet_parser.rb | 7 +++ 5 files changed, 49 insertions(+), 43 deletions(-) diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index 79c72c4e..6f6580fc 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -36,49 +36,7 @@ module Jekyll def convert(content) setup - case @config['markdown'] - when 'redcarpet' - @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'] - Kramdown::Document.new(content, { - :auto_ids => @config['kramdown']['auto_ids'], - :footnote_nr => @config['kramdown']['footnote_nr'], - :entity_output => @config['kramdown']['entity_output'], - :toc_levels => @config['kramdown']['toc_levels'], - :smart_quotes => @config['kramdown']['smart_quotes'], - - :coderay_wrap => @config['kramdown']['coderay']['coderay_wrap'], - :coderay_line_numbers => @config['kramdown']['coderay']['coderay_line_numbers'], - :coderay_line_number_start => @config['kramdown']['coderay']['coderay_line_number_start'], - :coderay_tab_width => @config['kramdown']['coderay']['coderay_tab_width'], - :coderay_bold_every => @config['kramdown']['coderay']['coderay_bold_every'], - :coderay_css => @config['kramdown']['coderay']['coderay_css'] - }).to_html - else - # not using coderay - Kramdown::Document.new(content, { - :auto_ids => @config['kramdown']['auto_ids'], - :footnote_nr => @config['kramdown']['footnote_nr'], - :entity_output => @config['kramdown']['entity_output'], - :toc_levels => @config['kramdown']['toc_levels'], - :smart_quotes => @config['kramdown']['smart_quotes'] - }).to_html - end - when 'rdiscount' - rd = RDiscount.new(content, *@rdiscount_extensions) - html = rd.to_html - if rd.generate_toc and html.include?(@config['rdiscount']['toc_token']) - html.gsub!(@config['rdiscount']['toc_token'], rd.toc_content.force_encoding('utf-8')) - end - html - when 'maruku' - Maruku.new(content).to_html - end + @parser.convert(content) end end end diff --git a/lib/jekyll/converters/parsers/kramdown_parser.rb b/lib/jekyll/converters/parsers/kramdown_parser.rb index 5f658e55..58857276 100644 --- a/lib/jekyll/converters/parsers/kramdown_parser.rb +++ b/lib/jekyll/converters/parsers/kramdown_parser.rb @@ -10,6 +10,34 @@ module Jekyll STDERR.puts ' $ [sudo] gem install kramdown' raise FatalException.new("Missing dependency: kramdown") end + + def convert(content) + # Check for use of coderay + kramdown_configs = if @config['kramdown']['use_coderay'] + base_kramdown_configs.merge({ + :coderay_wrap => @config['kramdown']['coderay']['coderay_wrap'], + :coderay_line_numbers => @config['kramdown']['coderay']['coderay_line_numbers'], + :coderay_line_number_start => @config['kramdown']['coderay']['coderay_line_number_start'], + :coderay_tab_width => @config['kramdown']['coderay']['coderay_tab_width'], + :coderay_bold_every => @config['kramdown']['coderay']['coderay_bold_every'], + :coderay_css => @config['kramdown']['coderay']['coderay_css'] + }) + else + # not using coderay + base_kramdown_configs + end + Kramdown::Document.new(content, kramdown_configs).to_html + end + + def base_kramdown_configs + { + :auto_ids => @config['kramdown']['auto_ids'], + :footnote_nr => @config['kramdown']['footnote_nr'], + :entity_output => @config['kramdown']['entity_output'], + :toc_levels => @config['kramdown']['toc_levels'], + :smart_quotes => @config['kramdown']['smart_quotes'] + } + end end end end diff --git a/lib/jekyll/converters/parsers/maruku_parser.rb b/lib/jekyll/converters/parsers/maruku_parser.rb index 84d5dca4..911366c7 100644 --- a/lib/jekyll/converters/parsers/maruku_parser.rb +++ b/lib/jekyll/converters/parsers/maruku_parser.rb @@ -37,6 +37,10 @@ module Jekyll MaRuKu::Globals[:html_png_dir] = @config['maruku']['png_dir'] MaRuKu::Globals[:html_png_url] = @config['maruku']['png_url'] end + + def convert(content) + Maruku.new(content).to_html + end end end end diff --git a/lib/jekyll/converters/parsers/rdiscount_parser.rb b/lib/jekyll/converters/parsers/rdiscount_parser.rb index 32970ff5..87b09831 100644 --- a/lib/jekyll/converters/parsers/rdiscount_parser.rb +++ b/lib/jekyll/converters/parsers/rdiscount_parser.rb @@ -11,6 +11,15 @@ module Jekyll STDERR.puts ' $ [sudo] gem install rdiscount' raise FatalException.new("Missing dependency: rdiscount") end + + def convert(content) + rd = RDiscount.new(content, *@rdiscount_extensions) + html = rd.to_html + if rd.generate_toc and html.include?(@config['rdiscount']['toc_token']) + html.gsub!(@config['rdiscount']['toc_token'], rd.toc_content.force_encoding('utf-8')) + end + html + end end end end diff --git a/lib/jekyll/converters/parsers/redcarpet_parser.rb b/lib/jekyll/converters/parsers/redcarpet_parser.rb index 381e1b0e..5225af8e 100644 --- a/lib/jekyll/converters/parsers/redcarpet_parser.rb +++ b/lib/jekyll/converters/parsers/redcarpet_parser.rb @@ -29,6 +29,13 @@ module Jekyll raise FatalException.new("Missing dependency: redcarpet") end end + + def convert(content) + @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) + end end end end From a971fec80130ddc37ae97971ec8f58e3fd08c10d Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sat, 13 Apr 2013 02:13:50 +0200 Subject: [PATCH 3/4] rescue block for the method and added redcarpet as option for parser --- lib/jekyll/converters/markdown.rb | 2 +- .../converters/parsers/redcarpet_parser.rb | 42 +++++++++---------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index 6f6580fc..baeb9bf7 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -19,7 +19,7 @@ module Jekyll MarukuParser.new @config else STDERR.puts "Invalid Markdown processor: #{@config['markdown']}" - STDERR.puts " Valid options are [ maruku | rdiscount | kramdown ]" + STDERR.puts " Valid options are [ maruku | rdiscount | kramdown | redcarpet ]" raise FatalException.new("Invalid Markdown process: #{@config['markdown']}") end @setup = true diff --git a/lib/jekyll/converters/parsers/redcarpet_parser.rb b/lib/jekyll/converters/parsers/redcarpet_parser.rb index 5225af8e..92d8aec9 100644 --- a/lib/jekyll/converters/parsers/redcarpet_parser.rb +++ b/lib/jekyll/converters/parsers/redcarpet_parser.rb @@ -3,31 +3,29 @@ module Jekyll class Markdown class RedcarpetParser def initialize(config) - begin - require 'redcarpet' - @config = config - @redcarpet_extensions = {} - @config['redcarpet']['extensions'].each { |e| @redcarpet_extensions[e.to_sym] = true } + require 'redcarpet' + @config = config + @redcarpet_extensions = {} + @config['redcarpet']['extensions'].each { |e| @redcarpet_extensions[e.to_sym] = true } - @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(/
/,'
')
-                code = code.sub(/<\/pre>/,"
") - end + @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(/
/,'
')
+              code = code.sub(/<\/pre>/,"
") end - rescue LoadError - STDERR.puts 'You are missing a library required for Markdown. Please run:' - STDERR.puts ' $ [sudo] gem install redcarpet' - raise FatalException.new("Missing dependency: redcarpet") end + rescue LoadError + STDERR.puts 'You are missing a library required for Markdown. Please run:' + STDERR.puts ' $ [sudo] gem install redcarpet' + raise FatalException.new("Missing dependency: redcarpet") end def convert(content) From 7a7990fb9afce1606d9d4e487f5ae5148860132b Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Sun, 14 Apr 2013 05:23:42 +0200 Subject: [PATCH 4/4] Moved markdown converters into lib/jekyll/converters/markdown --- lib/jekyll.rb | 2 +- lib/jekyll/converters/{parsers => markdown}/kramdown_parser.rb | 0 lib/jekyll/converters/{parsers => markdown}/maruku_parser.rb | 0 lib/jekyll/converters/{parsers => markdown}/rdiscount_parser.rb | 0 lib/jekyll/converters/{parsers => markdown}/redcarpet_parser.rb | 0 5 files changed, 1 insertion(+), 1 deletion(-) rename lib/jekyll/converters/{parsers => markdown}/kramdown_parser.rb (100%) rename lib/jekyll/converters/{parsers => markdown}/maruku_parser.rb (100%) rename lib/jekyll/converters/{parsers => markdown}/rdiscount_parser.rb (100%) rename lib/jekyll/converters/{parsers => markdown}/redcarpet_parser.rb (100%) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index f8a65409..58318011 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -46,7 +46,7 @@ require 'jekyll/command' require_all 'jekyll/commands' require_all 'jekyll/converters' -require_all 'jekyll/converters/parsers' +require_all 'jekyll/converters/markdown' require_all 'jekyll/generators' require_all 'jekyll/tags' diff --git a/lib/jekyll/converters/parsers/kramdown_parser.rb b/lib/jekyll/converters/markdown/kramdown_parser.rb similarity index 100% rename from lib/jekyll/converters/parsers/kramdown_parser.rb rename to lib/jekyll/converters/markdown/kramdown_parser.rb diff --git a/lib/jekyll/converters/parsers/maruku_parser.rb b/lib/jekyll/converters/markdown/maruku_parser.rb similarity index 100% rename from lib/jekyll/converters/parsers/maruku_parser.rb rename to lib/jekyll/converters/markdown/maruku_parser.rb diff --git a/lib/jekyll/converters/parsers/rdiscount_parser.rb b/lib/jekyll/converters/markdown/rdiscount_parser.rb similarity index 100% rename from lib/jekyll/converters/parsers/rdiscount_parser.rb rename to lib/jekyll/converters/markdown/rdiscount_parser.rb diff --git a/lib/jekyll/converters/parsers/redcarpet_parser.rb b/lib/jekyll/converters/markdown/redcarpet_parser.rb similarity index 100% rename from lib/jekyll/converters/parsers/redcarpet_parser.rb rename to lib/jekyll/converters/markdown/redcarpet_parser.rb