MediaWiki
REL1_22
|
00001 <?php 00032 class ApiQueryAllMessages extends ApiQueryBase { 00033 00034 public function __construct( $query, $moduleName ) { 00035 parent::__construct( $query, $moduleName, 'am' ); 00036 } 00037 00038 public function execute() { 00039 $params = $this->extractRequestParams(); 00040 00041 if ( is_null( $params['lang'] ) ) { 00042 $langObj = $this->getLanguage(); 00043 } elseif ( !Language::isValidCode( $params['lang'] ) ) { 00044 $this->dieUsage( 'Invalid language code for parameter lang', 'invalidlang' ); 00045 } else { 00046 $langObj = Language::factory( $params['lang'] ); 00047 } 00048 00049 if ( $params['enableparser'] ) { 00050 if ( !is_null( $params['title'] ) ) { 00051 $title = Title::newFromText( $params['title'] ); 00052 if ( !$title || $title->isExternal() ) { 00053 $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) ); 00054 } 00055 } else { 00056 $title = Title::newFromText( 'API' ); 00057 } 00058 } 00059 00060 $prop = array_flip( (array)$params['prop'] ); 00061 00062 // Determine which messages should we print 00063 if ( in_array( '*', $params['messages'] ) ) { 00064 $message_names = Language::getMessageKeysFor( $langObj->getCode() ); 00065 if ( $params['includelocal'] ) { 00066 global $wgLanguageCode; 00067 $message_names = array_unique( array_merge( 00068 $message_names, 00069 // Pass in the content language code so we get local messages that have a 00070 // MediaWiki:msgkey page. We might theoretically miss messages that have no 00071 // MediaWiki:msgkey page but do have a MediaWiki:msgkey/lang page, but that's 00072 // just a stupid case. 00073 MessageCache::singleton()->getAllMessageKeys( $wgLanguageCode ) 00074 ) ); 00075 } 00076 sort( $message_names ); 00077 $messages_target = $message_names; 00078 } else { 00079 $messages_target = $params['messages']; 00080 } 00081 00082 // Filter messages that have the specified prefix 00083 // Because we sorted the message array earlier, they will appear in a clump: 00084 if ( isset( $params['prefix'] ) ) { 00085 $skip = false; 00086 $messages_filtered = array(); 00087 foreach ( $messages_target as $message ) { 00088 // === 0: must be at beginning of string (position 0) 00089 if ( strpos( $message, $params['prefix'] ) === 0 ) { 00090 if ( !$skip ) { 00091 $skip = true; 00092 } 00093 $messages_filtered[] = $message; 00094 } elseif ( $skip ) { 00095 break; 00096 } 00097 } 00098 $messages_target = $messages_filtered; 00099 } 00100 00101 // Filter messages that contain specified string 00102 if ( isset( $params['filter'] ) ) { 00103 $messages_filtered = array(); 00104 foreach ( $messages_target as $message ) { 00105 // !== is used because filter can be at the beginning of the string 00106 if ( strpos( $message, $params['filter'] ) !== false ) { 00107 $messages_filtered[] = $message; 00108 } 00109 } 00110 $messages_target = $messages_filtered; 00111 } 00112 00113 // Whether we have any sort of message customisation filtering 00114 $customiseFilterEnabled = $params['customised'] !== 'all'; 00115 if ( $customiseFilterEnabled ) { 00116 global $wgContLang; 00117 $lang = $langObj->getCode(); 00118 00119 $customisedMessages = AllmessagesTablePager::getCustomisedStatuses( 00120 array_map( array( $langObj, 'ucfirst' ), $messages_target ), $lang, $lang != $wgContLang->getCode() ); 00121 00122 $customised = $params['customised'] === 'modified'; 00123 } 00124 00125 // Get all requested messages and print the result 00126 $skip = !is_null( $params['from'] ); 00127 $useto = !is_null( $params['to'] ); 00128 $result = $this->getResult(); 00129 foreach ( $messages_target as $message ) { 00130 // Skip all messages up to $params['from'] 00131 if ( $skip && $message === $params['from'] ) { 00132 $skip = false; 00133 } 00134 00135 if ( $useto && $message > $params['to'] ) { 00136 break; 00137 } 00138 00139 if ( !$skip ) { 00140 $a = array( 'name' => $message ); 00141 $args = array(); 00142 if ( isset( $params['args'] ) && count( $params['args'] ) != 0 ) { 00143 $args = $params['args']; 00144 } 00145 00146 if ( $customiseFilterEnabled ) { 00147 $messageIsCustomised = isset( $customisedMessages['pages'][$langObj->ucfirst( $message )] ); 00148 if ( $customised === $messageIsCustomised ) { 00149 if ( $customised ) { 00150 $a['customised'] = ''; 00151 } 00152 } else { 00153 continue; 00154 } 00155 } 00156 00157 $msg = wfMessage( $message, $args )->inLanguage( $langObj ); 00158 00159 if ( !$msg->exists() ) { 00160 $a['missing'] = ''; 00161 } else { 00162 // Check if the parser is enabled: 00163 if ( $params['enableparser'] ) { 00164 $msgString = $msg->title( $title )->text(); 00165 } else { 00166 $msgString = $msg->plain(); 00167 } 00168 if ( !$params['nocontent'] ) { 00169 ApiResult::setContent( $a, $msgString ); 00170 } 00171 if ( isset( $prop['default'] ) ) { 00172 $default = wfMessage( $message )->inLanguage( $langObj )->useDatabase( false ); 00173 if ( !$default->exists() ) { 00174 $a['defaultmissing'] = ''; 00175 } elseif ( $default->plain() != $msgString ) { 00176 $a['default'] = $default->plain(); 00177 } 00178 } 00179 } 00180 $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $a ); 00181 if ( !$fit ) { 00182 $this->setContinueEnumParameter( 'from', $message ); 00183 break; 00184 } 00185 } 00186 } 00187 $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'message' ); 00188 } 00189 00190 public function getCacheMode( $params ) { 00191 if ( is_null( $params['lang'] ) ) { 00192 // Language not specified, will be fetched from preferences 00193 return 'anon-public-user-private'; 00194 } elseif ( $params['enableparser'] ) { 00195 // User-specific parser options will be used 00196 return 'anon-public-user-private'; 00197 } else { 00198 // OK to cache 00199 return 'public'; 00200 } 00201 } 00202 00203 public function getAllowedParams() { 00204 return array( 00205 'messages' => array( 00206 ApiBase::PARAM_DFLT => '*', 00207 ApiBase::PARAM_ISMULTI => true, 00208 ), 00209 'prop' => array( 00210 ApiBase::PARAM_ISMULTI => true, 00211 ApiBase::PARAM_TYPE => array( 00212 'default' 00213 ) 00214 ), 00215 'enableparser' => false, 00216 'nocontent' => false, 00217 'includelocal' => false, 00218 'args' => array( 00219 ApiBase::PARAM_ISMULTI => true, 00220 ApiBase::PARAM_ALLOW_DUPLICATES => true, 00221 ), 00222 'filter' => array(), 00223 'customised' => array( 00224 ApiBase::PARAM_DFLT => 'all', 00225 ApiBase::PARAM_TYPE => array( 00226 'all', 00227 'modified', 00228 'unmodified' 00229 ) 00230 ), 00231 'lang' => null, 00232 'from' => null, 00233 'to' => null, 00234 'title' => null, 00235 'prefix' => null, 00236 ); 00237 } 00238 00239 public function getParamDescription() { 00240 return array( 00241 'messages' => 'Which messages to output. "*" (default) means all messages', 00242 'prop' => 'Which properties to get', 00243 'enableparser' => array( 'Set to enable parser, will preprocess the wikitext of message', 00244 'Will substitute magic words, handle templates etc.' ), 00245 'nocontent' => 'If set, do not include the content of the messages in the output.', 00246 'includelocal' => array( "Also include local messages, i.e. messages that don't exist in the software but do exist as a MediaWiki: page.", 00247 "This lists all MediaWiki: pages, so it will also list those that aren't 'really' messages such as Common.js", 00248 ), 00249 'title' => 'Page name to use as context when parsing message (for enableparser option)', 00250 'args' => 'Arguments to be substituted into message', 00251 'prefix' => 'Return messages with this prefix', 00252 'filter' => 'Return only messages with names that contain this string', 00253 'customised' => 'Return only messages in this customisation state', 00254 'lang' => 'Return messages in this language', 00255 'from' => 'Return messages starting at this message', 00256 'to' => 'Return messages ending at this message', 00257 ); 00258 } 00259 00260 public function getPossibleErrors() { 00261 return array_merge( parent::getPossibleErrors(), array( 00262 array( 'code' => 'invalidlang', 'info' => 'Invalid language code for parameter lang' ), 00263 ) ); 00264 } 00265 00266 public function getResultProperties() { 00267 return array( 00268 '' => array( 00269 'name' => 'string', 00270 'customised' => 'boolean', 00271 'missing' => 'boolean', 00272 '*' => array( 00273 ApiBase::PROP_TYPE => 'string', 00274 ApiBase::PROP_NULLABLE => true 00275 ) 00276 ), 00277 'default' => array( 00278 'defaultmissing' => 'boolean', 00279 'default' => array( 00280 ApiBase::PROP_TYPE => 'string', 00281 ApiBase::PROP_NULLABLE => true 00282 ) 00283 ) 00284 ); 00285 } 00286 00287 public function getDescription() { 00288 return 'Return messages from this site'; 00289 } 00290 00291 public function getExamples() { 00292 return array( 00293 'api.php?action=query&meta=allmessages&refix=ipb-', 00294 'api.php?action=query&meta=allmessages&ammessages=august|mainpage&amlang=de', 00295 ); 00296 } 00297 00298 public function getHelpUrls() { 00299 return 'https://www.mediawiki.org/wiki/API:Meta#allmessages_.2F_am'; 00300 } 00301 }