diff options
Diffstat (limited to 'includes/api/ApiParse.php')
-rw-r--r-- | includes/api/ApiParse.php | 83 |
1 files changed, 56 insertions, 27 deletions
diff --git a/includes/api/ApiParse.php b/includes/api/ApiParse.php index 21a21e8d..4dcc94b6 100644 --- a/includes/api/ApiParse.php +++ b/includes/api/ApiParse.php @@ -29,7 +29,7 @@ if (!defined('MEDIAWIKI')) { } /** - * @addtogroup API + * @ingroup API */ class ApiParse extends ApiBase { @@ -43,31 +43,56 @@ class ApiParse extends ApiBase { $text = $params['text']; $title = $params['title']; $page = $params['page']; + $oldid = $params['oldid']; if(!is_null($page) && (!is_null($text) || $title != "API")) $this->dieUsage("The page parameter cannot be used together with the text and title parameters", 'params'); $prop = array_flip($params['prop']); - + $revid = false; + global $wgParser, $wgUser; - if(!is_null($page)) { - $titleObj = Title::newFromText($page); - if(!$titleObj) - $this->dieUsageMsg(array('missingtitle', $page)); - - // Try the parser cache first - $articleObj = new Article($titleObj); - $pcache =& ParserCache::singleton(); - $p_result = $pcache->get($articleObj, $wgUser); - if(!$p_result) { - $p_result = $wgParser->parse($articleObj->getContent(), $titleObj, new ParserOptions()); - global $wgUseParserCache; - if($wgUseParserCache) - $pcache->save($p_result, $articleObj, $wgUser); + $popts = new ParserOptions(); + $popts->setTidy(true); + $popts->enableLimitReport(); + if(!is_null($oldid) || !is_null($page)) + { + if(!is_null($oldid)) + { + # Don't use the parser cache + $rev = Revision::newFromID($oldid); + if(!$rev) + $this->dieUsage("There is no revision ID $oldid", 'missingrev'); + if(!$rev->userCan(Revision::DELETED_TEXT)) + $this->dieUsage("You don't have permission to view deleted revisions", 'permissiondenied'); + $text = $rev->getRawText(); + $titleObj = $rev->getTitle(); + $p_result = $wgParser->parse($text, $titleObj, $popts); } - } else { + else + { + $titleObj = Title::newFromText($page); + if(!$titleObj) + $this->dieUsage("The page you specified doesn't exist", 'missingtitle'); + + // Try the parser cache first + $articleObj = new Article($titleObj); + if(isset($prop['revid'])) + $oldid = $articleObj->getRevIdFetched(); + $pcache = ParserCache::singleton(); + $p_result = $pcache->get($articleObj, $wgUser); + if(!$p_result) { + $p_result = $wgParser->parse($articleObj->getContent(), $titleObj, $popts); + global $wgUseParserCache; + if($wgUseParserCache) + $pcache->save($p_result, $articleObj, $wgUser); + } + } + } + else + { $titleObj = Title::newFromText($title); if(!$titleObj) $titleObj = Title::newFromText("API"); - $p_result = $wgParser->parse($text, $titleObj, new ParserOptions()); + $p_result = $wgParser->parse($text, $titleObj, $popts); } // Return result @@ -91,6 +116,8 @@ class ApiParse extends ApiBase { $result_array['externallinks'] = array_keys($p_result->getExternalLinks()); if(isset($prop['sections'])) $result_array['sections'] = $p_result->getSections(); + if(!is_null($oldid)) + $result_array['revid'] = $oldid; $result_mapping = array( 'langlinks' => 'll', @@ -104,7 +131,7 @@ class ApiParse extends ApiBase { $this->setIndexedTagNames( $result_array, $result_mapping ); $result->addValue( null, $this->getModuleName(), $result_array ); } - + private function formatLangLinks( $links ) { $result = array(); foreach( $links as $link ) { @@ -116,7 +143,7 @@ class ApiParse extends ApiBase { } return $result; } - + private function formatCategoryLinks( $links ) { $result = array(); foreach( $links as $link => $sortkey ) { @@ -127,7 +154,7 @@ class ApiParse extends ApiBase { } return $result; } - + private function formatLinks( $links ) { $result = array(); foreach( $links as $ns => $nslinks ) { @@ -142,7 +169,7 @@ class ApiParse extends ApiBase { } return $result; } - + private function setIndexedTagNames( &$array, $mapping ) { foreach( $mapping as $key => $name ) { if( isset( $array[$key] ) ) @@ -152,13 +179,14 @@ class ApiParse extends ApiBase { public function getAllowedParams() { return array ( - 'title' => array( + 'title' => array( ApiBase :: PARAM_DFLT => 'API', ), 'text' => null, 'page' => null, + 'oldid' => null, 'prop' => array( - ApiBase :: PARAM_DFLT => 'text|langlinks|categories|links|templates|images|externallinks|sections', + ApiBase :: PARAM_DFLT => 'text|langlinks|categories|links|templates|images|externallinks|sections|revid', ApiBase :: PARAM_ISMULTI => true, ApiBase :: PARAM_TYPE => array( 'text', @@ -168,7 +196,8 @@ class ApiParse extends ApiBase { 'templates', 'images', 'externallinks', - 'sections' + 'sections', + 'revid' ) ) ); @@ -179,6 +208,7 @@ class ApiParse extends ApiBase { 'text' => 'Wikitext to parse', 'title' => 'Title of page the text belongs to', 'page' => 'Parse the content of this page. Cannot be used together with text and title', + 'oldid' => 'Parse the content of this revision. Overrides page', 'prop' => array('Which pieces of information to get.', 'NOTE: Section tree is only generated if there are more than 4 sections, or if the __TOC__ keyword is present' ), @@ -196,7 +226,6 @@ class ApiParse extends ApiBase { } public function getVersion() { - return __CLASS__ . ': $Id: ApiParse.php 30262 2008-01-29 14:47:27Z catrope $'; + return __CLASS__ . ': $Id: ApiParse.php 36983 2008-07-03 15:01:50Z catrope $'; } } - |