2019-11-19 10:29:33 +00:00
|
|
|
<?php
|
|
|
|
|
2019-11-19 14:12:11 +00:00
|
|
|
namespace Cite;
|
|
|
|
|
|
|
|
use Html;
|
|
|
|
use Language;
|
|
|
|
use Parser;
|
|
|
|
use Sanitizer;
|
|
|
|
|
2019-11-19 10:29:33 +00:00
|
|
|
/**
|
|
|
|
* @license GPL-2.0-or-later
|
|
|
|
*/
|
2019-12-09 16:08:57 +00:00
|
|
|
class ErrorReporter {
|
2019-11-19 10:29:33 +00:00
|
|
|
|
2019-12-06 03:20:20 +00:00
|
|
|
/**
|
|
|
|
* @var ReferenceMessageLocalizer
|
|
|
|
*/
|
|
|
|
private $messageLocalizer;
|
|
|
|
|
2019-11-19 10:29:33 +00:00
|
|
|
/**
|
|
|
|
* @var Language
|
|
|
|
*/
|
2019-12-06 03:20:20 +00:00
|
|
|
private $cachedInterfaceLanguage = null;
|
2019-11-19 10:29:33 +00:00
|
|
|
|
|
|
|
/**
|
2019-12-06 03:20:20 +00:00
|
|
|
* @param ReferenceMessageLocalizer $messageLocalizer
|
2019-11-19 10:29:33 +00:00
|
|
|
*/
|
2019-12-06 03:20:20 +00:00
|
|
|
public function __construct(
|
|
|
|
ReferenceMessageLocalizer $messageLocalizer
|
|
|
|
) {
|
|
|
|
$this->messageLocalizer = $messageLocalizer;
|
2019-11-19 10:29:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2019-12-11 15:05:19 +00:00
|
|
|
* @param Parser $parser
|
2019-11-19 10:29:33 +00:00
|
|
|
* @param string $key Message name of the error or warning
|
|
|
|
* @param mixed ...$params
|
|
|
|
*
|
2019-11-22 10:43:09 +00:00
|
|
|
* @return string Half-parsed wikitext with extension's tags already being expanded
|
2019-11-19 10:29:33 +00:00
|
|
|
*/
|
2019-12-11 15:05:19 +00:00
|
|
|
public function halfParsed( Parser $parser, string $key, ...$params ) : string {
|
2019-11-22 10:43:09 +00:00
|
|
|
// FIXME: We suspect this is not necessary and can just be removed
|
2019-12-11 15:05:19 +00:00
|
|
|
return $parser->recursiveTagParse( $this->plain( $parser, $key, ...$params ) );
|
2019-11-19 10:29:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2019-12-11 15:05:19 +00:00
|
|
|
* @param Parser $parser
|
2019-11-19 10:29:33 +00:00
|
|
|
* @param string $key Message name of the error or warning
|
|
|
|
* @param mixed ...$params
|
|
|
|
*
|
2019-11-22 10:43:09 +00:00
|
|
|
* @return string Plain, unparsed wikitext
|
2019-11-19 10:29:33 +00:00
|
|
|
* @return-taint tainted
|
|
|
|
*/
|
2019-12-11 15:05:19 +00:00
|
|
|
public function plain( Parser $parser, string $key, ...$params ) : string {
|
|
|
|
$interfaceLanguage = $this->getInterfaceLanguageAndSplitCache( $parser );
|
|
|
|
$msg = $this->messageLocalizer->msg( $key, ...$params )->inLanguage( $interfaceLanguage );
|
2019-11-19 10:29:33 +00:00
|
|
|
|
2019-11-22 22:20:04 +00:00
|
|
|
if ( strncmp( $msg->getKey(), 'cite_warning_', 13 ) === 0 ) {
|
2019-11-19 10:29:33 +00:00
|
|
|
$type = 'warning';
|
2019-11-22 22:20:04 +00:00
|
|
|
$id = substr( $msg->getKey(), 13 );
|
2019-11-19 10:29:33 +00:00
|
|
|
$extraClass = ' mw-ext-cite-warning-' . Sanitizer::escapeClass( $id );
|
|
|
|
} else {
|
|
|
|
$type = 'error';
|
|
|
|
$extraClass = '';
|
|
|
|
|
|
|
|
// Take care; this is a sideeffect that might not belong to this class.
|
2019-12-11 15:05:19 +00:00
|
|
|
$parser->addTrackingCategory( 'cite-tracking-category-cite-error' );
|
2019-11-19 10:29:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return Html::rawElement(
|
|
|
|
'span',
|
|
|
|
[
|
|
|
|
'class' => "$type mw-ext-cite-$type" . $extraClass,
|
2019-12-06 03:20:20 +00:00
|
|
|
'lang' => $interfaceLanguage->getHtmlCode(),
|
|
|
|
'dir' => $interfaceLanguage->getDir(),
|
2019-11-19 10:29:33 +00:00
|
|
|
],
|
2019-12-06 03:20:20 +00:00
|
|
|
$this->messageLocalizer->msg( "cite_$type", $msg->plain() )
|
|
|
|
->inLanguage( $interfaceLanguage )->plain()
|
2019-11-19 10:29:33 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2019-12-06 03:20:20 +00:00
|
|
|
/**
|
|
|
|
* Note the startling side effect of splitting ParserCache by user interface language!
|
|
|
|
*
|
2019-12-11 15:05:19 +00:00
|
|
|
* @param Parser $parser
|
2020-01-09 10:50:32 +00:00
|
|
|
*
|
2019-12-06 03:20:20 +00:00
|
|
|
* @return Language
|
|
|
|
*/
|
2019-12-11 15:05:19 +00:00
|
|
|
private function getInterfaceLanguageAndSplitCache( Parser $parser ): Language {
|
2019-12-12 15:42:53 +00:00
|
|
|
if ( !$this->cachedInterfaceLanguage ) {
|
2019-12-11 15:05:19 +00:00
|
|
|
$this->cachedInterfaceLanguage = $parser->getOptions()->getUserLangObj();
|
2019-12-06 03:20:20 +00:00
|
|
|
}
|
|
|
|
return $this->cachedInterfaceLanguage;
|
|
|
|
}
|
|
|
|
|
2019-11-19 10:29:33 +00:00
|
|
|
}
|