Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
LIHandler
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 5
342
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 / 18
0.00% covered (danger)
0.00%
0 / 1
90
 before
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
30
 after
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 firstChild
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
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\DiffUtils;
9use Wikimedia\Parsoid\Html2Wt\SerializerState;
10use Wikimedia\Parsoid\Utils\DiffDOMUtils;
11use Wikimedia\Parsoid\Utils\DOMCompat;
12use Wikimedia\Parsoid\Utils\DOMDataUtils;
13use Wikimedia\Parsoid\Utils\DOMUtils;
14use Wikimedia\Parsoid\Utils\WTUtils;
15
16class LIHandler extends DOMHandler {
17
18    public function __construct() {
19        parent::__construct( true );
20    }
21
22    /** @inheritDoc */
23    public function handle(
24        Element $node, SerializerState $state, bool $wrapperUnmodified = false
25    ): ?Node {
26        $firstChildElement = DiffDOMUtils::firstNonSepChild( $node );
27        if ( !DOMUtils::isList( $firstChildElement )
28             || WTUtils::isLiteralHTMLNode( $firstChildElement )
29        ) {
30            $state->emitChunk( $this->getListBullets( $state, $node ), $node );
31        }
32        $liHandler = static function ( $state, $text, $opts ) use ( $node ) {
33            return $state->serializer->wteHandlers->liHandler( $node, $state, $text, $opts );
34        };
35        $state->singleLineContext->enforce();
36        $state->serializeChildren( $node, $liHandler );
37
38        // Recover trailing whitespace (only on unmodified innermost <li> nodes);
39        // Consider "*** foo ". Since WS is only trimmed on the innermost <li> node,
40        // it makes sense to recover this only for the innermost <li> node.
41        // [ Given current DSR offsets, without this check, we'll recover one space for
42        //   every nested <li> node which makes for lotsa dirty diffs. ]
43        $lastChild = DiffDOMUtils::lastNonSepChild( $node );
44        if ( $lastChild && !DOMUtils::isList( $lastChild ) &&
45            !DiffUtils::hasDiffMarkers( $lastChild ) &&
46            !( $lastChild instanceof Element && $lastChild->hasAttribute( 'data-mw-selser-wrapper' ) )
47        ) {
48            $trailingSpace = $state->recoverTrimmedWhitespace( $node, false );
49            if ( $trailingSpace ) {
50                $state->appendSep( $trailingSpace );
51            }
52        }
53
54        $state->singleLineContext->pop();
55        return $node->nextSibling;
56    }
57
58    /** @inheritDoc */
59    public function before( Element $node, Node $otherNode, SerializerState $state ): array {
60        if ( ( $otherNode === $node->parentNode
61                && in_array( DOMCompat::nodeName( $otherNode ), [ 'ul', 'ol' ], true ) )
62            || ( $otherNode instanceof Element
63                && ( DOMDataUtils::getDataParsoid( $otherNode )->stx ?? null ) === 'html' )
64        ) {
65            return [];
66        } else {
67            return [ 'min' => 1, 'max' => 2 ];
68        }
69    }
70
71    /** @inheritDoc */
72    public function after( Element $node, Node $otherNode, SerializerState $state ): array {
73        return $this->wtListEOL( $node, $otherNode );
74    }
75
76    /** @inheritDoc */
77    public function firstChild( Node $node, Node $otherNode, SerializerState $state ): array {
78        if ( !DOMUtils::isList( $otherNode ) ) {
79            return [ 'min' => 0, 'max' => 0 ];
80        } else {
81            return [];
82        }
83    }
84
85}