diff --git a/lib/redmine/wiki_formatting/html_parser.rb b/lib/redmine/wiki_formatting/html_parser.rb index 80f15b72c..f6f9639e0 100644 --- a/lib/redmine/wiki_formatting/html_parser.rb +++ b/lib/redmine/wiki_formatting/html_parser.rb @@ -36,7 +36,7 @@ module Redmine doc.scrub!(WikiTags.new(tags)) doc.scrub!(:newline_block_elements) - Loofah.remove_extraneous_whitespace(doc.text).strip.squeeze(' ').gsub(/^ +/, '') + Loofah.remove_extraneous_whitespace(doc.text(:encode_special_chars => false)).strip.squeeze(' ').gsub(/^ +/, '') end class WikiTags < ::Loofah::Scrubber @@ -54,6 +54,9 @@ module Redmine when String node.add_next_sibling Nokogiri::XML::Text.new(formatting, node.document) node.remove + when Proc + node.add_next_sibling formatting.call(node) + node.remove else CONTINUE end diff --git a/lib/redmine/wiki_formatting/markdown/html_parser.rb b/lib/redmine/wiki_formatting/markdown/html_parser.rb index 8cc0eaccd..f6f01938a 100644 --- a/lib/redmine/wiki_formatting/markdown/html_parser.rb +++ b/lib/redmine/wiki_formatting/markdown/html_parser.rb @@ -34,7 +34,8 @@ module Redmine 'h3' => {:pre => "\n\n### ", :post => "\n\n"}, 'h4' => {:pre => "\n\n#### ", :post => "\n\n"}, 'h5' => {:pre => "\n\n##### ", :post => "\n\n"}, - 'h6' => {:pre => "\n\n###### ", :post => "\n\n"} + 'h6' => {:pre => "\n\n###### ", :post => "\n\n"}, + 'a' => lambda {|node| node.content.present? ? %Q| [#{node.content}](#{node.attributes['href'].value}) | : %Q| #{node.attributes['href'].value} |} ) end end diff --git a/lib/redmine/wiki_formatting/textile/html_parser.rb b/lib/redmine/wiki_formatting/textile/html_parser.rb index 72890871e..848851b2b 100644 --- a/lib/redmine/wiki_formatting/textile/html_parser.rb +++ b/lib/redmine/wiki_formatting/textile/html_parser.rb @@ -34,7 +34,8 @@ module Redmine 'h3' => {:pre => "\n\nh3. ", :post => "\n\n"}, 'h4' => {:pre => "\n\nh4. ", :post => "\n\n"}, 'h5' => {:pre => "\n\nh5. ", :post => "\n\n"}, - 'h6' => {:pre => "\n\nh6. ", :post => "\n\n"} + 'h6' => {:pre => "\n\nh6. ", :post => "\n\n"}, + 'a' => lambda {|node| node.content.present? ? %Q| "#{node.content}":#{node.attributes['href'].value} | : %Q| #{node.attributes['href'].value} |} ) end end diff --git a/test/unit/lib/redmine/wiki_formatting/markdown_html_parser_test.rb b/test/unit/lib/redmine/wiki_formatting/markdown_html_parser_test.rb index 63fc4ae5c..6a4b77387 100644 --- a/test/unit/lib/redmine/wiki_formatting/markdown_html_parser_test.rb +++ b/test/unit/lib/redmine/wiki_formatting/markdown_html_parser_test.rb @@ -28,5 +28,10 @@ class Redmine::WikiFormatting::MarkdownHtmlParserTest < ActiveSupport::TestCase def test_should_convert_tags assert_equal 'A **simple** html snippet.', @parser.to_text('

A simple html snippet.

') + + assert_equal 'foo [bar](http://example.com/) baz', + @parser.to_text('foobarbaz') + assert_equal 'foo http://example.com/ baz', + @parser.to_text('foobaz') end end diff --git a/test/unit/lib/redmine/wiki_formatting/textile_html_parser_test.rb b/test/unit/lib/redmine/wiki_formatting/textile_html_parser_test.rb index 8d6f78689..a338ed528 100644 --- a/test/unit/lib/redmine/wiki_formatting/textile_html_parser_test.rb +++ b/test/unit/lib/redmine/wiki_formatting/textile_html_parser_test.rb @@ -28,5 +28,10 @@ class Redmine::WikiFormatting::TextileHtmlParserTest < ActiveSupport::TestCase def test_should_convert_tags assert_equal 'A *simple* html snippet.', @parser.to_text('

A simple html snippet.

') + + assert_equal 'foo "bar":http://example.com/ baz', + @parser.to_text('foobarbaz') + assert_equal 'foo http://example.com/ baz', + @parser.to_text('foobaz') end end