mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Cite
synced 2024-12-21 02:52:42 +00:00
54333c9bd6
The new extends="…" feature is using numbers like "1.2". These should be localized in languages like Hebrew that uses other symbols for the digits. But the "." should not change. The existing feature when a <ref> is reused multiple times does have the same "issue". But it seems this is intentional, because it is covered by a test. Note this is not visible in German, because German uses custom labels "a", "b", and so on. This patch also improves the so called "smoke" tests and makes one cover numbers up to "1,10" for a <ref> that is reused that often. Bug: T239725 Change-Id: Iffcb56e1c7be09cefed9dabb1d6391eb6ad995ce
114 lines
2.8 KiB
PHP
114 lines
2.8 KiB
PHP
<?php
|
|
|
|
namespace Cite;
|
|
|
|
use MediaWiki\MediaWikiServices;
|
|
use Parser;
|
|
use Sanitizer;
|
|
|
|
/**
|
|
* @license GPL-2.0-or-later
|
|
*/
|
|
class FootnoteMarkFormatter {
|
|
|
|
/**
|
|
* @var string[][]
|
|
*/
|
|
private $linkLabels = [];
|
|
|
|
/**
|
|
* @var Parser
|
|
*/
|
|
private $parser;
|
|
|
|
/**
|
|
* @var CiteKeyFormatter
|
|
*/
|
|
private $citeKeyFormatter;
|
|
|
|
/**
|
|
* @var CiteErrorReporter
|
|
*/
|
|
private $errorReporter;
|
|
|
|
/**
|
|
* @param Parser $parser
|
|
* @param CiteErrorReporter $errorReporter
|
|
* @param CiteKeyFormatter $citeKeyFormatter
|
|
*/
|
|
public function __construct(
|
|
Parser $parser,
|
|
CiteErrorReporter $errorReporter,
|
|
CiteKeyFormatter $citeKeyFormatter
|
|
) {
|
|
$this->parser = $parser;
|
|
$this->citeKeyFormatter = $citeKeyFormatter;
|
|
$this->errorReporter = $errorReporter;
|
|
}
|
|
|
|
/**
|
|
* Generate a link (<sup ...) for the <ref> element from a key
|
|
* and return XHTML ready for output
|
|
*
|
|
* @suppress SecurityCheck-DoubleEscaped
|
|
* @param string $group
|
|
* @param array $ref Dictionary with ReferenceStack ref format
|
|
*
|
|
* @return string
|
|
*/
|
|
public function linkRef( string $group, array $ref ) : string {
|
|
$language = MediaWikiServices::getInstance()->getContentLanguage();
|
|
|
|
$label = $this->getLinkLabel( $group, $ref['number'] );
|
|
if ( $label === null ) {
|
|
$label = $language->formatNum( $ref['number'] );
|
|
if ( $group !== Cite::DEFAULT_GROUP ) {
|
|
$label = "$group $label";
|
|
}
|
|
}
|
|
if ( isset( $ref['extendsIndex'] ) ) {
|
|
$label .= '.' . $language->formatNum( $ref['extendsIndex'], true );
|
|
}
|
|
|
|
$key = $ref['name'] ?? $ref['key'];
|
|
$count = $ref['name'] ? $ref['key'] . '-' . $ref['count'] : null;
|
|
$subkey = $ref['name'] ? '-' . $ref['key'] : null;
|
|
|
|
return $this->parser->recursiveTagParse(
|
|
wfMessage(
|
|
'cite_reference_link',
|
|
$this->citeKeyFormatter->refKey( $key, $count ),
|
|
$this->citeKeyFormatter->getReferencesKey( $key . $subkey ),
|
|
Sanitizer::safeEncodeAttribute( $label )
|
|
)->inContentLanguage()->plain()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Generate a custom format link for a group given an offset, e.g.
|
|
* the second <ref group="foo"> is b if $this->mLinkLabels["foo"] =
|
|
* [ 'a', 'b', 'c', ...].
|
|
* Return an error if the offset > the # of array items
|
|
*
|
|
* @param string $group The group name
|
|
* @param int $number Expected to start at 1
|
|
*
|
|
* @return string|null Returns null if no custom labels for this group exist
|
|
*/
|
|
private function getLinkLabel( string $group, int $number ) : ?string {
|
|
$message = "cite_link_label_group-$group";
|
|
if ( !isset( $this->linkLabels[$group] ) ) {
|
|
$msg = wfMessage( $message )->inContentLanguage();
|
|
$this->linkLabels[$group] = $msg->isDisabled() ? [] : preg_split( '/\s+/', $msg->plain() );
|
|
}
|
|
|
|
if ( !$this->linkLabels[$group] ) {
|
|
return null;
|
|
}
|
|
|
|
return $this->linkLabels[$group][$number - 1]
|
|
?? $this->errorReporter->plain( 'cite_error_no_link_label_group', $group, $message );
|
|
}
|
|
|
|
}
|