mediawiki-extensions-Cite/src/AnchorFormatter.php
Thiemo Kreuz 7b30a165e4 Use correct Sanitizer method for id/fragment escaping
Note how only the HTML5 mode behavior changes, but nothing in
legacy mode.

Also note this does not 100% fix the issue. The esample with a
non-breaking space is still broken. But it's already much better
than before.

Bug: T298278
Change-Id: Idf50dad4219ff4c594a0cc15f63cb10fdac5ffb7
2022-01-03 16:23:45 +01:00

77 lines
1.9 KiB
PHP

<?php
namespace Cite;
use Sanitizer;
/**
* @license GPL-2.0-or-later
*/
class AnchorFormatter {
/**
* @var ReferenceMessageLocalizer
*/
private $messageLocalizer;
/**
* @param ReferenceMessageLocalizer $messageLocalizer
*/
public function __construct( ReferenceMessageLocalizer $messageLocalizer ) {
$this->messageLocalizer = $messageLocalizer;
}
/**
* Return an id for use in wikitext output based on a key and
* optionally the number of it, used in <references>, not <ref>
* (since otherwise it would link to itself)
*
* @param string $key
* @param string|null $num The number of the key
*
* @return string A key for use in wikitext
*/
public function refKey( string $key, string $num = null ): string {
$prefix = $this->messageLocalizer->msg( 'cite_reference_link_prefix' )->text();
$suffix = $this->messageLocalizer->msg( 'cite_reference_link_suffix' )->text();
if ( $num !== null ) {
$key = $this->messageLocalizer->msg( 'cite_reference_link_key_with_num', $key, $num )
->plain();
}
return $this->normalizeKey( $prefix . $key . $suffix );
}
/**
* Return an id for use in wikitext output based on a key and
* optionally the number of it, used in <ref>, not <references>
* (since otherwise it would link to itself)
*
* @param string $key
*
* @return string A key for use in wikitext
*/
public function getReferencesKey( string $key ): string {
$prefix = $this->messageLocalizer->msg( 'cite_references_link_prefix' )->text();
$suffix = $this->messageLocalizer->msg( 'cite_references_link_suffix' )->text();
return $this->normalizeKey( $prefix . $key . $suffix );
}
/**
* Normalizes and sanitizes a reference key
*
* @param string $key
*
* @return string
*/
private function normalizeKey( string $key ): string {
$ret = Sanitizer::escapeIdForLink( $key );
$ret = preg_replace( '/__+/', '_', $ret );
$ret = Sanitizer::safeEncodeAttribute( $ret );
return $ret;
}
}