38 private $mIsWrappedHtml =
false;
39 private $mHttpStatus =
false;
49 parent::__construct( $main, $format );
51 $this->mIsHtml = str_ends_with( $format,
'fm' );
52 if ( $this->mIsHtml ) {
53 $this->mFormat = substr( $format, 0, -2 );
54 $this->mIsWrappedHtml = $this->
getMain()->getCheck(
'wrappedhtml' );
56 $this->mFormat = $format;
58 $this->mFormat = strtoupper( $this->mFormat );
81 return 'api-result-wrapped.json';
85 return 'api-result.html';
88 $mimeAnalyzer = MediaWikiServices::getInstance()->getMimeAnalyzer();
89 $ext = $mimeAnalyzer->getExtensionFromMimeTypeOrNull( $this->
getMimeType() )
90 ?? strtolower( $this->mFormat );
91 return "api-result.$ext";
110 return $this->mIsHtml;
120 return $this->mIsWrappedHtml;
129 $this->mDisabled =
true;
160 $this->mForceDefaultParams =
true;
169 if ( !$this->mForceDefaultParams ) {
170 return parent::getParameterFromSettings( $paramName, $paramSettings, $parseLimit );
173 if ( !is_array( $paramSettings ) ) {
174 return $paramSettings;
177 return $paramSettings[ParamValidator::PARAM_DEFAULT] ??
null;
186 if ( $this->mDisabled ) {
191 $this->mHttpStatus = $code;
193 $this->
getMain()->getRequest()->response()->statusHeader( $code );
202 if ( $this->mDisabled ) {
207 ?
'text/mediawiki-api-prettyprint-wrapped'
212 if (
$mime ===
null ) {
216 $this->
getMain()->getRequest()->response()->header(
"Content-Type: $mime; charset=utf-8" );
219 $apiFrameOptions = $this->
getConfig()->get( MainConfigNames::ApiFrameOptions );
220 if ( $apiFrameOptions ) {
221 $this->
getMain()->getRequest()->response()->header(
"X-Frame-Options: $apiFrameOptions" );
226 $header =
'Content-Disposition: inline';
228 $compatFilename = mb_convert_encoding( $filename,
'ISO-8859-1' );
229 if ( preg_match(
'/^[0-9a-zA-Z!#$%&\'*+\-.^_`|~]+$/', $compatFilename ) ) {
230 $header .=
'; filename=' . $compatFilename;
233 . preg_replace(
'/([\0-\x1f"\x5c\x7f])/',
'\\\\$1', $compatFilename ) .
'"';
235 if ( $compatFilename !== $filename ) {
236 $value =
"UTF-8''" . rawurlencode( $filename );
238 $value = strtr( $value, [
239 '%21' =>
'!',
'%23' =>
'#',
'%24' =>
'$',
'%26' =>
'&',
'%2B' =>
'+',
'%5E' =>
'^',
240 '%60' =>
'`',
'%7C' =>
'|',
242 $header .=
'; filename*=' . $value;
251 if ( $this->mDisabled ) {
258 $lcformat = strtolower( $format );
262 $skinFactory = MediaWikiServices::getInstance()->getSkinFactory();
263 $context->setSkin( $skinFactory->makeSkin(
'apioutput' ) );
264 $context->setTitle( SpecialPage::getTitleFor(
'ApiHelp' ) );
266 $context->setOutput( $out );
268 $out->setRobotPolicy(
'noindex,nofollow' );
269 $out->addModuleStyles(
'mediawiki.apipretty' );
270 $out->setPageTitleMsg( $context->msg(
'api-format-title' ) );
276 $nonHtmlUrl = strtok( $this->
getRequest()->getFullRequestURL(),
'?' )
277 .
'?' . $this->
getRequest()->appendQueryValue(
'format', $lcformat );
278 $msg = $context->msg(
'api-format-prettyprint-header-hyperlinked' )
279 ->params( $format, $lcformat, $nonHtmlUrl );
281 $msg = $context->msg(
'api-format-prettyprint-header' )->params( $format, $lcformat );
284 $msg = $context->msg(
'api-format-prettyprint-header-only-html' )->params( $format );
287 $header = $msg->parseAsBlock();
289 Html::rawElement(
'div', [
'class' =>
'api-pretty-header' ],
294 if ( $this->mHttpStatus && $this->mHttpStatus !== 200 ) {
296 Html::rawElement(
'div', [
'class' => [
'api-pretty-header',
'api-pretty-status' ] ],
298 'api-format-prettyprint-status',
307 if ( $this->
getHookRunner()->onApiFormatHighlight( $context, $result,
$mime, $format ) ) {
309 Html::element(
'pre', [
'class' =>
'api-pretty-content' ], $result )
315 $time = $this->
getMain()->getRequest()->getElapsedTime();
318 'status' => (
int)( $this->mHttpStatus ?: 200 ),
320 'html' => $out->getHTML(),
321 'modules' => array_values( array_unique( array_merge(
323 $out->getModuleStyles()
325 'continue' => $this->getResult()->getResultData(
'continue' ),
326 'time' => round( $time * 1000 ),
333 $out->setPreventClickjacking(
false );
351 $this->mBuffer .= $text;
360 return $this->mBuffer;
366 $ret[
'wrappedhtml'] = [
367 ParamValidator::PARAM_DEFAULT =>
false,
376 'action=query&meta=siteinfo&siprop=namespaces&format=' . $this->
getModuleName()
377 => [
'apihelp-format-example-generic', $this->
getFormat() ]
382 return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Data_formats';
This abstract class implements many basic API functions, and is the base of all API classes.
getModuleManager()
Get the module manager, or null if this module has no submodules.
getMain()
Get the main module.
const PARAM_HELP_MSG
(string|array|Message) Specify an alternative i18n documentation message for this parameter.
getModuleName()
Get the name of the module being executed by this instance.
getHookRunner()
Get an ApiHookRunner for running core API hooks.
static fixHelpLinks( $html, $helptitle=null, $localModules=[])
Replace Special:ApiHelp links with links to api.php.
This is the main API class, used for both external and internal processing.
msg( $key,... $params)
Get a Message object with context set Parameters are the same as wfMessage()
An IContextSource implementation which will inherit context from another source but allow individual ...
static getMessage( $code)
Get the message associated with an HTTP response status code.
A class containing constants representing the names of configuration variables.
This is one of the Core classes and should be read at least once by any new developers.
Parent class for all special pages.
if(!is_readable( $file)) $ext