You are here

public function DOMTreeBuilder::endTag in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/masterminds/html5/src/HTML5/Parser/DOMTreeBuilder.php \Masterminds\HTML5\Parser\DOMTreeBuilder::endTag()

An end-tag.

Overrides EventHandler::endTag

File

vendor/masterminds/html5/src/HTML5/Parser/DOMTreeBuilder.php, line 460

Class

DOMTreeBuilder
Create an HTML5 DOM tree from events.

Namespace

Masterminds\HTML5\Parser

Code

public function endTag($name) {
  $lname = $this
    ->normalizeTagName($name);

  // Ignore closing tags for unary elements.
  if (Elements::isA($name, Elements::VOID_TAG)) {
    return;
  }
  if ($this->insertMode <= static::IM_BEFORE_HTML) {

    // 8.2.5.4.2
    if (in_array($name, array(
      'html',
      'br',
      'head',
      'title',
    ))) {
      $this
        ->startTag('html');
      $this
        ->endTag($name);
      $this->insertMode = static::IM_BEFORE_HEAD;
      return;
    }

    // Ignore the tag.
    $this
      ->parseError("Illegal closing tag at global scope.");
    return;
  }

  // Special case handling for SVG.
  if ($this->insertMode == static::IM_IN_SVG) {
    $lname = Elements::normalizeSvgElement($lname);
  }

  // See https://github.com/facebook/hhvm/issues/2962
  if (defined('HHVM_VERSION') && ($cid = $this->current
    ->getAttribute('html5-php-fake-id-attribute'))) {
    $this->current
      ->removeAttribute('html5-php-fake-id-attribute');
  }
  else {
    $cid = spl_object_hash($this->current);
  }

  // XXX: Not sure whether we need this anymore.
  // if ($name != $lname) {
  // return $this->quirksTreeResolver($lname);
  // }
  // XXX: HTML has no parent. What do we do, though,
  // if this element appears in the wrong place?
  if ($lname == 'html') {
    return;
  }

  // remove the namespaced definded by current node
  if (isset($this->pushes[$cid])) {
    for ($i = 0; $i < $this->pushes[$cid][0]; $i++) {
      array_shift($this->nsStack);
    }
    unset($this->pushes[$cid]);
  }
  if (!$this
    ->autoclose($lname)) {
    $this
      ->parseError('Could not find closing tag for ' . $lname);
  }

  // switch ($this->insertMode) {
  switch ($lname) {
    case "head":
      $this->insertMode = static::IM_AFTER_HEAD;
      break;
    case "body":
      $this->insertMode = static::IM_AFTER_BODY;
      break;
    case "svg":
    case "mathml":
      $this->insertMode = static::IM_IN_BODY;
      break;
  }
}