diff options
author | Matt Butcher <[email protected]> | 2013-06-25 15:52:20 -0500 |
---|---|---|
committer | Matt Butcher <[email protected]> | 2013-06-25 15:52:20 -0500 |
commit | 25f2325b3b83d049df0ac74000dcbd72436fe60e (patch) | |
tree | 154507e918b0c0e4eb29a2fa7fb40bd2f5c54490 /src/HTML5/Parser | |
parent | 71f4839ac1adf1adc68e10eaef56873093fbdf03 (diff) |
Issue #8: Can now parse fragments.
Diffstat (limited to 'src/HTML5/Parser')
-rw-r--r-- | src/HTML5/Parser/DOMTreeBuilder.php | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/HTML5/Parser/DOMTreeBuilder.php b/src/HTML5/Parser/DOMTreeBuilder.php index 416d29f..ebb0acc 100644 --- a/src/HTML5/Parser/DOMTreeBuilder.php +++ b/src/HTML5/Parser/DOMTreeBuilder.php @@ -56,8 +56,9 @@ class DOMTreeBuilder implements EventHandler { */ protected $quirks = TRUE; - public function __construct($insertMode = self::IM_INITIAL) { - $this->insertMode = $insertMode; + public $isFragment = FALSE; + + public function __construct($isFragment = FALSE) { $impl = new \DOMImplementation(); // XXX: // Create the doctype. For now, we are always creating HTML5 @@ -72,6 +73,14 @@ class DOMTreeBuilder implements EventHandler { // Create a rules engine for tags. $this->rules = new TreeBuildingRules($this->doc); + + if ($isFragment) { + $this->isFragment = TRUE; + $this->insertMode = self::IM_IN_BODY; + $ele = $this->doc->createElement('html'); + $this->doc->appendChild($ele); + $this->current = $ele; + } } /** @@ -93,9 +102,18 @@ class DOMTreeBuilder implements EventHandler { $append = $this->doc->documentElement->childNodes; $frag = $this->doc->createDocumentFragment(); + // appendChild() modifies the DOMNodeList, so we + // have to buffer up the items first, then use the + // array buffer and loop twice. + $buffer = array(); foreach ($append as $node) { + $buffer[] = $node; + } + + foreach ($buffer as $node) { $frag->appendChild($node); } + $frag->errors = $this->doc->errors; return $frag; } @@ -132,6 +150,7 @@ class DOMTreeBuilder implements EventHandler { * - Omission rules: 8.1.2.4 Optional tags */ public function startTag($name, $attributes = array(), $selfClosing = FALSE) { + // fprintf(STDOUT, $name); $lname = $this->normalizeTagName($name); // Make sure we have an html element. |