X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/0561bd0c3c07257fd58ded6c7cfa5feeae97af57..9a11b502e406202db58fb6751f3448aa30288062:/doc/zenweb-liquid.rb diff --git a/doc/zenweb-liquid.rb b/doc/zenweb-liquid.rb index 4a6828188e..3e8672e021 100644 --- a/doc/zenweb-liquid.rb +++ b/doc/zenweb-liquid.rb @@ -16,7 +16,7 @@ module Zenweb def render_liquid page, content liquid self.body, content, page, binding end - + ## # Render a page's liquid and return the intermediate result def liquid template, content, page, binding = TOPLEVEL_BINDING @@ -24,7 +24,7 @@ module Zenweb unless defined? @liquid_template @liquid_template = Liquid::Template.parse(template) end - + vars = {} vars["content"] = content @@ -38,7 +38,7 @@ module Zenweb vars["page"] = page.config.h.clone vars["page"]["url"] = page.url - + @liquid_template.render(vars) end end @@ -50,20 +50,25 @@ module Zenweb Liquid::Tag.instance_method(:initialize).bind(self).call(tag_name, markup, tokens) if markup =~ Syntax - @template_name = $1 + @template_name_expr = $1 @language = $3 @attributes = {} else raise SyntaxError.new("Error in tag 'code' - Valid syntax: include '[code_file]' as '[language]'") end end - + def render(context) require 'coderay' - partial = load_cached_partial(context) + partial = load_cached_partial(@template_name_expr, context) html = '' + # be explicit about errors + context.exception_renderer = lambda do |exc| + exc.is_a?(Liquid::InternalError) ? "Liquid error: #{exc.cause.message}" : exc + end + context.stack do html = CodeRay.scan(partial.root.nodelist.join, @language).div end @@ -71,6 +76,45 @@ module Zenweb html end - Liquid::Template.register_tag('code', LiquidCode) + Liquid::Template.register_tag('code', LiquidCode) + end + + class LiquidCodeBlock < Liquid::Block + Syntax = /((?:as)\s+(#{Liquid::QuotedFragment}+))?/o + + def initialize(tag_name, markup, tokens) + Liquid::Tag.instance_method(:initialize).bind(self).call(tag_name, markup, tokens) + + if markup =~ Syntax + @language = $2 + @attributes = {} + else + raise SyntaxError.new("Error in tag 'code' - Valid syntax: codeblock as '[language]'") + end + end + + def render(context) + require 'coderay' + + partial = super + html = '' + + if partial[0] == '\n' + partial = partial[1..-1] + end + + # be explicit about errors + context.exception_renderer = lambda do |exc| + exc.is_a?(Liquid::InternalError) ? "Liquid error: #{exc.cause.message}" : exc + end + + context.stack do + html = CodeRay.scan(partial, @language).div + end + + "#{html}" + end + + Liquid::Template.register_tag('codeblock', LiquidCodeBlock) end end