diff options
Diffstat (limited to 'includes/api/ApiParse.php')
-rw-r--r-- | includes/api/ApiParse.php | 115 |
1 files changed, 73 insertions, 42 deletions
diff --git a/includes/api/ApiParse.php b/includes/api/ApiParse.php index 893491b9..db6e2bb8 100644 --- a/includes/api/ApiParse.php +++ b/includes/api/ApiParse.php @@ -2,7 +2,7 @@ /** * Created on Dec 01, 2007 * - * Copyright © 2007 Yuri Astrakhan <Firstname><Lastname>@gmail.com + * Copyright © 2007 Yuri Astrakhan "<Firstname><Lastname>@gmail.com" * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -59,19 +59,15 @@ class ApiParse extends ApiBase { // The parser needs $wgTitle to be set, apparently the // $title parameter in Parser::parse isn't enough *sigh* // TODO: Does this still need $wgTitle? - global $wgParser, $wgTitle, $wgLang; + global $wgParser, $wgTitle; // Currently unnecessary, code to act as a safeguard against any change in current behaviour of uselang breaks $oldLang = null; - if ( isset( $params['uselang'] ) && $params['uselang'] != $wgLang->getCode() ) { - $oldLang = $wgLang; // Backup wgLang - $wgLang = Language::factory( $params['uselang'] ); + if ( isset( $params['uselang'] ) && $params['uselang'] != $this->getContext()->getLanguage()->getCode() ) { + $oldLang = $this->getContext()->getLanguage(); // Backup language + $this->getContext()->setLanguage( Language::factory( $params['uselang'] ) ); } - $popts = ParserOptions::newFromContext( $this->getContext() ); - $popts->setTidy( true ); - $popts->enableLimitReport( !$params['disablepp'] ); - $redirValues = null; // Return result @@ -89,13 +85,15 @@ class ApiParse extends ApiBase { } $titleObj = $rev->getTitle(); - $wgTitle = $titleObj; + $pageObj = WikiPage::factory( $titleObj ); + $popts = $pageObj->makeParserOptions( $this->getContext() ); + $popts->enableLimitReport( !$params['disablepp'] ); // If for some reason the "oldid" is actually the current revision, it may be cached if ( $titleObj->getLatestRevID() === intval( $oldid ) ) { // May get from/save to parser cache - $p_result = $this->getParsedSectionOrText( $titleObj, $popts, $pageid, + $p_result = $this->getParsedSectionOrText( $pageObj, $popts, $pageid, isset( $prop['wikitext'] ) ) ; } else { // This is an old revision, so get the text differently $this->text = $rev->getText( Revision::FOR_THIS_USER, $this->getUser() ); @@ -129,32 +127,26 @@ class ApiParse extends ApiBase { foreach ( (array)$redirValues as $r ) { $to = $r['to']; } - $titleObj = Title::newFromText( $to ); - } else { - if ( !is_null ( $pageid ) ) { - $reqParams['pageids'] = $pageid; - $titleObj = Title::newFromID( $pageid ); - } else { // $page - $to = $page; - $titleObj = Title::newFromText( $to ); - } - } - if ( !is_null ( $pageid ) ) { - if ( !$titleObj ) { - // Still throw nosuchpageid error if pageid was provided - $this->dieUsageMsg( array( 'nosuchpageid', $pageid ) ); - } - } elseif ( !$titleObj || !$titleObj->exists() ) { - $this->dieUsage( "The page you specified doesn't exist", 'missingtitle' ); + $pageParams = array( 'title' => $to ); + } elseif ( !is_null( $pageid ) ) { + $pageParams = array( 'pageid' => $pageid ); + } else { // $page + $pageParams = array( 'title' => $page ); } + + $pageObj = $this->getTitleOrPageId( $pageParams, 'fromdb' ); + $titleObj = $pageObj->getTitle(); $wgTitle = $titleObj; if ( isset( $prop['revid'] ) ) { - $oldid = $titleObj->getLatestRevID(); + $oldid = $pageObj->getLatest(); } + $popts = $pageObj->makeParserOptions( $this->getContext() ); + $popts->enableLimitReport( !$params['disablepp'] ); + // Potentially cached - $p_result = $this->getParsedSectionOrText( $titleObj, $popts, $pageid, + $p_result = $this->getParsedSectionOrText( $pageObj, $popts, $pageid, isset( $prop['wikitext'] ) ) ; } } else { // Not $oldid, $pageid, $page. Hence based on $text @@ -168,6 +160,10 @@ class ApiParse extends ApiBase { $this->dieUsageMsg( array( 'invalidtitle', $title ) ); } $wgTitle = $titleObj; + $pageObj = WikiPage::factory( $titleObj ); + + $popts = $pageObj->makeParserOptions( $this->getContext() ); + $popts->enableLimitReport( !$params['disablepp'] ); if ( $this->section !== false ) { $this->text = $this->getSectionText( $this->text, $titleObj->getText() ); @@ -285,6 +281,21 @@ class ApiParse extends ApiBase { $result->setContent( $result_array['psttext'], $this->pstText ); } } + if ( isset( $prop['properties'] ) ) { + $result_array['properties'] = $this->formatProperties( $p_result->getProperties() ); + } + + if ( $params['generatexml'] ) { + $wgParser->startExternalParse( $titleObj, $popts, OT_PREPROCESS ); + $dom = $wgParser->preprocessToDom( $this->text ); + if ( is_callable( array( $dom, 'saveXML' ) ) ) { + $xml = $dom->saveXML(); + } else { + $xml = $dom->__toString(); + } + $result_array['parsetree'] = array(); + $result->setContent( $result_array['parsetree'], $xml ); + } $result_mapping = array( 'redirects' => 'r', @@ -297,37 +308,39 @@ class ApiParse extends ApiBase { 'iwlinks' => 'iw', 'sections' => 's', 'headitems' => 'hi', + 'properties' => 'pp', ); $this->setIndexedTagNames( $result_array, $result_mapping ); $result->addValue( null, $this->getModuleName(), $result_array ); if ( !is_null( $oldLang ) ) { - $wgLang = $oldLang; // Reset $wgLang to $oldLang + $this->getContext()->setLanguage( $oldLang ); // Reset language to $oldLang } } /** - * @param $titleObj Title + * @param $page WikiPage * @param $popts ParserOptions * @param $pageId Int * @param $getWikitext Bool * @return ParserOutput */ - private function getParsedSectionOrText( $titleObj, $popts, $pageId = null, $getWikitext = false ) { + private function getParsedSectionOrText( $page, $popts, $pageId = null, $getWikitext = false ) { global $wgParser; - $page = WikiPage::factory( $titleObj ); - if ( $this->section !== false ) { $this->text = $this->getSectionText( $page->getRawText(), !is_null( $pageId ) - ? 'page id ' . $pageId : $titleObj->getText() ); + ? 'page id ' . $pageId : $page->getTitle()->getPrefixedText() ); // Not cached (save or load) - return $wgParser->parse( $this->text, $titleObj, $popts ); + return $wgParser->parse( $this->text, $page->getTitle(), $popts ); } else { // Try the parser cache first // getParserOutput will save to Parser cache if able $pout = $page->getParserOutput( $popts ); + if ( !$pout ) { + $this->dieUsage( "There is no revision ID {$page->getLatest()}", 'missingrev' ); + } if ( $getWikitext ) { $this->text = $page->getRawText(); } @@ -394,19 +407,19 @@ class ApiParse extends ApiBase { return ''; } - $s = htmlspecialchars( wfMsg( 'otherlanguages' ) . wfMsg( 'colon-separator' ) ); + $s = htmlspecialchars( wfMessage( 'otherlanguages' )->text() . wfMessage( 'colon-separator' )->text() ); $langs = array(); foreach ( $languages as $l ) { $nt = Title::newFromText( $l ); - $text = $wgContLang->getLanguageName( $nt->getInterwiki() ); + $text = Language::fetchLanguageName( $nt->getInterwiki() ); $langs[] = Html::element( 'a', array( 'href' => $nt->getFullURL(), 'title' => $nt->getText(), 'class' => "external" ), $text == '' ? $l : $text ); } - $s .= implode( htmlspecialchars( wfMsgExt( 'pipe-separator', 'escapenoentities' ) ), $langs ); + $s .= implode( wfMessage( 'pipe-separator' )->escaped(), $langs ); if ( $wgContLang->isRTL() ) { $s = Html::rawElement( 'span', array( 'dir' => "LTR" ), $s ); @@ -461,6 +474,17 @@ class ApiParse extends ApiBase { return $result; } + private function formatProperties( $properties ) { + $result = array(); + foreach ( $properties as $name => $value ) { + $entry = array(); + $entry['name'] = $name; + $this->getResult()->setContent( $entry, $value ); + $result[] = $entry; + } + return $result; + } + private function formatCss( $css ) { $result = array(); foreach ( $css as $file => $link ) { @@ -496,7 +520,7 @@ class ApiParse extends ApiBase { ApiBase::PARAM_TYPE => 'integer', ), 'prop' => array( - ApiBase::PARAM_DFLT => 'text|langlinks|categories|links|templates|images|externallinks|sections|revid|displaytitle', + ApiBase::PARAM_DFLT => 'text|langlinks|categories|links|templates|images|externallinks|sections|revid|displaytitle|iwlinks|properties', ApiBase::PARAM_ISMULTI => true, ApiBase::PARAM_TYPE => array( 'text', @@ -515,6 +539,7 @@ class ApiParse extends ApiBase { 'headhtml', 'iwlinks', 'wikitext', + 'properties', ) ), 'pst' => false, @@ -522,6 +547,7 @@ class ApiParse extends ApiBase { 'uselang' => null, 'section' => null, 'disablepp' => false, + 'generatexml' => false, ); } @@ -553,6 +579,7 @@ class ApiParse extends ApiBase { ' headhtml - Gives parsed <head> of the page', ' iwlinks - Gives interwiki links in the parsed wikitext', ' wikitext - Gives the original wikitext that was parsed', + ' properties - Gives various properties defined in the parsed wikitext', ), 'pst' => array( 'Do a pre-save transform on the input before parsing it', @@ -565,11 +592,15 @@ class ApiParse extends ApiBase { 'uselang' => 'Which language to parse the request in', 'section' => 'Only retrieve the content of this section number', 'disablepp' => 'Disable the PP Report from the parser output', + 'generatexml' => 'Generate XML parse tree', ); } public function getDescription() { - return 'Parses wikitext and returns parser output'; + return array( + 'Parses wikitext and returns parser output', + 'See the various prop-Modules of action=query to get information from the current version of a page', + ); } public function getPossibleErrors() { |