src/Template/Tokenizer/Token/Element.php
public function isClosingElementImplied(string $html): bool
    {
        $parent = $this->getParent();
        if ($parent === null || !($parent instanceof self)) {
            return false;
        }

        $name = $this->parseElementName($html);
        $parentName = $parent->getName();

        // HEAD: no closing tag.
        if ($name === 'body' && $parentName === 'head') {
            return true;
        }

        // P
        if ($parentName === 'p' && \in_array($name, self::NO_CHILDREN_OF_P, true)) {
            return true;
        }

        // LI
        if ($parentName === 'li' && $name === 'li') {
            return true;
        }

        // DT and DD
        if (($parentName === 'dt' || $parentName === 'dd') && ($name === 'dt' || $name === 'dd')) {
            return true;
        }

        // RP and RT
        if (($parentName === 'rp' || $parentName === 'rt') && ($name === 'rp' || $name === 'rt')) {
            return true;
        }

        return false;
    }
public function isClosingElementImplied(string $html): bool
    {
        $parent = $this->getParent();
        if ($parent === null || !($parent instanceof self)) {
            return false;
        }

        $name = $this->parseElementName($html);
        $parentName = $parent->getName();

        // HEAD: no closing tag.
        if ($name === 'body' && $parentName === 'head') {
            return true;
        }

        // P
        if ($parentName === 'p' && \in_array($name, self::NO_CHILDREN_OF_P, true)) {
            return true;
        }

        // LI
        if ($parentName === 'li' && $name === 'li') {
            return true;
        }

        // DT and DD
        if (($parentName === 'dt' || $parentName === 'dd') && ($name === 'dt' || $name === 'dd')) {
            return true;
        }

        // RP and RT
        if (($parentName === 'rp' || $parentName === 'rt') && ($name === 'rp' || $name === 'rt')) {
            return true;
        }

        return false;
    }
public function isClosingElementImplied ( string $ html ) : bool { $ parent = $ this -> getParent ( ) ; if ( $ parent === null || ! ( $ parent instanceof self ) ) { return false ; } $ name = $ this -> parseElementName ( $ html ) ; $ parentName = $ parent -> getName ( ) ; // HEAD: no closing tag. if ( $ name === 'body' && $ parentName === 'head' ) { return true ; } // P if ( $ parentName === 'p' && \ in_array ( $ name , self :: NO_CHILDREN_OF_P , true ) ) { return true ; } // LI if ( $ parentName === 'li' && $ name === 'li' ) { return true ; } // DT and DD if ( ( $ parentName === 'dt' || $ parentName === 'dd' ) && ( $ name === 'dt' || $ name === 'dd' ) ) { return true ; } // RP and RT if ( ( $ parentName === 'rp' || $ parentName === 'rt' ) && ( $ name === 'rp' || $ name === 'rt' ) ) { return true ; } return false ; }
Does the parent have an implied closing tag?

@param string $html

@return boolean
Does the parent have an implied closing tag?