Skip to content

Commit 3fd1bed

Browse files
coddersjenkins-bot
authored andcommitted
Refactor StatementSectionsView
Make the StatementSectionsView class a bit tidier, and reduce code duplication. This is a separate change to reduce conflicts with other patches. Bug: T400085 Change-Id: I14710ddde80ad47082d6a8142579774b57f0e4e3
1 parent a032909 commit 3fd1bed

File tree

1 file changed

+85
-60
lines changed

1 file changed

+85
-60
lines changed

view/src/StatementSectionsView.php

Lines changed: 85 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use InvalidArgumentException;
66
use MediaWiki\MediaWikiServices;
7+
use Traversable;
78
use Wikibase\DataModel\Serializers\SerializerFactory;
89
use Wikibase\DataModel\Services\Lookup\PropertyDataTypeLookup;
910
use 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

Comments
 (0)