diff --git a/lib/jekyll/tags/highlight.rb b/lib/jekyll/tags/highlight.rb index f88cfc9d..f7ca2dcd 100644 --- a/lib/jekyll/tags/highlight.rb +++ b/lib/jekyll/tags/highlight.rb @@ -4,9 +4,11 @@ module Jekyll include Liquid::StandardFilters # The regular expression syntax checker. Start with the language specifier. - # Follow that by zero or more space separated options that take one of two - # forms: name or name=value - SYNTAX = /^([a-zA-Z0-9.+#-]+)((\s+\w+(=\w+)?)*)$/ + # Follow that by zero or more space separated options that take one of three + # forms: name, name=value, or name="" + # + # is a space-separated list of numbers + SYNTAX = /^([a-zA-Z0-9.+#-]+)((\s+\w+(=(\w+|"([0-9]+\s)*[0-9]+"))?)*)$/ def initialize(tag_name, markup, tokens) super @@ -14,8 +16,14 @@ module Jekyll @lang = $1.downcase @options = {} if defined?($2) && $2 != '' - $2.split.each do |opt| + # Split along 3 possible forms -- key="", key=value, or key + $2.scan(/(?:\w="[^"]*"|\w=\w|\w)+/) do |opt| key, value = opt.split('=') + # If a quoted list, convert to array + if value && value.include?("\"") + value.gsub!(/"/, "") + value = value.split + end @options[key.to_sym] = value || true end end diff --git a/test/test_tags.rb b/test/test_tags.rb index f34030e0..1895a629 100644 --- a/test/test_tags.rb +++ b/test/test_tags.rb @@ -75,7 +75,13 @@ CONTENT tag = Jekyll::Tags::HighlightBlock.new('highlight', 'ruby linenos=table cssclass=hl', ["test", "{% endhighlight %}", "\n"]) assert_equal({ :cssclass => 'hl', :linenos => 'table' }, tag.instance_variable_get(:@options)) - + + tag = Jekyll::Tags::HighlightBlock.new('highlight', 'ruby linenos=table cssclass=hl hl_linenos=3', ["test", "{% endhighlight %}", "\n"]) + assert_equal({ :cssclass => 'hl', :linenos => 'table', :hl_linenos => '3' }, tag.instance_variable_get(:@options)) + + tag = Jekyll::Tags::HighlightBlock.new('highlight', 'ruby linenos=table cssclass=hl hl_linenos="3 5 6"', ["test", "{% endhighlight %}", "\n"]) + assert_equal({ :cssclass => 'hl', :linenos => 'table', :hl_linenos => ['3', '5', '6'] }, tag.instance_variable_get(:@options)) + tag = Jekyll::Tags::HighlightBlock.new('highlight', 'Ruby ', ["test", "{% endhighlight %}", "\n"]) assert_equal "ruby", tag.instance_variable_get(:@lang), "lexers should be case insensitive" end