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
This commit is contained in:
Gergő Tisza 2016-04-17 07:35:54 +00:00
parent bc4e07b6f6
commit dab874cc22
5 changed files with 65 additions and 32 deletions

View file

@ -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

View file

@ -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 );
}
}

View file

@ -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 );
}
}

View file

@ -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 );
}

View file

@ -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' ],
];
}
}