summaryrefslogtreecommitdiff
path: root/src/HTML5/Serializer/Traverser.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/HTML5/Serializer/Traverser.php')
-rw-r--r--src/HTML5/Serializer/Traverser.php244
1 files changed, 126 insertions, 118 deletions
diff --git a/src/HTML5/Serializer/Traverser.php b/src/HTML5/Serializer/Traverser.php
index bcb9814..3bd55b4 100644
--- a/src/HTML5/Serializer/Traverser.php
+++ b/src/HTML5/Serializer/Traverser.php
@@ -4,139 +4,147 @@ namespace Masterminds\HTML5\Serializer;
/**
* Traverser for walking a DOM tree.
*
- * This is a concrete traverser designed to convert a DOM tree into an
- * HTML5 document. It is not intended to be a generic DOMTreeWalker
+ * This is a concrete traverser designed to convert a DOM tree into an
+ * HTML5 document. It is not intended to be a generic DOMTreeWalker
* implementation.
*
* @see http://www.w3.org/TR/2012/CR-html5-20121217/syntax.html#serializing-html-fragments
*/
-class Traverser {
+class Traverser
+{
- /** Namespaces that should be treated as "local" to HTML5. */
- static $local_ns = array(
- 'http://www.w3.org/1999/xhtml' => 'html',
- 'http://www.w3.org/1998/Math/MathML' => 'math',
- 'http://www.w3.org/2000/svg' => 'svg',
- );
+ /**
+ * Namespaces that should be treated as "local" to HTML5.
+ */
+ static $local_ns = array(
+ 'http://www.w3.org/1999/xhtml' => 'html',
+ 'http://www.w3.org/1998/Math/MathML' => 'math',
+ 'http://www.w3.org/2000/svg' => 'svg'
+ );
- protected $dom;
- protected $options;
- protected $encode = FALSE;
- protected $rules;
- protected $out;
+ protected $dom;
- /**
- * Create a traverser.
- *
- * @param DOMNode|DOMNodeList $dom
- * The document or node to traverse.
- * @param resource $out
- * A stream that allows writing. The traverser will output into this
- * stream.
- * @param array $options
- * An array or options for the traverser as key/value pairs. These include:
- * - encode_entities: A bool to specify if full encding should happen for all named
- * charachter references. Defaults to FALSE which escapes &'<>".
- * - output_rules: The path to the class handling the output rules.
- */
- public function __construct($dom, $out, RulesInterface $rules, $options = array()) {
- $this->dom = $dom;
- $this->out = $out;
- $this->rules = $rules;
- $this->options = $options;
+ protected $options;
- $this->rules->setTraverser($this);
- }
+ protected $encode = FALSE;
- /**
- * Tell the traverser to walk the DOM.
- *
- * @return resource $out
- * Returns the output stream.
- */
- public function walk() {
-
- if ($this->dom instanceof \DOMDocument) {
- $this->rules->document($this->dom);
- }
- elseif ($this->dom instanceof \DOMDocumentFragment) {
- // Document fragments are a special case. Only the children need to
- // be serialized.
- if ($this->dom->hasChildNodes()) {
- $this->children($this->dom->childNodes);
- }
- }
- // If NodeList, loop
- elseif ($this->dom instanceof \DOMNodeList) {
- // If this is a NodeList of DOMDocuments this will not work.
- $this->children($this->dom);
- }
- // Else assume this is a DOMNode-like datastructure.
- else {
- $this->node($this->dom);
+ protected $rules;
+
+ protected $out;
+
+ /**
+ * Create a traverser.
+ *
+ * @param DOMNode|DOMNodeList $dom
+ * The document or node to traverse.
+ * @param resource $out
+ * A stream that allows writing. The traverser will output into this
+ * stream.
+ * @param array $options
+ * An array or options for the traverser as key/value pairs. These include:
+ * - encode_entities: A bool to specify if full encding should happen for all named
+ * charachter references. Defaults to FALSE which escapes &'<>".
+ * - output_rules: The path to the class handling the output rules.
+ */
+ public function __construct($dom, $out, RulesInterface $rules, $options = array())
+ {
+ $this->dom = $dom;
+ $this->out = $out;
+ $this->rules = $rules;
+ $this->options = $options;
+
+ $this->rules->setTraverser($this);
}
- return $this->out;
- }
+ /**
+ * Tell the traverser to walk the DOM.
+ *
+ * @return resource $out
+ * Returns the output stream.
+ */
+ public function walk()
+ {
+ if ($this->dom instanceof \DOMDocument) {
+ $this->rules->document($this->dom);
+ } elseif ($this->dom instanceof \DOMDocumentFragment) {
+ // Document fragments are a special case. Only the children need to
+ // be serialized.
+ if ($this->dom->hasChildNodes()) {
+ $this->children($this->dom->childNodes);
+ }
+ } // If NodeList, loop
+ elseif ($this->dom instanceof \DOMNodeList) {
+ // If this is a NodeList of DOMDocuments this will not work.
+ $this->children($this->dom);
+ } // Else assume this is a DOMNode-like datastructure.
+ else {
+ $this->node($this->dom);
+ }
+
+ return $this->out;
+ }
- /**
- * Process a node in the DOM.
- *
- * @param mixed $node
- * A node implementing \DOMNode.
- */
- public function node($node) {
- // A listing of types is at http://php.net/manual/en/dom.constants.php
- switch ($node->nodeType) {
- case XML_ELEMENT_NODE:
- $this->rules->element($node);
- break;
- case XML_TEXT_NODE:
- $this->rules->text($node);
- break;
- case XML_CDATA_SECTION_NODE:
- $this->rules->cdata($node);
- break;
- // FIXME: It appears that the parser doesn't do PI's.
- case XML_PI_NODE:
- $this->rules->processorInstruction($node);
- break;
- case XML_COMMENT_NODE:
- $this->rules->comment($node);
- break;
- // Currently we don't support embedding DTDs.
- default:
- print '<!-- Skipped -->';
- break;
+ /**
+ * Process a node in the DOM.
+ *
+ * @param mixed $node
+ * A node implementing \DOMNode.
+ */
+ public function node($node)
+ {
+ // A listing of types is at http://php.net/manual/en/dom.constants.php
+ switch ($node->nodeType) {
+ case XML_ELEMENT_NODE:
+ $this->rules->element($node);
+ break;
+ case XML_TEXT_NODE:
+ $this->rules->text($node);
+ break;
+ case XML_CDATA_SECTION_NODE:
+ $this->rules->cdata($node);
+ break;
+ // FIXME: It appears that the parser doesn't do PI's.
+ case XML_PI_NODE:
+ $this->rules->processorInstruction($node);
+ break;
+ case XML_COMMENT_NODE:
+ $this->rules->comment($node);
+ break;
+ // Currently we don't support embedding DTDs.
+ default:
+ print '<!-- Skipped -->';
+ break;
+ }
}
- }
- /**
- * Walk through all the nodes on a node list.
- *
- * @param \DOMNodeList $nl
- * A list of child elements to walk through.
- */
- public function children($nl) {
- foreach ($nl as $node) {
- $this->node($node);
+ /**
+ * Walk through all the nodes on a node list.
+ *
+ * @param \DOMNodeList $nl
+ * A list of child elements to walk through.
+ */
+ public function children($nl)
+ {
+ foreach ($nl as $node) {
+ $this->node($node);
+ }
}
- }
- /**
- * Is an element local?
- *
- * @param mixed $ele
- * An element that implement \DOMNode.
- *
- * @return bool
- * True if local and false otherwise.
- */
- public function isLocalElement($ele) {
- $uri = $ele->namespaceURI;
- if (empty($uri)) {
- return FALSE;
+ /**
+ * Is an element local?
+ *
+ * @param mixed $ele
+ * An element that implement \DOMNode.
+ *
+ * @return bool True if local and false otherwise.
+ */
+ public function isLocalElement($ele)
+ {
+ $uri = $ele->namespaceURI;
+ if (empty($uri)) {
+ return FALSE;
+ }
+
+ return isset(static::$local_ns[$uri]);
}
- return isset(static::$local_ns[$uri]);
- }
}