X-Git-Url: https://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2Fapi%2FApiParse.php;h=f5e520a305fb4840f4a05478f622172322831c96;hb=9d285a54b4a8f97b23f5f51601bfcd53de36521c;hp=5618f972106b713298e970f2ec56b7994f815fe1;hpb=0769301e8706f9f44e8efc6c686c425562b3f3fc;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiParse.php b/includes/api/ApiParse.php index 5618f97210..f5e520a305 100644 --- a/includes/api/ApiParse.php +++ b/includes/api/ApiParse.php @@ -1,10 +1,9 @@ @gmail.com * * This program is free software; you can redistribute it and/or modify @@ -19,8 +18,10 @@ * * 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. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * http://www.gnu.org/copyleft/gpl.html + * + * @file */ if ( !defined( 'MEDIAWIKI' ) ) { @@ -38,34 +39,44 @@ class ApiParse extends ApiBase { } public function execute() { + // The data is hot but user-dependent, like page views, so we set vary cookies + $this->getMain()->setCacheMode( 'anon-public-user-private' ); + // Get parameters $params = $this->extractRequestParams(); $text = $params['text']; $title = $params['title']; $page = $params['page']; + $pageid = $params['pageid']; $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; + + if ( isset( $params['section'] ) ) { + $this->section = $params['section']; + } else { + $this->section = false; + } // The parser needs $wgTitle to be set, apparently the // $title parameter in Parser::parse isn't enough *sigh* global $wgParser, $wgUser, $wgTitle, $wgEnableParserCache, $wgLang; - - // Current unncessary, code to act as a safeguard against any change in current behaviour of uselang breaks + + // 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'] ); } - + $popts = new ParserOptions(); $popts->setTidy( true ); - $popts->enableLimitReport(); + $popts->enableLimitReport( !$params['disablepp'] ); $redirValues = null; - if ( !is_null( $oldid ) || !is_null( $page ) ) { + if ( !is_null( $oldid ) || !is_null( $pageid ) || !is_null( $page ) ) { if ( !is_null( $oldid ) ) { // Don't use the parser cache $rev = Revision::newFromID( $oldid ); @@ -79,45 +90,65 @@ class ApiParse extends ApiBase { $text = $rev->getText( Revision::FOR_THIS_USER ); $titleObj = $rev->getTitle(); $wgTitle = $titleObj; + + if ( $this->section !== false ) { + $text = $this->getSectionText( $text, 'r' . $rev ); + } + $p_result = $wgParser->parse( $text, $titleObj, $popts ); } else { - if ( $params['redirects'] ) { - $req = new FauxRequest( array( - 'action' => 'query', - 'redirects' => '', - 'titles' => $page - ) ); - $main = new ApiMain( $req ); - $main->execute(); - $data = $main->getResultData(); - $redirValues = @$data['query']['redirects']; - $to = $page; - foreach ( (array)$redirValues as $r ) { - $to = $r['to']; + if ( !is_null ( $pageid ) ) { + $titleObj = Title::newFromID( $pageid ); + + if ( !$titleObj ) { + $this->dieUsageMsg( array( 'nosuchpageid', $pageid ) ); } } else { - $to = $page; - } - $titleObj = Title::newFromText( $to ); - if ( !$titleObj ) { - $this->dieUsage( "The page you specified doesn't exist", 'missingtitle' ); + if ( $params['redirects'] ) { + $req = new FauxRequest( array( + 'action' => 'query', + 'redirects' => '', + 'titles' => $page + ) ); + $main = new ApiMain( $req ); + $main->execute(); + $data = $main->getResultData(); + $redirValues = @$data['query']['redirects']; + $to = $page; + foreach ( (array)$redirValues as $r ) { + $to = $r['to']; + } + } else { + $to = $page; + } + $titleObj = Title::newFromText( $to ); + if ( !$titleObj ) { + $this->dieUsage( "The page you specified doesn't exist", 'missingtitle' ); + } } + $wgTitle = $titleObj; $articleObj = new Article( $titleObj ); if ( isset( $prop['revid'] ) ) { $oldid = $articleObj->getRevIdFetched(); } - // Try the parser cache first - $p_result = false; - $pcache = ParserCache::singleton(); - if ( $wgEnableParserCache ) { - $p_result = $pcache->get( $articleObj, $wgUser ); - } - if ( !$p_result ) { - $p_result = $wgParser->parse( $articleObj->getContent(), $titleObj, $popts ); + if ( $this->section !== false ) { + $text = $this->getSectionText( $text, !is_null ( $pageid ) ? 'page id ' . $pageid : $titleObj->getText() ); + $p_result = $wgParser->parse( $text, $titleObj, $popts ); + } else { + // Try the parser cache first + $p_result = false; + $pcache = ParserCache::singleton(); if ( $wgEnableParserCache ) { - $pcache->save( $p_result, $articleObj, $popts ); + $p_result = $pcache->get( $articleObj, $popts ); + } + if ( !$p_result ) { + $p_result = $wgParser->parse( $articleObj->getContent(), $titleObj, $popts ); + + if ( $wgEnableParserCache ) { + $pcache->save( $p_result, $articleObj, $popts ); + } } } } @@ -127,6 +158,11 @@ class ApiParse extends ApiBase { $titleObj = Title::newFromText( 'API' ); } $wgTitle = $titleObj; + + if ( $this->section !== false ) { + $text = $this->getSectionText( $text, $titleObj->getText() ); + } + if ( $params['pst'] || $params['onlypst'] ) { $text = $wgParser->preSaveTransform( $text, $titleObj, $wgUser, $popts ); } @@ -178,21 +214,37 @@ class ApiParse extends ApiBase { if ( isset( $prop['sections'] ) ) { $result_array['sections'] = $p_result->getSections(); } + if ( isset( $prop['displaytitle'] ) ) { $result_array['displaytitle'] = $p_result->getDisplayTitle() ? $p_result->getDisplayTitle() : $titleObj->getPrefixedText(); } + if ( isset( $prop['headitems'] ) || isset( $prop['headhtml'] ) ) { + $out = new OutputPage; + $out->addParserOutputNoText( $p_result ); + $userSkin = $wgUser->getSkin(); + } + if ( isset( $prop['headitems'] ) ) { - $result_array['headitems'] = $this->formatHeadItems( $p_result->getHeadItems() ); + $headItems = $this->formatHeadItems( $p_result->getHeadItems() ); + + $userSkin->setupUserCss( $out ); + $css = $this->formatCss( $out->buildCssLinksArray() ); + + $scripts = array( $out->getHeadScripts( $userSkin ) ); + + $result_array['headitems'] = array_merge( $headItems, $css, $scripts ); } if ( isset( $prop['headhtml'] ) ) { - $out = new OutputPage; - $out->addParserOutputNoText( $p_result ); $result_array['headhtml'] = array(); - $result->setContent( $result_array['headhtml'], $out->headElement( $wgUser->getSkin() ) ); + $result->setContent( $result_array['headhtml'], $out->headElement( $userSkin ) ); + } + + if ( isset( $prop['iwlinks'] ) ) { + $result_array['iwlinks'] = $this->formatIWLinks( $p_result->getInterwikiLinks() ); } if ( !is_null( $oldid ) ) { @@ -207,17 +259,27 @@ class ApiParse extends ApiBase { 'templates' => 'tl', 'images' => 'img', 'externallinks' => 'el', + 'iwlinks' => 'iw', 'sections' => 's', - 'headitems' => 'hi' + 'headitems' => 'hi', ); $this->setIndexedTagNames( $result_array, $result_mapping ); $result->addValue( null, $this->getModuleName(), $result_array ); - + if ( !is_null( $oldLang ) ) { $wgLang = $oldLang; // Reset $wgLang to $oldLang } } + private function getSectionText( $text, $what ) { + global $wgParser; + $text = $wgParser->getSection( $text, $this->section, false ); + if ( $text === false ) { + $this->dieUsage( "There is no section {$this->section} in " . $what, 'nosuchsection' ); + } + return $text; + } + private function formatLangLinks( $links ) { $result = array(); foreach ( $links as $link ) { @@ -257,6 +319,25 @@ class ApiParse extends ApiBase { return $result; } + private function formatIWLinks( $iw ) { + $result = array(); + foreach ( $iw as $prefix => $titles ) { + foreach ( $titles as $title => $id ) { + $entry = array(); + $entry['prefix'] = $prefix; + + $title = Title::newFromText( "{$prefix}:{$title}" ); + if ( $title ) { + $entry['url'] = $title->getFullURL(); + } + + $this->getResult()->setContent( $entry, $title->getFullText() ); + $result[] = $entry; + } + } + return $result; + } + private function formatHeadItems( $headItems ) { $result = array(); foreach ( $headItems as $tag => $content ) { @@ -268,6 +349,17 @@ class ApiParse extends ApiBase { return $result; } + private function formatCss( $css ) { + $result = array(); + foreach ( $css as $file => $link ) { + $entry = array(); + $entry['file'] = $file; + $this->getResult()->setContent( $entry, $link ); + $result[] = $entry; + } + return $result; + } + private function setIndexedTagNames( &$array, $mapping ) { foreach ( $mapping as $key => $name ) { if ( isset( $array[$key] ) ) { @@ -284,6 +376,7 @@ class ApiParse extends ApiBase { 'text' => null, 'summary' => null, 'page' => null, + 'pageid' => null, 'redirects' => false, 'oldid' => null, 'prop' => array( @@ -301,32 +394,56 @@ class ApiParse extends ApiBase { 'revid', 'displaytitle', 'headitems', - 'headhtml' + 'headhtml', + 'iwlinks', ) ), 'pst' => false, 'onlypst' => false, + 'uselang' => null, + 'section' => null, + 'disablepp' => false, ); } public function getParamDescription() { + $p = $this->getModulePrefix(); return array( - 'text' => 'Wikitext to parse.', - 'summary' => 'Summary to parse.', - 'redirects' => 'If the page parameter is set to a redirect, resolve it.', - '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.' + 'text' => 'Wikitext to parse', + 'summary' => 'Summary to parse', + 'redirects' => "If the {$p}page parameter is set to a redirect, resolve it", + 'title' => 'Title of page the text belongs to', + 'page' => "Parse the content of this page. Cannot be used together with {$p}text and {$p}title", + 'pageid' => "Parse the content of this page. Overrides {$p}page", + 'oldid' => "Parse the content of this revision. Overrides {$p}page and {$p}pageid", + 'prop' => array( + 'Which pieces of information to get', + ' text - Gives the parsed text of the wikitext', + ' langlinks - Gives the langlinks the parsed wikitext', + ' categories - Gives the categories of the parsed wikitext', + ' links - Gives the internal links in the parsed wikitext', + ' templates - Gives the templates in the parsed wikitext', + ' images - Gives the images in the parsed wikitext', + ' externallinks - Gives the external links in the parsed wikitext', + ' sections - Gives the sections in the parsed wikitext', + ' revid - Adds the revision id of the parsed page', + ' displaytitle - Adds the title of the parsed wikitext', + ' headitems - Gives items to put in the of the page', + ' headhtml - Gives parsed of the page', + ' iwlinks - Gives interwiki links in the parsed wikitext', + 'NOTE: Section tree is only generated if there are more than 4 sections, or if the __TOC__ keyword is present' ), - 'pst' => array( 'Do a pre-save transform on the input before parsing it.', - 'Ignored if page or oldid is used.' + 'pst' => array( + 'Do a pre-save transform on the input before parsing it', + 'Ignored if page, pageid or oldid is used' ), - 'onlypst' => array( 'Do a PST on the input, but don\'t parse it.', - 'Returns PSTed wikitext. Ignored if page or oldid is used.' + 'onlypst' => array( + 'Do a pre-save transform (PST) on the input, but don\'t parse it', + 'Returns the same wikitext, after a PST has been applied. Ignored if page, pageid or oldid is used' ), - 'uselang' => 'Which language to parse the request in.' + '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', ); } @@ -340,6 +457,8 @@ class ApiParse extends ApiBase { array( 'code' => 'missingrev', 'info' => 'There is no revision ID oldid' ), array( 'code' => 'permissiondenied', 'info' => 'You don\'t have permission to view deleted revisions' ), array( 'code' => 'missingtitle', 'info' => 'The page you specified doesn\'t exist' ), + array( 'code' => 'nosuchsection', 'info' => 'There is no section sectionnumber in page' ), + array( 'nosuchpageid' ), ) ); } @@ -352,4 +471,4 @@ class ApiParse extends ApiBase { public function getVersion() { return __CLASS__ . ': $Id$'; } -} \ No newline at end of file +}