4
4
5
5
use InvalidArgumentException ;
6
6
use MediaWiki \MediaWikiServices ;
7
+ use Traversable ;
7
8
use Wikibase \DataModel \Serializers \SerializerFactory ;
8
9
use Wikibase \DataModel \Services \Lookup \PropertyDataTypeLookup ;
9
10
use Wikibase \DataModel \Services \Statement \Grouper \StatementGrouper ;
@@ -130,64 +131,69 @@ private function populateQualifierSnakHtml( Statement $statement, array $stateme
130
131
}
131
132
132
133
/**
133
- * @param StatementList[] $statementsLists
134
- * @param App $app
134
+ * @param App $app The Vue App
135
+ * @param string $sectionHeadingHtml Section heading as HTML
136
+ * @param StatementList $statementsList
135
137
* @param array &$snakHtmlLookup
136
- * @return string HTML
138
+ * @return string Rendered HTML
137
139
*/
138
- private function getVueStatementHtml ( array $ statementsLists , App $ app , array &$ snakHtmlLookup ): string {
139
- $ rendered = '' ;
140
- foreach ( $ statementsLists as $ key => $ statementsList ) {
141
- if ( !is_string ( $ key ) || !( $ statementsList instanceof StatementList ) ) {
142
- throw new InvalidArgumentException (
143
- '$statementLists must be an associative array of StatementList objects '
144
- );
145
- }
146
-
147
- if ( $ key !== 'statements ' && $ statementsList ->isEmpty () ) {
148
- continue ;
149
- }
150
-
151
- $ sectionHeadingHtml = $ this ->getHtmlForSectionHeading ( $ key );
152
- $ propertyStatementMap = [];
153
- $ propertyList = [];
154
- foreach ( $ statementsList ->getPropertyIds () as $ propertyId ) {
155
- $ propertyStatements = $ statementsList ->getByPropertyId ( $ propertyId )->toArray ();
156
- $ propertyList [] = $ propertyId ->getSerialization ();
157
-
158
- $ statementsData = [];
159
- foreach ( $ propertyStatements as $ statement ) {
160
- $ mainSnak = $ statement ->getMainSnak ();
161
- $ statementSerializer = $ this ->serializerFactory ->newStatementSerializer ();
162
- $ statementData = $ statementSerializer ->serialize ( $ statement );
163
-
164
- $ dataType = $ this ->propertyDataTypeLookup ->getDataTypeIdForProperty ( $ mainSnak ->getPropertyId () );
165
- $ statementData ['mainsnak ' ]['datatype ' ] = $ dataType ;
166
- $ this ->populateReferenceSnakHtml ( $ statement , $ statementData , $ snakHtmlLookup );
167
- $ this ->populateQualifierSnakHtml ( $ statement , $ statementData , $ snakHtmlLookup );
168
- if ( array_key_exists ( 'hash ' , $ statementData ['mainsnak ' ] ) ) {
169
- $ snakHtmlLookup [$ statementData ['mainsnak ' ]['hash ' ]] = $ this ->snakFormatter ->formatSnak ( $ mainSnak );
170
- }
171
- $ statementsData [] = $ statementData ;
140
+ private function renderStatementsSectionHtml (
141
+ App $ app ,
142
+ string $ sectionHeadingHtml ,
143
+ StatementList $ statementsList ,
144
+ array &$ snakHtmlLookup
145
+ ): string {
146
+ $ propertyStatementMap = [];
147
+ $ propertyList = [];
148
+ foreach ( $ statementsList ->getPropertyIds () as $ propertyId ) {
149
+ $ propertyStatements = $ statementsList ->getByPropertyId ( $ propertyId )->toArray ();
150
+ $ propertyList [] = $ propertyId ->getSerialization ();
151
+
152
+ $ statementsData = [];
153
+ foreach ( $ propertyStatements as $ statement ) {
154
+ $ mainSnak = $ statement ->getMainSnak ();
155
+ $ statementSerializer = $ this ->serializerFactory ->newStatementSerializer ();
156
+ $ statementData = $ statementSerializer ->serialize ( $ statement );
157
+
158
+ $ dataType = $ this ->propertyDataTypeLookup ->getDataTypeIdForProperty ( $ mainSnak ->getPropertyId () );
159
+ $ statementData ['mainsnak ' ]['datatype ' ] = $ dataType ;
160
+ $ this ->populateReferenceSnakHtml ( $ statement , $ statementData , $ snakHtmlLookup );
161
+ $ this ->populateQualifierSnakHtml ( $ statement , $ statementData , $ snakHtmlLookup );
162
+ if ( array_key_exists ( 'hash ' , $ statementData ['mainsnak ' ] ) ) {
163
+ $ snakHtmlLookup [$ statementData ['mainsnak ' ]['hash ' ]] = $ this ->snakFormatter ->formatSnak ( $ mainSnak );
172
164
}
173
- $ propertyStatementMap [ $ propertyId -> getSerialization () ] = $ statementsData ;
165
+ $ statementsData [ ] = $ statementData ;
174
166
}
175
-
176
- $ rendered .= $ app ->renderComponent ( 'wbui2025-statement-sections ' , [
177
- 'sectionHeadingHtml ' => $ sectionHeadingHtml ,
178
- 'propertyList ' => $ propertyList ,
179
- 'propertyStatementMap ' => $ propertyStatementMap ,
180
- ] );
167
+ $ propertyStatementMap [$ propertyId ->getSerialization ()] = $ statementsData ;
181
168
}
182
- return $ rendered ;
169
+
170
+ return $ app ->renderComponent ( 'wbui2025-statement-sections ' , [
171
+ 'sectionHeadingHtml ' => $ sectionHeadingHtml ,
172
+ 'propertyList ' => $ propertyList ,
173
+ 'propertyStatementMap ' => $ propertyStatementMap ,
174
+ ] );
183
175
}
184
176
185
177
/**
186
178
* @param StatementList[] $statementsLists
179
+ * @param App $app
180
+ * @param array &$snakHtmlLookup
187
181
* @return string HTML
188
182
*/
189
- private function getVueStatementsHtml ( array $ statementsLists ): string {
190
- $ snakHtmlLookup = [];
183
+ private function getVueStatementSectionsHtml ( array $ statementsLists , App $ app , array &$ snakHtmlLookup ): string {
184
+ $ rendered = '' ;
185
+ foreach ( $ this ->iterateOverNonEmptyStatementSections ( $ statementsLists ) as $ key => $ statementsList ) {
186
+ $ rendered .= $ this ->renderStatementsSectionHtml (
187
+ $ app ,
188
+ $ this ->getHtmlForSectionHeading ( $ key ),
189
+ $ statementsList ,
190
+ $ snakHtmlLookup
191
+ );
192
+ }
193
+ return $ rendered ;
194
+ }
195
+
196
+ private function setupVueTemplateRenderer ( array &$ snakHtmlLookup ): App {
191
197
$ app = new App ( [
192
198
'snakHtml ' => function ( $ snak ) use ( &$ snakHtmlLookup ) {
193
199
if ( array_key_exists ( $ snak ['hash ' ], $ snakHtmlLookup ) ) {
@@ -274,26 +280,26 @@ function ( array $data ): array {
274
280
return $ data ;
275
281
}
276
282
);
283
+ return $ app ;
284
+ }
285
+
286
+ /**
287
+ * @param StatementList[] $statementsLists
288
+ * @return string HTML
289
+ */
290
+ private function getVueStatementsHtml ( array $ statementsLists ): string {
291
+ $ snakHtmlLookup = [];
292
+ $ app = $ this ->setupVueTemplateRenderer ( $ snakHtmlLookup );
277
293
278
294
return "<div id='wikibase-wbui2025-statementgrouplistview'> " .
279
- $ this ->getVueStatementHtml ( $ statementsLists , $ app , $ snakHtmlLookup ) .
295
+ $ this ->getVueStatementSectionsHtml ( $ statementsLists , $ app , $ snakHtmlLookup ) .
280
296
"</div> " ;
281
297
}
282
298
283
299
/**
284
- * @param StatementList $statementList
285
- * @param bool $wbui2025Ready whether the caller supports wbui2025
286
- *
287
- * @throws InvalidArgumentException
288
- * @return string HTML
300
+ * @param StatementList[] $statementLists
289
301
*/
290
- public function getHtml ( StatementList $ statementList , bool $ wbui2025Ready = false ) {
291
- $ statementLists = $ this ->statementGrouper ->groupStatements ( $ statementList );
292
- if ( $ wbui2025Ready && $ this ->vueStatementsView ) {
293
- return $ this ->getVueStatementsHtml ( $ statementLists );
294
- }
295
- $ html = '' ;
296
-
302
+ private function iterateOverNonEmptyStatementSections ( array $ statementLists ): Traversable {
297
303
foreach ( $ statementLists as $ key => $ statements ) {
298
304
if ( !is_string ( $ key ) || !( $ statements instanceof StatementList ) ) {
299
305
throw new InvalidArgumentException (
@@ -305,6 +311,25 @@ public function getHtml( StatementList $statementList, bool $wbui2025Ready = fal
305
311
continue ;
306
312
}
307
313
314
+ yield $ key => $ statements ;
315
+ }
316
+ }
317
+
318
+ /**
319
+ * @param StatementList $statementList
320
+ * @param bool $wbui2025Ready whether the caller supports wbui2025
321
+ *
322
+ * @throws InvalidArgumentException
323
+ * @return string HTML
324
+ */
325
+ public function getHtml ( StatementList $ statementList , bool $ wbui2025Ready = false ) {
326
+ $ statementLists = $ this ->statementGrouper ->groupStatements ( $ statementList );
327
+ if ( $ wbui2025Ready && $ this ->vueStatementsView ) {
328
+ return $ this ->getVueStatementsHtml ( $ statementLists );
329
+ }
330
+
331
+ $ html = '' ;
332
+ foreach ( $ this ->iterateOverNonEmptyStatementSections ( $ statementLists ) as $ key => $ statements ) {
308
333
$ html .= $ this ->getHtmlForSectionHeading ( $ key );
309
334
$ html .= $ this ->statementListView ->getHtml ( $ statements ->toArray () );
310
335
}
0 commit comments