diff options
author | Asmir Mustafic <[email protected]> | 2014-07-09 09:21:42 +0200 |
---|---|---|
committer | Asmir Mustafic <[email protected]> | 2014-07-09 09:21:42 +0200 |
commit | d31d82ebe8bf43f88dba8db1a1d9e6c466e06f41 (patch) | |
tree | ac73a17302661d7791c50d7b14de9779a9c62573 /src | |
parent | 072da11763d0188e0dad12335c85f43fe6fcf9b2 (diff) |
Optimized namespaceAttrs, removing one xpath query
Diffstat (limited to 'src')
-rw-r--r-- | src/HTML5/Serializer/OutputRules.php | 34 |
1 files changed, 11 insertions, 23 deletions
diff --git a/src/HTML5/Serializer/OutputRules.php b/src/HTML5/Serializer/OutputRules.php index 1ab5c76..537a4bf 100644 --- a/src/HTML5/Serializer/OutputRules.php +++ b/src/HTML5/Serializer/OutputRules.php @@ -35,10 +35,12 @@ class OutputRules implements \Masterminds\HTML5\Serializer\RulesInterface * * @var array */ - protected $nsRoots = array( - 'html' => self::NAMESPACE_HTML, - 'svg' => self::NAMESPACE_SVG, - 'math' => self::NAMESPACE_MATHML + protected $implicitNamespaces = array( + self::NAMESPACE_HTML, + self::NAMESPACE_SVG, + self::NAMESPACE_MATHML, + self::NAMESPACE_XML, + self::NAMESPACE_XMLNS, ); @@ -185,27 +187,13 @@ class OutputRules implements \Masterminds\HTML5\Serializer\RulesInterface */ protected function namespaceAttrs($ele) { - $this->xpath = new \DOMXPath($ele->ownerDocument); - $declared = array(); - - $declared["xmlns:xml"] = "http://www.w3.org/XML/1998/namespace"; - - if ($ele->parentNode) { - foreach( $this->xpath->query('namespace::*', $ele->parentNode ) as $nsNode ) { - $declared[$nsNode->nodeName] = $nsNode->nodeValue; - } - } - foreach( $this->xpath->query('namespace::*', $ele ) as $nsNode ) { - if (isset($declared[$nsNode->nodeName]) && $declared[$nsNode->nodeName] === $nsNode->nodeValue) { - unset($declared[$nsNode->nodeName]); - } else { - $declared[$nsNode->nodeName] = $nsNode->nodeValue; - } + if (!$this->xpath || $this->xpath->document !== $ele->ownerDocument){ + $this->xpath = new \DOMXPath($ele->ownerDocument); } - foreach( $declared as $aName => $aValue ) { - if (!in_array($aValue, $this->nsRoots)) { - $this->wr(' ')->wr($aName)->wr('="')->wr($aValue)->wr('"'); + foreach( $this->xpath->query('namespace::*[not(.=../../namespace::*)]', $ele ) as $nsNode ) { + if (!in_array($nsNode->nodeValue, $this->implicitNamespaces)) { + $this->wr(' ')->wr($nsNode->nodeName)->wr('="')->wr($nsNode->nodeValue)->wr('"'); } } } |