devroom.io/lib/pygmentizer_filter.rb
2013-03-24 16:10:43 +01:00

44 lines
1.2 KiB
Ruby

module Nanoc
class PygmentizerFilter < Nanoc::Filter
identifier :pygmentizer
type :text
def run(content, params = {})
doc = Nokogiri::HTML::fragment(content, 'UTF-8')
nodes = doc.search("pre>code")
nodes.each do |node|
code = node.inner_html || "[++where is the code?++]"
node.parent.swap(pygmentize(code))
end
doc.to_html
end
private
def pygmentize(string, pattern = /\A:::(\w+)\s*(\n|&#x000A;)/i)
refs = pattern.match(string) # extract language name
if refs # found a language identifier!
lang = refs[1]
str = unescape_html(string.sub(pattern, ""))
code = ::Pygments.highlight(str, options: {
encoding: 'utf-8',
linenos: 'table',
lexer: lexers.include?(lang) ? lang : nil
})
"<div class='code'>#{code}</div>"
else # No language identifer,
"<pre class='plaincode'>#{string}</pre>"
end
end
private
def lexers
@lexers ||= Pygments.lexers.map { |lex| lex[1][:aliases] }.flatten
end
private
def unescape_html(string)
string.to_s.gsub(/&#x000A;/i, "\n").gsub("&lt;", '<').gsub("&gt;", '>').gsub("&amp;", '&')
end end
end