| Current File : /home/jvzmxxx/wiki/extensions/Wikibase/lib/includes/Formatters/EntityIdHtmlLinkFormatter.php |
<?php
namespace Wikibase\Lib;
use Html;
use Wikibase\DataModel\Entity\EntityId;
use Wikibase\DataModel\Services\EntityId\EntityIdLabelFormatter;
use Wikibase\DataModel\Services\Lookup\LabelDescriptionLookup;
use Wikibase\DataModel\Term\Term;
use Wikibase\DataModel\Term\TermFallback;
use Wikibase\Lib\Store\EntityTitleLookup;
/**
* Formats entity IDs by generating an HTML link to the corresponding page title.
*
* @since 0.5
*
* @license GPL-2.0+
* @author Adrian Heine <adrian.heine@wikimedia.de>
* @author Thiemo Mättig
*/
class EntityIdHtmlLinkFormatter extends EntityIdLabelFormatter {
/**
* @var LanguageNameLookup
*/
private $languageNameLookup;
/**
* @var EntityTitleLookup
*/
protected $entityTitleLookup;
/**
* @param LabelDescriptionLookup $labelDescriptionLookup
* @param EntityTitleLookup $entityTitleLookup
* @param LanguageNameLookup $languageNameLookup
*/
public function __construct(
LabelDescriptionLookup $labelDescriptionLookup,
EntityTitleLookup $entityTitleLookup,
LanguageNameLookup $languageNameLookup
) {
parent::__construct( $labelDescriptionLookup );
$this->entityTitleLookup = $entityTitleLookup;
$this->languageNameLookup = $languageNameLookup;
}
/**
* @see EntityIdFormatter::formatEntityId
*
* @param EntityId $entityId
*
* @return string HTML
*/
public function formatEntityId( EntityId $entityId ) {
$title = $this->entityTitleLookup->getTitleForId( $entityId );
$term = $this->lookupEntityLabel( $entityId );
if ( $term ) {
return $this->getHtmlForTerm( $title->getLocalURL(), $term, $title->getPrefixedText() );
} elseif ( !$title->exists() ) {
return $this->getHtmlForNonExistent( $entityId );
}
$attributes = array(
'title' => $title->getPrefixedText(),
'href' => $title->getLocalURL()
);
$html = Html::element( 'a', $attributes, $entityId->getSerialization() );
return $html;
}
/**
* @param string $targetUrl
* @param Term $term
* @param string $titleText
*
* @return string HTML
*/
private function getHtmlForTerm( $targetUrl, Term $term, $titleText = '' ) {
$fallbackIndicatorHtml = '';
$attributes = array(
'title' => $titleText,
'href' => $targetUrl
);
if ( $term instanceof TermFallback ) {
$fallbackIndicatorHtml = $this->getHtmlForFallbackIndicator( $term );
if ( $term->getActualLanguageCode() !== $term->getLanguageCode() ) {
$attributes['lang'] = $term->getActualLanguageCode();
//TODO: mark as rtl/ltr if appropriate.
}
}
$html = Html::element( 'a', $attributes, $term->getText() );
return $html . $fallbackIndicatorHtml;
}
/**
* @param EntityId $entityId
*
* @return string HTML
*/
private function getHtmlForNonExistent( EntityId $entityId ) {
$attributes = array( 'class' => 'wb-entity-undefinedinfo' );
$message = wfMessage( 'parentheses',
wfMessage( 'wikibase-deletedentity-' . $entityId->getEntityType() )->text()
);
$undefinedInfo = Html::element( 'span', $attributes, $message );
$separator = wfMessage( 'word-separator' )->text();
return $entityId->getSerialization() . $separator . $undefinedInfo;
}
private function getHtmlForFallbackIndicator( TermFallback $term ) {
$requestedLanguage = $term->getLanguageCode();
$actualLanguage = $term->getActualLanguageCode();
$sourceLanguage = $term->getSourceLanguageCode();
// FIXME: TermFallback should either return equal values or null
$sourceLanguage = $sourceLanguage === null ? $actualLanguage : $sourceLanguage;
$isInRequestedLanguage = $actualLanguage === $requestedLanguage;
$isInSourceLanguage = $actualLanguage === $sourceLanguage;
if ( $isInRequestedLanguage && $isInSourceLanguage ) {
// This is neither a fallback nor a transliteration
return '';
}
$sourceLanguageName = $this->languageNameLookup->getName( $sourceLanguage );
$actualLanguageName = $this->languageNameLookup->getName( $actualLanguage );
// Generate indicator text
if ( $isInSourceLanguage ) {
$text = $sourceLanguageName;
} else {
$text = wfMessage(
'wikibase-language-fallback-transliteration-hint',
$sourceLanguageName,
$actualLanguageName
)->text();
}
// Generate HTML class names
$classes = 'wb-language-fallback-indicator';
if ( !$isInSourceLanguage ) {
$classes .= ' wb-language-fallback-transliteration';
}
if ( !$isInRequestedLanguage
&& $this->getBaseLanguage( $actualLanguage ) === $this->getBaseLanguage( $requestedLanguage )
) {
$classes .= ' wb-language-fallback-variant';
}
$attributes = array( 'class' => $classes );
$html = Html::element( 'sup', $attributes, $text );
return $html;
}
/**
* @param string $languageCode
*
* @return string
*/
private function getBaseLanguage( $languageCode ) {
return preg_replace( '/-.*/', '', $languageCode );
}
}