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
|
|
|
|
*/
|
|
|
|
class CiteErrorReporter {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @var Parser
|
|
|
|
*/
|
|
|
|
private $parser;
|
|
|
|
|
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
|
|
|
|
|
|
|
/**
|
|
|
|
* @param Parser $parser
|
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(
|
|
|
|
Parser $parser,
|
|
|
|
ReferenceMessageLocalizer $messageLocalizer
|
|
|
|
) {
|
2019-11-19 10:29:33 +00:00
|
|
|
$this->parser = $parser;
|
2019-12-06 03:20:20 +00:00
|
|
|
$this->messageLocalizer = $messageLocalizer;
|
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-11-28 10:15:19 +00:00
|
|
|
public function halfParsed( string $key, ...$params ) : string {
|
2019-11-22 10:43:09 +00:00
|
|
|
// FIXME: We suspect this is not necessary and can just be removed
|
|
|
|
return $this->parser->recursiveTagParse( $this->plain( $key, ...$params ) );
|
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-11-28 10:15:19 +00:00
|
|
|
public function plain( string $key, ...$params ) : string {
|
2019-12-06 03:20:20 +00:00
|
|
|
$msg = $this->messageLocalizer->msg( $key, ...$params );
|
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.
|
|
|
|
$this->parser->addTrackingCategory( 'cite-tracking-category-cite-error' );
|
|
|
|
}
|
|
|
|
|
2019-12-06 03:20:20 +00:00
|
|
|
$interfaceLanguage = $this->getInterfaceLanguageAndSplitCache();
|
|
|
|
|
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!
|
|
|
|
*
|
|
|
|
* @return Language
|
|
|
|
*/
|
|
|
|
private function getInterfaceLanguageAndSplitCache(): Language {
|
|
|
|
if ( $this->cachedInterfaceLanguage === null ) {
|
|
|
|
$this->cachedInterfaceLanguage = $this->parser->getOptions()->getUserLangObj();
|
|
|
|
}
|
|
|
|
return $this->cachedInterfaceLanguage;
|
|
|
|
}
|
|
|
|
|
2019-11-19 10:29:33 +00:00
|
|
|
}
|