107 parent::__construct( $query, $moduleName,
'si' );
108 $this->userOptionsLookup = $userOptionsLookup;
109 $this->userGroupManager = $userGroupManager;
110 $this->hookContainer = $hookContainer;
111 $this->languageConverterFactory = $languageConverterFactory;
112 $this->languageFactory = $languageFactory;
113 $this->languageNameUtils = $languageNameUtils;
114 $this->contentLanguage = $contentLanguage;
115 $this->namespaceInfo = $namespaceInfo;
116 $this->interwikiLookup = $interwikiLookup;
117 $this->parserFactory = $parserFactory;
118 $this->magicWordFactory = $magicWordFactory;
119 $this->specialPageFactory = $specialPageFactory;
120 $this->skinFactory = $skinFactory;
121 $this->loadBalancer = $loadBalancer;
122 $this->readOnlyMode = $readOnlyMode;
123 $this->urlUtils = $urlUtils;
124 $this->tempUserConfig = $tempUserConfig;
125 $this->groupPermissionsLookup = $groupPermissionsLookup;
131 foreach (
$params[
'prop'] as $p ) {
139 case 'namespacealiases':
142 case 'specialpagealiases':
160 case 'autocreatetempuser':
163 case 'clientlibraries':
172 case 'fileextensions':
184 case 'languagevariants':
190 case 'extensiontags':
193 case 'functionhooks':
205 case 'defaultoptions':
212 $fit = $this->appendAutoPromote( $p );
214 case 'autopromoteonce':
215 $fit = $this->appendAutoPromoteOnce( $p );
224 array_diff(
$params[
'prop'], $done ) ) );
233 $mainPage = Title::newMainPage();
237 'mainpage' => $mainPage->getPrefixedText(),
238 'base' => (string)$this->urlUtils->expand( $mainPage->getFullURL(),
PROTO_CURRENT ),
244 'logo' => (string)$this->urlUtils->expand( $logo[
'1x'],
PROTO_RELATIVE ),
248 'phpversion' => PHP_VERSION,
249 'phpsapi' => PHP_SAPI,
251 'dbversion' => $this->
getDB()->getServerVersion(),
255 $allowException =
true;
257 $data[
'imagewhitelistenabled'] =
260 $allowException = (bool)$allowFrom;
262 if ( $allowException ) {
263 $data[
'externalimages'] = (array)$allowFrom;
267 $data[
'langconversion'] = !$this->languageConverterFactory->isConversionDisabled();
268 $data[
'linkconversion'] = !$this->languageConverterFactory->isLinkConversionDisabled();
270 $data[
'titleconversion'] = $data[
'linkconversion'];
272 $contLangConverter = $this->languageConverterFactory->getLanguageConverter( $this->contentLanguage );
273 if ( $this->contentLanguage->linkPrefixExtension() ) {
277 $data[
'linkprefix'] =
"/^((?>.*[^$linkPrefixCharset]|))(.+)$/sDu";
279 $data[
'linkprefixcharset'] =
'';
280 $data[
'linkprefix'] =
'';
283 $data[
'linktrail'] = $this->contentLanguage->linkTrail() ?:
'';
285 $data[
'legaltitlechars'] = Title::legalChars();
289 $data[
'fixarabicunicode'] =
true;
290 $data[
'fixmalayalamunicode'] =
true;
294 $data[
'git-hash'] = $git;
303 $data[
'fallback'] = [];
304 foreach ( $this->contentLanguage->getFallbackLanguages() as $code ) {
305 $data[
'fallback'][] = [
'code' => $code ];
309 if ( $contLangConverter->hasVariants() ) {
310 $data[
'variants'] = [];
311 foreach ( $contLangConverter->getVariants() as $code ) {
312 $data[
'variants'][] = [
314 'name' => $this->contentLanguage->getVariantname( $code ),
320 $data[
'rtl'] = $this->contentLanguage->isRTL();
321 $data[
'fallback8bitEncoding'] = $this->contentLanguage->fallback8bitEncoding();
323 $data[
'readonly'] = $this->readOnlyMode->isReadOnly();
324 if ( $data[
'readonly'] ) {
325 $data[
'readonlyreason'] = $this->readOnlyMode->getReason();
327 $data[
'writeapi'] =
true;
340 $data[
'wikiid'] = WikiMap::getCurrentWikiId();
341 $data[
'time'] =
wfTimestamp( TS_ISO_8601, time() );
345 $data[
'uploadsenabled'] = UploadBase::isEnabled();
346 $data[
'maxuploadsize'] = UploadBase::getMaxUploadSize();
354 $data[
'imagelimits'] = [];
356 $data[
'imagelimits'][$k] = [
'width' => $limit[0],
'height' => $limit[1] ];
364 $data[
'favicon'] = (string)$this->urlUtils->expand( $favicon );
369 $data[
'allcentralidlookupproviders'] = $providerIds;
381 $this->
getHookRunner()->onAPIQuerySiteInfoGeneralInfo( $this, $data );
383 return $this->
getResult()->addValue(
'query', $property, $data );
390 foreach ( $this->contentLanguage->getFormattedNamespaces() as $ns => $title ) {
393 'case' => $this->namespaceInfo->isCapitalized( $ns ) ?
'first-letter' :
'case-sensitive',
396 $canonical = $this->namespaceInfo->getCanonicalName( $ns );
398 $data[$ns][
'subpages'] = $this->namespaceInfo->hasSubpages( $ns );
401 $data[$ns][
'canonical'] = strtr( $canonical,
'_',
' ' );
404 $data[$ns][
'content'] = $this->namespaceInfo->isContent( $ns );
405 $data[$ns][
'nonincludable'] = $this->namespaceInfo->isNonincludable( $ns );
407 $specificNs = $nsProtection[$ns] ??
'';
408 if ( is_array( $specificNs ) ) {
409 $specificNs = implode(
"|", array_filter( $specificNs ) );
411 if ( $specificNs !==
'' ) {
412 $data[$ns][
'namespaceprotection'] = $specificNs;
415 $contentmodel = $this->namespaceInfo->getNamespaceContentModel( $ns );
416 if ( $contentmodel ) {
417 $data[$ns][
'defaultcontentmodel'] = $contentmodel;
424 return $this->
getResult()->addValue(
'query', $property, $data );
428 $aliases = $this->contentLanguage->getNamespaceAliases();
429 $namespaces = $this->contentLanguage->getNamespaces();
431 foreach ( $aliases as $title => $ns ) {
432 if ( $namespaces[$ns] == $title ) {
436 $item = [
'id' => (int)$ns ];
445 return $this->
getResult()->addValue(
'query', $property, $data );
450 $aliases = $this->contentLanguage->getSpecialPageAliases();
451 foreach ( $this->specialPageFactory->getNames() as $specialpage ) {
452 if ( isset( $aliases[$specialpage] ) ) {
453 $arr = [
'realname' => $specialpage,
'aliases' => $aliases[$specialpage] ];
460 return $this->
getResult()->addValue(
'query', $property, $data );
465 foreach ( $this->contentLanguage->getMagicWords() as $name => $aliases ) {
466 $caseSensitive = (bool)array_shift( $aliases );
469 'aliases' => $aliases,
470 'case-sensitive' => $caseSensitive,
477 return $this->
getResult()->addValue(
'query', $property, $data );
481 $local = $filter ? $filter ===
'local' :
null;
484 $langCode =
$params[
'inlanguagecode'] ??
'';
487 if ( $interwikiMagic ) {
488 $langNames = $this->languageNameUtils->getLanguageNames( $langCode );
496 foreach ( $this->interwikiLookup->getAllPrefixes( $local ) as $row ) {
497 $prefix = $row[
'iw_prefix'];
499 $val[
'prefix'] = $prefix;
500 if ( $row[
'iw_local'] ??
false ) {
501 $val[
'local'] =
true;
503 if ( $row[
'iw_trans'] ??
false ) {
504 $val[
'trans'] =
true;
507 if ( $interwikiMagic && isset( $langNames[$prefix] ) ) {
508 $val[
'language'] = $langNames[$prefix];
509 $standard = LanguageCode::replaceDeprecatedCodes( $prefix );
510 if ( $standard !== $prefix ) {
511 # Note that even if this code is deprecated, it should
512 # only be remapped if extralanglink (set below) is false.
513 $val[
'deprecated'] = $standard;
515 $val[
'bcp47'] = LanguageCode::bcp47( $standard );
517 if ( in_array( $prefix, $localInterwikis ) ) {
518 $val[
'localinterwiki'] =
true;
520 if ( $interwikiMagic && in_array( $prefix, $extraLangPrefixes ) ) {
521 $val[
'extralanglink'] =
true;
522 $val[
'code'] = $extraLangCodeMap[$prefix] ?? $prefix;
523 $val[
'bcp47'] = LanguageCode::bcp47( $val[
'code'] );
525 $linktext = $this->
msg(
"interlanguage-link-$prefix" );
526 if ( !$linktext->isDisabled() ) {
527 $val[
'linktext'] = $linktext->text();
530 $sitename = $this->
msg(
"interlanguage-link-sitename-$prefix" );
531 if ( !$sitename->isDisabled() ) {
532 $val[
'sitename'] = $sitename->text();
536 $val[
'url'] = (string)$this->urlUtils->expand( $row[
'iw_url'],
PROTO_CURRENT );
537 $val[
'protorel'] = str_starts_with( $row[
'iw_url'],
'//' );
538 if ( ( $row[
'iw_wikiid'] ??
'' ) !==
'' ) {
539 $val[
'wikiid'] = $row[
'iw_wikiid'];
541 if ( ( $row[
'iw_api'] ??
'' ) !==
'' ) {
542 $val[
'api'] = $row[
'iw_api'];
550 return $this->
getResult()->addValue(
'query', $property, $data );
557 if ( !$showHostnames ) {
558 $this->
dieWithError(
'apierror-siteinfo-includealldenied',
'includeAllDenied' );
561 foreach ( $this->loadBalancer->getLagTimes() as $i => $lag ) {
563 'host' => $this->loadBalancer->getServerName( $i ),
568 [ , $lag, $index ] = $this->loadBalancer->getMaxLag();
570 'host' => $showHostnames ? $this->loadBalancer->getServerName( $index ) :
'',
577 return $this->
getResult()->addValue(
'query', $property, $data );
592 $this->
getHookRunner()->onAPIQuerySiteInfoStatisticsInfo( $data );
594 return $this->
getResult()->addValue(
'query', $property, $data );
602 $allGroups = $this->userGroupManager->listAllGroups();
603 $allImplicitGroups = $this->userGroupManager->listAllImplicitGroups();
604 foreach ( array_merge( $allImplicitGroups, $allGroups ) as $group ) {
607 'rights' => $this->groupPermissionsLookup->getGrantedPermissions( $group ),
611 if ( $numberInGroup ) {
614 if ( $group ==
'user' ) {
617 } elseif ( $group !==
'*' && !isset( $autopromote[$group] ) ) {
622 $groupArr = $this->userGroupManager->getGroupsChangeableByGroup( $group );
624 foreach ( $groupArr as $type => $groups ) {
625 $groups = array_values( array_intersect( $groups, $allGroups ) );
627 $arr[$type] = $groups;
639 return $result->addValue(
'query', $property, $data );
643 $data = [
'enabled' => $this->tempUserConfig->isEnabled() ];
644 if ( $this->tempUserConfig->isKnown() ) {
645 $data[
'matchPatterns'] = $this->tempUserConfig->getMatchPatterns();
647 return $this->
getResult()->addValue(
'query', $property, $data );
655 $data[] = [
'ext' => $ext ];
659 return $this->
getResult()->addValue(
'query', $property, $data );
664 foreach ( SpecialVersion::parseForeignResources() as $name => $info ) {
668 'name' => $info[
'name'],
669 'version' => $info[
'version'],
673 return $this->
getResult()->addValue(
'query', $property, $data );
677 $credits = SpecialVersion::getCredits(
678 ExtensionRegistry::getInstance(),
682 foreach ( SpecialVersion::parseComposerInstalled( $credits ) as $name => $info ) {
683 if ( str_starts_with( $info[
'type'],
'mediawiki-' ) ) {
690 'version' => $info[
'version'],
695 return $this->
getResult()->addValue(
'query', $property, $data );
700 $credits = SpecialVersion::getCredits(
701 ExtensionRegistry::getInstance(),
704 foreach ( $credits as $type => $extensions ) {
705 foreach ( $extensions as $ext ) {
706 $ret = [
'type' => $type ];
707 if ( isset( $ext[
'name'] ) ) {
708 $ret[
'name'] = $ext[
'name'];
710 if ( isset( $ext[
'namemsg'] ) ) {
711 $ret[
'namemsg'] = $ext[
'namemsg'];
713 if ( isset( $ext[
'description'] ) ) {
714 $ret[
'description'] = $ext[
'description'];
716 if ( isset( $ext[
'descriptionmsg'] ) ) {
718 if ( is_array( $ext[
'descriptionmsg'] ) ) {
719 $ret[
'descriptionmsg'] = $ext[
'descriptionmsg'][0];
720 $ret[
'descriptionmsgparams'] = array_slice( $ext[
'descriptionmsg'], 1 );
723 $ret[
'descriptionmsg'] = $ext[
'descriptionmsg'];
726 if ( isset( $ext[
'author'] ) ) {
727 $ret[
'author'] = is_array( $ext[
'author'] ) ?
728 implode(
', ', $ext[
'author'] ) : $ext[
'author'];
730 if ( isset( $ext[
'url'] ) ) {
731 $ret[
'url'] = $ext[
'url'];
733 if ( isset( $ext[
'version'] ) ) {
734 $ret[
'version'] = $ext[
'version'];
736 if ( isset( $ext[
'path'] ) ) {
737 $extensionPath = dirname( $ext[
'path'] );
738 $gitInfo =
new GitInfo( $extensionPath );
739 $vcsVersion = $gitInfo->getHeadSHA1();
740 if ( $vcsVersion !==
false ) {
741 $ret[
'vcs-system'] =
'git';
742 $ret[
'vcs-version'] = $vcsVersion;
743 $ret[
'vcs-url'] = $gitInfo->getHeadViewUrl();
744 $vcsDate = $gitInfo->getHeadCommitDate();
745 if ( $vcsDate !==
false ) {
746 $ret[
'vcs-date'] =
wfTimestamp( TS_ISO_8601, $vcsDate );
750 if ( ExtensionInfo::getLicenseFileNames( $extensionPath ) ) {
751 $ret[
'license-name'] = $ext[
'license-name'] ??
'';
754 "License/{$ext['name']}"
758 if ( ExtensionInfo::getAuthorsFileName( $extensionPath ) ) {
761 "Credits/{$ext['name']}"
771 return $this->
getResult()->addValue(
'query', $property, $data );
783 if ( $text ===
'' && $title ) {
784 $text = $title->getPrefixedText();
788 'url' => (string)
$url,
789 'text' => (
string)$text,
792 return $this->
getResult()->addValue(
'query', $property, $data );
814 return $this->
getResult()->addValue(
'query', $property, $data );
819 $langCode =
$params[
'inlanguagecode'] ??
'';
820 $langNames = $this->languageNameUtils->getLanguageNames( $langCode );
824 foreach ( $langNames as $code => $name ) {
827 'bcp47' => LanguageCode::bcp47( $code ),
834 return $this->
getResult()->addValue(
'query', $property, $data );
840 $langNames = $this->languageConverterFactory->isConversionDisabled() ? [] :
841 LanguageConverter::$languagesWithVariants;
845 foreach ( $langNames as $langCode ) {
846 $lang = $this->languageFactory->getLanguage( $langCode );
847 $langConverter = $this->languageConverterFactory->getLanguageConverter( $lang );
848 if ( !$langConverter->hasVariants() ) {
852 $data[$langCode] = [];
856 $variants = $langConverter->getVariants();
858 foreach ( $variants as $v ) {
859 $data[$langCode][$v] = [
860 'fallbacks' => (array)$langConverter->getVariantFallbacks( $v ),
863 $data[$langCode][$v][
'fallbacks'],
'variant'
870 return $this->
getResult()->addValue(
'query', $property, $data );
875 $allowed = $this->skinFactory->getAllowedSkins();
878 foreach ( $this->skinFactory->getInstalledSkins() as $name => $displayName ) {
879 $msg = $this->
msg(
"skinname-{$name}" );
881 if ( $code && $this->languageNameUtils->isValidCode( $code ) ) {
882 $msg->inLanguage( $code );
884 $msg->inContentLanguage();
886 if ( $msg->exists() ) {
887 $displayName = $msg->text();
889 $skin = [
'code' => $name ];
891 if ( !isset( $allowed[$name] ) ) {
892 $skin[
'unusable'] =
true;
894 if ( $name === $default ) {
895 $skin[
'default'] =
true;
901 return $this->
getResult()->addValue(
'query', $property, $data );
906 static function ( $item ) {
909 $this->parserFactory->getMainInstance()->getTags()
914 return $this->
getResult()->addValue(
'query', $property, $tags );
918 $hooks = $this->parserFactory->getMainInstance()->getFunctionHooks();
922 return $this->
getResult()->addValue(
'query', $property, $hooks );
926 $variables = $this->magicWordFactory->getVariableIDs();
930 return $this->
getResult()->addValue(
'query', $property, $variables );
939 return $this->
getResult()->addValue(
'query', $property, $protocols );
943 $options = $this->userOptionsLookup->getDefaultOptions(
null );
945 return $this->
getResult()->addValue(
'query', $property, $options );
950 return $this->
getResult()->addValue(
'query', $property, $config );
953 private function getAutoPromoteConds() {
954 $allowedConditions = [];
955 foreach ( get_defined_constants() as $constantName => $constantValue ) {
956 if ( strpos( $constantName,
'APCOND_' ) !==
false ) {
957 $allowedConditions[$constantName] = $constantValue;
960 return $allowedConditions;
963 private function processAutoPromote( $input, $allowedConditions ) {
965 foreach ( $input as $groupName => $conditions ) {
966 $row = $this->recAutopromote( $conditions, $allowedConditions );
967 if ( !isset( $row[0] ) || is_string( $row ) ) {
970 $data[$groupName] = $row;
975 private function appendAutoPromote( $property ) {
979 $this->processAutoPromote(
981 $this->getAutoPromoteConds()
986 private function appendAutoPromoteOnce( $property ) {
987 $allowedConditions = $this->getAutoPromoteConds();
990 $data[$key] = $this->processAutoPromote( $value, $allowedConditions );
992 return $this->
getResult()->addValue(
'query', $property, $data );
1000 private function recAutopromote( $cond, $allowedConditions ) {
1003 if ( is_array( $cond ) ) {
1005 if ( in_array( $cond[0], UserGroupManager::VALID_OPS,
true ) ) {
1006 $config[
'operand'] = $cond[0];
1008 foreach ( array_slice( $cond, 1 ) as $value ) {
1009 $config[] = $this->recAutopromote( $value, $allowedConditions );
1011 } elseif ( is_string( $cond[0] ) ) {
1016 $params = array_slice( $cond, 1 );
1027 'condname' => array_search( $cond[0], $allowedConditions ),
1032 } elseif ( is_string( $cond ) ) {
1037 'condname' => array_search( $cond, $allowedConditions ),
1047 $hookNames = $this->hookContainer->getHookNames();
1051 foreach ( $hookNames as $name ) {
1054 'subscribers' => $this->hookContainer->getHandlerDescriptions( $name ),
1064 return $this->
getResult()->addValue(
'query', $property, $data );
1070 in_array(
'interwikimap',
$params[
'prop'] ?? [] )
1072 return 'anon-public-user-private';
1081 ParamValidator::PARAM_DEFAULT =>
'general',
1082 ParamValidator::PARAM_ISMULTI =>
true,
1083 ParamValidator::PARAM_TYPE => [
1087 'specialpagealiases',
1093 'autocreatetempuser',
1116 ParamValidator::PARAM_TYPE => [
1121 'showalldb' =>
false,
1122 'numberingroup' =>
false,
1123 'inlanguagecode' =>
null,
1129 'action=query&meta=siteinfo&siprop=general|namespaces|namespacealiases|statistics'
1130 =>
'apihelp-query+siteinfo-example-simple',
1131 'action=query&meta=siteinfo&siprop=interwikimap&sifilteriw=local'
1132 =>
'apihelp-query+siteinfo-example-interwiki',
1133 'action=query&meta=siteinfo&siprop=dbrepllag&sishowalldb='
1134 =>
'apihelp-query+siteinfo-example-replag',
1139 return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Siteinfo';
1144class_alias( ApiQuerySiteinfo::class,
'ApiQuerySiteinfo' );
const MW_VERSION
The running version of MediaWiki.
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
array $params
The job parameters.
msg( $key,... $params)
Get a Message object with context set Parameters are the same as wfMessage()
A class containing constants representing the names of configuration variables.
const ExternalLinkTarget
Name constant for the ExternalLinkTarget setting, for use with Config::get()
const NoFollowDomainExceptions
Name constant for the NoFollowDomainExceptions setting, for use with Config::get()
const AutoConfirmCount
Name constant for the AutoConfirmCount setting, for use with Config::get()
const ServerName
Name constant for the ServerName setting, for use with Config::get()
const RightsPage
Name constant for the RightsPage setting, for use with Config::get()
const VariantArticlePath
Name constant for the VariantArticlePath setting, for use with Config::get()
const NamespaceProtection
Name constant for the NamespaceProtection setting, for use with Config::get()
const DBtype
Name constant for the DBtype setting, for use with Config::get()
const CapitalLinks
Name constant for the CapitalLinks setting, for use with Config::get()
const Localtimezone
Name constant for the Localtimezone setting, for use with Config::get()
const Server
Name constant for the Server setting, for use with Config::get()
const CentralIdLookupProviders
Name constant for the CentralIdLookupProviders setting, for use with Config::get()
const MaxArticleSize
Name constant for the MaxArticleSize setting, for use with Config::get()
const RestrictionTypes
Name constant for the RestrictionTypes setting, for use with Config::get()
const AutopromoteOnce
Name constant for the AutopromoteOnce setting, for use with Config::get()
const RightsText
Name constant for the RightsText setting, for use with Config::get()
const Autopromote
Name constant for the Autopromote setting, for use with Config::get()
const NoFollowNsExceptions
Name constant for the NoFollowNsExceptions setting, for use with Config::get()
const CascadingRestrictionLevels
Name constant for the CascadingRestrictionLevels setting, for use with Config::get()
const AllowExternalImages
Name constant for the AllowExternalImages setting, for use with Config::get()
const Sitename
Name constant for the Sitename setting, for use with Config::get()
const UrlProtocols
Name constant for the UrlProtocols setting, for use with Config::get()
const ArticlePath
Name constant for the ArticlePath setting, for use with Config::get()
const Favicon
Name constant for the Favicon setting, for use with Config::get()
const LocalTZoffset
Name constant for the LocalTZoffset setting, for use with Config::get()
const RightsUrl
Name constant for the RightsUrl setting, for use with Config::get()
const MainPageIsDomainRoot
Name constant for the MainPageIsDomainRoot setting, for use with Config::get()
const CategoryCollation
Name constant for the CategoryCollation setting, for use with Config::get()
const ImageLimits
Name constant for the ImageLimits setting, for use with Config::get()
const CentralIdLookupProvider
Name constant for the CentralIdLookupProvider setting, for use with Config::get()
const InterlanguageLinkCodeMap
Name constant for the InterlanguageLinkCodeMap setting, for use with Config::get()
const FileExtensions
Name constant for the FileExtensions setting, for use with Config::get()
const ScriptPath
Name constant for the ScriptPath setting, for use with Config::get()
const AllUnicodeFixes
Name constant for the AllUnicodeFixes setting, for use with Config::get()
const SemiprotectedRestrictionLevels
Name constant for the SemiprotectedRestrictionLevels setting, for use with Config::get()
const AutoConfirmAge
Name constant for the AutoConfirmAge setting, for use with Config::get()
const GalleryOptions
Name constant for the GalleryOptions setting, for use with Config::get()
const EnableMagicLinks
Name constant for the EnableMagicLinks setting, for use with Config::get()
const ThumbLimits
Name constant for the ThumbLimits setting, for use with Config::get()
const LanguageCode
Name constant for the LanguageCode setting, for use with Config::get()
const RestrictionLevels
Name constant for the RestrictionLevels setting, for use with Config::get()
const EnableImageWhitelist
Name constant for the EnableImageWhitelist setting, for use with Config::get()
const MiserMode
Name constant for the MiserMode setting, for use with Config::get()
const InvalidUsernameCharacters
Name constant for the InvalidUsernameCharacters setting, for use with Config::get()
const LocalInterwikis
Name constant for the LocalInterwikis setting, for use with Config::get()
const UploadDialog
Name constant for the UploadDialog setting, for use with Config::get()
const InterwikiMagic
Name constant for the InterwikiMagic setting, for use with Config::get()
const AllowExternalImagesFrom
Name constant for the AllowExternalImagesFrom setting, for use with Config::get()
const NoFollowLinks
Name constant for the NoFollowLinks setting, for use with Config::get()
const Script
Name constant for the Script setting, for use with Config::get()
const ExtraInterlanguageLinkPrefixes
Name constant for the ExtraInterlanguageLinkPrefixes setting, for use with Config::get()
const ShowHostnames
Name constant for the ShowHostnames setting, for use with Config::get()
Factory for handling the special page list and generating SpecialPage objects.
Parent class for all special pages.
static getTitleFor( $name, $subpage=false, $fragment='')
Get a localised Title object for a specified special page name If you don't need a full Title object,...
Factory class to create Skin objects.
The base class for all skins.
static normalizeKey(string $key)
Normalize a skin preference value to a form that can be loaded.
UploadBase and subclasses are the backend of MediaWiki's file uploads.