jenkins-bot has submitted this change and it was merged. Change subject: Adding a bunch of hooks from wikiHow into DifferenceEngine ......................................................................
Adding a bunch of hooks from wikiHow into DifferenceEngine These hooks allow things such as: * adding CSS(/JS) into the OutputPage when viewing diffs * adding extra HTML content (such as avatars) into diff views * hiding the bottom "mark as patrolled" link * altering the parser output that is used by DifferenceEngine * and more Example extension using these hooks is wikiHow's /extensions/wikihow/hooks/, specifically the file DiffHooks.php (but the hooks are setup in WikihowHooks.php). Live example of the DiffHooks stuff in action can be found at wikiHow.com, for example: http://www.wikihow.com/index.php?title=Set-Your-Homepage&diff=17112892&oldid=15888129 (user avatars, additional CSS, changes to the old/new revision header texts/links) Change-Id: Icbc987fa4806e7bfc66743375301912b428dc348 --- M docs/hooks.txt M includes/diff/DifferenceEngine.php 2 files changed, 117 insertions(+), 6 deletions(-) Approvals: Brian Wolff: Looks good to me, approved jenkins-bot: Verified diff --git a/docs/hooks.txt b/docs/hooks.txt index fa664c3..2e7a299 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -1135,6 +1135,85 @@ $row: the DB row for this line &$classes: the classes to add to the surrounding <li> +'DifferenceEngineMarkPatrolledLink': Allows extensions to change the "mark as patrolled" link +which is shown both on the diff header as well as on the bottom of a page, usually +wrapped in a span element which has class="patrollink". +$differenceEngine: DifferenceEngine object +&$markAsPatrolledLink: The "mark as patrolled" link HTML (string) +$rcid: Recent change ID (rc_id) for this change (int) +$token: Patrol token; $rcid is used in generating this variable + +'DifferenceEngineMarkPatrolledRCID': Allows extensions to possibly change the rcid parameter. +For example the rcid might be set to zero due to the user being the same as the +performer of the change but an extension might still want to show it under certain +conditions. +&$rcid: rc_id (int) of the change or 0 +$differenceEngine: DifferenceEngine object +$change: RecentChange object +$user: User object representing the current user + +'DifferenceEngineNewHeader': Allows extensions to change the $newHeader variable, which +contains information about the new revision, such as the revision's author, whether +the revision was marked as a minor edit or not, etc. +$differenceEngine: DifferenceEngine object +&$newHeader: The string containing the various #mw-diff-otitle[1-5] divs, which +include things like revision author info, revision comment, RevisionDelete link and more +$formattedRevisionTools: Array containing revision tools, some of which may have +been injected with the DiffRevisionTools hook +$nextlink: String containing the link to the next revision (if any); also included in $newHeader +$rollback: Rollback link (string) to roll this revision back to the previous one, if any +$newminor: String indicating if the new revision was marked as a minor edit +$diffOnly: Boolean parameter passed to DifferenceEngine#showDiffPage, indicating +whether we should show just the diff; passed in as a query string parameter to the +various URLs constructed here (i.e. $nextlink) +$rdel: RevisionDelete link for the new revision, if the current user is allowed +to use the RevisionDelete feature +$unhide: Boolean parameter indicating whether to show RevisionDeleted revisions + +'DifferenceEngineOldHeader': Allows extensions to change the $oldHeader variable, which +contains information about the old revision, such as the revision's author, whether +the revision was marked as a minor edit or not, etc. +$differenceEngine: DifferenceEngine object +&$oldHeader: The string containing the various #mw-diff-otitle[1-5] divs, which +include things like revision author info, revision comment, RevisionDelete link and more +$prevlink: String containing the link to the previous revision (if any); also included in $oldHeader +$oldminor: String indicating if the old revision was marked as a minor edit +$diffOnly: Boolean parameter passed to DifferenceEngine#showDiffPage, indicating +whether we should show just the diff; passed in as a query string parameter to the +various URLs constructed here (i.e. $prevlink) +$ldel: RevisionDelete link for the old revision, if the current user is allowed +to use the RevisionDelete feature +$unhide: Boolean parameter indicating whether to show RevisionDeleted revisions + +'DifferenceEngineOldHeaderNoOldRev': Change the $oldHeader variable in cases when +there is no old revision +&$oldHeader: empty string by default + +'DifferenceEngineRenderRevisionAddParserOutput': Allows extensions to change the parser output. +Return false to not add parser output via OutputPage's addParserOutput method. +$differenceEngine: DifferenceEngine object +$out: OutputPage object +$parserOutput: ParserOutput object +$wikiPage: WikiPage object + +'DifferenceEngineRenderRevisionShowFinalPatrolLink': An extension can hook into this hook +point and return false to not show the final "mark as patrolled" link on the bottom +of a page. +This hook has no arguments. + +'DifferenceEngineShowDiff': Allows extensions to affect the diff text which +eventually gets sent to the OutputPage object. +$differenceEngine: DifferenceEngine object + +'DifferenceEngineShowEmptyOldContent': Allows extensions to change the diff table +body (without header) in cases when there is no old revision or the old and new +revisions are identical. +$differenceEngine: DifferenceEngine object + +'DifferenceEngineShowDiffPage': Add additional output via the available OutputPage +object into the diff view +$out: OutputPage object + 'DiffRevisionTools': Override or extend the revision tools available from the diff view, i.e. undo, etc. $newRev: Revision object of the "new" revision diff --git a/includes/diff/DifferenceEngine.php b/includes/diff/DifferenceEngine.php index f35356c..c5e94c5 100644 --- a/includes/diff/DifferenceEngine.php +++ b/includes/diff/DifferenceEngine.php @@ -236,11 +236,13 @@ } public function showDiffPage( $diffOnly = false ) { - # Allow frames except in certain special cases $out = $this->getOutput(); $out->allowClickjacking(); $out->setRobotPolicy( 'noindex,nofollow' ); + + // Allow extensions to add any extra output here + Hooks::run( 'DifferenceEngineShowDiffPage', [ $out ] ); if ( !$this->loadRevisionData() ) { $this->showMissingRevision(); @@ -283,6 +285,8 @@ $out->setPageTitle( $this->msg( 'difference-title', $this->mNewPage->getPrefixedText() ) ); $samePage = true; $oldHeader = ''; + // Allow extensions to change the $oldHeader variable + Hooks::run( 'DifferenceEngineOldHeaderNoOldRev', [ &$oldHeader ] ); } else { Hooks::run( 'DiffViewHeader', [ $this, $this->mOldRev, $this->mNewRev ] ); @@ -352,6 +356,10 @@ '<div id="mw-diff-otitle5">' . $oldChangeTags[0] . '</div>' . '<div id="mw-diff-otitle4">' . $prevlink . '</div>'; + // Allow extensions to change the $oldHeader variable + Hooks::run( 'DifferenceEngineOldHeader', [ $this, &$oldHeader, $prevlink, $oldminor, + $diffOnly, $ldel, $this->unhide ] ); + if ( $this->mOldRev->isDeleted( Revision::DELETED_TEXT ) ) { $deleted = true; // old revisions text is hidden if ( $this->mOldRev->isDeleted( Revision::DELETED_RESTRICTED ) ) { @@ -412,6 +420,10 @@ Linker::revComment( $this->mNewRev, !$diffOnly, !$this->unhide ) . $rdel . '</div>' . '<div id="mw-diff-ntitle5">' . $newChangeTags[0] . '</div>' . '<div id="mw-diff-ntitle4">' . $nextlink . $this->markPatrolledLink() . '</div>'; + + // Allow extensions to change the $newHeader variable + Hooks::run( 'DifferenceEngineNewHeader', [ $this, &$newHeader, $formattedRevisionTools, + $nextlink, $rollback, $newminor, $diffOnly, $rdel, $this->unhide ] ); if ( $this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) { $deleted = true; // new revisions text is hidden @@ -485,6 +497,9 @@ 'token' => $linkInfo['token'], ] ) . ']</span>'; + // Allow extensions to change the markpatrolled link + Hooks::run( 'DifferenceEngineMarkPatrolledLink', [ $this, + &$this->mMarkPatrolledLink, $linkInfo['rcid'], $linkInfo['token'] ] ); } } return $this->mMarkPatrolledLink; @@ -528,6 +543,13 @@ // If the user could patrol this it already would be patrolled $rcid = 0; } + + // Allow extensions to possibly change the rcid here + // For example the rcid might be set to zero due to the user + // being the same as the performer of the change but an extension + // might still want to show it under certain conditions + Hooks::run( 'DifferenceEngineMarkPatrolledRCID', [ &$rcid, $this, $change, $user ] ); + // Build the link if ( $rcid ) { $this->getOutput()->preventClickjacking(); @@ -615,15 +637,20 @@ # WikiPage::getParserOutput() should not return false, but just in case if ( $parserOutput ) { - $out->addParserOutput( $parserOutput ); + // Allow extensions to change parser output here + if ( !Hooks::run( 'DifferenceEngineRenderRevisionAddParserOutput', [ $this, $out, $parserOutput, $wikiPage ] ) ) { + $out->addParserOutput( $parserOutput ); + } } } } # @codingStandardsIgnoreEnd - # Add redundant patrol link on bottom... - $out->addHTML( $this->markPatrolledLink() ); - + // Allow extensions to optionally not show the final patrolled link + if ( Hooks::run( 'DifferenceEngineRenderRevisionShowFinalPatrolLink' ) ) { + # Add redundant patrol link on bottom... + $out->addHTML( $this->markPatrolledLink() ); + } } protected function getParserOutput( WikiPage $page, Revision $rev ) { @@ -649,6 +676,9 @@ * @return bool */ public function showDiff( $otitle, $ntitle, $notice = '' ) { + // Allow extensions to affect the output here + Hooks::run( 'DifferenceEngineShowDiff', [ $this ] ); + $diff = $this->getDiff( $otitle, $ntitle, $notice ); if ( $diff === false ) { $this->showMissingRevision(); @@ -718,7 +748,9 @@ if ( $this->mOldRev === false || ( $this->mOldRev && $this->mNewRev && $this->mOldRev->getId() == $this->mNewRev->getId() ) ) { - return ''; + if ( !Hooks::run( 'DifferenceEngineShowEmptyOldContent', [ $this ] ) ) { + return ''; + } } // Cacheable? $key = false; -- To view, visit https://gerrit.wikimedia.org/r/206642 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: Icbc987fa4806e7bfc66743375301912b428dc348 Gerrit-PatchSet: 4 Gerrit-Project: mediawiki/core Gerrit-Branch: master Gerrit-Owner: Jack Phoenix <j...@countervandalism.net> Gerrit-Reviewer: Addshore <addshorew...@gmail.com> Gerrit-Reviewer: Aude <aude.w...@gmail.com> Gerrit-Reviewer: Brian Wolff <bawolff...@gmail.com> Gerrit-Reviewer: Daniel Kinzler <daniel.kinz...@wikimedia.de> Gerrit-Reviewer: Dereckson <dereck...@espace-win.org> Gerrit-Reviewer: Jack Phoenix <j...@countervandalism.net> Gerrit-Reviewer: Jdlrobson <jrob...@wikimedia.org> Gerrit-Reviewer: MaxSem <maxsem.w...@gmail.com> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits