summaryrefslogtreecommitdiff
path: root/src/HTML5
diff options
context:
space:
mode:
authorAlbert Peschar <[email protected]>2017-12-04 15:38:30 +0100
committerAlbert Peschar <[email protected]>2017-12-04 15:38:30 +0100
commit275886dbcf83bcdb113d665da2af5ac0eff1a09b (patch)
treef610a5a23460b0ca6f0c56a15d8abf49ef6602f6 /src/HTML5
parent57a740669f332b8635ff1cdec118f7585dbfc40a (diff)
#136: Respect self-closing tags only on foreign elements
Diffstat (limited to 'src/HTML5')
-rw-r--r--src/HTML5/Parser/DOMTreeBuilder.php13
-rw-r--r--src/HTML5/Parser/Tokenizer.php7
2 files changed, 14 insertions, 6 deletions
diff --git a/src/HTML5/Parser/DOMTreeBuilder.php b/src/HTML5/Parser/DOMTreeBuilder.php
index b26860d..865c5f0 100644
--- a/src/HTML5/Parser/DOMTreeBuilder.php
+++ b/src/HTML5/Parser/DOMTreeBuilder.php
@@ -433,10 +433,16 @@ class DOMTreeBuilder implements EventHandler
else {
$this->current->appendChild($ele);
- // XXX: Need to handle self-closing tags and unary tags.
if (! Elements::isA($name, Elements::VOID_TAG)) {
$this->current = $ele;
}
+
+ // Self-closing tags should only be respected on foreign elements
+ // (and are implied on void elements)
+ // See: https://www.w3.org/TR/html5/syntax.html#start-tags
+ if (Elements::isHtml5Element($name)) {
+ $selfClosing = false;
+ }
}
// This is sort of a last-ditch attempt to correct for cases where no head/body
@@ -453,6 +459,11 @@ class DOMTreeBuilder implements EventHandler
array_shift($this->nsStack);
}
}
+
+ if ($selfClosing) {
+ $this->endTag($name);
+ }
+
// Return the element mask, which the tokenizer can then use to set
// various processing rules.
return Elements::element($name);
diff --git a/src/HTML5/Parser/Tokenizer.php b/src/HTML5/Parser/Tokenizer.php
index c42bc3d..1f6868b 100644
--- a/src/HTML5/Parser/Tokenizer.php
+++ b/src/HTML5/Parser/Tokenizer.php
@@ -383,11 +383,8 @@ class Tokenizer
}
$mode = $this->events->startTag($name, $attributes, $selfClose);
- // Should we do this? What does this buy that selfClose doesn't?
- if ($selfClose) {
- $this->events->endTag($name);
- } elseif (is_int($mode)) {
- // fprintf(STDOUT, "Event response says move into mode %d for tag %s", $mode, $name);
+
+ if (is_int($mode)) {
$this->setTextMode($mode, $name);
}