/**
  * @see ValueFormatter::format
  *
  * @param MonolingualTextValue $value
  *
  * @throws InvalidArgumentException
  * @return string HTML
  */
 public function format($value)
 {
     if (!$value instanceof MonolingualTextValue) {
         throw new InvalidArgumentException('Data value type mismatch. Expected a MonolingualTextValue.');
     }
     $text = $value->getText();
     $languageCode = $value->getLanguageCode();
     $languageName = $this->languageNameLookup->getName($languageCode);
     $msg = wfMessage('wikibase-monolingualtext')->params(wfEscapeWikiText($text), wfEscapeWikiText($languageCode), wfEscapeWikiText($languageName));
     return $msg->parse();
 }
 /**
  * @param array $siteLinkForTable
  * @param bool $isSpecialGroup
  *
  * @return string
  */
 private function getHtmlForSiteLink($siteLinkForTable, $isSpecialGroup)
 {
     /** @var Site $site */
     $site = $siteLinkForTable['site'];
     /** @var SiteLink $siteLink */
     $siteLink = $siteLinkForTable['siteLink'];
     if ($site->getDomain() === '') {
         return $this->getHtmlForUnknownSiteLink($siteLink);
     }
     $languageCode = $site->getLanguageCode();
     $siteId = $siteLink->getSiteId();
     // FIXME: this is a quickfix to allow a custom site-name for the site groups which are
     // special according to the specialSiteLinkGroups setting
     if ($isSpecialGroup) {
         // FIXME: not escaped?
         $siteNameMsg = wfMessage('wikibase-sitelinks-sitename-' . $siteId);
         $siteName = $siteNameMsg->exists() ? $siteNameMsg->parse() : $siteId;
     } else {
         // TODO: get an actual site name rather then just the language
         $siteName = htmlspecialchars($this->languageNameLookup->getName($languageCode));
     }
     // TODO: for non-JS, also set the dir attribute on the link cell;
     // but do not build language objects for each site since it causes too much load
     // and will fail when having too much site links
     return $this->templateFactory->render('wikibase-sitelinkview', htmlspecialchars($siteId), $languageCode, 'auto', htmlspecialchars($siteId), $siteName, $this->getHtmlForPage($siteLink, $site));
 }
 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 Fingerprint $fingerprint
  * @param string $languageCode
  * @param Title|null $title
  *
  * @return string HTML
  */
 private function getEntityTermsForLanguageView(Fingerprint $fingerprint, $languageCode, Title $title = null)
 {
     $languageName = $this->languageNameLookup->getName($languageCode);
     $labels = $fingerprint->getLabels();
     $descriptions = $fingerprint->getDescriptions();
     $hasLabel = $labels->hasTermForLanguage($languageCode);
     $hasDescription = $descriptions->hasTermForLanguage($languageCode);
     return $this->templateFactory->render('wikibase-entitytermsforlanguageview', 'tr', 'td', $languageCode, $this->templateFactory->render('wikibase-entitytermsforlanguageview-language', htmlspecialchars($title === null ? '#' : $title->getLocalURL(array('setlang' => $languageCode))), htmlspecialchars($languageName)), $this->templateFactory->render('wikibase-labelview', $hasLabel ? '' : 'wb-empty', htmlspecialchars($hasLabel ? $labels->getByLanguage($languageCode)->getText() : $this->msg('wikibase-label-empty')->text()), ''), $this->templateFactory->render('wikibase-descriptionview', $hasDescription ? '' : 'wb-empty', htmlspecialchars($hasDescription ? $descriptions->getByLanguage($languageCode)->getText() : $this->msg('wikibase-description-empty')->text()), '', ''), $this->getAliasesView($fingerprint->getAliasGroups(), $languageCode), '');
 }
 /**
  * @dataProvider getNameProvider
  */
 public function testGetName($lang, $in, $expected)
 {
     if ($in !== null && !\ExtensionRegistry::getInstance()->isLoaded('CLDR')) {
         $this->markTestSkipped('CLDR extension required for full language name support');
     }
     $languageNameLookup = new LanguageNameLookup($in);
     $name = $languageNameLookup->getName($lang);
     $this->assertSame($expected, $name);
 }
 /**
  * Returns HTML representing the matched term in the search language (or an appropriate fallback).
  * The matched text and language are wrapped using the wikibase-itemlink-userlang-wrapper message.
  * If the matched term has the same text as the display label, an empty string is returned.
  *
  * @param Term|null $match
  * @param Term|null $label
  *
  * @return string HTML
  */
 private function getMatchHtml(Term $match = null, Term $label = null)
 {
     if (!$match) {
         return '';
     }
     if ($label && $label->getText() == $match->getText()) {
         return '';
     }
     $text = $match->getText();
     $language = $this->languageNameLookup->getName($match->getLanguageCode());
     $matchElement = $descriptionElement = Html::element('span', array('class' => 'wb-itemlink-match'), wfMessage('wikibase-itemlink-userlang-wrapper')->params($language, $text)->text());
     return $matchElement;
 }
 /**
  * @param MediaWikiSite $site
  * @param string[] $specialGroups
  *
  * @return string[]
  */
 private function getSiteDetails(MediaWikiSite $site, array $specialGroups)
 {
     $languageNameLookup = new LanguageNameLookup();
     $group = $site->getGroup();
     // FIXME: quickfix to allow a custom site-name / handling for the site groups which are
     // special according to the specialSiteLinkGroups setting
     if (in_array($group, $specialGroups)) {
         $languageNameMsg = wfMessage('wikibase-sitelinks-sitename-' . $site->getGlobalId());
         $languageName = $languageNameMsg->exists() ? $languageNameMsg->parse() : $site->getGlobalId();
         $groupName = 'special';
     } else {
         $languageName = $languageNameLookup->getName($site->getLanguageCode());
         $groupName = $group;
     }
     // Use protocol relative URIs, as it's safe to assume that all wikis support the same protocol
     list($pageUrl, $apiUrl) = preg_replace("/^https?:/i", '', array($site->getPageUrl(), $site->getFileUrl('api.php')));
     //TODO: figure out which name is best
     //$localIds = $site->getLocalIds();
     //$name = empty( $localIds['equivalent'] ) ? $site->getGlobalId() : $localIds['equivalent'][0];
     return array('shortName' => $languageName, 'name' => $languageName, 'id' => $site->getGlobalId(), 'pageUrl' => $pageUrl, 'apiUrl' => $apiUrl, 'languageCode' => $site->getLanguageCode(), 'group' => $groupName);
 }