| Current File : /home/jvzmxxx/wiki1/extensions/Wikibase/view/src/ClaimHtmlGenerator.php |
<?php
namespace Wikibase\View;
use ValueFormatters\NumberLocalizer;
use Wikibase\DataModel\Reference;
use Wikibase\DataModel\ReferenceList;
use Wikibase\DataModel\Services\ByPropertyIdGrouper;
use Wikibase\DataModel\Snak\Snak;
use Wikibase\DataModel\Snak\SnakList;
use Wikibase\DataModel\Statement\Statement;
use Wikibase\View\Template\TemplateFactory;
/**
* Base class for generating the HTML for a Claim in Entity View.
*
* @todo move Statement-specific formatting elsewhere.
*
* @since 0.4
*
* @license GPL-2.0+
* @author H. Snater < mediawiki@snater.com >
* @author Pragunbhutani
* @author Katie Filbert < aude.wiki@gmail.com >
* @author Daniel Kinzler
* @author Adrian Heine <adrian.heine@wikimedia.de>
*/
class ClaimHtmlGenerator {
/**
* @var TemplateFactory
*/
private $templateFactory;
/**
* @var SnakHtmlGenerator
*/
private $snakHtmlGenerator;
/**
* @var NumberLocalizer
*/
private $numberLocalizer;
/**
* @var string[]
*/
private $referenceHeadings = array();
/**
* @var string[]
*/
private $statementRankSelector = array();
/**
* @var LocalizedTextProvider
*/
private $textProvider;
/**
* @param TemplateFactory $templateFactory
* @param SnakHtmlGenerator $snakHtmlGenerator
* @param NumberLocalizer $numberLocalizer
* @param LocalizedTextProvider $textProvider
*/
public function __construct(
TemplateFactory $templateFactory,
SnakHtmlGenerator $snakHtmlGenerator,
NumberLocalizer $numberLocalizer,
LocalizedTextProvider $textProvider
) {
$this->snakHtmlGenerator = $snakHtmlGenerator;
$this->templateFactory = $templateFactory;
$this->numberLocalizer = $numberLocalizer;
$this->textProvider = $textProvider;
}
/**
* Builds and returns the HTML representing a single WikibaseEntity's statement.
*
* @since 0.4
*
* @param Statement $statement
* @param null|string $editSectionHtml has the html for the edit section
*
* @return string HTML
*/
public function getHtmlForClaim( Statement $statement, $editSectionHtml = null ) {
$mainSnakHtml = $this->snakHtmlGenerator->getSnakHtml(
$statement->getMainSnak(),
false
);
$rankHtml = $this->getRankSelector( $statement->getRank() );
$referencesHeadingHtml = $this->getReferencesHeading( $statement );
$references = $statement->getReferences();
$referencesHtml = $this->getHtmlForReferences( $references );
return $this->templateFactory->render(
'wikibase-statementview',
$statement->getGuid(),
$rankHtml,
$mainSnakHtml,
$this->getHtmlForQualifiers( $statement->getQualifiers() ),
$editSectionHtml,
$referencesHeadingHtml,
$referencesHtml,
count( $references ) ? 'wikibase-initially-collapsed' : ''
);
}
/**
* Generates and returns the HTML representing a claim's qualifiers.
*
* @param SnakList $qualifiers
*
* @return string HTML
*/
private function getHtmlForQualifiers( SnakList $qualifiers ) {
$qualifiersByProperty = new ByPropertyIdGrouper( $qualifiers );
$snaklistviewsHtml = '';
foreach ( $qualifiersByProperty->getPropertyIds() as $propertyId ) {
$snaklistviewsHtml .= $this->getSnaklistviewHtml(
$qualifiersByProperty->getByPropertyId( $propertyId )
);
}
return $this->wrapInListview( $snaklistviewsHtml );
}
/**
* Generates the HTML for a ReferenceList object.
*
* @param ReferenceList $referenceList
*
* @return string HTML
*/
private function getHtmlForReferences( ReferenceList $referenceList ) {
$referencesHtml = '';
foreach ( $referenceList as $reference ) {
$referencesHtml .= $this->getHtmlForReference( $reference );
}
return $this->wrapInListview( $referencesHtml );
}
private function wrapInListview( $listviewContent ) {
if ( $listviewContent !== '' ) {
return $this->templateFactory->render( 'wikibase-listview', $listviewContent );
} else {
return '';
}
}
/**
* Generates the HTML for a Reference object.
*
* @param Reference $reference
*
* @return string HTML
*/
private function getHtmlForReference( Reference $reference ) {
$snaks = $reference->getSnaks();
$referenceSnaksByProperty = new ByPropertyIdGrouper( $snaks );
$snaklistviewsHtml = '';
foreach ( $referenceSnaksByProperty->getPropertyIds() as $propertyId ) {
$snaklistviewsHtml .= $this->getSnaklistviewHtml(
$referenceSnaksByProperty->getByPropertyId( $propertyId )
);
}
return $this->templateFactory->render(
'wikibase-referenceview',
'wikibase-referenceview-' . $reference->getHash(),
$snaklistviewsHtml
);
}
/**
* Generates the HTML for a list of snaks.
*
* @param Snak[] $snaks
*
* @return string HTML
*/
private function getSnaklistviewHtml( array $snaks ) {
$snaksHtml = '';
$i = 0;
foreach ( $snaks as $snak ) {
$snaksHtml .= $this->snakHtmlGenerator->getSnakHtml( $snak, ( $i++ === 0 ) );
}
return $this->templateFactory->render( 'wikibase-snaklistview', $snaksHtml );
}
/**
* @param Statement $statement
*
* @return string HTML
*/
private function getReferencesHeading( Statement $statement ) {
$referenceCount = count( $statement->getReferences() );
if ( !array_key_exists( $referenceCount, $this->referenceHeadings ) ) {
$this->referenceHeadings[ $referenceCount ] = htmlspecialchars( $this->textProvider->get(
'wikibase-statementview-references-counter',
[
$this->numberLocalizer->localizeNumber( $referenceCount ),
$this->numberLocalizer->localizeNumber( 0 ),
'',
''
]
) );
}
return $this->referenceHeadings[ $referenceCount ];
}
/**
* @param int $rank
*
* @return string HTML
*/
private function getRankSelector( $rank ) {
if ( !array_key_exists( $rank, $this->statementRankSelector ) ) {
$rankName = [
Statement::RANK_DEPRECATED => 'deprecated',
Statement::RANK_NORMAL => 'normal',
Statement::RANK_PREFERRED => 'preferred'
][ $rank ];
// Messages: wikibase-statementview-rank-preferred, wikibase-statementview-rank-normal,
// wikibase-statementview-rank-deprecated
$rankSelector = $this->templateFactory->render(
'wikibase-rankselector',
'ui-state-disabled',
'wikibase-rankselector-' . $rankName,
htmlspecialchars( $this->textProvider->get( 'wikibase-statementview-rank-' . $rankName ) )
);
$this->statementRankSelector[ $rank ] = $rankSelector;
}
return $this->statementRankSelector[ $rank ];
}
}