/** * Recursively-called function to actually construct the help * * @param IContextSource $context * @param ApiBase[] $modules * @param array $options * @param array &$haveModules * @return string */ private static function getHelpInternal(IContextSource $context, array $modules, array $options, &$haveModules) { $out = ''; $level = empty($options['headerlevel']) ? 2 : $options['headerlevel']; if (empty($options['tocnumber'])) { $tocnumber = array(2 => 0); } else { $tocnumber =& $options['tocnumber']; } foreach ($modules as $module) { $tocnumber[$level]++; $path = $module->getModulePath(); $module->setContext($context); $help = array('header' => '', 'flags' => '', 'description' => '', 'help-urls' => '', 'parameters' => '', 'examples' => '', 'submodules' => ''); if (empty($options['noheader']) || !empty($options['toc'])) { $anchor = $path; $i = 1; while (isset($haveModules[$anchor])) { $anchor = $path . '|' . ++$i; } if ($module->isMain()) { $header = $context->msg('api-help-main-header')->parse(); } else { $name = $module->getModuleName(); $header = $module->getParent()->getModuleManager()->getModuleGroup($name) . "={$name}"; if ($module->getModulePrefix() !== '') { $header .= ' ' . $context->msg('parentheses', $module->getModulePrefix())->parse(); } } $haveModules[$anchor] = array('toclevel' => count($tocnumber), 'level' => $level, 'anchor' => $anchor, 'line' => $header, 'number' => join('.', $tocnumber), 'index' => false); if (empty($options['noheader'])) { $help['header'] .= Html::element('h' . min(6, $level), array('id' => $anchor, 'class' => 'apihelp-header'), $header); } } else { $haveModules[$path] = true; } $links = array(); $any = false; for ($m = $module; $m !== null; $m = $m->getParent()) { $name = $m->getModuleName(); if ($name === 'main_int') { $name = 'main'; } if (count($modules) === 1 && $m === $modules[0] && !(!empty($options['submodules']) && $m->getModuleManager())) { $link = Html::element('b', null, $name); } else { $link = SpecialPage::getTitleFor('ApiHelp', $m->getModulePath())->getLocalURL(); $link = Html::element('a', array('href' => $link, 'class' => 'apihelp-linktrail'), $name); $any = true; } array_unshift($links, $link); } if ($any) { $help['header'] .= self::wrap($context->msg('parentheses')->rawParams($context->getLanguage()->pipeList($links)), 'apihelp-linktrail', 'div'); } $flags = $module->getHelpFlags(); $help['flags'] .= Html::openElement('div', array('class' => 'apihelp-block apihelp-flags')); $msg = $context->msg('api-help-flags'); if (!$msg->isDisabled()) { $help['flags'] .= self::wrap($msg->numParams(count($flags)), 'apihelp-block-head', 'div'); } $help['flags'] .= Html::openElement('ul'); foreach ($flags as $flag) { $help['flags'] .= Html::rawElement('li', null, self::wrap($context->msg("api-help-flag-{$flag}"), "apihelp-flag-{$flag}")); } $sourceInfo = $module->getModuleSourceInfo(); if ($sourceInfo) { if (isset($sourceInfo['namemsg'])) { $extname = $context->msg($sourceInfo['namemsg'])->text(); } else { $extname = $sourceInfo['name']; } $help['flags'] .= Html::rawElement('li', null, self::wrap($context->msg('api-help-source', $extname, $sourceInfo['name']), 'apihelp-source')); $link = SpecialPage::getTitleFor('Version', 'License/' . $sourceInfo['name']); if (isset($sourceInfo['license-name'])) { $msg = $context->msg('api-help-license', $link, $sourceInfo['license-name']); } elseif (SpecialVersion::getExtLicenseFileName(dirname($sourceInfo['path']))) { $msg = $context->msg('api-help-license-noname', $link); } else { $msg = $context->msg('api-help-license-unknown'); } $help['flags'] .= Html::rawElement('li', null, self::wrap($msg, 'apihelp-license')); } else { $help['flags'] .= Html::rawElement('li', null, self::wrap($context->msg('api-help-source-unknown'), 'apihelp-source')); $help['flags'] .= Html::rawElement('li', null, self::wrap($context->msg('api-help-license-unknown'), 'apihelp-license')); } $help['flags'] .= Html::closeElement('ul'); $help['flags'] .= Html::closeElement('div'); foreach ($module->getFinalDescription() as $msg) { $msg->setContext($context); $help['description'] .= $msg->parseAsBlock(); } $urls = $module->getHelpUrls(); if ($urls) { $help['help-urls'] .= Html::openElement('div', array('class' => 'apihelp-block apihelp-help-urls')); $msg = $context->msg('api-help-help-urls'); if (!$msg->isDisabled()) { $help['help-urls'] .= self::wrap($msg->numParams(count($urls)), 'apihelp-block-head', 'div'); } if (!is_array($urls)) { $urls = array($urls); } $help['help-urls'] .= Html::openElement('ul'); foreach ($urls as $url) { $help['help-urls'] .= Html::rawElement('li', null, Html::element('a', array('href' => $url), $url)); } $help['help-urls'] .= Html::closeElement('ul'); $help['help-urls'] .= Html::closeElement('div'); } $params = $module->getFinalParams(ApiBase::GET_VALUES_FOR_HELP); $dynamicParams = $module->dynamicParameterDocumentation(); $groups = array(); if ($params || $dynamicParams !== null) { $help['parameters'] .= Html::openElement('div', array('class' => 'apihelp-block apihelp-parameters')); $msg = $context->msg('api-help-parameters'); if (!$msg->isDisabled()) { $help['parameters'] .= self::wrap($msg->numParams(count($params)), 'apihelp-block-head', 'div'); } $help['parameters'] .= Html::openElement('dl'); $descriptions = $module->getFinalParamDescription(); foreach ($params as $name => $settings) { if (!is_array($settings)) { $settings = array(ApiBase::PARAM_DFLT => $settings); } $help['parameters'] .= Html::element('dt', null, $module->encodeParamName($name)); // Add description $description = array(); if (isset($descriptions[$name])) { foreach ($descriptions[$name] as $msg) { $msg->setContext($context); $description[] = $msg->parseAsBlock(); } } // Add usage info $info = array(); // Required? if (!empty($settings[ApiBase::PARAM_REQUIRED])) { $info[] = $context->msg('api-help-param-required')->parse(); } // Custom info? if (!empty($settings[ApiBase::PARAM_HELP_MSG_INFO])) { foreach ($settings[ApiBase::PARAM_HELP_MSG_INFO] as $i) { $tag = array_shift($i); $info[] = $context->msg("apihelp-{$path}-paraminfo-{$tag}")->numParams(count($i))->params($context->getLanguage()->commaList($i))->params($module->getModulePrefix())->parse(); } } // Type documentation if (!isset($settings[ApiBase::PARAM_TYPE])) { $dflt = isset($settings[ApiBase::PARAM_DFLT]) ? $settings[ApiBase::PARAM_DFLT] : null; if (is_bool($dflt)) { $settings[ApiBase::PARAM_TYPE] = 'boolean'; } elseif (is_string($dflt) || is_null($dflt)) { $settings[ApiBase::PARAM_TYPE] = 'string'; } elseif (is_int($dflt)) { $settings[ApiBase::PARAM_TYPE] = 'integer'; } } if (isset($settings[ApiBase::PARAM_TYPE])) { $type = $settings[ApiBase::PARAM_TYPE]; $multi = !empty($settings[ApiBase::PARAM_ISMULTI]); $hintPipeSeparated = true; $count = ApiBase::LIMIT_SML2 + 1; if (is_array($type)) { $count = count($type); $links = isset($settings[ApiBase::PARAM_VALUE_LINKS]) ? $settings[ApiBase::PARAM_VALUE_LINKS] : array(); $type = array_map(function ($v) use($links) { $ret = wfEscapeWikiText($v); if (isset($links[$v])) { $ret = "[[{$links[$v]}|{$ret}]]"; } return $ret; }, $type); $i = array_search('', $type, true); if ($i === false) { $type = $context->getLanguage()->commaList($type); } else { unset($type[$i]); $type = $context->msg('api-help-param-list-can-be-empty')->numParams(count($type))->params($context->getLanguage()->commaList($type))->parse(); } $info[] = $context->msg('api-help-param-list')->params($multi ? 2 : 1)->params($type)->parse(); $hintPipeSeparated = false; } else { switch ($type) { case 'submodule': $groups[] = $name; if (isset($settings[ApiBase::PARAM_SUBMODULE_MAP])) { $map = $settings[ApiBase::PARAM_SUBMODULE_MAP]; ksort($map); $submodules = array(); foreach ($map as $v => $m) { $submodules[] = "[[Special:ApiHelp/{$m}|{$v}]]"; } } else { $submodules = $module->getModuleManager()->getNames($name); sort($submodules); $prefix = $module->isMain() ? '' : $module->getModulePath() . '+'; $submodules = array_map(function ($name) use($prefix) { return "[[Special:ApiHelp/{$prefix}{$name}|{$name}]]"; }, $submodules); } $count = count($submodules); $info[] = $context->msg('api-help-param-list')->params($multi ? 2 : 1)->params($context->getLanguage()->commaList($submodules))->parse(); $hintPipeSeparated = false; // No type message necessary, we have a list of values. $type = null; break; case 'namespace': $namespaces = MWNamespace::getValidNamespaces(); $count = count($namespaces); $info[] = $context->msg('api-help-param-list')->params($multi ? 2 : 1)->params($context->getLanguage()->commaList($namespaces))->parse(); $hintPipeSeparated = false; // No type message necessary, we have a list of values. $type = null; break; case 'limit': if (isset($settings[ApiBase::PARAM_MAX2])) { $info[] = $context->msg('api-help-param-limit2')->numParams($settings[ApiBase::PARAM_MAX])->numParams($settings[ApiBase::PARAM_MAX2])->parse(); } else { $info[] = $context->msg('api-help-param-limit')->numParams($settings[ApiBase::PARAM_MAX])->parse(); } break; case 'integer': // Possible messages: // api-help-param-integer-min, // api-help-param-integer-max, // api-help-param-integer-minmax $suffix = ''; $min = $max = 0; if (isset($settings[ApiBase::PARAM_MIN])) { $suffix .= 'min'; $min = $settings[ApiBase::PARAM_MIN]; } if (isset($settings[ApiBase::PARAM_MAX])) { $suffix .= 'max'; $max = $settings[ApiBase::PARAM_MAX]; } if ($suffix !== '') { $info[] = $context->msg("api-help-param-integer-{$suffix}")->params($multi ? 2 : 1)->numParams($min, $max)->parse(); } break; case 'upload': $info[] = $context->msg('api-help-param-upload')->parse(); // No type message necessary, api-help-param-upload should handle it. $type = null; break; case 'string': case 'text': // Displaying a type message here would be useless. $type = null; break; } } // Add type. Messages for grep: api-help-param-type-limit // api-help-param-type-integer api-help-param-type-boolean // api-help-param-type-timestamp api-help-param-type-user // api-help-param-type-password if (is_string($type)) { $msg = $context->msg("api-help-param-type-{$type}"); if (!$msg->isDisabled()) { $info[] = $msg->params($multi ? 2 : 1)->parse(); } } if ($multi) { $extra = array(); if ($hintPipeSeparated) { $extra[] = $context->msg('api-help-param-multi-separate')->parse(); } if ($count > ApiBase::LIMIT_SML1) { $extra[] = $context->msg('api-help-param-multi-max')->numParams(ApiBase::LIMIT_SML1, ApiBase::LIMIT_SML2)->parse(); } if ($extra) { $info[] = join(' ', $extra); } } } // Add default $default = isset($settings[ApiBase::PARAM_DFLT]) ? $settings[ApiBase::PARAM_DFLT] : null; if ($default === '') { $info[] = $context->msg('api-help-param-default-empty')->parse(); } elseif ($default !== null && $default !== false) { $info[] = $context->msg('api-help-param-default')->params(wfEscapeWikiText($default))->parse(); } if (!array_filter($description)) { $description = array(self::wrap($context->msg('api-help-param-no-description'), 'apihelp-empty')); } // Add "deprecated" flag if (!empty($settings[ApiBase::PARAM_DEPRECATED])) { $help['parameters'] .= Html::openElement('dd', array('class' => 'info')); $help['parameters'] .= self::wrap($context->msg('api-help-param-deprecated'), 'apihelp-deprecated', 'strong'); $help['parameters'] .= Html::closeElement('dd'); } if ($description) { $description = join('', $description); $description = preg_replace('!\\s*</([oud]l)>\\s*<\\1>\\s*!', "\n", $description); $help['parameters'] .= Html::rawElement('dd', array('class' => 'description'), $description); } foreach ($info as $i) { $help['parameters'] .= Html::rawElement('dd', array('class' => 'info'), $i); } } if ($dynamicParams !== null) { $dynamicParams = ApiBase::makeMessage($dynamicParams, $context, array($module->getModulePrefix(), $module->getModuleName(), $module->getModulePath())); $help['parameters'] .= Html::element('dt', null, '*'); $help['parameters'] .= Html::rawElement('dd', array('class' => 'description'), $dynamicParams->parse()); } $help['parameters'] .= Html::closeElement('dl'); $help['parameters'] .= Html::closeElement('div'); } $examples = $module->getExamplesMessages(); if ($examples) { $help['examples'] .= Html::openElement('div', array('class' => 'apihelp-block apihelp-examples')); $msg = $context->msg('api-help-examples'); if (!$msg->isDisabled()) { $help['examples'] .= self::wrap($msg->numParams(count($examples)), 'apihelp-block-head', 'div'); } $help['examples'] .= Html::openElement('dl'); foreach ($examples as $qs => $msg) { $msg = ApiBase::makeMessage($msg, $context, array($module->getModulePrefix(), $module->getModuleName(), $module->getModulePath())); $link = wfAppendQuery(wfScript('api'), $qs); $help['examples'] .= Html::rawElement('dt', null, $msg->parse()); $help['examples'] .= Html::rawElement('dd', null, Html::element('a', array('href' => $link), "api.php?{$qs}")); } $help['examples'] .= Html::closeElement('dl'); $help['examples'] .= Html::closeElement('div'); } $subtocnumber = $tocnumber; $subtocnumber[$level + 1] = 0; $suboptions = array('submodules' => $options['recursivesubmodules'], 'headerlevel' => $level + 1, 'tocnumber' => &$subtocnumber, 'noheader' => false) + $options; if ($options['submodules'] && $module->getModuleManager()) { $manager = $module->getModuleManager(); $submodules = array(); foreach ($groups as $group) { $names = $manager->getNames($group); sort($names); foreach ($names as $name) { $submodules[] = $manager->getModule($name); } } $help['submodules'] .= self::getHelpInternal($context, $submodules, $suboptions, $haveModules); } $module->modifyHelp($help, $suboptions, $haveModules); Hooks::run('APIHelpModifyOutput', array($module, &$help, $suboptions, &$haveModules)); $out .= join("\n", $help); } return $out; }
/** * @param ApiBase $module * @return ApiResult */ private function getModuleInfo($module) { $ret = []; $path = $module->getModulePath(); $ret['name'] = $module->getModuleName(); $ret['classname'] = get_class($module); $ret['path'] = $path; if (!$module->isMain()) { $ret['group'] = $module->getParent()->getModuleManager()->getModuleGroup($module->getModuleName()); } $ret['prefix'] = $module->getModulePrefix(); $sourceInfo = $module->getModuleSourceInfo(); if ($sourceInfo) { $ret['source'] = $sourceInfo['name']; if (isset($sourceInfo['namemsg'])) { $ret['sourcename'] = $this->context->msg($sourceInfo['namemsg'])->text(); } else { $ret['sourcename'] = $ret['source']; } $link = SpecialPage::getTitleFor('Version', 'License/' . $sourceInfo['name'])->getFullURL(); if (isset($sourceInfo['license-name'])) { $ret['licensetag'] = $sourceInfo['license-name']; $ret['licenselink'] = (string) $link; } elseif (SpecialVersion::getExtLicenseFileName(dirname($sourceInfo['path']))) { $ret['licenselink'] = (string) $link; } } $this->formatHelpMessages($ret, 'description', $module->getFinalDescription()); foreach ($module->getHelpFlags() as $flag) { $ret[$flag] = true; } $ret['helpurls'] = (array) $module->getHelpUrls(); if (isset($ret['helpurls'][0]) && $ret['helpurls'][0] === false) { $ret['helpurls'] = []; } ApiResult::setIndexedTagName($ret['helpurls'], 'helpurl'); if ($this->helpFormat !== 'none') { $ret['examples'] = []; $examples = $module->getExamplesMessages(); foreach ($examples as $qs => $msg) { $item = ['query' => $qs]; $msg = ApiBase::makeMessage($msg, $this->context, [$module->getModulePrefix(), $module->getModuleName(), $module->getModulePath()]); $this->formatHelpMessages($item, 'description', [$msg]); if (isset($item['description'])) { if (is_array($item['description'])) { $item['description'] = $item['description'][0]; } else { ApiResult::setSubelementsList($item, 'description'); } } $ret['examples'][] = $item; } ApiResult::setIndexedTagName($ret['examples'], 'example'); } $ret['parameters'] = []; $params = $module->getFinalParams(ApiBase::GET_VALUES_FOR_HELP); $paramDesc = $module->getFinalParamDescription(); foreach ($params as $name => $settings) { if (!is_array($settings)) { $settings = [ApiBase::PARAM_DFLT => $settings]; } $item = ['name' => $name]; if (isset($paramDesc[$name])) { $this->formatHelpMessages($item, 'description', $paramDesc[$name], true); } $item['required'] = !empty($settings[ApiBase::PARAM_REQUIRED]); if (!empty($settings[ApiBase::PARAM_DEPRECATED])) { $item['deprecated'] = true; } if ($name === 'token' && $module->needsToken()) { $item['tokentype'] = $module->needsToken(); } if (!isset($settings[ApiBase::PARAM_TYPE])) { $dflt = isset($settings[ApiBase::PARAM_DFLT]) ? $settings[ApiBase::PARAM_DFLT] : null; if (is_bool($dflt)) { $settings[ApiBase::PARAM_TYPE] = 'boolean'; } elseif (is_string($dflt) || is_null($dflt)) { $settings[ApiBase::PARAM_TYPE] = 'string'; } elseif (is_int($dflt)) { $settings[ApiBase::PARAM_TYPE] = 'integer'; } } if (isset($settings[ApiBase::PARAM_DFLT])) { switch ($settings[ApiBase::PARAM_TYPE]) { case 'boolean': $item['default'] = (bool) $settings[ApiBase::PARAM_DFLT]; break; case 'string': case 'text': case 'password': $item['default'] = strval($settings[ApiBase::PARAM_DFLT]); break; case 'integer': case 'limit': $item['default'] = intval($settings[ApiBase::PARAM_DFLT]); break; case 'timestamp': $item['default'] = wfTimestamp(TS_ISO_8601, $settings[ApiBase::PARAM_DFLT]); break; default: $item['default'] = $settings[ApiBase::PARAM_DFLT]; break; } } $item['multi'] = !empty($settings[ApiBase::PARAM_ISMULTI]); if ($item['multi']) { $item['limit'] = $this->getMain()->canApiHighLimits() ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_SML1; $item['lowlimit'] = ApiBase::LIMIT_SML1; $item['highlimit'] = ApiBase::LIMIT_SML2; } if (!empty($settings[ApiBase::PARAM_ALLOW_DUPLICATES])) { $item['allowsduplicates'] = true; } if (isset($settings[ApiBase::PARAM_TYPE])) { if ($settings[ApiBase::PARAM_TYPE] === 'submodule') { if (isset($settings[ApiBase::PARAM_SUBMODULE_MAP])) { ksort($settings[ApiBase::PARAM_SUBMODULE_MAP]); $item['type'] = array_keys($settings[ApiBase::PARAM_SUBMODULE_MAP]); $item['submodules'] = $settings[ApiBase::PARAM_SUBMODULE_MAP]; } else { $item['type'] = $module->getModuleManager()->getNames($name); sort($item['type']); $prefix = $module->isMain() ? '' : $module->getModulePath() . '+'; $item['submodules'] = []; foreach ($item['type'] as $v) { $item['submodules'][$v] = $prefix . $v; } } if (isset($settings[ApiBase::PARAM_SUBMODULE_PARAM_PREFIX])) { $item['submoduleparamprefix'] = $settings[ApiBase::PARAM_SUBMODULE_PARAM_PREFIX]; } } elseif ($settings[ApiBase::PARAM_TYPE] === 'tags') { $item['type'] = ChangeTags::listExplicitlyDefinedTags(); } else { $item['type'] = $settings[ApiBase::PARAM_TYPE]; } if (is_array($item['type'])) { // To prevent sparse arrays from being serialized to JSON as objects $item['type'] = array_values($item['type']); ApiResult::setIndexedTagName($item['type'], 't'); } } if (isset($settings[ApiBase::PARAM_MAX])) { $item['max'] = $settings[ApiBase::PARAM_MAX]; } if (isset($settings[ApiBase::PARAM_MAX2])) { $item['highmax'] = $settings[ApiBase::PARAM_MAX2]; } if (isset($settings[ApiBase::PARAM_MIN])) { $item['min'] = $settings[ApiBase::PARAM_MIN]; } if (!empty($settings[ApiBase::PARAM_RANGE_ENFORCE])) { $item['enforcerange'] = true; } if (!empty($settings[ApiBase::PARAM_HELP_MSG_INFO])) { $item['info'] = []; foreach ($settings[ApiBase::PARAM_HELP_MSG_INFO] as $i) { $tag = array_shift($i); $info = ['name' => $tag]; if (count($i)) { $info['values'] = $i; ApiResult::setIndexedTagName($info['values'], 'v'); } $this->formatHelpMessages($info, 'text', [$this->context->msg("apihelp-{$path}-paraminfo-{$tag}")->numParams(count($i))->params($this->context->getLanguage()->commaList($i))->params($module->getModulePrefix())]); ApiResult::setSubelementsList($info, 'text'); $item['info'][] = $info; } ApiResult::setIndexedTagName($item['info'], 'i'); } $ret['parameters'][] = $item; } ApiResult::setIndexedTagName($ret['parameters'], 'param'); $dynamicParams = $module->dynamicParameterDocumentation(); if ($dynamicParams !== null) { if ($this->helpFormat === 'none') { $ret['dynamicparameters'] = true; } else { $dynamicParams = ApiBase::makeMessage($dynamicParams, $this->context, [$module->getModulePrefix(), $module->getModuleName(), $module->getModulePath()]); $this->formatHelpMessages($ret, 'dynamicparameters', [$dynamicParams]); } } return $ret; }
protected function appendExtensions($property) { global $wgExtensionCredits; $data = array(); foreach ($wgExtensionCredits as $type => $extensions) { foreach ($extensions as $ext) { $ret = array(); $ret['type'] = $type; if (isset($ext['name'])) { $ret['name'] = $ext['name']; } if (isset($ext['description'])) { $ret['description'] = $ext['description']; } if (isset($ext['descriptionmsg'])) { // Can be a string or array( key, param1, param2, ... ) if (is_array($ext['descriptionmsg'])) { $ret['descriptionmsg'] = $ext['descriptionmsg'][0]; $ret['descriptionmsgparams'] = array_slice($ext['descriptionmsg'], 1); $this->getResult()->setIndexedTagName($ret['descriptionmsgparams'], 'param'); } else { $ret['descriptionmsg'] = $ext['descriptionmsg']; } } if (isset($ext['author'])) { $ret['author'] = is_array($ext['author']) ? implode(', ', $ext['author']) : $ext['author']; } if (isset($ext['url'])) { $ret['url'] = $ext['url']; } if (isset($ext['version'])) { $ret['version'] = $ext['version']; } elseif (isset($ext['svn-revision']) && preg_match('/\\$(?:Rev|LastChangedRevision|Revision): *(\\d+)/', $ext['svn-revision'], $m)) { $ret['version'] = 'r' . $m[1]; } if (isset($ext['path'])) { $extensionPath = dirname($ext['path']); $gitInfo = new GitInfo($extensionPath); $vcsVersion = $gitInfo->getHeadSHA1(); if ($vcsVersion !== false) { $ret['vcs-system'] = 'git'; $ret['vcs-version'] = $vcsVersion; $ret['vcs-url'] = $gitInfo->getHeadViewUrl(); $vcsDate = $gitInfo->getHeadCommitDate(); if ($vcsDate !== false) { $ret['vcs-date'] = wfTimestamp(TS_ISO_8601, $vcsDate); } } else { $svnInfo = SpecialVersion::getSvnInfo($extensionPath); if ($svnInfo !== false) { $ret['vcs-system'] = 'svn'; $ret['vcs-version'] = $svnInfo['checkout-rev']; $ret['vcs-url'] = isset($svnInfo['viewvc-url']) ? $svnInfo['viewvc-url'] : ''; } } if (SpecialVersion::getExtLicenseFileName($extensionPath)) { $ret['license-name'] = isset($ext['license-name']) ? $ext['license-name'] : ''; $ret['license'] = SpecialPage::getTitleFor('Version', "License/{$ext['name']}")->getLinkURL(); } if (SpecialVersion::getExtAuthorsFileName($extensionPath)) { $ret['credits'] = SpecialPage::getTitleFor('Version', "Credits/{$ext['name']}")->getLinkURL(); } } $data[] = $ret; } } $this->getResult()->setIndexedTagName($data, 'ext'); return $this->getResult()->addValue('query', $property, $data); }
protected function appendExtensions($property) { $data = []; foreach ($this->getConfig()->get('ExtensionCredits') as $type => $extensions) { foreach ($extensions as $ext) { $ret = []; $ret['type'] = $type; if (isset($ext['name'])) { $ret['name'] = $ext['name']; } if (isset($ext['namemsg'])) { $ret['namemsg'] = $ext['namemsg']; } if (isset($ext['description'])) { $ret['description'] = $ext['description']; } if (isset($ext['descriptionmsg'])) { // Can be a string or array( key, param1, param2, ... ) if (is_array($ext['descriptionmsg'])) { $ret['descriptionmsg'] = $ext['descriptionmsg'][0]; $ret['descriptionmsgparams'] = array_slice($ext['descriptionmsg'], 1); ApiResult::setIndexedTagName($ret['descriptionmsgparams'], 'param'); } else { $ret['descriptionmsg'] = $ext['descriptionmsg']; } } if (isset($ext['author'])) { $ret['author'] = is_array($ext['author']) ? implode(', ', $ext['author']) : $ext['author']; } if (isset($ext['url'])) { $ret['url'] = $ext['url']; } if (isset($ext['version'])) { $ret['version'] = $ext['version']; } if (isset($ext['path'])) { $extensionPath = dirname($ext['path']); $gitInfo = new GitInfo($extensionPath); $vcsVersion = $gitInfo->getHeadSHA1(); if ($vcsVersion !== false) { $ret['vcs-system'] = 'git'; $ret['vcs-version'] = $vcsVersion; $ret['vcs-url'] = $gitInfo->getHeadViewUrl(); $vcsDate = $gitInfo->getHeadCommitDate(); if ($vcsDate !== false) { $ret['vcs-date'] = wfTimestamp(TS_ISO_8601, $vcsDate); } } if (SpecialVersion::getExtLicenseFileName($extensionPath)) { $ret['license-name'] = isset($ext['license-name']) ? $ext['license-name'] : ''; $ret['license'] = SpecialPage::getTitleFor('Version', "License/{$ext['name']}")->getLinkURL(); } if (SpecialVersion::getExtAuthorsFileName($extensionPath)) { $ret['credits'] = SpecialPage::getTitleFor('Version', "Credits/{$ext['name']}")->getLinkURL(); } } $data[] = $ret; } } ApiResult::setIndexedTagName($data, 'ext'); return $this->getResult()->addValue('query', $property, $data); }