From ac7a0cc95fcccfe16ba337424ddd58c940a3a3c4 Mon Sep 17 00:00:00 2001 From: Jason Graham Date: Wed, 20 Oct 2010 23:35:54 -0700 Subject: [PATCH 1/3] Add Kramdown support and tests --- bin/jekyll | 4 ++++ features/site_configuration.feature | 7 +++++++ lib/jekyll/converters/markdown.rb | 13 ++++++++++++- test/helper.rb | 1 + test/test_tags.rb | 11 +++++++++++ 5 files changed, 35 insertions(+), 1 deletion(-) diff --git a/bin/jekyll b/bin/jekyll index 62d88e1aa8c..2be69ade58c 100755 --- a/bin/jekyll +++ b/bin/jekyll @@ -56,6 +56,10 @@ opts = OptionParser.new do |opts| options['markdown'] = 'rdiscount' end + opts.on("--kramdown", "Use kramdown gem for Markdown") do + options['markdown'] = 'kramdown' + end + opts.on("--time [TIME]", "Time to generate the site for") do |time| options['time'] = Time.parse(time) end diff --git a/features/site_configuration.feature b/features/site_configuration.feature index 38a315aec2d..0681c2f5907 100644 --- a/features/site_configuration.feature +++ b/features/site_configuration.feature @@ -48,6 +48,13 @@ Feature: Site configuration Then the _site directory should exist And I should see "Google" in "_site/index.html" + Scenario: Use Kramdown for markup + Given I have an "index.markdown" page that contains "[Google](http://google.com)" + And I have a configuration file with "markdown" set to "kramdown" + When I run jekyll + Then the _site directory should exist + And I should see "Google" in "_site/index.html" + Scenario: Use Maruku for markup Given I have an "index.markdown" page that contains "[Google](http://google.com)" And I have a configuration file with "markdown" set to "maruku" diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index 317b1487e5b..a0ba3ee1e36 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -10,6 +10,15 @@ def setup return if @setup # Set the Markdown interpreter (and Maruku self.config, if necessary) case @config['markdown'] + 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 when 'rdiscount' begin require 'rdiscount' @@ -52,7 +61,7 @@ def setup end else STDERR.puts "Invalid Markdown processor: #{@config['markdown']}" - STDERR.puts " Valid options are [ maruku | rdiscount ]" + STDERR.puts " Valid options are [ maruku | rdiscount | kramdown ]" raise FatalException.new("Invalid Markdown process: #{@config['markdown']}") end @setup = true @@ -69,6 +78,8 @@ def output_ext(ext) def convert(content) setup case @config['markdown'] + when 'kramdown' + Kramdown::Document.new(content).to_html when 'rdiscount' RDiscount.new(content, *@rdiscount_extensions).to_html when 'maruku' diff --git a/test/helper.rb b/test/helper.rb index 61636a4e51f..c426b2a0176 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -5,6 +5,7 @@ require 'RedCloth' require 'rdiscount' +require 'kramdown' require 'test/unit' require 'redgreen' diff --git a/test/test_tags.rb b/test/test_tags.rb index d25aa705fa5..3f25e5c2967 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -112,5 +112,16 @@ def fill_post(code, override = {}) assert_match %r{FINISH HIM}, @result end end + + context "using Kramdown" do + setup do + create_post(@content, 'markdown' => 'kramdown') + end + + should "parse correctly" do + assert_match %r{FIGHT!}, @result + assert_match %r{FINISH HIM}, @result + end + end end end From f85e229a9e99e8c9368928379e564bc8056ecd8a Mon Sep 17 00:00:00 2001 From: Jason Graham Date: Sat, 20 Nov 2010 14:38:40 -0800 Subject: [PATCH 2/3] Add support for kramdown HTML converter options http://kramdown.rubyforge.org/converter/html.html#options Example: In the _config.yaml, markdown: kramdown kramdown: auto_ids: true --- lib/jekyll.rb | 6 ++++++ lib/jekyll/converters/markdown.rb | 7 ++++++- test/test_kramdown.rb | 24 ++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 test/test_kramdown.rb diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 9d13f99f5b7..981f8ed8deb 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -74,6 +74,12 @@ module Jekyll }, 'rdiscount' => { 'extensions' => [] + }, + 'kramdown' => { + 'auto_ids' => true, + 'footnote_nr' => 1, + 'entity_output' => 'as_char', + 'toc_levels' => '1..6' } } diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index a0ba3ee1e36..4e3110e593b 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -79,7 +79,12 @@ def convert(content) setup case @config['markdown'] when 'kramdown' - Kramdown::Document.new(content).to_html + 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'] + }).to_html when 'rdiscount' RDiscount.new(content, *@rdiscount_extensions).to_html when 'maruku' diff --git a/test/test_kramdown.rb b/test/test_kramdown.rb new file mode 100644 index 00000000000..0bcc58e50ee --- /dev/null +++ b/test/test_kramdown.rb @@ -0,0 +1,24 @@ +require File.dirname(__FILE__) + '/helper' + +class TestKramdown < Test::Unit::TestCase + + context "kramdown" do + setup do + config = { + 'markdown' => 'kramdown', + 'kramdown' => { 'auto_ids' => false, + 'footnote_nr' => 1, + 'entity_output' => 'as_char', + 'toc_levels' => '1..6' + } + } + @markdown = MarkdownConverter.new config + end + + # http://kramdown.rubyforge.org/converter/html.html#options + should "pass kramdown options" do + assert_equal "

Some Header

", @markdown.convert('# Some Header #').strip + end + + end +end From dca30c3ad1a161ff18dc5adc60f6e53787306b95 Mon Sep 17 00:00:00 2001 From: Jason Graham Date: Sat, 20 Nov 2010 16:57:57 -0800 Subject: [PATCH 3/3] Add kramdown's support for coderay - no test added so that coderay isn't added to list of developer dependencies --- lib/jekyll.rb | 12 ++++++++++- lib/jekyll/converters/markdown.rb | 33 +++++++++++++++++++++++++------ 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 981f8ed8deb..6e029437171 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -79,7 +79,17 @@ module Jekyll 'auto_ids' => true, 'footnote_nr' => 1, 'entity_output' => 'as_char', - 'toc_levels' => '1..6' + 'toc_levels' => '1..6', + 'use_coderay' => false, + + 'coderay' => { + 'coderay_wrap' => 'div', + 'coderay_line_numbers' => 'inline', + 'coderay_line_number_start' => 1, + 'coderay_tab_width' => 4, + 'coderay_bold_every' => 10, + 'coderay_css' => 'style' + } } } diff --git a/lib/jekyll/converters/markdown.rb b/lib/jekyll/converters/markdown.rb index 4e3110e593b..05ddb622321 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -79,12 +79,33 @@ def convert(content) setup case @config['markdown'] when 'kramdown' - 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'] - }).to_html + + # 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'], + + :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 + + # not using coderay + else + + 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'] + }).to_html + end when 'rdiscount' RDiscount.new(content, *@rdiscount_extensions).to_html when 'maruku'