diff --git a/History.txt b/History.txt index 131ef72b..6fc70e23 100644 --- a/History.txt +++ b/History.txt @@ -5,6 +5,7 @@ * Add uri_escape filter (#234) * Add --base-url cli option (#235) * Improve MT migrator (#238) + * Add kramdown support (#239) * Bug Fixes * Fixed filename basename generation (#208) * Set mode to UTF8 on Sequel connections (#237) diff --git a/bin/jekyll b/bin/jekyll index 62d88e1a..2be69ade 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 38a315ae..0681c2f5 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/jekyll.gemspec b/jekyll.gemspec index b5cb0419..76c6a300 100644 --- a/jekyll.gemspec +++ b/jekyll.gemspec @@ -33,6 +33,7 @@ Gem::Specification.new do |s| s.add_development_dependency('rr', [">= 4.2.1"]) s.add_development_dependency('cucumber', [">= 4.2.1"]) s.add_development_dependency('RedCloth', [">= 4.2.1"]) + s.add_development_dependency('kramdown', [">= 0.12.0"]) # = MANIFEST = s.files = %w[ diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 9d13f99f..6e029437 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -74,6 +74,22 @@ module Jekyll }, 'rdiscount' => { 'extensions' => [] + }, + 'kramdown' => { + 'auto_ids' => true, + 'footnote_nr' => 1, + 'entity_output' => 'as_char', + '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 317b1487..00c56d7c 100644 --- a/lib/jekyll/converters/markdown.rb +++ b/lib/jekyll/converters/markdown.rb @@ -10,6 +10,14 @@ module Jekyll 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 +60,7 @@ module Jekyll 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 +77,31 @@ module Jekyll def convert(content) setup case @config['markdown'] + 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'], + + :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'] + }).to_html + end when 'rdiscount' RDiscount.new(content, *@rdiscount_extensions).to_html when 'maruku' diff --git a/test/helper.rb b/test/helper.rb index 61636a4e..c426b2a0 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -5,6 +5,7 @@ require File.join(File.dirname(__FILE__), *%w[.. lib jekyll]) require 'RedCloth' require 'rdiscount' +require 'kramdown' require 'test/unit' require 'redgreen' diff --git a/test/test_kramdown.rb b/test/test_kramdown.rb new file mode 100644 index 00000000..f89e7286 --- /dev/null +++ b/test/test_kramdown.rb @@ -0,0 +1,23 @@ +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 "