parse: parses wikitext to html * parseinline: parses wikitext to html and removes the surrounding p's added by parser or tidy * escape: filters message through htmlspecialchars * escapenoentities: same, but allows entity references like   through * replaceafter: parameters are substituted after parsing or escaping * parsemag: transform the message using magic phrases * content: fetch message for content language instead of interface * language: language code to fetch message for (overriden by content), its behaviour * with parse, parseinline and parsemag is undefined. * Behavior for conflicting options (e.g., parse+parseinline) is undefined. */ function wfMsgExt( $key, $options ) { $args = func_get_args(); array_shift( $args ); array_shift( $args ); if( !is_array($options) ) { $options = array($options); } $language = MessageGetter::LANG_UI; if( in_array('content', $options) ) { $language = MessageGetter::LANG_CONTENT; } elseif( array_key_exists('language', $options) ) { $language = $options['language']; $validCodes = array_keys( Language::getLanguageNames() ); if( !in_array($language, $validCodes) ) { # Fallback to en, instead of whatsever interface language we might have $language = 'en'; } } $message = MessageGetter::get( $key, $language ); if( !in_array('replaceafter', $options) ) { $message = MessageGetter::replaceArgs( $message, $args ); } if( in_array('parse', $options) ) { $message = MessageGetter::parse( $message, $language ); } elseif ( in_array('parseinline', $options) ) { $message = MessageGetter::parse( $message, $language, /*inline*/true ); } elseif ( in_array('parsemag', $options) ) { $message = MessageGetter::transform( $message, $language ); } if ( in_array('escape', $options) ) { $message = MessageGetter::escapeHtml( $message, /*allowEntities*/false ); } elseif ( in_array( 'escapenoentities', $options ) ) { $message = MessageGetter::escapeHtml( $message ); } if( in_array('replaceafter', $options) ) { $message = MessageGetter::replaceArgs( $message, $args ); } return $message; } class MessageGetter { const LANG_UI = false; const LANG_CONTENT = true; public static function get( $key, $language = self::LANG_UI, $database = true ) { global $wgMessageCache; if( !is_object($wgMessageCache) ) { throw new MWException( "Message cache not initialised\n" ); } wfRunHooks('NormalizeMessageKey', array(&$key, &$database, &$language)); $message = $wgMessageCache->get( $key, $database, $language ); # Fix windows line-endings # Some messages are split with explode("\n", $msg) $message = str_replace( "\r", '', $message ); return $message; } public static function forContentLanguage( $key ) { global $wgForceUIMsgAsContentMsg; if( is_array( $wgForceUIMsgAsContentMsg ) && in_array( $key, $wgForceUIMsgAsContentMsg ) ) { return self::LANG_UI; } else { return self::LANG_CONTENT; } } public static function replaceArgs( $message, $args ) { // Replace arguments if ( count( $args ) ) { if ( is_array( $args[0] ) ) { $args = array_values( $args[0] ); } $replacementKeys = array(); foreach( $args as $n => $param ) { $replacementKeys['$' . ($n + 1)] = $param; } $message = strtr( $message, $replacementKeys ); } return $message; } /** * @param $language LANG_UI or LANG_CONTENT. */ public static function transform( $message, $language = self::LANG_UI ) { global $wgMessageCache; // transform accepts only boolean values if ( !is_bool($language) ) throw new MWException( __METHOD__ . ': only ui/content language supported' ); return $wgMessageCache->transform( $message, !$language ); } /** * @param $language LANG_UI or LANG_CONTENT. */ public static function parse( $message, $language = self::LANG_UI, $inline = false ) { global $wgOut; // parse accepts only boolean values if ( !is_bool($language) ) throw new MWException( __METHOD__ . ': only ui/content language supported' ); $message = $wgOut->parse( $message, true, !$language ); if ( $inline ) { $m = array(); if( preg_match( '/^

(.*)\n?<\/p>\n?$/sU', $message, $m ) ) { $message = $m[1]; } } return $message; } public static function escapeHtml( $message, $allowEntities = true ) { $message = htmlspecialchars( $message ); if ( $allowEntities ) { $message = str_replace( '&', '&', $message ); $message = Sanitizer::normalizeCharReferences( $message ); } return $message; } }