Browse Source

Fixing bugs exposed when trying to extend Serializer

pretty-print
Dustin Wilson 3 years ago
parent
commit
6da73a3dab
  1. 72
      lib/Parser/Serializer.php

72
lib/Parser/Serializer.php

@ -88,7 +88,7 @@ abstract class Serializer {
# If the node is a template element, then let the node instead be the template
# element's template contents (a DocumentFragment node).
elseif ($node->tagName === 'template') {
$node = self::getTemplateContent($node);
$node = static::getTemplateContent($node);
}
}
if ($node instanceof \DOMElement || $node instanceof \DOMDocument || $node instanceof \DOMDocumentFragment) {
@ -109,16 +109,6 @@ abstract class Serializer {
# 2. Let s be a string, and initialize it to the empty string.
$s = '';
# 3. If the node is a template element, then let the node instead be the
# template element’s template contents (a DocumentFragment node).
if ($node instanceof \DOMElement) {
$htmlElement = ($node->namespaceURI ?? Parser::HTML_NAMESPACE) === Parser::HTML_NAMESPACE;
if ($htmlElement && $node->tagName === 'template') {
$node = self::getTemplateContent($node);
}
}
# If current node is an Element
if ($node instanceof \DOMElement) {
extract($serializerState);
@ -133,16 +123,17 @@ abstract class Serializer {
$tagName = self::uncoerceName($node->tagName);
}
$htmlElement = ($node->namespaceURI ?? Parser::HTML_NAMESPACE) === Parser::HTML_NAMESPACE;
if ($reformatWhitespace) {
$modify = false;
$preformattedContent = $preformattedContent ?: self::isPreformattedContent($node);
$preformattedContent = $preformattedContent ?: static::isPreformattedContent($node);
// If the node is an HTML element...
if ($htmlElement) {
// If the element's parent is to be treated as block then we need to modify
// whitespace.
if (!$first && self::treatAsBlock($node->parentNode)) {
if (!$first && static::treatAsBlock($node->parentNode)) {
$modify = true;
}
}
@ -159,7 +150,7 @@ abstract class Serializer {
$modify = true;
$foreignAsBlock = true;
} elseif (($node->parentNode->namespaceURI ?? Parser::HTML_NAMESPACE) === Parser::HTML_NAMESPACE) {
if (self::treatAsBlock($node->parentNode)) {
if (static::treatAsBlock($node->parentNode)) {
$modify = true;
$foreignAsBlock = true;
}
@ -171,7 +162,7 @@ abstract class Serializer {
// the document.
// TODO: Figure out how to make this not fire on every single "inline" svg
// element.
elseif (self::treatForeignRootAsBlock($node->parentNode)) {
elseif (static::treatForeignRootAsBlock($node->parentNode)) {
$modify = true;
$foreignAsBlock = true;
}
@ -276,7 +267,12 @@ abstract class Serializer {
}
}
$hasChildNodes = $node->hasChildNodes();
if ($htmlElement && $tagName === 'template') {
$node = static::getTemplateContent($node);
$hasChildNodes = $node->hasChildNodes();
} else {
$hasChildNodes = $node->hasChildNodes();
}
if (!$endTags && !$htmlElement && !$hasChildNodes) {
$s .= '/>';
@ -321,26 +317,20 @@ abstract class Serializer {
if (!$preformattedContent) {
$modify = false;
if ($foreignAsBlock) {
$firstElementChild = null;
if (property_exists($node, 'firstElementChild')) {
if ($node->firstElementChild !== null) {
$modify = true;
$firstElementChild = null;
if (property_exists($node, 'firstElementChild')) {
$firstElementChild = $node->firstElementChild;
} else {
$n = $node->firstChild;
do {
if ($n instanceof \DOMElement) {
$firstElementChild = $n;
break;
}
} else {
$n = $node->firstChild;
do {
if ($n instanceof \DOMElement) {
$modify = true;
break;
}
} while ($n = $n->nextSibling);
}
} elseif ($htmlElement && self::treatAsBlock($node)) {
$modify = true;
} while ($n = $n->nextSibling);
}
if ($modify) {
if ($firstElementChild !== null && ($foreignAsBlock || ($htmlElement && static::treatAsBlock($node)))) {
$s .= "\n" . str_repeat($indentChar, $indentionLevel * $indentStep);
}
}
@ -366,8 +356,8 @@ abstract class Serializer {
$data = $node->data;
if ($serializerState['reformatWhitespace']) {
$preformattedContent = $serializerState['preformattedContent'] ?: self::isPreformattedContent($node);
if (!$preformattedContent && ($serializerState['foreignAsBlock'] || self::treatAsBlock($node->parentNode)) && strspn($data, Data::WHITESPACE) === strlen($data)) {
$preformattedContent = $serializerState['preformattedContent'] ?: static::isPreformattedContent($node);
if (!$preformattedContent && ($serializerState['foreignAsBlock'] || static::treatAsBlock($node->parentNode)) && strspn($data, Data::WHITESPACE) === strlen($data)) {
return $s;
}
@ -381,8 +371,8 @@ abstract class Serializer {
# If current node is a Comment
elseif ($node instanceof \DOMComment) {
if ($serializerState['reformatWhitespace'] && !$serializerState['first']) {
$preformattedContent = $serializerState['preformattedContent'] ?: self::isPreformattedContent($node);
if (!$preformattedContent && ($serializerState['foreignAsBlock'] || self::treatAsBlock($node->parentNode))) {
$preformattedContent = $serializerState['preformattedContent'] ?: static::isPreformattedContent($node);
if (!$preformattedContent && ($serializerState['foreignAsBlock'] || static::treatAsBlock($node->parentNode))) {
$n = $node;
while ($n = $n->previousSibling) {
if (!$n instanceof \DOMText) {
@ -407,8 +397,8 @@ abstract class Serializer {
# If current node is a ProcessingInstruction
elseif ($node instanceof \DOMProcessingInstruction) {
if ($serializerState['reformatWhitespace'] && !$serializerState['first']) {
$preformattedContent = $serializerState['preformattedContent'] ?: self::isPreformattedContent($node);
if (!$preformattedContent && ($serializerState['foreignAsBlock'] || self::treatAsBlock($node->parentNode))) {
$preformattedContent = $serializerState['preformattedContent'] ?: static::isPreformattedContent($node);
if (!$preformattedContent && ($serializerState['foreignAsBlock'] || static::treatAsBlock($node->parentNode))) {
$n = $node;
while ($n = $n->previousSibling) {
if (!$n instanceof \DOMText) {
@ -528,7 +518,7 @@ abstract class Serializer {
if ($n instanceof \DOMDocument || $n instanceof \DOMDocumentFragment || ($n instanceof \DOMElement && $n->parentNode === null)) {
return true;
} elseif (($n->parentNode->namespaceURI ?? Parser::HTML_NAMESPACE) === Parser::HTML_NAMESPACE) {
if (self::treatAsBlock($n->parentNode)) {
if (static::treatAsBlock($n->parentNode)) {
return true;
}
break;

Loading…
Cancel
Save