diff options
author | Albert Peschar <[email protected]> | 2017-12-04 15:38:30 +0100 |
---|---|---|
committer | Albert Peschar <[email protected]> | 2017-12-04 15:38:30 +0100 |
commit | 275886dbcf83bcdb113d665da2af5ac0eff1a09b (patch) | |
tree | f610a5a23460b0ca6f0c56a15d8abf49ef6602f6 /src/HTML5 | |
parent | 57a740669f332b8635ff1cdec118f7585dbfc40a (diff) |
#136: Respect self-closing tags only on foreign elements
Diffstat (limited to 'src/HTML5')
-rw-r--r-- | src/HTML5/Parser/DOMTreeBuilder.php | 13 | ||||
-rw-r--r-- | src/HTML5/Parser/Tokenizer.php | 7 |
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); } |