Skip to content

Commit 76c9cfe

Browse files
authored
Merge pull request #295 from ianks/fix-syntax-hl
Ensure <pre> nodes are not removed after syntax highlighting
2 parents 9c44c43 + 2437bb3 commit 76c9cfe

File tree

4 files changed

+45
-3
lines changed

4 files changed

+45
-3
lines changed

Gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ group :development do
1010
end
1111

1212
group :test do
13-
gem 'commonmarker', '~> 0.14', require: false
13+
gem 'commonmarker', '~> 0.16', require: false
1414
gem 'email_reply_parser', '~> 0.5', require: false
1515
gem 'gemoji', '~> 2.0', require: false
1616
gem 'minitest'

Rakefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Rake::TestTask.new do |t|
99
t.libs << 'test'
1010
t.test_files = FileList['test/**/*_test.rb']
1111
t.verbose = true
12+
t.warning = false
1213
end
1314

1415
task default: :test

lib/html/pipeline/syntax_highlight_filter.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ def call
2020
html = highlight_with_timeout_handling(text, lang)
2121
next if html.nil?
2222

23-
next unless (node = node.replace(html).first)
23+
node.inner_html = html
2424
klass = node['class']
25-
klass = [klass, "highlight-#{lang}"].compact.join ' '
25+
scope = context[:scope] || "highlight-#{lang}"
26+
klass = [klass, scope].compact.join ' '
2627

2728
node['class'] = klass
2829
end

test/html/pipeline/syntax_highlight_filter_test.rb

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
require 'test_helper'
2+
require 'escape_utils'
23

34
SyntaxHighlightFilter = HTML::Pipeline::SyntaxHighlightFilter
45

@@ -19,4 +20,43 @@ def test_highlight_default_will_not_override
1920
assert doc.css('.highlight-coffeescript').empty?
2021
assert !doc.css('.highlight-c').empty?
2122
end
23+
24+
def test_highlight_does_not_remove_pre_tag
25+
filter = SyntaxHighlightFilter.new \
26+
"<pre lang='c'>hello</pre>", highlight: 'coffeescript'
27+
28+
doc = filter.call
29+
30+
assert !doc.css('pre').empty?
31+
end
32+
33+
def test_highlight_allows_optional_scope
34+
filter = SyntaxHighlightFilter.new \
35+
"<pre lang='c'>hello</pre>", highlight: 'coffeescript', scope: 'test-scope'
36+
37+
doc = filter.call
38+
39+
assert !doc.css('pre.test-scope').empty?
40+
end
41+
42+
def test_highlight_keeps_the_pre_tags_lang
43+
filter = SyntaxHighlightFilter.new \
44+
"<pre lang='c'>hello</pre>", highlight: 'coffeescript'
45+
46+
doc = filter.call
47+
48+
assert !doc.css('pre[lang=c]').empty?
49+
end
50+
51+
def test_highlight_handles_nested_pre_tags
52+
inner_code = "<pre>console.log('i am nested!')</pre>"
53+
escaped = EscapeUtils.escape_html(inner_code)
54+
html = "<pre lang='html'>#{escaped}</pre>"
55+
filter = SyntaxHighlightFilter.new html, highlight: 'html'
56+
57+
doc = filter.call
58+
59+
assert_equal 2, doc.css('span[class=nt]').length
60+
assert_equal EscapeUtils.unescape_html(escaped), doc.inner_text
61+
end
2262
end

0 commit comments

Comments
 (0)