Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 31
TableHandler
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 6
342
0.00% covered (danger)
0.00%
0 / 31
 __construct
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 handle
0.00% covered (danger)
0.00%
0 / 1
72
0.00% covered (danger)
0.00%
0 / 20
 before
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 3
 after
0.00% covered (danger)
0.00%
0 / 1
20
0.00% covered (danger)
0.00%
0 / 4
 firstChild
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 lastChild
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
<?php
declare( strict_types = 1 );
namespace Wikimedia\Parsoid\Html2Wt\DOMHandlers;
use Wikimedia\Parsoid\DOM\Element;
use Wikimedia\Parsoid\DOM\Node;
use Wikimedia\Parsoid\Html2Wt\SerializerState;
use Wikimedia\Parsoid\Utils\DOMCompat;
use Wikimedia\Parsoid\Utils\DOMDataUtils;
use Wikimedia\Parsoid\Utils\DOMUtils;
use Wikimedia\Parsoid\Utils\WTUtils;
class TableHandler extends DOMHandler {
    public function __construct() {
        parent::__construct( false );
    }
    /** @inheritDoc */
    public function handle(
        Element $node, SerializerState $state, bool $wrapperUnmodified = false
    ): ?Node {
        $dp = DOMDataUtils::getDataParsoid( $node );
        $wt = $dp->startTagSrc ?? '{|';
        $indentTable = DOMCompat::nodeName( $node->parentNode ) === 'dd'
            && DOMUtils::previousNonSepSibling( $node ) === null;
        if ( $indentTable ) {
            $state->singleLineContext->disable();
        }
        $state->emitChunk(
            $this->serializeTableTag( $wt, '', $state, $node, $wrapperUnmodified ),
            $node
        );
        if ( !WTUtils::isLiteralHTMLNode( $node ) ) {
            $state->wikiTableNesting++;
        }
        $state->serializeChildren( $node );
        if ( !WTUtils::isLiteralHTMLNode( $node ) ) {
            $state->wikiTableNesting--;
        }
        if ( $state->sep->constraints === null ) {
            // Special case hack for "{|\n|}" since state.sep is
            // cleared in SSP.emitSep after a separator is emitted.
            // However, for {|\n|}, the <table> tag has no element
            // children which means lastchild -> parent constraint
            // is never computed and set here.
            $state->sep->constraints = [ 'min' => 1, 'max' => 2, 'constraintInfo' => [] ];
        }
        $state->emitChunk( $dp->endTagSrc ?? '|}', $node );
        if ( $indentTable ) {
            $state->singleLineContext->pop();
        }
        return $node->nextSibling;
    }
    /** @inheritDoc */
    public function before( Element $node, Node $otherNode, SerializerState $state ): array {
        // Handle special table indentation case!
        if ( $node->parentNode === $otherNode && DOMCompat::nodeName( $otherNode ) === 'dd' ) {
            return [ 'min' => 0, 'max' => 2 ];
        } else {
            return [ 'min' => 1, 'max' => 2 ];
        }
    }
    /** @inheritDoc */
    public function after( Element $node, Node $otherNode, SerializerState $state ): array {
        if ( ( WTUtils::isNewElt( $node ) || WTUtils::isNewElt( $otherNode ) )
            && !DOMUtils::atTheTop( $otherNode )
        ) {
            return [ 'min' => 1, 'max' => 2 ];
        } else {
            return [ 'min' => 0, 'max' => 2 ];
        }
    }
    /** @inheritDoc */
    public function firstChild( Node $node, Node $otherNode, SerializerState $state ): array {
        return [ 'min' => 1, 'max' => $this->maxNLsInTable( $node, $otherNode ) ];
    }
    /** @inheritDoc */
    public function lastChild( Node $node, Node $otherNode, SerializerState $state ): array {
        return [ 'min' => 1, 'max' => $this->maxNLsInTable( $node, $otherNode ) ];
    }
}