From acb2263f51af818ed74734b8843ddb0a18ac4532 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Thu, 7 Jan 2016 02:36:24 -0800 Subject: [PATCH 1/2] Add smartify filter --- lib/jekyll/converters/smartypants.rb | 34 ++++++++++++++++++++++++++++ lib/jekyll/filters.rb | 11 +++++++++ test/test_filters.rb | 5 ++++ 3 files changed, 50 insertions(+) create mode 100644 lib/jekyll/converters/smartypants.rb diff --git a/lib/jekyll/converters/smartypants.rb b/lib/jekyll/converters/smartypants.rb new file mode 100644 index 00000000..7af9d297 --- /dev/null +++ b/lib/jekyll/converters/smartypants.rb @@ -0,0 +1,34 @@ +class Kramdown::Parser::SmartyPants < Kramdown::Parser::Kramdown + def initialize(source, options) + super + @block_parsers = [] + @span_parsers = [:smart_quotes, :html_entity, :typographic_syms, :escaped_chars] + end +end + +module Jekyll + module Converters + class SmartyPants < Converter + safe true + priority :low + + def initialize(config) + Jekyll::External.require_with_graceful_fail "kramdown" + @config = config["kramdown"].dup || {} + @config[:input] = :SmartyPants + end + + def matches(_) + false + end + + def output_ext(_) + nil + end + + def convert(content) + Kramdown::Document.new(content, @config).to_html.chomp + end + end + end +end diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 36760d65..986bfdee 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -15,6 +15,17 @@ module Jekyll converter.convert(input) end + # Convert a Markdown string into HTML output. + # + # input - The Markdown String to convert. + # + # Returns the HTML formatted String. + def smartify(input) + site = @context.registers[:site] + converter = site.find_converter_instance(Jekyll::Converters::SmartyPants) + converter.convert(input) + end + # Convert a Sass string into CSS output. # # input - The Sass String to convert. diff --git a/test/test_filters.rb b/test/test_filters.rb index dc51252e..63e52672 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -31,6 +31,11 @@ class TestFilters < JekyllUnitTest assert_equal "

something really simple

\n", @filter.markdownify("something **really** simple") end + should "smartify with simple string" do + assert_equal "SmartyPants is *not* Markdown", @filter.smartify("SmartyPants is *not* Markdown") + assert_equal "“This filter’s test…”", @filter.smartify(%q{"This filter's test..."}) + end + should "sassify with simple string" do assert_equal "p {\n color: #123456; }\n", @filter.sassify("$blue:#123456\np\n color: $blue") end From ddf640e6bdeb0ae457faf50eacabab74f5c92183 Mon Sep 17 00:00:00 2001 From: Pat Hawks Date: Fri, 8 Jan 2016 17:10:36 -0800 Subject: [PATCH 2/2] Test all the things --- lib/jekyll/converters/smartypants.rb | 4 ++-- test/test_filters.rb | 29 +++++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/lib/jekyll/converters/smartypants.rb b/lib/jekyll/converters/smartypants.rb index 7af9d297..d1bc8103 100644 --- a/lib/jekyll/converters/smartypants.rb +++ b/lib/jekyll/converters/smartypants.rb @@ -1,8 +1,8 @@ class Kramdown::Parser::SmartyPants < Kramdown::Parser::Kramdown def initialize(source, options) super - @block_parsers = [] - @span_parsers = [:smart_quotes, :html_entity, :typographic_syms, :escaped_chars] + @block_parsers = [:block_html] + @span_parsers = [:smart_quotes, :html_entity, :typographic_syms, :span_html] end end diff --git a/test/test_filters.rb b/test/test_filters.rb index 63e52672..d2d281c3 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -31,9 +31,32 @@ class TestFilters < JekyllUnitTest assert_equal "

something really simple

\n", @filter.markdownify("something **really** simple") end - should "smartify with simple string" do - assert_equal "SmartyPants is *not* Markdown", @filter.smartify("SmartyPants is *not* Markdown") - assert_equal "“This filter’s test…”", @filter.smartify(%q{"This filter's test..."}) + context "smartify filter" do + should "convert quotes and typographic characters" do + assert_equal "SmartyPants is *not* Markdown", @filter.smartify("SmartyPants is *not* Markdown") + assert_equal "“This filter’s test…”", @filter.smartify(%q{"This filter's test..."}) + end + + should "escapes special characters when configured to do so" do + kramdown = JekyllFilter.new({:kramdown => {:entity_output => :symbolic}}) + assert_equal "“This filter’s test…”", kramdown.smartify(%q{"This filter's test..."}) + end + + should "convert HTML entities to unicode characters" do + assert_equal "’", @filter.smartify("’") + assert_equal "“", @filter.smartify("“") + end + + should "allow raw HTML passthrough" do + assert_equal "Span HTML is not escaped", @filter.smartify("Span HTML is not escaped") + assert_equal "
Block HTML is not escaped
", @filter.smartify("
Block HTML is not escaped
") + end + + should "escape special characters" do + assert_equal "3 < 4", @filter.smartify("3 < 4") + assert_equal "5 > 4", @filter.smartify("5 > 4") + assert_equal "This & that", @filter.smartify("This & that") + end end should "sassify with simple string" do