Loading core/modules/filter/filter.module +21 −0 Original line number Diff line number Diff line Loading @@ -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); Loading core/modules/filter/tests/src/Kernel/FilterKernelTest.php +52 −0 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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. * Loading Loading
core/modules/filter/filter.module +21 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
core/modules/filter/tests/src/Kernel/FilterKernelTest.php +52 −0 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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. * Loading