X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FMessage.php;h=ca6e5c23f4766396a81e0cb89b9b625629b280c7;hb=d4cbde99eb961f0ec9508f4881e7afa712233eeb;hp=7fedb9b29a68e99ea3f752fda4e2acd1c985a186;hpb=9bae2600f1127f127ac24b9029931ad9ae6baac5;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Message.php b/includes/Message.php index 7fedb9b29a..ca6e5c23f4 100644 --- a/includes/Message.php +++ b/includes/Message.php @@ -1,5 +1,4 @@ text() ); + * $button = Xml::button( Message::key( 'submit' )->text() ); + * * Messages can have parameters: - * Message::key( 'welcome-to' )->param( $wgSitename )->text(); // {{GRAMMAR}} and friends work correctly - * Message::key( 'are-friends' )->params( $user, $friend ); - * Message::key( 'bad-message' )->rawParam( '' )->escaped() + * Message::key( 'welcome-to' )->params( $wgSitename )->text(); + * {{GRAMMAR}} and friends work correctly + * Message::key( 'are-friends' )->params( $user, $friend ); + * Message::key( 'bad-message' )->rawParams( '' )->escaped() + * * Sometimes the message text ends up in the database, so content language is needed. - * Message::key( 'file-log' )->params( $user, $filename )->inContentLanguage()->text() + * Message::key( 'file-log' )->params( $user, $filename )->inContentLanguage()->text() + * * Checking if message exists: - * Message::key( 'mysterious-message' )->exists() + * Message::key( 'mysterious-message' )->exists() + * * If you want to use a different language: - * Message::key( 'email-header' )->language( $user->getOption( 'language' ) )->plain() + * Message::key( 'email-header' )->language( $user->getOption( 'language' ) )->plain() + * Note that you cannot parse the text except in the content or interface + * languages + * * * * Comparison with old wfMsg* functions: * * Use full parsing. - * Would correspond to wfMsgExt( 'key', array( 'parseinline' ), 'apple' ); - * $parsed = Message::key( 'key' )->param( 'apple' )->parse(); + * wfMsgExt( 'key', array( 'parseinline' ), 'apple' ); + * === Message::key( 'key' )->params( 'apple' )->parse(); + * * Parseinline is used because it is more useful when pre-building html. * In normal use it is better to use OutputPage::(add|wrap)WikiMsg. * * Places where html cannot be used. {{-transformation is done. - * Would correspond to wfMsgExt( 'key', array( 'parsemag' ), 'apple', 'pear' ); - * $plain = Message::key( 'key' )->params( 'apple', 'pear' )->text(); + * wfMsgExt( 'key', array( 'parsemag' ), 'apple', 'pear' ); + * === Message::key( 'key' )->params( 'apple', 'pear' )->text(); + * * * Shortcut for escaping the message too, similar to wfMsgHTML, but * parameters are not replaced after escaping by default. - * $escaped = Message::key( 'key' )->rawParam( 'apple' )->escaped(); + * $escaped = Message::key( 'key' )->rawParams( 'apple' )->escaped(); + * * * TODO: - * * test, can we have tests? - * * sort out the details marked with fixme - * * should we have _m() or similar global wrapper? + * - test, can we have tests? + * - sort out the details marked with fixme + * - should we have _m() or similar global wrapper? * * @since 1.17 */ @@ -53,11 +63,13 @@ class Message { * means the current interface language, false content language. */ protected $interface = true; + /** * In which language to get this message. Overrides the $interface * variable. */ protected $language = null; + /** * The message key. */ @@ -68,13 +80,31 @@ class Message { */ protected $parameters = array(); + /** + * Format for the message. + * Supported formats are: + * * text (transform) + * * escaped (transform+htmlspecialchars) + * * block-parse + * * parse (default) + * * plain + */ + protected $format = 'parse'; + + /** + * Whether database can be used. + */ + protected $useDatabase = true; + /** * Constructor. * @param $key String: message key + * @param $params Array message parameters * @return Message: $this */ - public function __construct( $key ) { + public function __construct( $key, $params = array() ) { $this->key = $key; + $this->parameters = array_values( $params ); } /** @@ -85,65 +115,53 @@ class Message { * @param $key String: message key * @return Message: $this */ - public function key( $key ) { - return new Message( $key ); - } - - /** - * Adds parameters to the parameter list of this message. - * @param $value String: parameter - * @return Message: $this - */ - public function param( $value ) { - $this->parameters[] = $value; - return $this; + public static function key( $key ) { + return new self( $key ); } /** * Adds parameters to the parameter list of this message. - * @params Vargars: parameters + * @param Varargs: parameters as Strings * @return Message: $this */ public function params( /*...*/ ) { - $this->paramList( func_get_args() ); + $this->parameters = array_merge( $this->parameters, array_values( func_get_args() ) ); return $this; } /** - * Adds a list of parameters to the parameter list of this message. - * @param $value Array: list of parameters, array keys will be ignored. - * @return Message: $this - */ - public function paramList( array $values ) { - $this->parameters += array_values( $values ); - return $this; - } - - /** - * Adds a parameters that is substituted after parsing or escaping. + * Add parameters that are substituted after parsing or escaping. * In other words the parsing process cannot access the contents - * of this type parameter, and you need to make sure it is - * sanitized beforehand. - * @param $value String: raw parameter + * of this type of parameter, and you need to make sure it is + * sanitized beforehand. The parser will see "$n", instead. + * @param Varargs: raw parameters as Strings * @return Message: $this */ - public function rawParam( $value ) { - $this->parameters[] = array( 'raw' => $value ); + public function rawParams( /*...*/ ) { + $params = func_get_args(); + foreach( $params as $param ) { + $this->parameters[] = array( 'raw' => $param ); + } return $this; } - + /** * Request the message in any language that is supported. * As a side effect interface message status is unconditionally * turned off. - * @param $lang Mixed: langauge code or language object. + * @param $lang Mixed: language code or Language object. * @return Message: $this */ - public function language( Language $lang ) { - if ( is_string( $lang ) ) { + public function language( $lang ) { + if( $lang instanceof Language ){ + $this->language = $lang; + } elseif ( is_string( $lang ) ) { $this->language = Language::factory( $lang ); } else { - $this->language = $lang; + $type = gettype( $lang ); + throw new MWException( __METHOD__ . " must be " + . "passed a String or Language object; $type given" + ); } $this->interface = false; return $this; @@ -159,29 +177,71 @@ class Message { return $this; } + /** + * Enable or disable database use. + * @param $value Boolean + * @return Message: $this + */ + public function useDatabase( $value ) { + $this->useDatabase = (bool) $value; + return $this; + } + /** * Returns the message parsed from wikitext to HTML. + * TODO: in PHP >= 5.2.0, we can make this a magic method, + * and then we can do, eg: + * $foo = Message::get($key); + * $string = "$foo"; + * But we shouldn't implement that while MediaWiki still supports + * PHP < 5.2; or people will start using it... * @return String: HTML */ - public function parse() { - $string = $this->parseAsBlock( $string ); - $m = array(); - if( preg_match( '/^

(.*)\n?<\/p>\n?$/sU', $string, $m ) ) { - $string = $m[1]; + public function toString() { + $string = $this->getMessageText(); + + # Replace parameters before text parsing + $string = $this->replaceParameters( $string, 'before' ); + + # Maybe transform using the full parser + if( $this->format === 'parse' ) { + $string = $this->parseText( $string ); + $m = array(); + if( preg_match( '/^

(.*)\n?<\/p>\n?$/sU', $string, $m ) ) { + $string = $m[1]; + } + } elseif( $this->format === 'block-parse' ){ + $string = $this->parseText( $string ); + } elseif( $this->format === 'text' ){ + $string = $this->transformText( $string ); + } elseif( $this->format === 'escaped' ){ + # FIXME: Sanitizer method here? + $string = $this->transformText( $string ); + $string = htmlspecialchars( $string ); } + + # Raw parameter replacement + $string = $this->replaceParameters( $string, 'after' ); + return $string; } + + /** + * Fully parse the text from wikitext to HTML + * @return String parsed HTML + */ + public function parse() { + $this->format = 'parse'; + return $this->toString(); + } /** * Returns the message text. {{-transformation is done. * @return String: Unescaped message text. */ public function text() { - $string = $this->getMessageText(); - $string = $this->replaceParameters( 'before' ); - $string = $this->transformText( $string ); - $string = $this->replaceParameters( 'after' ); - return $string; + $this->format = 'text'; + return $this->toString(); } /** @@ -189,10 +249,8 @@ class Message { * @return String: Unescaped untransformed message text. */ public function plain() { - $string = $this->getMessageText(); - $string = $this->replaceParameters( 'before' ); - $string = $this->replaceParameters( 'after' ); - return $string; + $this->format = 'plain'; + return $this->toString(); } /** @@ -200,11 +258,8 @@ class Message { * @return String: HTML */ public function parseAsBlock() { - $string = $this->getMessageText(); - $string = $this->replaceParameters( 'before' ); - $string = $this->parseText( $string ); - $string = $this->replaceParameters( 'after' ); - return $string; + $this->format = 'block-parse'; + return $this->toString(); } /** @@ -213,12 +268,8 @@ class Message { * @return String: Escaped message text. */ public function escaped() { - $string = $this->getMessageText(); - $string = $this->replaceParameters( 'before' ); - $string = $this->transformText( $string ); - $string = htmlspecialchars( $string ); - $string = $this->replaceParameters( 'after' ); - return $string; + $this->format = 'escaped'; + return $this->toString(); } /** @@ -226,18 +277,19 @@ class Message { * @return Bool: true if it is and false if not. */ public function exists() { - return !wfEmptyMsg( $this->key, $this->getMessageText() ); + return $this->fetchMessage() === false; } /** * Substitutes any paramaters into the message text. + * @param $message String, the message text * @param $type String: either before or after * @return String */ - protected function replaceParameters( $type = 'before' ) { + protected function replaceParameters( $message, $type = 'before' ) { $replacementKeys = array(); - foreach( $args as $n => $param ) { - if ( $type === 'before' && !isset( $param['raw'] ) ) { + foreach( $this->parameters as $n => $param ) { + if ( $type === 'before' && !is_array( $param ) ) { $replacementKeys['$' . ($n + 1)] = $param; } elseif ( $type === 'after' && isset( $param['raw'] ) ) { $replacementKeys['$' . ($n + 1)] = $param['raw']; @@ -255,10 +307,10 @@ class Message { protected function parseText( $string ) { global $wgOut; if ( $this->language !== null ) { - // FIXME: remove this limitation + # FIXME: remove this limitation throw new MWException( 'Can only parse in interface or content language' ); } - return $wgOut->parse( $string, /*linestart*/true, $this->interface() ); + return $wgOut->parse( $string, /*linestart*/true, $this->interface ); } /** @@ -272,12 +324,27 @@ class Message { } /** - * Wrapper for what ever method we use to get message contents - * @return Unmodified message contents + * Returns the textual value for the message. + * @return Message contents or placeholder */ protected function getMessageText() { - global $wgMessageCache; - return $wgMessageCache->get( $this->key, /*DB*/true, $this->language ); + $message = $this->fetchMessage(); + if ( $message === false ) { + return '<' . htmlspecialchars( $this->key ) . '>'; + } else { + return $message; + } + } + + /** + * Wrapper for what ever method we use to get message contents + */ + protected function fetchMessage() { + if ( !isset( $this->message ) ) { + global $wgMessageCache; + $this->message = $wgMessageCache->get( $this->key, $this->useDatabase, $this->language ); + } + return $this->message; } } \ No newline at end of file