From c8079f0b81fe962b4deef7daa9c0b9dae69b210d Mon Sep 17 00:00:00 2001 From: Sam Reed Date: Sun, 1 May 2011 21:56:02 +0000 Subject: [PATCH] * (bug 27185) API: Add Special:ComparePages --- RELEASE-NOTES | 1 + includes/AutoLoader.php | 1 + includes/api/ApiComparePages.php | 123 +++++++++++++++++++++++++++++ includes/api/ApiMain.php | 1 + includes/diff/DifferenceEngine.php | 4 +- 5 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 includes/api/ApiComparePages.php diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 17aabb6fe0..44e08402fe 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -370,6 +370,7 @@ PHP if you have not done so prior to upgrading MediaWiki. * Get a list of function hooks through meta=siteinfo * Get a list of all subscribed hooks, and those subscribers * (bug 28225) Allow hiding of user groups in list=allusers +* (bug 27185) API: Add Special:ComparePages === Languages updated in 1.18 === diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index 413c4d1af2..21d5970a22 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -257,6 +257,7 @@ $wgAutoloadLocalClasses = array( # includes/api 'ApiBase' => 'includes/api/ApiBase.php', 'ApiBlock' => 'includes/api/ApiBlock.php', + 'ApiComparePages' => 'includes/api/ApiComparePages.php', 'ApiDelete' => 'includes/api/ApiDelete.php', 'ApiDisabled' => 'includes/api/ApiDisabled.php', 'ApiEditPage' => 'includes/api/ApiEditPage.php', diff --git a/includes/api/ApiComparePages.php b/includes/api/ApiComparePages.php new file mode 100644 index 0000000000..d3100dc21c --- /dev/null +++ b/includes/api/ApiComparePages.php @@ -0,0 +1,123 @@ +extractRequestParams(); + + $rev1 = $this->revisionOrTitle( $params['fromrev'], $params['fromtitle'] ); + $rev2 = $this->revisionOrTitle( $params['torev'], $params['totitle'] ); + + $de = new DifferenceEngine( null, + $rev1, + $rev2, + null, // rcid + true, + false ); + + $vals = array(); + if ( isset( $params['fromtitle'] ) ) { + $vals['fromtitle'] = $params['fromtitle']; + } + $vals['fromrevid'] = $rev1; + if ( isset( $params['totitle'] ) ) { + $vals['totitle'] = $params['totitle']; + } + $vals['torevid'] = $rev2; + + $difftext = $de->getDiffBody(); + ApiResult::setContent( $vals, $difftext ); + + $this->getResult()->addValue( null, $this->getModuleName(), $vals ); + } + + /** + * @param $revision int + * @param $title string + * @return int + */ + private function revisionOrTitle( $revision, $title ) { + if( $revision ){ + return $revision; + } elseif( $title ) { + $title = Title::newFromText( $title ); + if( !$title ){ + $this->dieUsageMsg( array( 'invalidtitle', $title ) ); + } + return $title->getLatestRevID(); + } + $this->dieUsage( 'inputneeded', 'A title or a revision number is needed for both the from and the to parameters' ); + } + + public function getAllowedParams() { + return array( + 'fromtitle' => null, + 'fromrev' => array( + ApiBase::PARAM_TYPE => 'integer' + ), + 'totitle' => null, + 'torev' => array( + ApiBase::PARAM_TYPE => 'integer' + ), + ); + } + + public function getParamDescription() { + return array( + 'title1' => 'First title to compare', + 'rev1' => 'First revision to compare', + 'title2' => 'Second title to compare', + 'rev2' => 'Second revision to compare', + ); + } + public function getDescription() { + return array( + 'Get the difference between 2 pages', + 'You must pass a revision number or a page title for each part (1 and 2)' + ); + } + + public function getPossibleErrors() { + return array_merge( parent::getPossibleErrors(), array( + array( 'code' => 'inputneeded', 'info' => 'A title or a revision is needed' ), + array( 'invalidtitle', 'title' ), + ) ); + } + + protected function getExamples() { + return array( + 'api.php?action=compare&rev1=1&rev2=2', + ); + } + + public function getVersion() { + return __CLASS__ . ': $Id$'; + } +} diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php index f6b98cde80..032bad70ee 100644 --- a/includes/api/ApiMain.php +++ b/includes/api/ApiMain.php @@ -64,6 +64,7 @@ class ApiMain extends ApiBase { 'help' => 'ApiHelp', 'paraminfo' => 'ApiParamInfo', 'rsd' => 'ApiRsd', + 'compare' => 'ApiComparePages', // Write modules 'purge' => 'ApiPurge', diff --git a/includes/diff/DifferenceEngine.php b/includes/diff/DifferenceEngine.php index e2b3c1133d..d2a08546c7 100644 --- a/includes/diff/DifferenceEngine.php +++ b/includes/diff/DifferenceEngine.php @@ -22,14 +22,14 @@ class DifferenceEngine { /**#@+ * @private */ - var $mOldid, $mNewid, $mTitle; + var $mOldid, $mNewid; var $mOldtitle, $mNewtitle, $mPagetitle; var $mOldtext, $mNewtext; /** * @var Title */ - var $mOldPage, $mNewPage; + var $mOldPage, $mNewPage, $mTitle; var $mRcidMarkPatrolled; /** -- 2.20.1