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