38 lines
915 B
Ruby
38 lines
915 B
Ruby
require 'nokogiri'
|
|
require 'coderay'
|
|
class SyntaxHighlighterFilter < Nanoc3::Filter
|
|
identifier :highlight
|
|
|
|
def highlight(code, type)
|
|
hl_map = Hash.new(:coderay)
|
|
hl_map[:sass] = :pygmentize
|
|
send(hl_map[type], code, type)
|
|
end
|
|
|
|
def pygmentize(code, type)
|
|
# -O linenos=table
|
|
IO.popen("pygmentize -l #{type} -f html -O encoding=utf-8", "r+") do |io|
|
|
io.write(code)
|
|
io.close_write
|
|
return io.read
|
|
end
|
|
end
|
|
|
|
def coderay(code, type)
|
|
# :line_numbers => :table,
|
|
type = :css if type == :scss
|
|
CodeRay.scan(code, type).div(:css => :class)
|
|
end
|
|
|
|
def run(content, params={})
|
|
doc = Nokogiri::HTML.fragment(content)
|
|
[:css, :sass, :scss].each do |format|
|
|
doc.css("pre.source-code.#{format}, code.#{format}").each do |el|
|
|
el.set_attribute("class", "brush: #{format} "+el.attribute("class").value)
|
|
end
|
|
end
|
|
doc.to_s
|
|
end
|
|
|
|
end
|