From: Marius Balteanu Date: Sun, 15 Aug 2021 21:00:16 +0000 (+0000) Subject: Unify code block and add "data-language" attribute with the user-supplied language... X-Git-Tag: 5.0.0~266 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=b7798e6e1c0c5db75b20a83a6ba4a96f83052392;p=redmine.git Unify code block and add "data-language" attribute with the user-supplied language for Textile and Markdown formaters (#35104). Patch by Martin Cizek. git-svn-id: http://svn.redmine.org/redmine/trunk@21183 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- diff --git a/lib/redmine/wiki_formatting/markdown/formatter.rb b/lib/redmine/wiki_formatting/markdown/formatter.rb index 418ab8b14..44d65248f 100644 --- a/lib/redmine/wiki_formatting/markdown/formatter.rb +++ b/lib/redmine/wiki_formatting/markdown/formatter.rb @@ -38,12 +38,14 @@ module Redmine def block_code(code, language) if language.present? && Redmine::SyntaxHighlighting.language_supported?(language) - "
" +
-              Redmine::SyntaxHighlighting.highlight_by_language(code, language) +
-              "
" + html = Redmine::SyntaxHighlighting.highlight_by_language(code, language) + classattr = " class=\"#{CGI.escapeHTML language} syntaxhl\"" else - "
" + CGI.escapeHTML(code) + "
" + html = CGI.escapeHTML(code) end + # original language for extension development + langattr = " data-language=\"#{CGI.escapeHTML language}\"" if language.present? + "
#{html}
" end def image(link, title, alt_text) diff --git a/lib/redmine/wiki_formatting/textile/formatter.rb b/lib/redmine/wiki_formatting/textile/formatter.rb index 8f0200b33..d42530651 100644 --- a/lib/redmine/wiki_formatting/textile/formatter.rb +++ b/lib/redmine/wiki_formatting/textile/formatter.rb @@ -128,12 +128,14 @@ module Redmine if content.match(/\s?(.*)/m) language = $1 || $2 text = $3 + # original language for extension development + langattr = " data-language=\"#{CGI.escapeHTML language}\"" if language.present? if Redmine::SyntaxHighlighting.language_supported?(language) text.gsub!(/x%x%/, '&') - content = "" + + content = "" + Redmine::SyntaxHighlighting.highlight_by_language(text, language) else - content = "#{ERB::Util.h(text)}" + content = "#{ERB::Util.h(text)}" end end content diff --git a/test/helpers/application_helper_test.rb b/test/helpers/application_helper_test.rb index f918f51d1..06dd04b6a 100644 --- a/test/helpers/application_helper_test.rb +++ b/test/helpers/application_helper_test.rb @@ -1328,7 +1328,7 @@ class ApplicationHelperTest < Redmine::HelperTest RAW expected = <<~EXPECTED -
/* Hello */document.write("Hello World!");
+
/* Hello */document.write("Hello World!");
EXPECTED assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '') end @@ -1340,7 +1340,7 @@ class ApplicationHelperTest < Redmine::HelperTest
RAW expected = <<~EXPECTED -
x = a & b
+
x = a & b
EXPECTED with_settings :text_formatting => 'textile' do assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '') diff --git a/test/unit/lib/redmine/wiki_formatting/markdown_formatter_test.rb b/test/unit/lib/redmine/wiki_formatting/markdown_formatter_test.rb index c1264f77b..5be1521a5 100644 --- a/test/unit/lib/redmine/wiki_formatting/markdown_formatter_test.rb +++ b/test/unit/lib/redmine/wiki_formatting/markdown_formatter_test.rb @@ -70,6 +70,7 @@ class Redmine::WikiFormatting::MarkdownFormatterTest < ActionView::TestCase STR assert_select_in @formatter.new(text).to_html, 'pre code.ruby.syntaxhl' do assert_select 'span.k', :text => 'def' + assert_select "[data-language='ruby']" end end @@ -79,7 +80,16 @@ class Redmine::WikiFormatting::MarkdownFormatterTest < ActionView::TestCase test ~~~ STR - assert_equal "
test\n
", @formatter.new(text).to_html + assert_equal "
test\n
", @formatter.new(text).to_html + end + + def test_should_preserve_code_block_language_in_data_language + text = <<~STR + ~~~c-k&r + test + ~~~ + STR + assert_equal "
test\n
", @formatter.new(text).to_html end def test_external_links_should_have_external_css_class diff --git a/test/unit/lib/redmine/wiki_formatting/textile_formatter_test.rb b/test/unit/lib/redmine/wiki_formatting/textile_formatter_test.rb index 5ee4defe1..3a8e0ad0f 100644 --- a/test/unit/lib/redmine/wiki_formatting/textile_formatter_test.rb +++ b/test/unit/lib/redmine/wiki_formatting/textile_formatter_test.rb @@ -596,12 +596,16 @@ class Redmine::WikiFormatting::TextileFormatterTest < ActionView::TestCase end def test_should_not_allow_arbitrary_class_attribute_on_offtags - %w(code pre kbd).each do |tag| - assert_html_output({"<#{tag} class=\"foo\">test" => "<#{tag}>test"}, false) - assert_html_output({"<#{tag} class='foo'>test" => "<#{tag}>test"}, false) - assert_html_output({"<#{tag} class=\"ruby foo\">test" => "<#{tag}>test"}, false) - assert_html_output({"<#{tag} class='ruby foo'>test" => "<#{tag}>test"}, false) - assert_html_output({"<#{tag} class=\"ruby \"foo\" bar\">test" => "<#{tag}>test"}, false) + { + "class=\"foo\"" => "data-language=\"foo\"", + "class='foo'" => "data-language=\"foo\"", + "class=\"ruby foo\"" => "data-language=\"ruby foo\"", + "class='ruby foo'" => "data-language=\"ruby foo\"", + "class=\"ruby \"foo\" bar\"" => "data-language=\"ruby \"", + }.each do |classattr, codeattr| + assert_html_output({"test" => "test"}, false) + assert_html_output({"
test
" => "
test
"}, false) + assert_html_output({"test" => "test"}, false) end assert_html_output({"test" => "test"}, false) @@ -615,13 +619,25 @@ class Redmine::WikiFormatting::TextileFormatterTest < ActionView::TestCase # language name is double-quoted assert_html_output( {"test" => - "test"}, + "test"}, false ) # language name is single-quoted assert_html_output( {"test" => - "test"}, + "test"}, + false + ) + end + + def test_should_preserve_code_language_class_attribute_in_data_language + assert_html_output( + { + "unsupported language" => + "unsupported language", + "special-char language" => + "special-char language", + }, false ) end