mirror of
https://github.com/Universal-Omega/PortableInfobox.git
synced 2024-12-21 12:32:35 +00:00
93 lines
2.4 KiB
PHP
93 lines
2.4 KiB
PHP
<?php
|
|
|
|
use PortableInfobox\Helpers\PagePropsProxy;
|
|
|
|
class ApiQueryPortableInfobox extends ApiQueryBase {
|
|
|
|
protected $propsProxy;
|
|
|
|
public function __construct( $query, $moduleName ) {
|
|
parent::__construct( $query, $moduleName, 'ib' );
|
|
$this->propsProxy = new PagePropsProxy( true );
|
|
}
|
|
|
|
public function execute() {
|
|
$this->runOnPageSet( $this->getPageSet() );
|
|
}
|
|
|
|
protected function runOnPageSet( ApiPageSet $pageSet ) {
|
|
$articles = $pageSet->getGoodPages();
|
|
$res = $pageSet->getResult();
|
|
|
|
foreach ( $articles as $id => $articleTitle ) {
|
|
$title = Title::castFromPageIdentity( $articleTitle );
|
|
|
|
if ( $title === null ) {
|
|
continue;
|
|
}
|
|
|
|
$parsedInfoboxes = PortableInfoboxDataService::newFromTitle( $title )
|
|
->setPagePropsProxy( $this->propsProxy )
|
|
->getData();
|
|
|
|
if ( is_array( $parsedInfoboxes ) && count( $parsedInfoboxes ) ) {
|
|
$inf = [];
|
|
|
|
foreach ( array_keys( $parsedInfoboxes ) as $k => $v ) {
|
|
$inf[$k] = [];
|
|
}
|
|
|
|
$res->setIndexedTagName( $inf, 'infobox' );
|
|
$res->addValue( [ 'query', 'pages', $id ], 'infoboxes', $inf );
|
|
|
|
foreach ( $parsedInfoboxes as $count => $infobox ) {
|
|
$res->addValue( [ 'query', 'pages', $id, 'infoboxes', $count ], 'id', $count );
|
|
|
|
$res->addValue(
|
|
[ 'query', 'pages', $id, 'infoboxes', $count ],
|
|
'parser_tag_version',
|
|
$infobox['parser_tag_version']
|
|
);
|
|
|
|
$metadata = $infobox['metadata'];
|
|
|
|
$res->addValue(
|
|
[ 'query', 'pages', $id, 'infoboxes', $count ], 'metadata', $metadata
|
|
);
|
|
$res->addIndexedTagName(
|
|
[ 'query', 'pages', $id, 'infoboxes', $count, 'metadata' ],
|
|
'metadata'
|
|
);
|
|
$this->setIndexedTagNamesForGroupMetadata(
|
|
$metadata,
|
|
[ 'query', 'pages', $id, 'infoboxes', $count, 'metadata' ],
|
|
$res
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
$this->propsProxy->write();
|
|
}
|
|
|
|
/**
|
|
* XML format requires all indexed arrays to have _element defined
|
|
* This method adds it recursively for all groups
|
|
*
|
|
* @param array $metadata
|
|
* @param array $rootPath
|
|
* @param ApiResult $result
|
|
*/
|
|
private function setIndexedTagNamesForGroupMetadata(
|
|
array $metadata, array $rootPath, ApiResult $result
|
|
) {
|
|
foreach ( $metadata as $nodeCount => $node ) {
|
|
if ( $node['type'] === 'group' ) {
|
|
$path = array_merge( $rootPath, [ $nodeCount, 'metadata' ] );
|
|
$result->addIndexedTagName( $path, 'metadata' );
|
|
$this->setIndexedTagNamesForGroupMetadata( $node['metadata'], $path, $result );
|
|
}
|
|
}
|
|
}
|
|
}
|