Class: HTML::Pipeline::SyntaxHighlightFilter
- Inherits:
-
Filter
- Object
- Filter
- HTML::Pipeline::SyntaxHighlightFilter
show all
- Defined in:
- lib/html/pipeline/syntax_highlight_filter.rb
Overview
HTML Filter that syntax highlights code blocks wrapped in <pre lang=“…”>.
Instance Attribute Summary
Attributes inherited from Filter
#context, #result
Instance Method Summary
collapse
Methods inherited from Filter
#base_url, call, #current_user, #doc, #has_ancestor?, #html, #needs, #parse_html, #repository, to_document, to_html, #validate
Constructor Details
8
9
10
11
|
# File 'lib/html/pipeline/syntax_highlight_filter.rb', line 8
def initialize(*args)
super(*args)
@formatter = Rouge::Formatters::HTML.new
end
|
Instance Method Details
#call ⇒ Object
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# File 'lib/html/pipeline/syntax_highlight_filter.rb', line 13
def call
doc.search('pre').each do |node|
default = context[:highlight] && context[:highlight].to_s
next unless lang = node['lang'] || default
next unless lexer = lexer_for(lang)
text = node.inner_text
html = highlight_with_timeout_handling(text, lang)
next if html.nil?
next unless (node = node.replace(html).first)
klass = node['class']
klass = [klass, "highlight-#{lang}"].compact.join ' '
node['class'] = klass
end
doc
end
|
#highlight_with_timeout_handling(text, lang) ⇒ Object
32
33
34
35
36
|
# File 'lib/html/pipeline/syntax_highlight_filter.rb', line 32
def highlight_with_timeout_handling(text, lang)
Rouge.highlight(text, lang, @formatter)
rescue Timeout::Error => _
nil
end
|
#lexer_for(lang) ⇒ Object
38
39
40
|
# File 'lib/html/pipeline/syntax_highlight_filter.rb', line 38
def lexer_for(lang)
Rouge::Lexer.find(lang)
end
|