Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 23
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
RemexMungerData
0.00% covered (danger)
0.00%
0 / 23
0.00% covered (danger)
0.00%
0 / 2
132
0.00% covered (danger)
0.00%
0 / 1
 __set
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 dump
0.00% covered (danger)
0.00%
0 / 22
0.00% covered (danger)
0.00%
0 / 1
110
1<?php
2
3namespace MediaWiki\Tidy;
4
5use InvalidArgumentException;
6use Wikimedia\RemexHtml\Serializer\SerializerNode;
7use Wikimedia\RemexHtml\TreeBuilder\Element;
8
9/**
10 * @internal
11 */
12class RemexMungerData {
13    /**
14     * The Element for the mw:p-wrap which is a child of the current node. If
15     * this is set, inline insertions into this node will be diverted so that
16     * they insert into the p-wrap.
17     *
18     * @var Element|null
19     */
20    public $childPElement;
21
22    /**
23     * This tracks the mw:p-wrap node in the Serializer stack which is an
24     * ancestor of this node. If there is no mw:p-wrap ancestor, it is null.
25     *
26     * @var SerializerNode|null
27     */
28    public $ancestorPNode;
29
30    /**
31     * The wrap base node is the body or blockquote node which is the parent
32     * of active p-wrappers. This is set if there is an ancestor p-wrapper,
33     * or if a p-wrapper was closed due to a block element being encountered
34     * inside it.
35     *
36     * @var SerializerNode|null
37     */
38    public $wrapBaseNode;
39
40    /**
41     * Stack splitting (essentially our idea of AFE reconstruction) can clone
42     * formatting elements which are split over multiple paragraphs.
43     * TreeBuilder is not aware of the cloning, and continues to insert into
44     * the original element. This is set to the newer clone if this node was
45     * cloned, i.e. if there is an active diversion of the insertion location.
46     *
47     * @var Element|null
48     */
49    public $currentCloneElement;
50
51    /**
52     * Is the node a p-wrapper, with name mw:p-wrap?
53     *
54     * @var bool
55     */
56    public $isPWrapper = false;
57
58    /**
59     * Is the node splittable, i.e. a formatting element or a node with a
60     * formatting element ancestor which is under an active or deactivated
61     * p-wrapper.
62     *
63     * @var bool
64     */
65    public $isSplittable = false;
66
67    /**
68     * This is true if the node is a body or blockquote, which activates
69     * p-wrapping of child nodes.
70     *
71     * @var bool
72     */
73    public $needsPWrapping = false;
74
75    /**
76     * The number of child nodes, not counting whitespace-only text nodes or
77     * comments.
78     *
79     * @var int
80     */
81    public $nonblankNodeCount = 0;
82
83    public function __set( $name, $value ) {
84        // @phan-suppress-previous-line PhanPluginNeverReturnMethod
85        throw new InvalidArgumentException( "Cannot set property \"$name\"" );
86    }
87
88    /**
89     * Get a text representation of the current state of the serializer, for
90     * debugging.
91     *
92     * @return string
93     */
94    public function dump() {
95        $parts = [];
96
97        if ( $this->childPElement ) {
98            $parts[] = 'childPElement=' . $this->childPElement->getDebugTag();
99        }
100        if ( $this->ancestorPNode ) {
101            $parts[] = "ancestorPNode=<{$this->ancestorPNode->name}>";
102        }
103        if ( $this->wrapBaseNode ) {
104            $parts[] = "wrapBaseNode=<{$this->wrapBaseNode->name}>";
105        }
106        if ( $this->currentCloneElement ) {
107            $parts[] = "currentCloneElement=" . $this->currentCloneElement->getDebugTag();
108        }
109        if ( $this->isPWrapper ) {
110            $parts[] = 'isPWrapper';
111        }
112        if ( $this->isSplittable ) {
113            $parts[] = 'isSplittable';
114        }
115        if ( $this->needsPWrapping ) {
116            $parts[] = 'needsPWrapping';
117        }
118        if ( $this->nonblankNodeCount ) {
119            $parts[] = "nonblankNodeCount={$this->nonblankNodeCount}";
120        }
121        $s = "RemexMungerData {\n";
122        foreach ( $parts as $part ) {
123            $s .= "  $part\n";
124        }
125        $s .= "}\n";
126        return $s;
127    }
128}