wiki.techinc.nl/includes/language/RawMessage.php
Bartosz Dziewoński 159dad8abb language: Improve behavior of RawMessage used as MessageSpecifier
We have some code that expects that if you disassemble a
MessageSpecifier using its getKey() and getParams() methods,
then assemble a new MessageSpecifier using the return values,
you will get (at least approximately) the same message.

This was not the case with RawMessage, even though it implements
the MessageSpecifier interface, because its "keys" are not real
message keys, and this operation would mess it up.

Override the MessageSpecifier methods on RawMessage so that they're
compatible with how everyone expects a MessageSpecifier to work.

Add some tests for OutputPage, Message\Converter and Status
to verify some scenarios that would previously have failed.

Depends-On: I41991989515b4791bc1746f26bd404bf4f17dbdb
Depends-On: I612361dd20ff8aad4c0069f1c5af78e3e13b9692
Change-Id: Iddd14efa8b9536277c372257d5a7be135f26a540
2024-07-16 15:06:26 +01:00

116 lines
3.1 KiB
PHP

<?php
/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
*/
namespace MediaWiki\Language;
use InvalidArgumentException;
use MediaWiki\Message\Message;
/**
* Variant of the Message class.
*
* Rather than treating the message key as a lookup
* value (which is passed to the MessageCache and
* translated as necessary), a RawMessage key is
* treated as the actual message.
*
* All other functionality (parsing, escaping, etc.)
* is preserved.
*
* @newable
* @since 1.21
*/
class RawMessage extends Message {
/**
* Call the parent constructor, then store the key as
* the message.
*
* @stable to call
* @see Message::__construct
*
* @param string $text Message to use.
* @param array $params Parameters for the message.
*
* @throws InvalidArgumentException
*/
public function __construct( $text, $params = [] ) {
if ( !is_string( $text ) ) {
throw new InvalidArgumentException( '$text must be a string' );
}
parent::__construct( $text, $params );
// The key is the message.
$this->message = $text;
}
/**
* Fetch the message (in this case, the key).
*
* @return string
*/
public function fetchMessage() {
// Just in case the message is unset somewhere.
$this->message ??= $this->key;
return $this->message;
}
public function getTextOfRawMessage() {
return $this->key;
}
public function getParamsOfRawMessage() {
return $this->parameters;
}
/**
* To conform to the MessageSpecifier interface, always return 'rawmessage',
* which is a real message key that can be used with MessageValue and other classes.
* @return string
*/
public function getKey() {
return 'rawmessage';
}
/**
* To conform to the MessageSpecifier interface, return parameters that are valid with the
* 'rawmessage' message, and can be used with MessageValue and other classes.
* @return string[]
*/
public function getParams() {
// If the provided text is equivalent to 'rawmessage', return the provided params.
if ( $this->key === '$1' ) {
return $this->parameters;
}
// If there are no provided params, return the provided text as the single param.
if ( !$this->parameters ) {
return [ $this->key ];
}
// As a last resort, substitute the provided params into the single param accepted by
// 'rawmessage'. This may access global state.
return [ $this->plain() ];
}
}
/** @deprecated class alias since 1.40 */
class_alias( RawMessage::class, 'RawMessage' );