Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. TreeBuildingRules.php

class TreeBuildingRules

Handles special-case rules for the DOM tree builder.

Many tags have special rules that need to be accomodated on an individual basis. This class handles those rules.

See section 8.1.2.4 of the spec.

@todo - colgroup and col special behaviors

  • body and head special behaviors

Hierarchy

  • class \Masterminds\HTML5\Parser\TreeBuildingRules

Expanded class hierarchy of TreeBuildingRules

File

vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php, line 16

Namespace

Masterminds\HTML5\Parser
View source
class TreeBuildingRules {
    protected static $tags = array(
        'li' => 1,
        'dd' => 1,
        'dt' => 1,
        'rt' => 1,
        'rp' => 1,
        'tr' => 1,
        'th' => 1,
        'td' => 1,
        'thead' => 1,
        'tfoot' => 1,
        'tbody' => 1,
        'table' => 1,
        'optgroup' => 1,
        'option' => 1,
    );
    
    /**
     * Returns true if the given tagname has special processing rules.
     */
    public function hasRules($tagname) {
        return isset(static::$tags[$tagname]);
    }
    
    /**
     * Evaluate the rule for the current tag name.
     *
     * This may modify the existing DOM.
     *
     * @return \DOMElement The new Current DOM element.
     */
    public function evaluate($new, $current) {
        switch ($new->tagName) {
            case 'li':
                return $this->handleLI($new, $current);
            case 'dt':
            case 'dd':
                return $this->handleDT($new, $current);
            case 'rt':
            case 'rp':
                return $this->handleRT($new, $current);
            case 'optgroup':
                return $this->closeIfCurrentMatches($new, $current, array(
                    'optgroup',
                ));
            case 'option':
                return $this->closeIfCurrentMatches($new, $current, array(
                    'option',
                ));
            case 'tr':
                return $this->closeIfCurrentMatches($new, $current, array(
                    'tr',
                ));
            case 'td':
            case 'th':
                return $this->closeIfCurrentMatches($new, $current, array(
                    'th',
                    'td',
                ));
            case 'tbody':
            case 'thead':
            case 'tfoot':
            case 'table':
                // Spec isn't explicit about this, but it's necessary.
                return $this->closeIfCurrentMatches($new, $current, array(
                    'thead',
                    'tfoot',
                    'tbody',
                ));
        }
        return $current;
    }
    protected function handleLI($ele, $current) {
        return $this->closeIfCurrentMatches($ele, $current, array(
            'li',
        ));
    }
    protected function handleDT($ele, $current) {
        return $this->closeIfCurrentMatches($ele, $current, array(
            'dt',
            'dd',
        ));
    }
    protected function handleRT($ele, $current) {
        return $this->closeIfCurrentMatches($ele, $current, array(
            'rt',
            'rp',
        ));
    }
    protected function closeIfCurrentMatches($ele, $current, $match) {
        if (in_array($current->tagName, $match, true)) {
            $current->parentNode
                ->appendChild($ele);
        }
        else {
            $current->appendChild($ele);
        }
        return $ele;
    }

}

Members

Title Sort descending Modifiers Object type Summary
TreeBuildingRules::$tags protected static property
TreeBuildingRules::closeIfCurrentMatches protected function
TreeBuildingRules::evaluate public function Evaluate the rule for the current tag name.
TreeBuildingRules::handleDT protected function
TreeBuildingRules::handleLI protected function
TreeBuildingRules::handleRT protected function
TreeBuildingRules::hasRules public function Returns true if the given tagname has special processing rules.

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal