1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
module Nanoc3::Filters
class ColorizeSyntax < Nanoc3::Filter
DEFAULT_COLORIZER = :coderay
def run(content, params={})
require 'nokogiri'
@colorizers = Hash.new(DEFAULT_COLORIZER)
(params[:colorizers] || {}).each_pair do |language, colorizer|
@colorizers[language] = colorizer
end
doc = Nokogiri::HTML.fragment(content)
doc.css('pre > code[class^="lang"]').each do |element|
language = element['class'][/lang-([^ ]+)/].sub(/^lang-/, '')
element.parent.replace(
Nokogiri.make(highlight(element.inner_text, language, params))
)
end
doc.to_s
end
private
KNOWN_COLORIZERS = [ :coderay, :pygmentize ]
def highlight(code, language, params={})
colorizer = @colorizers[language]
if KNOWN_COLORIZERS.include?(colorizer)
send(colorizer, code, language, params[colorizer])
else
raise RuntimeError, "I don’t know how to highlight code using the “#{colorizer}” colorizer"
end
end
def pygmentize(code, language, params={})
IO.popen("pygmentize -l #{language} -f html", "r+") do |io|
io.write(code)
io.close_write
return io.read
end
end
def coderay(code, language, params={})
require 'coderay'
CodeRay.scan(code, language).div(params)
end
end
end
|