summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAsmir Mustafic <[email protected]>2014-07-09 09:21:42 +0200
committerAsmir Mustafic <[email protected]>2014-07-09 09:21:42 +0200
commitd31d82ebe8bf43f88dba8db1a1d9e6c466e06f41 (patch)
treeac73a17302661d7791c50d7b14de9779a9c62573 /src
parent072da11763d0188e0dad12335c85f43fe6fcf9b2 (diff)
Optimized namespaceAttrs, removing one xpath query
Diffstat (limited to 'src')
-rw-r--r--src/HTML5/Serializer/OutputRules.php34
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('"');
}
}
}