class Glim::LiquidTags::HighlightBlock

Public Class Methods

new(tag_name, markup, tokens) click to toggle source
Calls superclass method
# File lib/liquid_ext.rb, line 172
def initialize(tag_name, markup, tokens)
  super

  if markup =~ /^([a-zA-Z0-9.+#_-]+)((\s+\w+(=(\w+|"[^"]*"))?)*)\s*$/
    @language, @options = $1, $2.scan(/(\w+)(?:=(?:(\w+)|"([^"]*)"))?/).map do |key, value, list|
      [ key.to_sym, list ? list.split : (value || true) ]
    end.to_h
  else
    @language, @options = nil, {}
    $log.error("Unable to parse highlight tag: #{markup}") unless markup.strip.empty?
  end

  begin
    require 'rouge'
  rescue LoadError => e
    $log.warn("Unable to load the rouge gem required by the highlight tag: #{e}")
  end
end

Public Instance Methods

render(context) click to toggle source
Calls superclass method
# File lib/liquid_ext.rb, line 191
def render(context)
  source = super.to_s.gsub(/\A[\r\n]+|[\r\n]+\z/, '')

  if defined?(Rouge)
    rouge_options = {
      :line_numbers => @options[:linenos] == true ? 'inline' : @options[:linenos],
      :wrap         => false,
      :css_class    => 'highlight',
      :gutter_class => 'gutter',
      :code_class   => 'code'
    }.merge(@options)

    lexer     = Rouge::Lexer.find_fancy(@language, source) || Rouge::Lexers::PlainText
    formatter = Rouge::Formatters::HTMLLegacy.new(rouge_options)
    source    = formatter.format(lexer.lex(source))

    $log.warn("No language specified in highlight tag. Will use #{lexer.class.name} to parse the code.") if @language.nil?
  end

  code_attributes = @language ? " class=\"language-#{@language.tr('+', '-')}\" data-lang=\"#{@language}\"" : ""
  "<figure class=\"highlight\"><pre><code#{code_attributes}>#{source.chomp}</code></pre></figure>"
end