diff options
Diffstat (limited to 'lib/banzai/filter/syntax_highlight_filter.rb')
-rw-r--r-- | lib/banzai/filter/syntax_highlight_filter.rb | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/banzai/filter/syntax_highlight_filter.rb b/lib/banzai/filter/syntax_highlight_filter.rb new file mode 100644 index 00000000000..c889cc1e97c --- /dev/null +++ b/lib/banzai/filter/syntax_highlight_filter.rb @@ -0,0 +1,45 @@ +require 'banzai' +require 'html/pipeline/filter' +require 'rouge/plugins/redcarpet' + +module Banzai + module Filter + # HTML Filter to highlight fenced code blocks + # + class SyntaxHighlightFilter < HTML::Pipeline::Filter + include Rouge::Plugins::Redcarpet + + def call + doc.search('pre > code').each do |node| + highlight_node(node) + end + + doc + end + + def highlight_node(node) + language = node.attr('class') + code = node.text + + begin + highlighted = block_code(code, language) + rescue + # Gracefully handle syntax highlighter bugs/errors to ensure + # users can still access an issue/comment/etc. + highlighted = "<pre>#{code}</pre>" + end + + # Replace the parent `pre` element with the entire highlighted block + node.parent.replace(highlighted) + end + + private + + # Override Rouge::Plugins::Redcarpet#rouge_formatter + def rouge_formatter(lexer) + Rouge::Formatters::HTMLGitlab.new( + cssclass: "code highlight js-syntax-highlight #{lexer.tag}") + end + end + end +end |