Don't fail to highlight when Rouge doesn't have a lexer
This commit is contained in:
parent
fbd75c35fd
commit
82959349dd
2 changed files with 35 additions and 14 deletions
|
@ -19,21 +19,22 @@ module Banzai
|
|||
language = node.attr('class')
|
||||
code = node.text
|
||||
|
||||
lexer = Rouge::Lexer.find_fancy(language)
|
||||
css_classes = "code highlight"
|
||||
|
||||
lexer = Rouge::Lexer.find_fancy(language) || Rouge::Lexers::PlainText
|
||||
formatter = Rouge::Formatters::HTML.new
|
||||
css_classes = "code highlight js-syntax-highlight #{lexer.tag}"
|
||||
|
||||
begin
|
||||
highlighted = ''
|
||||
highlighted << %(<pre class="#{css_classes}"><code>)
|
||||
highlighted << formatter.format(lexer.lex(code))
|
||||
highlighted << %(</code></pre>)
|
||||
code = formatter.format(lexer.lex(code))
|
||||
|
||||
css_classes << " js-syntax-highlight #{lexer.tag}"
|
||||
rescue
|
||||
# Gracefully handle syntax highlighter bugs/errors to ensure
|
||||
# users can still access an issue/comment/etc.
|
||||
highlighted = "<pre>#{code}</pre>"
|
||||
end
|
||||
|
||||
highlighted = %(<pre class="#{css_classes}"><code>#{code}</code></pre>)
|
||||
|
||||
# Extracted to a method to measure it
|
||||
replace_parent_pre_element(node, highlighted)
|
||||
end
|
||||
|
|
|
@ -3,15 +3,35 @@ require 'spec_helper'
|
|||
describe Banzai::Filter::SyntaxHighlightFilter, lib: true do
|
||||
include FilterSpecHelper
|
||||
|
||||
it 'highlights valid code blocks' do
|
||||
result = filter('<pre><code>def fun end</code>')
|
||||
expect(result.to_html).to eq("<pre class=\"code highlight js-syntax-highlight plaintext\"><code>def fun end</code></pre>")
|
||||
context "when no language is specified" do
|
||||
it "highlights as plaintext" do
|
||||
result = filter('<pre><code>def fun end</code></pre>')
|
||||
expect(result.to_html).to eq('<pre class="code highlight js-syntax-highlight plaintext"><code>def fun end</code></pre>')
|
||||
end
|
||||
end
|
||||
|
||||
it 'passes through invalid code blocks' do
|
||||
allow_any_instance_of(Rouge::Formatter).to receive(:format).and_raise(StandardError)
|
||||
context "when a valid language is specified" do
|
||||
it "highlights as that language" do
|
||||
result = filter('<pre><code class="ruby">def fun end</code></pre>')
|
||||
expect(result.to_html).to eq('<pre class="code highlight js-syntax-highlight ruby"><code><span class="k">def</span> <span class="nf">fun</span> <span class="k">end</span></code></pre>')
|
||||
end
|
||||
end
|
||||
|
||||
result = filter('<pre><code>This is a test</code></pre>')
|
||||
expect(result.to_html).to eq('<pre>This is a test</pre>')
|
||||
context "when an invalid language is specified" do
|
||||
it "highlights as plaintext" do
|
||||
result = filter('<pre><code class="gnuplot">This is a test</code></pre>')
|
||||
expect(result.to_html).to eq('<pre class="code highlight js-syntax-highlight plaintext"><code>This is a test</code></pre>')
|
||||
end
|
||||
end
|
||||
|
||||
context "when Rouge formatting fails" do
|
||||
before do
|
||||
allow_any_instance_of(Rouge::Formatter).to receive(:format).and_raise(StandardError)
|
||||
end
|
||||
|
||||
it "highlights as plaintext" do
|
||||
result = filter('<pre><code class="ruby">This is a test</code></pre>')
|
||||
expect(result.to_html).to eq('<pre class="code highlight"><code>This is a test</code></pre>')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue