From dab874cc22a80a2d4de121fa9f18ac0784263097 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Gerg=C5=91=20Tisza?= Date: Sun, 17 Apr 2016 07:35:54 +0000 Subject: [PATCH] Unify HTMLForm message handling Improves Ida647973a which unified message handling for form fields but did not make the functionality available to HTMLForm itself. Change-Id: I2e6195ba13afbd8b993acb47409fab1be91c547e --- includes/Message.php | 25 +++++++++++++++++++++++++ includes/htmlform/HTMLForm.php | 21 ++++++++++++--------- includes/htmlform/HTMLFormField.php | 11 +---------- includes/htmlform/OOUIHTMLForm.php | 15 ++------------- tests/phpunit/includes/MessageTest.php | 25 +++++++++++++++++++++++++ 5 files changed, 65 insertions(+), 32 deletions(-) diff --git a/includes/Message.php b/includes/Message.php index fd016fcb37..8ac73b34d8 100644 --- a/includes/Message.php +++ b/includes/Message.php @@ -382,6 +382,31 @@ class Message implements MessageSpecifier, Serializable { return new self( $key, $params ); } + /** + * Transform a MessageSpecifier or a primitive value used interchangeably with + * specifiers (a message key string, or a key + params array) into a proper Message + * @param string|array|MessageSpecifier $value + * @return Message + * @throws InvalidArgumentException + */ + public static function newFromSpecifier( $value ) { + if ( $value instanceof RawMessage ) { + $message = new RawMessage( $value->getKey(), $value->getParams() ); + } elseif ( $value instanceof MessageSpecifier ) { + $message = new Message( $value ); + } elseif ( is_array( $value ) ) { + $key = array_shift( $value ); + $message = new Message( $key, $value ); + } elseif ( is_string( $value ) ) { + $message = new Message( $value ); + } else { + throw new InvalidArgumentException( __METHOD__ . ': invalid argument type ' + . gettype( $value ) ); + } + + return $message; + } + /** * Factory function accepting multiple message keys and returning a message instance * for the first message which is non-empty. If all messages are empty then an diff --git a/includes/htmlform/HTMLForm.php b/includes/htmlform/HTMLForm.php index d50fac0a69..57796d5aaf 100644 --- a/includes/htmlform/HTMLForm.php +++ b/includes/htmlform/HTMLForm.php @@ -1119,7 +1119,7 @@ class HTMLForm extends ContextSource { ]; if ( isset( $button['label-message'] ) ) { - $label = $this->msg( $button['label-message'] )->parse(); + $label = $this->getMessage( $button['label-message'] )->parse(); } elseif ( isset( $button['label'] ) ) { $label = htmlspecialchars( $button['label'] ); } elseif ( isset( $button['label-raw'] ) ) { @@ -1198,17 +1198,10 @@ class HTMLForm extends ContextSource { $errorstr = ''; foreach ( $errors as $error ) { - if ( is_array( $error ) ) { - $msg = array_shift( $error ); - } else { - $msg = $error; - $error = []; - } - $errorstr .= Html::rawElement( 'li', [], - $this->msg( $msg, $error )->parse() + $this->getMessage( $error )->parse() ); } @@ -1717,4 +1710,14 @@ class HTMLForm extends ContextSource { return $this; } + + /** + * Turns a *-message parameter (which could be a MessageSpecifier, or a message name, or a + * name + parameters array) into a Message. + * @param mixed $value + * @return Message + */ + protected function getMessage( $value ) { + return Message::newFromSpecifier( $value )->setContext( $this ); + } } diff --git a/includes/htmlform/HTMLFormField.php b/includes/htmlform/HTMLFormField.php index e86d4c486d..a5d994db68 100644 --- a/includes/htmlform/HTMLFormField.php +++ b/includes/htmlform/HTMLFormField.php @@ -1095,15 +1095,6 @@ abstract class HTMLFormField { * @return Message */ protected function getMessage( $value ) { - if ( $value instanceof Message ) { - return $value; - } elseif ( $value instanceof MessageSpecifier ) { - return Message::newFromKey( $value ); - } elseif ( is_array( $value ) ) { - $msg = array_shift( $value ); - return $this->msg( $msg, $value ); - } else { - return $this->msg( $value, [] ); - } + return Message::newFromSpecifier( $value )->setContext( $this->mParent ); } } diff --git a/includes/htmlform/OOUIHTMLForm.php b/includes/htmlform/OOUIHTMLForm.php index 4f8365e019..20f4e45724 100644 --- a/includes/htmlform/OOUIHTMLForm.php +++ b/includes/htmlform/OOUIHTMLForm.php @@ -100,7 +100,7 @@ class OOUIHTMLForm extends HTMLForm { if ( $isBadIE ) { $label = $button['value']; } elseif ( isset( $button['label-message'] ) ) { - $label = new OOUI\HtmlSnippet( $this->msg( $button['label-message'] )->parse() ); + $label = new OOUI\HtmlSnippet( $this->getMessage( $button['label-message'] )->parse() ); } elseif ( isset( $button['label'] ) ) { $label = $button['label']; } elseif ( isset( $button['label-raw'] ) ) { @@ -196,18 +196,7 @@ class OOUIHTMLForm extends HTMLForm { } foreach ( $errors as &$error ) { - if ( is_array( $error ) ) { - $msg = array_shift( $error ); - } else { - $msg = $error; - $error = []; - } - // if the error is already a message object, don't use it as a message key - if ( !$msg instanceof Message ) { - $error = $this->msg( $msg, $error )->parse(); - } else { - $error = $msg->parse(); - } + $error = $this->getMessage( $error )->parse(); $error = new OOUI\HtmlSnippet( $error ); } diff --git a/tests/phpunit/includes/MessageTest.php b/tests/phpunit/includes/MessageTest.php index cf34b18713..224b0cbdfa 100644 --- a/tests/phpunit/includes/MessageTest.php +++ b/tests/phpunit/includes/MessageTest.php @@ -581,4 +581,29 @@ class MessageTest extends MediaWikiLangTestCase { $msg = unserialize( serialize( $msg ) ); $this->assertEquals( 'Hauptseite', $msg->plain() ); } + + /** + * @covers Message::newFromSpecifier + * @dataProvider provideNewFromSpecifier + */ + public function testNewFromSpecifier( $value, $expectedText ) { + $message = Message::newFromSpecifier( $value ); + $this->assertInstanceOf( Message::class, $message ); + $this->assertSame( $expectedText, $message->text() ); + } + + public function provideNewFromSpecifier() { + $messageSpecifier = $this->getMockForAbstractClass( MessageSpecifier::class ); + $messageSpecifier->expects( $this->any() )->method( 'getKey' )->willReturn( 'mainpage' ); + $messageSpecifier->expects( $this->any() )->method( 'getParams' )->willReturn( [] ); + + return [ + 'string' => [ 'mainpage', 'Main Page' ], + 'array' => [ [ 'youhavenewmessages', 'foo', 'bar' ], 'You have foo (bar).' ], + 'Message' => [ new Message( 'youhavenewmessages', [ 'foo', 'bar' ] ), 'You have foo (bar).' ], + 'RawMessage' => [ new RawMessage( 'foo ($1)', [ 'bar' ] ), 'foo (bar)' ], + 'MessageSpecifier' => [ $messageSpecifier, 'Main Page' ], + ]; + } } + -- 2.20.1