X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fapi%2FApiParse.php;h=71cf0f9ffb0dfcdcad828803532f9916e2e40075;hb=f830c86e06ccc3ba28872314f546a8dbb7665411;hp=04915e5045b118d81f0e75ab9b425f8655b5bd1c;hpb=bb7f8624d190c1be551ca02be159e786d3df1e6d;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiParse.php b/includes/api/ApiParse.php index 04915e5045..71cf0f9ffb 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 { @@ -42,16 +42,58 @@ class ApiParse extends ApiBase { $params = $this->extractRequestParams(); $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; - //Create title for parser - $title_obj = Title :: newFromText($params['title']); - if(!$title_obj) - $title_obj = Title :: newFromText("API"); // Default title is "API". For example, ExpandTemplates uses "ExpendTemplates" for it + global $wgParser, $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 + { + $titleObj = Title::newFromText($page); + if(!$titleObj) + $this->dieUsage("The page you specified doesn't exist", 'missingtitle'); - // Parse text - global $wgParser; - $p_result = $wgParser->parse( $text, $title_obj, new ParserOptions() ); + // 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, $popts); + } // Return result $result = $this->getResult(); @@ -74,7 +116,9 @@ 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', 'categories' => 'cl', @@ -87,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 ) { @@ -99,7 +143,7 @@ class ApiParse extends ApiBase { } return $result; } - + private function formatCategoryLinks( $links ) { $result = array(); foreach( $links as $link => $sortkey ) { @@ -110,7 +154,7 @@ class ApiParse extends ApiBase { } return $result; } - + private function formatLinks( $links ) { $result = array(); foreach( $links as $ns => $nslinks ) { @@ -125,7 +169,7 @@ class ApiParse extends ApiBase { } return $result; } - + private function setIndexedTagNames( &$array, $mapping ) { foreach( $mapping as $key => $name ) { if( isset( $array[$key] ) ) @@ -133,14 +177,16 @@ class ApiParse extends ApiBase { } } - protected function getAllowedParams() { + 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', @@ -150,21 +196,26 @@ class ApiParse extends ApiBase { 'templates', 'images', 'externallinks', - 'sections' + 'sections', + 'revid' ) ) ); } - protected function getParamDescription() { + public function getParamDescription() { return array ( 'text' => 'Wikitext to parse', - 'title' => 'Title of page', - 'prop' => 'Which pieces of information to get' + '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' + ), ); } - protected function getDescription() { + public function getDescription() { return 'This module parses wikitext and returns parser output'; } @@ -178,4 +229,3 @@ class ApiParse extends ApiBase { return __CLASS__ . ': $Id$'; } } -