';
/** @var boolean */
protected $escape = true;
/**
* @since 1.9
*
* @param Language $language
*/
public function __construct( Language $language ) {
$this->language = $language;
}
/**
* Convenience factory method to invoke a message array together with
* a language object
*
* @par Example:
* @code
* MessageFormatter::newFromArray( $language, array( 'Foo' ) )->getHtml();
* @endcode
*
* @since 1.9
*
* @param Language $language
* @param array|null $messages
*
* @return MessageFormatter
*/
public static function newFromArray( Language $language, array $messages = [] ) {
$instance = new self( $language );
return $instance->addFromArray( $messages );
}
/**
* Creates a Message object from a key and adds it to an internal array
*
* @since 1.9
*
* @param string $key message key
*
* @return MessageFormatter
*/
public function addFromKey( $key /*...*/ ) {
$params = func_get_args();
array_shift( $params );
$this->addFromArray( [ new \Message( $key, $params ) ] );
return $this;
}
/**
* Adds an arbitrary array of messages which can either contain text
* or/and Message objects
*
* @par Example:
* @code
* $msgFormatter = new MessageFormatter( $language );
* $msgFormatter->addFromArray( array( 'Foo', new Message( 'Bar' ) ) )->getHtml()
* @endcode
*
* @since 1.9
*
* @param array $messages
*
* @return MessageFormatter
*/
public function addFromArray( array $messages ) {
$messages = ProcessingErrorMsgHandler::normalizeAndDecodeMessages( $messages );
foreach ( $messages as $message ) {
if ( is_string( $message ) ) {
$this->messages[md5( $message )] = $message;
} else{
$this->messages[] = $message;
}
}
return $this;
}
/**
* Returns unformatted invoked messages
*
* @since 1.9
*
* @return array
*/
public function getMessages() {
return $this->messages;
}
/**
* Used in connection with the html output to invoke a specific display
* type
*
* @see Highlighter::getTypeId
*
* @since 1.9
*
* @return MessageFormatter
*/
public function setType( $type ) {
$this->type = $type;
return $this;
}
/**
* Enables/disables escaping for the output representation
*
* @note Escaping is generally enabled but in cases of special pages or
* with messages already being escaped this option can be circumvent by
* invoking escape( false )
*
* @since 1.9
*
* @param boolean $escape
*
* @return MessageFormatter
*/
public function escape( $escape ) {
$this->escape = (bool)$escape;
return $this;
}
/**
* Clears the internal message array
*
* @since 1.9
*
* @return MessageFormatter
*/
public function clear() {
$this->messages = [];
return $this;
}
/**
* Returns if the internal message array does contain messages
*
* @since 1.9
*
* @return boolean
*/
public function exists() {
return $this->messages !== [];
}
/**
* Overrides invoked language object
*
* @since 1.9
*
* @param Language $language
*
* @return MessageFormatter
*/
public function setLanguage( Language $language ) {
$this->language = $language;
return $this;
}
/**
* Formatting and normalization of an array
*
* @note The array is being recursively resolved in order to ensure that
* the returning representation is a 1-n array where duplicate entries
* have been eliminated already while Message objects being transformed
* into a simple text representation using the invoked language
*
* @since 1.9
*
* @param array $messages
*
* @return array
*/
protected function doFormat( array $messages ) {
$newArray = [];
foreach ( $messages as $msg ) {
if ( $msg instanceof \Message ) {
$text = $msg->inLanguage( $this->language )->text();
$newArray[md5( $text )] = $text;
} elseif ( (array)$msg === $msg ) {
foreach ( $this->doFormat( $msg ) as $m ) {
$newArray[md5( $m )] = $m;
}
} elseif ( (string)$msg === $msg ) {
$newArray[md5( $msg )] = $msg;
}
}
return $newArray;
}
/**
* Converts the message array into a string representation
*
* @since 1.9
*
* @param boolean $escape
* @param boolean $html
*
* @return string
*/
protected function getString( $html = true ) {
if ( $this->escape ) {
$messages = array_map( 'htmlspecialchars', array_values( $this->doFormat( $this->messages ) ) );
} else {
$messages = array_values( $this->doFormat( $this->messages ) );
}
if ( count( $messages ) == 1 ) {
$messageString = $messages[0];
} else {
foreach ( $messages as &$message ) {
$message = $html ? Html::rawElement( 'li', [], $message ) : $message;
}
$messageString = implode( $this->separator, $messages );
$messageString = $html ? Html::rawElement( 'ul', [], $messageString ) : $messageString;
}
return $messageString;
}
/**
* Returns html representation of the formatted messages
*
* @since 1.9
*
* @return string
*/
public function getHtml() {
if ( $this->exists() ) {
$highlighter = Highlighter::factory( $this->type );
$highlighter->setContent( [ 'content' => $this->getString( true ) ] );
return $highlighter->getHtml();
}
return '';
}
/**
* Returns plain text representation of the formatted messages
*
* @since 1.9
*
* @return string
*/
public function getPlain() {
return $this->exists() ? $this->getString( false ) : '';
}
}