Project

General

Profile

Patch #42737 » 0001-If-not-needed-stop-traverse.patch

Takashi Kato, 2026-02-06 00:03

View differences:

lib/redmine/wiki_formatting/common_mark/formatter.rb
54 54

  
55 55
      SANITIZER = SanitizationFilter.new
56 56
      SCRUBBERS = [
57
        Redmine::WikiFormatting::CopypreScrubber.new,
57 58
        SyntaxHighlightScrubber.new,
58 59
        Redmine::WikiFormatting::TablesortScrubber.new,
59
        Redmine::WikiFormatting::CopypreScrubber.new,
60 60
        FixupAutoLinksScrubber.new,
61 61
        ExternalLinksScrubber.new,
62 62
        AlertsIconsScrubber.new
......
73 73
          html = MarkdownFilter.new(@text, PIPELINE_CONFIG).call
74 74
          fragment = Redmine::WikiFormatting::HtmlParser.parse(html)
75 75
          SANITIZER.call(fragment)
76
          SCRUBBERS.each do |scrubber|
77
            fragment.scrub!(scrubber)
76

  
77
          scrubber = Loofah::Scrubber.new do |node|
78
            SCRUBBERS.each do |s|
79
              result = s.scrub(node)
80
              break result if result == Loofah::Scrubber::STOP
81
              break if node.parent.nil?
82
            end
78 83
          end
84
          fragment.scrub!(scrubber)
79 85
          fragment.to_s
80 86
        end
81 87
      end
lib/redmine/wiki_formatting/common_mark/syntax_highlight_scrubber.rb
35 35
          lang = $1
36 36
          text = node.inner_text
37 37
          process node, text, lang
38
          Loofah::Scrubber::STOP
38 39
        end
39 40
      end
40 41
    end
lib/redmine/wiki_formatting/html_sanitizer.rb
27 27
      def self.call(html)
28 28
        fragment = HtmlParser.parse(html)
29 29
        SANITIZER.call(fragment)
30
        SCRUBBERS.each do |scrubber|
31
          fragment.scrub!(scrubber)
30
        scrubber = Loofah::Scrubber.new do |node|
31
          SCRUBBERS.each do |s|
32
            result = s.scrub(node)
33
            break result if result == Loofah::Scrubber::STOP
34
            break if node.parent.nil?
35
          end
32 36
        end
37
        fragment.scrub!(scrubber)
33 38
        fragment.to_s
34 39
      end
35 40
    end
lib/redmine/wiki_formatting/textile/formatter.rb
21 21
  module WikiFormatting
22 22
    module Textile
23 23
      SCRUBBERS = [
24
        Redmine::WikiFormatting::CopypreScrubber.new,
24 25
        SyntaxHighlightScrubber.new,
25
        Redmine::WikiFormatting::TablesortScrubber.new,
26
        Redmine::WikiFormatting::CopypreScrubber.new
26
        Redmine::WikiFormatting::TablesortScrubber.new
27 27
      ]
28 28

  
29 29
      class Formatter
......
39 39
        def to_html(*rules)
40 40
          html = @filter.to_html(rules)
41 41
          fragment = Loofah.html5_fragment(html)
42
          SCRUBBERS.each do |scrubber|
43
            fragment.scrub!(scrubber)
42
          scrubber = Loofah::Scrubber.new do |node|
43
            SCRUBBERS.each do |s|
44
              result = s.scrub(node)
45
              break result if result == Loofah::Scrubber::STOP
46
              break if node.parent.nil?
47
            end
44 48
          end
49
          fragment.scrub!(scrubber)
45 50
          fragment.to_s
46 51
        end
47 52
      end
lib/redmine/wiki_formatting/textile/syntax_highlight_scrubber.rb
34 34
          end
35 35

  
36 36
          process node, text, lang
37
          Loofah::Scrubber::STOP
37 38
        end
38 39
      end
39 40
    end
test/helpers/application_helper_test.rb
1447 1447
    end
1448 1448
  end
1449 1449

  
1450
  def test_syntax_highlight_common_mark
1451
    raw = <<~RAW
1452
      ```ECMA_script
1453
      /* Hello */
1454
      document.write("Hello World!");
1455
      ```
1456
    RAW
1457
    expected = <<~EXPECTED
1458
      #{pre_wrapper('<pre data-clipboard-target="pre"><code class="ECMA_script syntaxhl" data-language="ECMA_script"><span class="cm">/* Hello */</span><span class="nb">document</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="dl">"</span><span class="s2">Hello World!</span><span class="dl">"</span><span class="p">);</span></code></pre>')}
1459
    EXPECTED
1460
    with_settings :text_formatting => 'common_mark' do
1461
      assert_equal expected.gsub(%r{[\r\n\t]}, ''), textilizable(raw).gsub(%r{[\r\n\t]}, '')
1462
    end
1463
  end
1464

  
1450 1465
  def test_syntax_highlight_ampersand_in_textile
1451 1466
    raw = <<~RAW
1452 1467
      <pre><code class="ruby">
(4-4/4)