diff --git a/core/modules/filter/src/Plugin/Filter/FilterCaption.php b/core/modules/filter/src/Plugin/Filter/FilterCaption.php index 76a1125..627379e 100644 --- a/core/modules/filter/src/Plugin/Filter/FilterCaption.php +++ b/core/modules/filter/src/Plugin/Filter/FilterCaption.php @@ -72,16 +72,18 @@ public function process($text, $langcode) { $altered_html = drupal_render($filter_caption); // Load the altered HTML into a new DOMDocument and retrieve the element. - $updated_node = Html::load($altered_html)->getElementsByTagName('body') + $updated_nodes = Html::load($altered_html)->getElementsByTagName('body') ->item(0) - ->childNodes - ->item(0); + ->childNodes; - // Import the updated node from the new DOMDocument into the original - // one, importing also the child nodes of the updated node. - $updated_node = $dom->importNode($updated_node, TRUE); - // Finally, replace the original node with the new node. - $node->parentNode->replaceChild($updated_node, $node); + foreach ($updated_nodes as $updated_node) { + // Import the updated node from the new DOMDocument into the original + // one, importing also the child nodes of the updated node. + $updated_node = $dom->importNode($updated_node, TRUE); + $node->parentNode->insertBefore($updated_node, $node); + } + // Finally, remove the original data-caption node. + $node->parentNode->removeChild($node); } $result->setProcessedText(Html::serialize($dom)) diff --git a/core/modules/filter/src/Tests/FilterTwigDebugTest.php b/core/modules/filter/src/Tests/FilterTwigDebugTest.php new file mode 100644 index 0000000..83302f1 --- /dev/null +++ b/core/modules/filter/src/Tests/FilterTwigDebugTest.php @@ -0,0 +1,114 @@ +container->getParameter('twig.config'); + if (! $parameters['debug']) { + $parameters['debug'] = TRUE; + $this->setContainerParameter('twig.config', $parameters); + $this->rebuildContainer(); + $this->resetAll(); + } + } + + /** + * Ensures twig debugging is off in the current container. + */ + protected function debugOff() { + // Disable debug, rebuild the service container, and clear all caches. + $parameters = $this->container->getParameter('twig.config'); + if ($parameters['debug']) { + $parameters['debug'] = FALSE; + $this->setContainerParameter('twig.config', $parameters); + $this->rebuildContainer(); + $this->resetAll(); + } + } + + /** + * {@inheritdoc} + */ + protected function setUp() { + parent::setUp(); + + $this->debugOn(); + + $manager = $this->container->get('plugin.manager.filter'); + $bag = new FilterPluginCollection($manager, array()); + $this->filters = $bag->getAll(); + } + + /** + * {@inheritdoc} + */ + protected function tearDown() { + $this->debugOff(); + } + + /** + * Tests the caption filter with twig debugging on. + */ + function testCaptionFilter() { + /** @var \Drupal\Core\Render\RendererInterface $renderer */ + $renderer = \Drupal::service('renderer'); + $filter = $this->filters['filter_caption']; + + $test = function($input) use ($filter, $renderer) { + return $renderer->executeInRenderContext(new RenderContext(), function () use ($input, $filter) { + return $filter->process($input, 'und'); + }); + }; + + $attached_library = array( + 'library' => array( + 'filter/caption', + ), + ); + + // No data-caption attribute. + $input = ''; + $expected = $input; + $this->assertIdentical($expected, $test($input)->getProcessedText()); + + // Data-caption attribute. + $input = ''; + $expected = '
Loquacious llama!
'; + $output = $test($input); + $output = $output->getProcessedText(); + $this->assertTrue(strpos($output, $expected) !== false, "\"$output\" contains \"$expected\""); + $this->assertTrue(strpos($output, '') !== false, 'filter_caption theme hook debug comment is present.'); + } + +}