| Current File : /home/jvzmxxx/wiki1/extensions/Wikibase/view/src/ViewFactory.php |
<?php
namespace Wikibase\View;
use DataTypes\DataTypeFactory;
use InvalidArgumentException;
use SiteStore;
use ValueFormatters\NumberLocalizer;
use Wikibase\DataModel\Services\Lookup\LabelDescriptionLookup;
use Wikibase\DataModel\Services\Statement\Grouper\StatementGrouper;
use Wikibase\LanguageFallbackChain;
use Wikibase\Lib\LanguageNameLookup;
use Wikibase\Lib\SnakFormatter;
use Wikibase\View\Template\TemplateFactory;
/**
* This is a basic factory to create views for DataModel objects. It contains all dependencies of
* the views besides request-specific options. Those are required in the parameters.
*
* @since 0.5
*
* @license GPL-2.0+
* @author Katie Filbert < aude.wiki@gmail.com >
* @author Thiemo Mättig
* @author Bene* < benestar.wikimedia@gmail.com >
*/
class ViewFactory {
/**
* @var HtmlSnakFormatterFactory
*/
private $htmlSnakFormatterFactory;
/**
* @var EntityIdFormatterFactory
*/
private $htmlIdFormatterFactory;
/**
* @var EntityIdFormatterFactory
*/
private $plainTextIdFormatterFactory;
/**
* @var StatementGrouper
*/
private $statementGrouper;
/**
* @var SiteStore
*/
private $siteStore;
/**
* @var DataTypeFactory
*/
private $dataTypeFactory;
/**
* @var TemplateFactory
*/
private $templateFactory;
/**
* @var LanguageNameLookup
*/
private $languageNameLookup;
/**
* @var LanguageDirectionalityLookup
*/
private $languageDirectionalityLookup;
/**
* @var NumberLocalizer
*/
private $numberLocalizer;
/**
* @var string[]
*/
private $siteLinkGroups;
/**
* @var string[]
*/
private $specialSiteLinkGroups;
/**
* @var string[]
*/
private $badgeItems;
/**
* @var LocalizedTextProvider
*/
private $textProvider;
/**
* @param EntityIdFormatterFactory $htmlIdFormatterFactory
* @param EntityIdFormatterFactory $plainTextIdFormatterFactory
* @param HtmlSnakFormatterFactory $htmlSnakFormatterFactory
* @param StatementGrouper $statementGrouper
* @param SiteStore $siteStore
* @param DataTypeFactory $dataTypeFactory
* @param TemplateFactory $templateFactory
* @param LanguageNameLookup $languageNameLookup
* @param LanguageDirectionalityLookup $languageDirectionalityLookup
* @param NumberLocalizer $numberLocalizer
* @param string[] $siteLinkGroups
* @param string[] $specialSiteLinkGroups
* @param string[] $badgeItems
* @param LocalizedTextProvider $textProvider
*
* @throws InvalidArgumentException
*/
public function __construct(
EntityIdFormatterFactory $htmlIdFormatterFactory,
EntityIdFormatterFactory $plainTextIdFormatterFactory,
HtmlSnakFormatterFactory $htmlSnakFormatterFactory,
StatementGrouper $statementGrouper,
SiteStore $siteStore,
DataTypeFactory $dataTypeFactory,
TemplateFactory $templateFactory,
LanguageNameLookup $languageNameLookup,
LanguageDirectionalityLookup $languageDirectionalityLookup,
NumberLocalizer $numberLocalizer,
array $siteLinkGroups = array(),
array $specialSiteLinkGroups = array(),
array $badgeItems = array(),
LocalizedTextProvider $textProvider
) {
if ( !$this->hasValidOutputFormat( $htmlIdFormatterFactory, 'text/html' )
|| !$this->hasValidOutputFormat( $plainTextIdFormatterFactory, 'text/plain' )
) {
throw new InvalidArgumentException( 'Expected an HTML and a plain text EntityIdFormatter factory' );
}
$this->htmlIdFormatterFactory = $htmlIdFormatterFactory;
$this->plainTextIdFormatterFactory = $plainTextIdFormatterFactory;
$this->htmlSnakFormatterFactory = $htmlSnakFormatterFactory;
$this->statementGrouper = $statementGrouper;
$this->siteStore = $siteStore;
$this->dataTypeFactory = $dataTypeFactory;
$this->templateFactory = $templateFactory;
$this->languageNameLookup = $languageNameLookup;
$this->languageDirectionalityLookup = $languageDirectionalityLookup;
$this->numberLocalizer = $numberLocalizer;
$this->siteLinkGroups = $siteLinkGroups;
$this->specialSiteLinkGroups = $specialSiteLinkGroups;
$this->badgeItems = $badgeItems;
$this->textProvider = $textProvider;
}
/**
* @param EntityIdFormatterFactory $factory
* @param string $expected
*
* @return bool
*/
private function hasValidOutputFormat( EntityIdFormatterFactory $factory, $expected ) {
switch ( $factory->getOutputFormat() ) {
case SnakFormatter::FORMAT_PLAIN:
return $expected === 'text/plain';
case SnakFormatter::FORMAT_HTML:
case SnakFormatter::FORMAT_HTML_DIFF:
case SnakFormatter::FORMAT_HTML_WIDGET:
return $expected === 'text/html';
}
return false;
}
/**
* Creates an ItemView suitable for rendering the item.
*
* @param string $languageCode UI language
* @param LabelDescriptionLookup $labelDescriptionLookup
* @param LanguageFallbackChain $fallbackChain
* @param EditSectionGenerator $editSectionGenerator
*
* @return ItemView
*/
public function newItemView(
$languageCode,
LabelDescriptionLookup $labelDescriptionLookup,
LanguageFallbackChain $fallbackChain,
EditSectionGenerator $editSectionGenerator
) {
$entityTermsView = $this->newEntityTermsView( $editSectionGenerator );
$statementSectionsView = $this->newStatementSectionsView(
$languageCode,
$labelDescriptionLookup,
$fallbackChain,
$editSectionGenerator
);
$siteLinksView = new SiteLinksView(
$this->templateFactory,
$this->siteStore->getSites(),
$editSectionGenerator,
$this->plainTextIdFormatterFactory->getEntityIdFormatter( $labelDescriptionLookup ),
$this->languageNameLookup,
$this->numberLocalizer,
$this->badgeItems,
$this->specialSiteLinkGroups,
$this->textProvider
);
return new ItemView(
$this->templateFactory,
$entityTermsView,
$this->languageDirectionalityLookup,
$statementSectionsView,
$languageCode,
$siteLinksView,
$this->siteLinkGroups,
$this->textProvider
);
}
/**
* Creates an PropertyView suitable for rendering the property.
*
* @param string $languageCode
* @param LabelDescriptionLookup $labelDescriptionLookup
* @param LanguageFallbackChain $fallbackChain
* @param EditSectionGenerator $editSectionGenerator
*
* @return PropertyView
*/
public function newPropertyView(
$languageCode,
LabelDescriptionLookup $labelDescriptionLookup,
LanguageFallbackChain $fallbackChain,
EditSectionGenerator $editSectionGenerator
) {
$entityTermsView = $this->newEntityTermsView( $editSectionGenerator );
$statementSectionsView = $this->newStatementSectionsView(
$languageCode,
$labelDescriptionLookup,
$fallbackChain,
$editSectionGenerator
);
return new PropertyView(
$this->templateFactory,
$entityTermsView,
$this->languageDirectionalityLookup,
$statementSectionsView,
$this->dataTypeFactory,
$languageCode,
$this->textProvider
);
}
/**
* @param string $languageCode
* @param LanguageFallbackChain $fallbackChain
* @param LabelDescriptionLookup $labelDescriptionLookup
* @param EditSectionGenerator $editSectionGenerator
*
* @return StatementSectionsView
*/
public function newStatementSectionsView(
$languageCode,
LabelDescriptionLookup $labelDescriptionLookup,
LanguageFallbackChain $fallbackChain,
EditSectionGenerator $editSectionGenerator
) {
$snakFormatter = $this->htmlSnakFormatterFactory->getSnakFormatter(
$languageCode,
$fallbackChain,
$labelDescriptionLookup
);
$propertyIdFormatter = $this->htmlIdFormatterFactory->getEntityIdFormatter(
$labelDescriptionLookup
);
$snakHtmlGenerator = new SnakHtmlGenerator(
$this->templateFactory,
$snakFormatter,
$propertyIdFormatter,
$this->textProvider
);
$claimHtmlGenerator = new ClaimHtmlGenerator(
$this->templateFactory,
$snakHtmlGenerator,
$this->numberLocalizer,
$this->textProvider
);
$statementGroupListView = new StatementGroupListView(
$this->templateFactory,
$propertyIdFormatter,
$editSectionGenerator,
$claimHtmlGenerator
);
return new StatementSectionsView(
$this->templateFactory,
$this->statementGrouper,
$statementGroupListView,
$this->textProvider
);
}
/**
* @param EditSectionGenerator $editSectionGenerator
*
* @return EntityTermsView
*/
public function newEntityTermsView( EditSectionGenerator $editSectionGenerator ) {
return new EntityTermsView(
$this->templateFactory,
$editSectionGenerator,
$this->textProvider
);
}
}