From be877bc691190909b587454e7bb7c89818762338 Mon Sep 17 00:00:00 2001 From: Mark Otto Date: Wed, 9 Jul 2014 20:00:22 -0700 Subject: [PATCH] plugins: add new example doodad hackery bullshitery and markdown block plugin for markdown includes --- docs/_includes/components/navs.html | 21 ++------ docs/_plugins/highlight_alt.rb | 80 +++++++++++++++++++++++++++++ docs/_plugins/markdown-block.rb | 20 ++++++++ 3 files changed, 103 insertions(+), 18 deletions(-) create mode 100644 docs/_plugins/highlight_alt.rb create mode 100644 docs/_plugins/markdown-block.rb diff --git a/docs/_includes/components/navs.html b/docs/_includes/components/navs.html index ed1f53f616..cd9db235b5 100644 --- a/docs/_includes/components/navs.html +++ b/docs/_includes/components/navs.html @@ -5,23 +5,8 @@

Roll your own navigation style by extending the base .nav component. All Bootstrap's nav components are built on top of this. Includes styles for the disabled state, but not the active state.

-
- -
-{% highlight html %} + +{% example html %} -{% endhighlight %} +{% endexample %}

Classes are used so your markup can be super flexible.

diff --git a/docs/_plugins/highlight_alt.rb b/docs/_plugins/highlight_alt.rb new file mode 100644 index 0000000000..de84e759da --- /dev/null +++ b/docs/_plugins/highlight_alt.rb @@ -0,0 +1,80 @@ +module Jekyll + module Tags + class ExampleBlock < Liquid::Block + 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 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 + if markup.strip =~ SYNTAX + @lang = $1.downcase + @options = {} + if defined?($2) && $2 != '' + # 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 + @options[:linenos] = "inline" if @options.key?(:linenos) and @options[:linenos] == true + else + raise SyntaxError.new <<-eos +Syntax Error in tag 'highlight' while parsing the following markup: + + #{markup} + +Valid syntax: highlight [linenos] +eos + end + end + + def render(context) + prefix = context["highlighter_prefix"] || "" + suffix = context["highlighter_suffix"] || "" + code = super.to_s.strip + + output = case context.registers[:site].highlighter + + when 'rouge' + render_rouge(code) + end + + rendered_output = example(code) + add_code_tag(output) + prefix + rendered_output + suffix + end + + def example(output) + "
#{output}
" + end + + def render_rouge(code) + require 'rouge' + formatter = Rouge::Formatters::HTML.new(line_numbers: @options[:linenos], wrap: false) + lexer = Rouge::Lexer.find_fancy(@lang, code) || Rouge::Lexers::PlainText + code = formatter.format(lexer.lex(code)) + "
#{code}
" + end + + def add_code_tag(code) + # Add nested tags to code blocks + code = code.sub(/
\n*/,'
')
+        code = code.sub(/\n*<\/pre>/,"
") + code.strip + end + + end + end +end + +Liquid::Template.register_tag('example', Jekyll::Tags::ExampleBlock) diff --git a/docs/_plugins/markdown-block.rb b/docs/_plugins/markdown-block.rb new file mode 100644 index 0000000000..6aa761585d --- /dev/null +++ b/docs/_plugins/markdown-block.rb @@ -0,0 +1,20 @@ +module Jekyll + class MarkdownBlock < Liquid::Block + alias_method :render_block, :render + + def initialize(tag_name, markup, tokens) + super + end + + # Uses the default Jekyll markdown parser to + # parse the contents of this block + # + def render(context) + site = context.registers[:site] + converter = site.getConverterImpl(::Jekyll::Converters::Markdown) + converter.convert(render_block(context)) + end + end +end + +Liquid::Template.register_tag('markdown', Jekyll::MarkdownBlock)