Patch #35104 » 0001-unify-code-blocks.patch
lib/redmine/wiki_formatting/markdown/formatter.rb | ||
---|---|---|
38 | 38 | |
39 | 39 |
def block_code(code, language) |
40 | 40 |
if language.present? && Redmine::SyntaxHighlighting.language_supported?(language) |
41 |
"<pre><code class=\"#{CGI.escapeHTML language} syntaxhl\">" + |
|
42 |
Redmine::SyntaxHighlighting.highlight_by_language(code, language) + |
|
43 |
"</code></pre>" |
|
41 |
html = Redmine::SyntaxHighlighting.highlight_by_language(code, language) |
|
42 |
classattr = " class=\"#{CGI.escapeHTML language} syntaxhl\"" |
|
44 | 43 |
else |
45 |
"<pre>" + CGI.escapeHTML(code) + "</pre>"
|
|
44 |
html = CGI.escapeHTML(code)
|
|
46 | 45 |
end |
46 |
# original language for extension development |
|
47 |
langattr = " data-language=\"#{CGI.escapeHTML language}\"" if language.present? |
|
48 |
"<pre><code#{classattr}#{langattr}>#{html}</code></pre>" |
|
47 | 49 |
end |
48 | 50 | |
49 | 51 |
def image(link, title, alt_text) |
lib/redmine/wiki_formatting/textile/formatter.rb | ||
---|---|---|
128 | 128 |
if content.match(/<code\s+class=(?:"([^"]+)"|'([^']+)')>\s?(.*)/m) |
129 | 129 |
language = $1 || $2 |
130 | 130 |
text = $3 |
131 |
# original language for extension development |
|
132 |
langattr = " data-language=\"#{CGI.escapeHTML language}\"" if language.present? |
|
131 | 133 |
if Redmine::SyntaxHighlighting.language_supported?(language) |
132 | 134 |
text.gsub!(/x%x%/, '&') |
133 |
content = "<code class=\"#{language} syntaxhl\">" +
|
|
135 |
content = "<code class=\"#{CGI.escapeHTML language} syntaxhl\"#{langattr}>" +
|
|
134 | 136 |
Redmine::SyntaxHighlighting.highlight_by_language(text, language) |
135 | 137 |
else |
136 |
content = "<code>#{ERB::Util.h(text)}" |
|
138 |
content = "<code#{langattr}>#{ERB::Util.h(text)}"
|
|
137 | 139 |
end |
138 | 140 |
end |
139 | 141 |
content |
test/unit/lib/redmine/wiki_formatting/markdown_formatter_test.rb | ||
---|---|---|
70 | 70 |
STR |
71 | 71 |
assert_select_in @formatter.new(text).to_html, 'pre code.ruby.syntaxhl' do |
72 | 72 |
assert_select 'span.k', :text => 'def' |
73 |
assert_select "[data-language='ruby']" |
|
73 | 74 |
end |
74 | 75 |
end |
75 | 76 | |
... | ... | |
79 | 80 |
test |
80 | 81 |
~~~ |
81 | 82 |
STR |
82 |
assert_equal "<pre>test\n</pre>", @formatter.new(text).to_html |
|
83 |
assert_equal "<pre><code data-language=\"foo\">test\n</code></pre>", @formatter.new(text).to_html |
|
84 |
end |
|
85 | ||
86 |
def test_should_preserve_code_block_language_in_data_language |
|
87 |
text = <<~STR |
|
88 |
~~~c-k&r |
|
89 |
test |
|
90 |
~~~ |
|
91 |
STR |
|
92 |
assert_equal "<pre><code data-language=\"c-k&r\">test\n</code></pre>", @formatter.new(text).to_html |
|
83 | 93 |
end |
84 | 94 | |
85 | 95 |
def test_external_links_should_have_external_css_class |
test/unit/lib/redmine/wiki_formatting/textile_formatter_test.rb | ||
---|---|---|
596 | 596 |
end |
597 | 597 | |
598 | 598 |
def test_should_not_allow_arbitrary_class_attribute_on_offtags |
599 |
%w(code pre kbd).each do |tag| |
|
600 |
assert_html_output({"<#{tag} class=\"foo\">test</#{tag}>" => "<#{tag}>test</#{tag}>"}, false) |
|
601 |
assert_html_output({"<#{tag} class='foo'>test</#{tag}>" => "<#{tag}>test</#{tag}>"}, false) |
|
602 |
assert_html_output({"<#{tag} class=\"ruby foo\">test</#{tag}>" => "<#{tag}>test</#{tag}>"}, false) |
|
603 |
assert_html_output({"<#{tag} class='ruby foo'>test</#{tag}>" => "<#{tag}>test</#{tag}>"}, false) |
|
604 |
assert_html_output({"<#{tag} class=\"ruby \"foo\" bar\">test</#{tag}>" => "<#{tag}>test</#{tag}>"}, false) |
|
599 |
{ |
|
600 |
"class=\"foo\"" => "data-language=\"foo\"", |
|
601 |
"class='foo'" => "data-language=\"foo\"", |
|
602 |
"class=\"ruby foo\"" => "data-language=\"ruby foo\"", |
|
603 |
"class='ruby foo'" => "data-language=\"ruby foo\"", |
|
604 |
"class=\"ruby \"foo\" bar\"" => "data-language=\"ruby \"", |
|
605 |
}.each do |classattr, codeattr| |
|
606 |
assert_html_output({"<code #{classattr}>test</code>" => "<code #{codeattr}>test</code>"}, false) |
|
607 |
assert_html_output({"<pre #{classattr}>test</pre>" => "<pre>test</pre>"}, false) |
|
608 |
assert_html_output({"<kbd #{classattr}>test</kbd>" => "<kbd>test</kbd>"}, false) |
|
605 | 609 |
end |
606 | 610 | |
607 | 611 |
assert_html_output({"<notextile class=\"foo\">test</notextile>" => "test"}, false) |
... | ... | |
615 | 619 |
# language name is double-quoted |
616 | 620 |
assert_html_output( |
617 | 621 |
{"<code class=\"ruby\">test</code>" => |
618 |
"<code class=\"ruby syntaxhl\"><span class=\"nb\">test</span></code>"}, |
|
622 |
"<code class=\"ruby syntaxhl\" data-language=\"ruby\"><span class=\"nb\">test</span></code>"},
|
|
619 | 623 |
false |
620 | 624 |
) |
621 | 625 |
# language name is single-quoted |
622 | 626 |
assert_html_output( |
623 | 627 |
{"<code class='ruby'>test</code>" => |
624 |
"<code class=\"ruby syntaxhl\"><span class=\"nb\">test</span></code>"}, |
|
628 |
"<code class=\"ruby syntaxhl\" data-language=\"ruby\"><span class=\"nb\">test</span></code>"}, |
|
629 |
false |
|
630 |
) |
|
631 |
end |
|
632 | ||
633 |
def test_should_preserve_code_language_class_attribute_in_data_language |
|
634 |
assert_html_output( |
|
635 |
{ |
|
636 |
"<code class=\"foolang\">unsupported language</code>" => |
|
637 |
"<code data-language=\"foolang\">unsupported language</code>", |
|
638 |
"<code class=\"c-k&r\">special-char language</code>" => |
|
639 |
"<code data-language=\"c-k&r\">special-char language</code>", |
|
640 |
}, |
|
625 | 641 |
false |
626 | 642 |
) |
627 | 643 |
end |