Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 20
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
TRHandler
0.00% covered (danger)
0.00%
0 / 20
0.00% covered (danger)
0.00%
0 / 5
110
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 handle
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
6
 before
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 after
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 trWikitextNeeded
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2declare( strict_types = 1 );
3
4namespace Wikimedia\Parsoid\Html2Wt\DOMHandlers;
5
6use Wikimedia\Parsoid\DOM\Element;
7use Wikimedia\Parsoid\DOM\Node;
8use Wikimedia\Parsoid\Html2Wt\SerializerState;
9use Wikimedia\Parsoid\NodeData\DataParsoid;
10use Wikimedia\Parsoid\Utils\DiffDOMUtils;
11use Wikimedia\Parsoid\Utils\DOMCompat;
12use Wikimedia\Parsoid\Utils\DOMDataUtils;
13
14class TRHandler extends DOMHandler {
15
16    public function __construct() {
17        parent::__construct( true );
18    }
19
20    /** @inheritDoc */
21    public function handle(
22        Element $node, SerializerState $state, bool $wrapperUnmodified = false
23    ): ?Node {
24        $dp = DOMDataUtils::getDataParsoid( $node );
25
26        if ( $this->trWikitextNeeded( $node, $dp ) ) {
27            $state->emitChunk(
28                $this->serializeTableTag(
29                    $dp->startTagSrc ?? '|-', '', $state,
30                    $node, $wrapperUnmodified
31                ),
32                $node
33            );
34        }
35
36        $state->serializeChildren( $node );
37        return $node->nextSibling;
38    }
39
40    /** @inheritDoc */
41    public function before( Element $node, Node $otherNode, SerializerState $state ): array {
42        if ( $this->trWikitextNeeded( $node, DOMDataUtils::getDataParsoid( $node ) ) ) {
43            return [ 'min' => 1, 'max' => $this->maxNLsInTable( $node, $otherNode ) ];
44        } else {
45            return [ 'min' => 0, 'max' => $this->maxNLsInTable( $node, $otherNode ) ];
46        }
47    }
48
49    /** @inheritDoc */
50    public function after( Element $node, Node $otherNode, SerializerState $state ): array {
51        return [ 'min' => 0, 'max' => $this->maxNLsInTable( $node, $otherNode ) ];
52    }
53
54    private function trWikitextNeeded( Element $node, DataParsoid $dp ): bool {
55        // If the token has 'startTagSrc' set, it means that the tr
56        // was present in the source wikitext and we emit it -- if not,
57        // we ignore it.
58        // ignore comments and ws
59        if ( ( $dp->startTagSrc ?? null ) || DiffDOMUtils::previousNonSepSibling( $node ) ) {
60            return true;
61        } else {
62            // If parent has a thead/tbody previous sibling, then
63            // we need the |- separation. But, a caption preceded
64            // this node's parent, all is good.
65            $parentSibling = DiffDOMUtils::previousNonSepSibling( $node->parentNode );
66
67            // thead/tbody/tfoot is always present around tr tags in the DOM.
68            return $parentSibling && DOMCompat::nodeName( $parentSibling ) !== 'caption';
69        }
70    }
71
72}