Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 70
0.00% covered (danger)
0.00%
0 / 18
CRAP
0.00% covered (danger)
0.00%
0 / 1
MathWikibaseInfo
0.00% covered (danger)
0.00%
0 / 70
0.00% covered (danger)
0.00%
0 / 18
702
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
6
 setLabel
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 setDescription
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 setSymbol
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 addHasPartElement
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 setUrl
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 addHasPartElements
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getId
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getLabel
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getDescription
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getSymbol
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getFormattedSymbol
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 getParts
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getUrl
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getFormatter
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 hasParts
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 generateTableOfParts
0.00% covered (danger)
0.00%
0 / 39
0.00% covered (danger)
0.00%
0 / 1
42
 generateSmallTableOfParts
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace MediaWiki\Extension\Math;
4
5use DataValues\StringValue;
6use MediaWiki\Html\Html;
7use MediaWiki\MediaWikiServices;
8use Wikibase\DataModel\Entity\EntityId;
9use Wikibase\Lib\Formatters\SnakFormatter;
10
11/**
12 * This class stores information about mathematical Wikibase items.
13 */
14class MathWikibaseInfo {
15    /**
16     * @var EntityId
17     */
18    private $id;
19
20    /**
21     * @var string the label of the item
22     */
23    private $label;
24
25    /**
26     * @var string description of the item
27     */
28    private $description;
29
30    /**
31     * @var StringValue a symbol representing the item
32     */
33    private $symbol;
34
35    /**
36     * @var MathWikibaseInfo[]
37     */
38    private $hasParts = [];
39
40    /**
41     * @var MathFormatter
42     */
43    private $mathFormatter;
44
45    /**
46     * @var string
47     */
48    private $url;
49
50    /**
51     * @param EntityId $entityId
52     * @param MathFormatter|null $mathFormatter to format math equations. Default format is HTML.
53     */
54    public function __construct( EntityId $entityId, ?MathFormatter $mathFormatter = null ) {
55        $this->id = $entityId;
56        $this->mathFormatter = $mathFormatter ?: new MathFormatter( SnakFormatter::FORMAT_HTML );
57    }
58
59    /**
60     * @param string $label
61     */
62    public function setLabel( $label ) {
63        $this->label = $label;
64    }
65
66    /**
67     * @param string $description
68     */
69    public function setDescription( $description ) {
70        $this->description = $description;
71    }
72
73    /**
74     * @param StringValue $symbol
75     */
76    public function setSymbol( $symbol ) {
77        $this->symbol = $symbol;
78    }
79
80    /**
81     * @param MathWikibaseInfo $info
82     */
83    public function addHasPartElement( MathWikibaseInfo $info ) {
84        $this->hasParts[] = $info;
85    }
86
87    /**
88     * @param string $link
89     */
90    public function setUrl( $link ) {
91        $this->url = $link;
92    }
93
94    /**
95     * @param MathWikibaseInfo[] $infos
96     */
97    public function addHasPartElements( $infos ) {
98        array_push( $this->hasParts, ...$infos );
99    }
100
101    /**
102     * @return EntityId id
103     */
104    public function getId() {
105        return $this->id;
106    }
107
108    /**
109     * @return string label
110     */
111    public function getLabel() {
112        return $this->label;
113    }
114
115    /**
116     * @return string description
117     */
118    public function getDescription() {
119        return $this->description;
120    }
121
122    /**
123     * @return StringValue symbol
124     */
125    public function getSymbol() {
126        return $this->symbol;
127    }
128
129    /**
130     * @return string|null html formatted version of the symbol
131     */
132    public function getFormattedSymbol() {
133        if ( $this->symbol ) {
134            return $this->mathFormatter->format( $this->getSymbol() );
135        } else {
136            return null;
137        }
138    }
139
140    /**
141     * @return MathWikibaseInfo[] hasparts
142     */
143    public function getParts() {
144        return $this->hasParts;
145    }
146
147    /**
148     * @return string
149     */
150    public function getUrl() {
151        return $this->url;
152    }
153
154    /**
155     * @return MathFormatter
156     */
157    public function getFormatter() {
158        return $this->mathFormatter;
159    }
160
161    /**
162     * Does this info object has elements?
163     * @return bool true if there are elements otherwise false
164     */
165    public function hasParts() {
166        return $this->hasParts !== [];
167    }
168
169    /**
170     * Generates an HTML table representation of the has-parts elements
171     * @return string
172     */
173    public function generateTableOfParts() {
174        $lang = MediaWikiServices::getInstance()->getContentLanguage();
175        $labelAlign = $lang->isRTL() ? 'left' : 'right';
176        $labelAlignOpposite = !$lang->isRTL() ? 'left' : 'right';
177
178        $output = '';
179
180        foreach ( $this->hasParts as $part ) {
181            $output .= Html::openElement( "tr" );
182
183            $output .= Html::openElement(
184                "td",
185                [ "style" => "font-weight: bold; text-align:$labelAlign;" ]
186            );
187
188            if ( $part->url ) {
189                $output .= Html::element(
190                    "a",
191                    [ "href" => $part->url ],
192                    $part->getLabel()
193                );
194            } else {
195                $output .= htmlspecialchars( $part->getLabel() );
196            }
197
198            $output .= Html::closeElement( "td" );
199            $output .= Html::openElement(
200                "td",
201                [ "style" => "text-align:center; padding: 2px; padding-left: 10px; padding-right: 10px;" ]
202            );
203
204            if ( $part->url ) {
205                $output .= Html::rawElement(
206                    "a",
207                    [ "href" => $part->url ],
208                    $part->getFormattedSymbol()
209                );
210            } else {
211                $output .= $part->getFormattedSymbol();
212            }
213
214            $output .= Html::closeElement( "td" );
215            $output .= Html::element(
216                "td",
217                [ "style" => "font-style: italic; text-align:$labelAlignOpposite;" ],
218                $part->getDescription()
219            );
220            $output .= Html::closeElement( "tr" );
221        }
222
223        return Html::rawElement( 'table', [ 'style' => 'padding: 5px' ],
224            Html::rawElement( 'tbody', [], $output )
225        );
226    }
227
228    /**
229     * Generates a minimalized Html representation of the has-parts elements.
230     * @return string
231     */
232    public function generateSmallTableOfParts() {
233        $output = '';
234
235        foreach ( $this->hasParts as $part ) {
236            $output .= Html::rawElement( 'tr', [],
237                Html::rawElement( 'td',
238                    [ 'style' => 'text-align: center; padding-right: 5px;' ],
239                    $part->getFormattedSymbol()
240                ) .
241                Html::element( 'td', [ 'style' => 'text-align:left;' ], $part->getLabel() )
242            );
243        }
244
245        return Html::rawElement( 'table', [],
246            Html::rawElement( 'tbody', [], $output )
247        );
248    }
249}