43 lines
1.1 KiB
Ruby
43 lines
1.1 KiB
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", "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)
|
|
[:html, :css, :sass, :scss].each do |format|
|
|
doc.css("pre.source-code.#{format}, code.#{format}").each do |el|
|
|
new_element = Nokogiri.make(highlight(el.inner_text, format))
|
|
new_element.set_attribute("class", new_element.attribute("class").value+" "+el.attribute("class").value)
|
|
if id = el.attribute("id")
|
|
new_element.set_attribute("id", id)
|
|
end
|
|
el.replace new_element
|
|
end
|
|
end
|
|
doc.to_s
|
|
end
|
|
|
|
end
|