Verified Commit 6ac42007 authored by Théodore Biadala's avatar Théodore Biadala
Browse files

Issue #3421843 by scott_euser, smustgrave, Wim Leers, catch: filter_autop...

Issue #3421843 by scott_euser, smustgrave, Wim Leers, catch: filter_autop should ignore twig.config debug html comments
parent 01575cf9
Loading
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -734,6 +734,27 @@ function _filter_autop($text) {
      }
    }
    elseif (!$ignore) {
      // Skip if the next chunk starts with Twig theme debug.
      // @see twig_render_template()
      if (isset($chunks[$i + 1]) && $chunks[$i + 1] === '<!-- THEME DEBUG -->') {
        $chunk = rtrim($chunk, "\n");
        $output .= $chunk;
        continue;
      }

      // Skip if the preceding chunk was the end of a Twig theme debug.
      // @see twig_render_template()
      if (isset($chunks[$i - 1])) {
        if (
          str_starts_with($chunks[$i - 1], '<!-- BEGIN OUTPUT from ')
          || str_starts_with($chunks[$i - 1], '<!-- 💡 BEGIN CUSTOM TEMPLATE OUTPUT from ')
        ) {
          $chunk = ltrim($chunk, "\n");
          $output .= $chunk;
          continue;
        }
      }

      // just to make things a little easier, pad the end
      $chunk = preg_replace('|\n*$|', '', $chunk) . "\n\n";
      $chunk = preg_replace('|<br />\s*<br />|', "\n\n", $chunk);
+52 −0
Original line number Diff line number Diff line
@@ -437,6 +437,20 @@ public function testLineBreakFilter() {
        '<!-- comment -->' => TRUE,
        "<!--\nThree.\n-->" => TRUE,
      ],
      // Do not add paragraph tags around Twig theme debugging.
      "<p>Text here\n<!-- THEME DEBUG -->\n<!-- THEME HOOK: 'html' -->\n<!-- FILE NAME SUGGESTIONS:\n* html--node.html.twig\nx html.html.twig\n-->\n<!-- BEGIN OUTPUT from 'core/themes/olivero/templates/layout/html.html.twig' -->\n<span>Test</span></p>" => [
        "<p>Text here" => TRUE,
        "<p>Text here</p>" => FALSE,
        "<span>Test</span></p>" => TRUE,
        "<p><span>Test</span></p>" => FALSE,
      ],
      // Do not add paragraph tags around custom template Twig theme debugging.
      "<p>Text here\n<!-- THEME DEBUG -->\n<!-- THEME HOOK: 'html' -->\n<!-- FILE NAME SUGGESTIONS:\n* html--node.html.twig\nx html.html.twig\n-->\n<!-- 💡 BEGIN CUSTOM TEMPLATE OUTPUT from 'custom/themes/custom-theme/templates/layout/html.html.twig' -->\n<span>Test</span></p>" => [
        "<p>Text here" => TRUE,
        "<p>Text here</p>" => FALSE,
        "<span>Test</span></p>" => TRUE,
        "<p><span>Test</span></p>" => FALSE,
      ],
      // Resulting HTML should produce matching paragraph tags.
      '<p><div>  </div></p>' => [
        "<p>\n<div>  </div>\n</p>" => TRUE,
@@ -481,6 +495,44 @@ public function testLineBreakFilter() {
    $this->assertEquals($result, '<p>' . $source . "</p>\n", 'Line break filter can process very long strings.');
  }

  /**
   * Tests that the line break filter does not apply to twig debug.
   */
  public function testLineBreakFilterTwigDebug(): void {

    // Enable twig theme debug to ensure that any
    // changes to theme debugging format force checking
    // that the auto paragraph filter continues to be applied
    // correctly.
    $twig = \Drupal::service('twig');
    $twig->enableDebug();

    // Manually render a template in its simplest form.
    $variables = [
      'theme_hook_original' => 'container',
      'directory' => '',
      'children' => 'Test two',
    ];
    include_once $this->root . '/core/themes/engines/twig/twig.engine';
    $render = twig_render_template('container.html.twig', $variables);
    $render = trim($render);

    // Render text before applying the auto paragraph filter.
    $this->assertSame("<!-- THEME DEBUG -->
<!-- THEME HOOK: 'container' -->
<!-- 💡 BEGIN CUSTOM TEMPLATE OUTPUT from 'container.html.twig' -->
<div>Test two</div>

<!-- END CUSTOM TEMPLATE OUTPUT from 'container.html.twig' -->", $render);
    $result = _filter_autop($render);

    // After auto-p is applied, the theme debug should no longer have
    // line breaks but the true line breaks should still.
    $this->assertSame("<!-- THEME DEBUG --><!-- THEME HOOK: 'container' --><!-- 💡 BEGIN CUSTOM TEMPLATE OUTPUT from 'container.html.twig' --><div>Test two</div>

<!-- END CUSTOM TEMPLATE OUTPUT from 'container.html.twig' -->", $result);
  }

  /**
   * Tests filter settings, defaults, access restrictions and similar.
   *