From 17cf492e6bb6b6a099a31f9da8321ff62f7f634b Mon Sep 17 00:00:00 2001 From: Victor Vasiliev Date: Sat, 1 Dec 2007 13:37:02 +0000 Subject: [PATCH] * Introduce action=parse to API. It deprecates action=render which will be removed once (perhaps before 1.12 release). New action returns full parser output instead of returning just rendering text --- RELEASE-NOTES | 1 + includes/AutoLoader.php | 1 + includes/api/ApiMain.php | 1 + includes/api/ApiParse.php | 152 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 155 insertions(+) create mode 100644 includes/api/ApiParse.php diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 768e9063f7..2463b2a4ee 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -310,6 +310,7 @@ Full API documentation is available at http://www.mediawiki.org/wiki/API * Make prop=info check for restrictions in the old format too. * Add apihighlimits permission, default for sysops and bots * Add limit=max to use maximal limit +* Add action=parse to render parser output. Use it instead of action=render which is deprecated. === Languages updated in 1.12 === diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index afed43d83d..57bb812eff 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -316,6 +316,7 @@ function __autoload($className) { 'ApiMain' => 'includes/api/ApiMain.php', 'ApiOpenSearch' => 'includes/api/ApiOpenSearch.php', 'ApiPageSet' => 'includes/api/ApiPageSet.php', + 'ApiParse' => 'includes/api/ApiParse.php', 'ApiQuery' => 'includes/api/ApiQuery.php', 'ApiQueryAllpages' => 'includes/api/ApiQueryAllpages.php', 'ApiQueryAllLinks' => 'includes/api/ApiQueryAllLinks.php', diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php index fbda428ced..6d811834d2 100644 --- a/includes/api/ApiMain.php +++ b/includes/api/ApiMain.php @@ -56,6 +56,7 @@ class ApiMain extends ApiBase { 'query' => 'ApiQuery', 'expandtemplates' => 'ApiExpandTemplates', 'render' => 'ApiRender', + 'parse' => 'ApiParse', 'opensearch' => 'ApiOpenSearch', 'feedwatchlist' => 'ApiFeedWatchlist', 'help' => 'ApiHelp', diff --git a/includes/api/ApiParse.php b/includes/api/ApiParse.php new file mode 100644 index 0000000000..5f2a0c6629 --- /dev/null +++ b/includes/api/ApiParse.php @@ -0,0 +1,152 @@ +@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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * http://www.gnu.org/copyleft/gpl.html + */ + +if (!defined('MEDIAWIKI')) { + // Eclipse helper - will be ignored in production + require_once ("ApiBase.php"); +} + +/** + * @addtogroup API + */ +class ApiParse extends ApiBase { + + public function __construct($main, $action) { + parent :: __construct($main, $action); + } + + public function execute() { + // Get parameters + $params = $this->extractRequestParams(); + $text = $params['text']; + $title = $params['title']; + $retval = ''; + + //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 + + // Parse text + global $wgParser; + $p_result = $wgParser->parse( $text, $title_obj, new ParserOptions() ); + + // Return result + $result = $this->getResult(); + $result_array = array( + 'text' => array(), + 'langlinks' => $this->formatLangLinks( $p_result->getLanguageLinks() ), + 'categories' => $this->formatCategoryLinks( $p_result->getCategories() ), + 'links' => $this->formatLinks( $p_result->getLinks() ), + 'templates' => $this->formatLinks( $p_result->getTemplates() ), + 'images' => array_keys( $p_result->getImages() ), + 'externallinks' => array_keys( $p_result->getExternalLinks() ), + ); + $result_mapping = array( + 'langlinks' => 'll', + 'categories' => 'cl', + 'links' => 'pl', + 'templates' => 'tl', + 'images' => 'img', + 'externallinks' => 'el', + ); + $this->setIndexedTagNames( $result_array, $result_mapping ); + $result->setContent( $result_array['text'], $p_result->getText() ); + $result->addValue( null, $this->getModuleName(), $result_array ); + } + + private function formatLangLinks( $links ) { + foreach( $links as $link ) { + $entry = array(); + $bits = split( ':', $link, 2 ); + $entry['lang'] = $bits[0]; + $this->getResult()->setContent( $entry, $bits[1] ); + $result[] = $entry; + } + return $result; + } + + private function formatCategoryLinks( $links ) { + foreach( $links as $link => $sortkey ) { + $entry = array(); + $entry['sortkey'] = $sortkey; + $this->getResult()->setContent( $entry, $link ); + $result[] = $entry; + } + return $result; + } + + private function formatLinks( $links ) { + global $wgContLang; + foreach( $links as $ns => $nslinks ) { + foreach( $nslinks as $title => $id ) { + $entry = array(); + $entry['ns'] = $ns; + $this->getResult()->setContent( $entry, Title::makeTitle( $ns, $title )->getFullText() ); + if( $id != 0 ) + $entry['exists'] = ''; + $result[] = $entry; + } + } + return $result; + } + + private function setIndexedTagNames( &$array, $mapping ) { + foreach( $mapping as $key => $name ) { + $this->getResult()->setIndexedTagName( $array[$key], $name ); + } + } + + protected function getAllowedParams() { + return array ( + 'title' => array( + ApiBase :: PARAM_DFLT => 'API', + ), + 'text' => null + ); + } + + protected function getParamDescription() { + return array ( + 'text' => 'Wikitext to parse', + 'title' => 'Title of page', + ); + } + + protected function getDescription() { + return 'This module parses wikitext and returns parser output'; + } + + protected function getExamples() { + return array ( + 'api.php?action=parse&text={{Project:Sandbox}}' + ); + } + + public function getVersion() { + return __CLASS__ . ': $Id$'; + } +} + -- 2.20.1