44
55use InvalidArgumentException ;
66use MediaWiki \MediaWikiServices ;
7+ use Traversable ;
78use Wikibase \DataModel \Serializers \SerializerFactory ;
89use Wikibase \DataModel \Services \Lookup \PropertyDataTypeLookup ;
910use Wikibase \DataModel \Services \Statement \Grouper \StatementGrouper ;
@@ -130,64 +131,69 @@ private function populateQualifierSnakHtml( Statement $statement, array $stateme
130131 }
131132
132133 /**
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
135137 * @param array &$snakHtmlLookup
136- * @return string HTML
138+ * @return string Rendered HTML
137139 */
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 );
172164 }
173- $ propertyStatementMap [ $ propertyId -> getSerialization () ] = $ statementsData ;
165+ $ statementsData [ ] = $ statementData ;
174166 }
175-
176- $ rendered .= $ app ->renderComponent ( 'wbui2025-statement-sections ' , [
177- 'sectionHeadingHtml ' => $ sectionHeadingHtml ,
178- 'propertyList ' => $ propertyList ,
179- 'propertyStatementMap ' => $ propertyStatementMap ,
180- ] );
167+ $ propertyStatementMap [$ propertyId ->getSerialization ()] = $ statementsData ;
181168 }
182- return $ rendered ;
169+
170+ return $ app ->renderComponent ( 'wbui2025-statement-sections ' , [
171+ 'sectionHeadingHtml ' => $ sectionHeadingHtml ,
172+ 'propertyList ' => $ propertyList ,
173+ 'propertyStatementMap ' => $ propertyStatementMap ,
174+ ] );
183175 }
184176
185177 /**
186178 * @param StatementList[] $statementsLists
179+ * @param App $app
180+ * @param array &$snakHtmlLookup
187181 * @return string HTML
188182 */
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 {
191197 $ app = new App ( [
192198 'snakHtml ' => function ( $ snak ) use ( &$ snakHtmlLookup ) {
193199 if ( array_key_exists ( $ snak ['hash ' ], $ snakHtmlLookup ) ) {
@@ -274,26 +280,26 @@ function ( array $data ): array {
274280 return $ data ;
275281 }
276282 );
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 );
277293
278294 return "<div id='wikibase-wbui2025-statementgrouplistview'> " .
279- $ this ->getVueStatementHtml ( $ statementsLists , $ app , $ snakHtmlLookup ) .
295+ $ this ->getVueStatementSectionsHtml ( $ statementsLists , $ app , $ snakHtmlLookup ) .
280296 "</div> " ;
281297 }
282298
283299 /**
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
289301 */
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 {
297303 foreach ( $ statementLists as $ key => $ statements ) {
298304 if ( !is_string ( $ key ) || !( $ statements instanceof StatementList ) ) {
299305 throw new InvalidArgumentException (
@@ -305,6 +311,25 @@ public function getHtml( StatementList $statementList, bool $wbui2025Ready = fal
305311 continue ;
306312 }
307313
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 ) {
308333 $ html .= $ this ->getHtmlForSectionHeading ( $ key );
309334 $ html .= $ this ->statementListView ->getHtml ( $ statements ->toArray () );
310335 }
0 commit comments