diff options
-rw-r--r-- | src/HTML5/Parser/DOMTreeBuilder.php | 13 | ||||
-rw-r--r-- | src/HTML5/Parser/Tokenizer.php | 7 | ||||
-rw-r--r-- | test/HTML5/Parser/TokenizerTest.php | 6 |
3 files changed, 17 insertions, 9 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); } diff --git a/test/HTML5/Parser/TokenizerTest.php b/test/HTML5/Parser/TokenizerTest.php index 5e52722..438a165 100644 --- a/test/HTML5/Parser/TokenizerTest.php +++ b/test/HTML5/Parser/TokenizerTest.php @@ -447,9 +447,9 @@ class TokenizerTest extends \Masterminds\HTML5\Tests\TestCase ); foreach ($selfClose as $test => $expects) { $events = $this->parse($test); - $this->assertEquals(3, $events->depth(), "Counting events for '$test'" . print_r($events, true)); + $this->assertEquals(2, $events->depth(), "Counting events for '$test'" . print_r($events, true)); $this->assertEventEquals('startTag', $expects, $events->get(0)); - $this->assertEventEquals('endTag', $expects, $events->get(1)); + $this->assertTrue($events->get(0)['data'][2]); } $bad = array( @@ -735,7 +735,7 @@ class TokenizerTest extends \Masterminds\HTML5\Tests\TestCase true ) ); - $this->isAllGood('startTag', 3, $withEnd); + $this->isAllGood('startTag', 2, $withEnd); // Cause a parse error. $bad = array( |