| Current File : /home/jvzmxxx/wiki1/extensions/Wikibase/view/src/SnakHtmlGenerator.php |
<?php
namespace Wikibase\View;
use InvalidArgumentException;
use ValueFormatters\FormattingException;
use Wikibase\DataModel\Services\EntityId\EntityIdFormatter;
use Wikibase\DataModel\Services\Lookup\PropertyDataTypeLookupException;
use Wikibase\DataModel\Snak\Snak;
use Wikibase\Lib\SnakFormatter;
use Wikibase\View\Template\TemplateFactory;
/**
* Base class for generating Snak html.
*
* @since 0.5
*
* @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 SnakHtmlGenerator {
/**
* @var TemplateFactory
*/
private $templateFactory;
/**
* @var SnakFormatter
*/
private $snakFormatter;
/**
* @var EntityIdFormatter
*/
private $propertyIdFormatter;
/**
* @var LocalizedTextProvider
*/
private $textProvider;
/**
* @param TemplateFactory $templateFactory
* @param SnakFormatter $snakFormatter
* @param EntityIdFormatter $propertyIdFormatter
* @param LocalizedTextProvider $textProvider
*
* @throws InvalidArgumentException
*/
public function __construct(
TemplateFactory $templateFactory,
SnakFormatter $snakFormatter,
EntityIdFormatter $propertyIdFormatter,
LocalizedTextProvider $textProvider
) {
if ( $snakFormatter->getFormat() !== SnakFormatter::FORMAT_HTML
&& $snakFormatter->getFormat() !== SnakFormatter::FORMAT_HTML_WIDGET ) {
throw new InvalidArgumentException( '$snakFormatter is expected to return text/html, not '
. $snakFormatter->getFormat() );
}
$this->snakFormatter = $snakFormatter;
$this->propertyIdFormatter = $propertyIdFormatter;
$this->templateFactory = $templateFactory;
$this->textProvider = $textProvider;
}
/**
* Generates the HTML for a single snak.
*
* @param Snak $snak
* @param bool $showPropertyLink
*
* @return string
*/
public function getSnakHtml( Snak $snak, $showPropertyLink = false ) {
$snakViewVariation = $this->getSnakViewVariation( $snak );
$snakViewCssClass = 'wikibase-snakview-variation-' . $snakViewVariation;
$formattedValue = $this->getFormattedSnakValue( $snak );
if ( $formattedValue === '' ) {
$formattedValue = ' ';
}
$propertyLink = $showPropertyLink ? $this->makePropertyLink( $snak ) : '';
$html = $this->templateFactory->render( 'wikibase-snakview',
// Display property link only once for snaks featuring the same property:
$propertyLink,
$snakViewCssClass,
$formattedValue
);
return $html;
}
/**
* @param Snak $snak
*
* @return string
*/
private function makePropertyLink( Snak $snak ) {
$propertyId = $snak->getPropertyId();
$propertyLink = $this->propertyIdFormatter->formatEntityId( $propertyId );
return $propertyLink;
}
/**
* @param Snak $snak
*
* @return string
*/
private function getSnakViewVariation( Snak $snak ) {
return $snak->getType() . 'snak';
}
/**
* @fixme handle errors more consistently as done in JS UI, and perhaps add
* localised exception messages.
*
* @param Snak $snak
* @return string HTML
*/
private function getFormattedSnakValue( $snak ) {
try {
$formattedSnak = $this->snakFormatter->formatSnak( $snak );
} catch ( FormattingException $ex ) {
return $this->getInvalidSnakMessage();
} catch ( PropertyDataTypeLookupException $ex ) {
return $this->getPropertyNotFoundMessage();
} catch ( InvalidArgumentException $ex ) {
return $this->getInvalidSnakMessage();
}
return $formattedSnak;
}
/**
* @return string HTML
*/
private function getInvalidSnakMessage() {
return htmlspecialchars( $this->textProvider->get( 'wikibase-snakformat-invalid-value' ) );
}
/**
* @return string HTML
*/
private function getPropertyNotFoundMessage() {
return htmlspecialchars( $this->textProvider->get( 'wikibase-snakformat-propertynotfound' ) );
}
}