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, :html, :haml].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