summaryrefslogtreecommitdiff
path: root/src/HTML5/Parser
diff options
context:
space:
mode:
authorMatt Butcher <[email protected]>2013-06-25 15:52:20 -0500
committerMatt Butcher <[email protected]>2013-06-25 15:52:20 -0500
commit25f2325b3b83d049df0ac74000dcbd72436fe60e (patch)
tree154507e918b0c0e4eb29a2fa7fb40bd2f5c54490 /src/HTML5/Parser
parent71f4839ac1adf1adc68e10eaef56873093fbdf03 (diff)
Issue #8: Can now parse fragments.
Diffstat (limited to 'src/HTML5/Parser')
-rw-r--r--src/HTML5/Parser/DOMTreeBuilder.php23
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.