| Current File : /home/jvzmxxx/wiki/extensions/Wikibase/client/includes/DataAccess/PropertyParserFunction/Runner.php |
<?php
namespace Wikibase\Client\DataAccess\PropertyParserFunction;
use Parser;
use PPFrame;
use Wikibase\DataModel\Services\Lookup\RestrictedEntityLookup;
use Wikibase\Client\Usage\ParserOutputUsageAccumulator;
use Wikibase\Client\WikibaseClient;
use Wikibase\DataModel\Entity\EntityId;
use Wikibase\DataModel\Entity\EntityIdParser;
use Wikibase\DataModel\Entity\EntityIdParsingException;
use Wikibase\Lib\Store\SiteLinkLookup;
/**
* Runner for the {{#property}} parser function.
*
* @since 0.4
*
* @license GPL-2.0+
* @author Katie Filbert < aude.wiki@gmail.com >
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
* @author Daniel Kinzler
* @author Liangent < liangent@gmail.com >
* @author Marius Hoch < hoo@online.de >
*/
class Runner {
/**
* @var StatementGroupRendererFactory
*/
private $rendererFactory;
/**
* @var SiteLinkLookup
*/
private $siteLinkLookup;
/**
* @var EntityIdParser
*/
private $entityIdParser;
/**
* @var RestrictedEntityLookup
*/
private $restrictedEntityLookup;
/**
* @var string
*/
private $siteId;
/**
* @var bool
*/
private $allowArbitraryDataAccess;
/**
* @param StatementGroupRendererFactory $rendererFactory
* @param SiteLinkLookup $siteLinkLookup
* @param EntityIdParser $entityIdParser
* @param RestrictedEntityLookup $restrictedEntityLookup
* @param string $siteId
* @param bool $allowArbitraryDataAccess
*/
public function __construct(
StatementGroupRendererFactory $rendererFactory,
SiteLinkLookup $siteLinkLookup,
EntityIdParser $entityIdParser,
RestrictedEntityLookup $restrictedEntityLookup,
$siteId,
$allowArbitraryDataAccess
) {
$this->rendererFactory = $rendererFactory;
$this->siteLinkLookup = $siteLinkLookup;
$this->entityIdParser = $entityIdParser;
$this->restrictedEntityLookup = $restrictedEntityLookup;
$this->siteId = $siteId;
$this->allowArbitraryDataAccess = $allowArbitraryDataAccess;
}
/**
* @param Parser $parser
* @param PPFrame $frame
* @param array $args
*
* @return array Wikitext
*/
public function runPropertyParserFunction( Parser $parser, PPFrame $frame, array $args ) {
$propertyLabelOrId = $frame->expand( $args[0] );
unset( $args[0] );
// Create a child frame, so that we can access arguments by name.
$childFrame = $frame->newChild( $args, $parser->getTitle() );
$entityId = $this->getEntityIdForStatementListProvider( $parser, $childFrame, $args );
if ( $entityId === null ) {
return $this->buildResult( '' );
}
$renderer = $this->rendererFactory->newRendererFromParser( $parser );
$rendered = $renderer->render( $entityId, $propertyLabelOrId );
$result = $this->buildResult( $rendered );
// Track usage of "other" (that is, not label/title/sitelinks) data from the item.
$usageAcc = new ParserOutputUsageAccumulator( $parser->getOutput() );
$usageAcc->addOtherUsage( $entityId );
return $result;
}
/**
* @param Parser $parser
* @param PPFrame $frame
* @param array $args
*
* @return EntityId|null
*/
private function getEntityIdForStatementListProvider( Parser $parser, PPFrame $frame, array $args ) {
$from = $frame->getArgument( 'from' );
if ( $from && $this->allowArbitraryDataAccess ) {
$entityId = $this->getEntityIdFromString( $parser, $from );
} else {
$title = $parser->getTitle();
$entityId = $this->siteLinkLookup->getItemIdForLink( $this->siteId, $title->getPrefixedText() );
}
return $entityId;
}
/**
* Gets the entity and increments the expensive parser function count.
*
* @param Parser $parser
* @param string $entityIdString
*
* @return EntityId|null
*/
private function getEntityIdFromString( Parser $parser, $entityIdString ) {
try {
$entityId = $this->entityIdParser->parse( $entityIdString );
} catch ( EntityIdParsingException $ex ) {
// Just ignore this
return null;
}
// Getting a foreign item is expensive (unless we already loaded it and it's cached)
if ( !$this->restrictedEntityLookup->entityHasBeenAccessed( $entityId ) ) {
$parser->incrementExpensiveFunctionCount();
}
return $entityId;
}
/**
* @param string $rendered
*
* @return array
*/
private function buildResult( $rendered ) {
$result = array(
$rendered,
'noparse' => false, // parse wikitext
'nowiki' => false, // formatters take care of escaping as needed
);
return $result;
}
/**
* @since 0.4
*
* @param Parser $parser
* @param PPFrame $frame
* @param array $args
*
* @return array
*/
public static function render( Parser $parser, PPFrame $frame, array $args ) {
$runner = WikibaseClient::getDefaultInstance()->getPropertyParserFunctionRunner();
return $runner->runPropertyParserFunction( $parser, $frame, $args );
}
}