function entity_embed_escape_cdata_element in Entity Embed 7.2
Same name and namespace in other branches
- 7.3 includes/entity_embed.html.inc \entity_embed_escape_cdata_element()
- 7 includes/entity_embed.html.inc \entity_embed_escape_cdata_element()
Adds comments around a <!CDATA section in a \DOMNode.
\DOMDocument::loadHTML() in \Drupal\Component\Utility\Html::load() makes CDATA sections from the contents of inline script and style tags. This can cause HTML4 browsers to throw exceptions.
This function attempts to solve the problem by creating a \DOMDocumentFragment to comment the CDATA tag.
Parameters
\DOMNode $node: The element potentially containing a CDATA node.
string $comment_start: (optional) A string to use as a comment start marker to escape the CDATA declaration. Defaults to '//'.
string $comment_end: (optional) A string to use as a comment end marker to escape the CDATA declaration. Defaults to an empty string.
1 call to entity_embed_escape_cdata_element()
- entity_embed_serialize in includes/
entity_embed.html.inc - Converts the body of a \DOMDocument back to an HTML snippet.
File
- includes/
entity_embed.html.inc, line 60 - DOM processing functions.
Code
function entity_embed_escape_cdata_element(\DOMNode $node, $comment_start = '//', $comment_end = '') {
foreach ($node->childNodes as $child_node) {
if ($child_node instanceof \DOMCdataSection) {
$embed_prefix = "\n<!--{$comment_start}--><![CDATA[{$comment_start} ><!--{$comment_end}\n";
$embed_suffix = "\n{$comment_start}--><!]]>{$comment_end}\n";
// Prevent invalid cdata escaping as this would throw a DOM error.
// This is the same behavior as found in libxml2.
// Related W3C standard: http://www.w3.org/TR/REC-xml/#dt-cdsection
// Fix explanation: http://en.wikipedia.org/wiki/CDATA#Nesting
$data = str_replace(']]>', ']]]]><![CDATA[>', $child_node->data);
$fragment = $node->ownerDocument
->createDocumentFragment();
$fragment
->appendXML($embed_prefix . $data . $embed_suffix);
$node
->appendChild($fragment);
$node
->removeChild($child_node);
}
}
}