36 $this->
getMain()->setCacheMode(
'anon-public-user-private' );
44 $titleProvided =
false;
48 $titleProvided =
true;
51 if ( $params[
'prop'] ===
null ) {
53 [
'apiwarn-deprecation-missingparam',
'prop' ],
'action=expandtemplates&!prop'
57 $prop = array_flip( $params[
'prop'] );
60 $titleObj = Title::newFromText(
$title );
61 if ( !$titleObj || $titleObj->isExternal() ) {
66 $revid = $params[
'revid'];
67 if ( $revid !==
null ) {
68 $rev = MediaWikiServices::getInstance()->getRevisionStore()->getRevisionById( $revid );
70 $this->
dieWithError( [
'apierror-nosuchrevid', $revid ] );
72 $pTitleObj = $titleObj;
73 $titleObj = Title::newFromLinkTarget( $rev->getPageAsLinkTarget() );
74 if ( $titleProvided ) {
75 if ( !$titleObj->equals( $pTitleObj ) ) {
76 $this->
addWarning( [
'apierror-revwrongpage', $rev->getId(),
85 $options = ParserOptions::newFromContext( $this->
getContext() );
87 if ( $params[
'includecomments'] ) {
88 $options->setRemoveComments(
false );
92 $suppressCache =
false;
93 Hooks::run(
'ApiMakeParserOptions',
94 [ $options, $titleObj, $params, $this, &$reset, &$suppressCache ] );
98 $parser = MediaWikiServices::getInstance()->getParser();
99 if ( isset( $prop[
'parsetree'] ) || $params[
'generatexml'] ) {
100 $parser->startExternalParse( $titleObj, $options, Parser::OT_PREPROCESS );
101 $dom = $parser->preprocessToDom( $params[
'text'] );
103 if ( is_callable( [ $dom,
'saveXML' ] ) ) {
105 $xml = $dom->saveXML();
108 $xml = $dom->__toString();
110 if ( isset( $prop[
'parsetree'] ) ) {
111 unset( $prop[
'parsetree'] );
112 $retval[
'parsetree'] = $xml;
115 $result->addValue(
null,
'parsetree', $xml );
116 $result->addValue(
null, ApiResult::META_BC_SUBELEMENTS, [
'parsetree' ] );
122 if ( $prop || $params[
'prop'] ===
null ) {
123 $parser->startExternalParse( $titleObj, $options, Parser::OT_PREPROCESS );
124 $frame = $parser->getPreprocessor()->newFrame();
125 $wikitext = $parser->preprocess( $params[
'text'], $titleObj, $options, $revid, $frame );
126 if ( $params[
'prop'] ===
null ) {
128 ApiResult::setContentValue( $retval,
'wikitext', $wikitext );
130 $p_output = $parser->getOutput();
131 if ( isset( $prop[
'categories'] ) ) {
132 $categories = $p_output->getCategories();
134 $categories_result = [];
135 foreach ( $categories as $category => $sortkey ) {
137 $entry[
'sortkey'] = $sortkey;
138 ApiResult::setContentValue( $entry,
'category', (
string)$category );
139 $categories_result[] = $entry;
141 ApiResult::setIndexedTagName( $categories_result,
'category' );
142 $retval[
'categories'] = $categories_result;
145 if ( isset( $prop[
'properties'] ) ) {
146 $properties = $p_output->getProperties();
148 ApiResult::setArrayType( $properties,
'BCkvp',
'name' );
149 ApiResult::setIndexedTagName( $properties,
'property' );
150 $retval[
'properties'] = $properties;
153 if ( isset( $prop[
'volatile'] ) ) {
154 $retval[
'volatile'] = $frame->isVolatile();
156 if ( isset( $prop[
'ttl'] ) && $frame->getTTL() !==
null ) {
157 $retval[
'ttl'] = $frame->getTTL();
159 if ( isset( $prop[
'wikitext'] ) ) {
160 $retval[
'wikitext'] = $wikitext;
162 if ( isset( $prop[
'modules'] ) ) {
163 $retval[
'modules'] = array_values( array_unique( $p_output->getModules() ) );
165 $retval[
'modulescripts'] = [];
166 $retval[
'modulestyles'] = array_values( array_unique( $p_output->getModuleStyles() ) );
168 if ( isset( $prop[
'jsconfigvars'] ) ) {
169 $retval[
'jsconfigvars'] =
170 ApiResult::addMetadataToResultVars( $p_output->getJsConfigVars() );
172 if ( isset( $prop[
'encodedjsconfigvars'] ) ) {
173 $retval[
'encodedjsconfigvars'] = FormatJson::encode(
174 $p_output->getJsConfigVars(),
false, FormatJson::ALL_OK
176 $retval[ApiResult::META_SUBELEMENTS][] =
'encodedjsconfigvars';
178 if ( isset( $prop[
'modules'] ) &&
179 !isset( $prop[
'jsconfigvars'] ) && !isset( $prop[
'encodedjsconfigvars'] ) ) {
180 $this->
addWarning(
'apiwarn-moduleswithoutvars' );
184 ApiResult::setSubelementsList( $retval, [
'wikitext',
'parsetree' ] );