From fd64488787ab096acff09034042643e59eec6cb0 Mon Sep 17 00:00:00 2001 From: Matthias Mullie Date: Thu, 26 Feb 2015 14:10:22 +0100 Subject: [PATCH] Add hook EnhancedChangesList::getLogText Enhanced RC generates these "(3 changes | history)" links for every block of grouped recentchanges. That changes-link links to a diff page. For Flow, that is all wrong: we have different ids (not integers), on a different page (&curid=&oldid=&diff= means nothing). Even the concept of a "diff" page seems wrong here for us - a new post is not part of some document that can be diffed. In short: we'll want to generate a different link, and we'll need a hook to let us change them. Meanwhile also split the code that generates those links into a separate method. Bug: T72513 Change-Id: Ib32fb9552b80f9581d89b3b47da6e5d32e3d84a3 --- RELEASE-NOTES-1.25 | 2 + docs/hooks.txt | 6 + includes/changes/EnhancedChangesList.php | 199 +++++++++++++---------- 3 files changed, 119 insertions(+), 88 deletions(-) diff --git a/RELEASE-NOTES-1.25 b/RELEASE-NOTES-1.25 index 83a569aeee..e0b1d5edfc 100644 --- a/RELEASE-NOTES-1.25 +++ b/RELEASE-NOTES-1.25 @@ -109,6 +109,8 @@ production. pointing to it. * New hooks 'ApiMain::moduleManager' and 'ApiQuery::moduleManager', can be used for conditional registration of API modules. +* New hook 'EnhancedChangesList::getLogText' to alter, remove or add to the + links of a group of changes in EnhancedChangesList. ==== External libraries ==== * MediaWiki now requires certain external libraries to be installed. In the past diff --git a/docs/hooks.txt b/docs/hooks.txt index cf2e3dd225..30a7e04563 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -1277,6 +1277,12 @@ $editToken: The user's edit token. &$hookErr: Out-param for the error. Passed as the parameters to OutputPage::showErrorPage. +'EnhancedChangesList::getLogText': to alter, remove or add to the links of a +group of changes in EnhancedChangesList. +$changesList: EnhancedChangesList object +&$links: The links that were generated by EnhancedChangesList +$block: The RecentChanges objects in that block + 'ExemptFromAccountCreationThrottle': Exemption from the account creation throttle. $ip: The ip address of the user diff --git a/includes/changes/EnhancedChangesList.php b/includes/changes/EnhancedChangesList.php index 2cee726308..19277f1073 100644 --- a/includes/changes/EnhancedChangesList.php +++ b/includes/changes/EnhancedChangesList.php @@ -181,14 +181,12 @@ class EnhancedChangesList extends ChangesList { $isnew = false; $allBots = true; $allMinors = true; - $curId = $currentRevision = 0; + $curId = 0; # Some catalyst variables... $namehidden = true; $allLogs = true; - $oldid = ''; $RCShowChangedSize = $this->getConfig()->get( 'RCShowChangedSize' ); foreach ( $block as $rcObj ) { - $oldid = $rcObj->mAttribs['rc_last_oldid']; if ( $rcObj->mAttribs['rc_type'] == RC_NEW ) { $isnew = true; } @@ -212,9 +210,6 @@ class EnhancedChangesList extends ChangesList { if ( !$curId && $rcObj->mAttribs['rc_cur_id'] ) { $curId = $rcObj->mAttribs['rc_cur_id']; } - if ( !$currentRevision && $rcObj->mAttribs['rc_this_oldid'] ) { - $currentRevision = $rcObj->mAttribs['rc_this_oldid']; - } if ( !$rcObj->mAttribs['rc_bot'] ) { $allBots = false; @@ -275,87 +270,7 @@ class EnhancedChangesList extends ChangesList { $queryParams['curid'] = $curId; - # Changes message - static $nchanges = array(); - static $sinceLastVisitMsg = array(); - - $n = count( $block ); - if ( !isset( $nchanges[$n] ) ) { - $nchanges[$n] = $this->msg( 'nchanges' )->numParams( $n )->escaped(); - } - - $sinceLast = 0; - $unvisitedOldid = null; - /** @var $rcObj RCCacheEntry */ - foreach ( $block as $rcObj ) { - // Same logic as below inside main foreach - if ( $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched ) { - $sinceLast++; - $unvisitedOldid = $rcObj->mAttribs['rc_last_oldid']; - } - } - if ( !isset( $sinceLastVisitMsg[$sinceLast] ) ) { - $sinceLastVisitMsg[$sinceLast] = - $this->msg( 'enhancedrc-since-last-visit' )->numParams( $sinceLast )->escaped(); - } - - # Total change link - $r .= ' '; - $logtext = ''; - /** @var $block0 RecentChange */ - $block0 = $block[0]; - if ( !$allLogs ) { - if ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) { - $logtext .= $nchanges[$n]; - } elseif ( $isnew ) { - $logtext .= $nchanges[$n]; - } else { - $logtext .= Linker::link( - $block0->getTitle(), - $nchanges[$n], - array(), - $queryParams + array( - 'diff' => $currentRevision, - 'oldid' => $oldid, - ), - array( 'known', 'noclasses' ) - ); - if ( $sinceLast > 0 && $sinceLast < $n ) { - $logtext .= $this->message['pipe-separator'] . Linker::link( - $block0->getTitle(), - $sinceLastVisitMsg[$sinceLast], - array(), - $queryParams + array( - 'diff' => $currentRevision, - 'oldid' => $unvisitedOldid, - ), - array( 'known', 'noclasses' ) - ); - } - } - } - - # History - if ( $allLogs ) { - // don't show history link for logs - } elseif ( $namehidden || !$block0->getTitle()->exists() ) { - $logtext .= $this->message['pipe-separator'] . $this->message['enhancedrc-history']; - } else { - $params = $queryParams; - $params['action'] = 'history'; - - $logtext .= $this->message['pipe-separator'] . - Linker::linkKnown( - $block0->getTitle(), - $this->message['enhancedrc-history'], - array(), - $params - ); - } - - if ( $logtext !== '' ) { - $r .= $this->msg( 'parentheses' )->rawParams( $logtext )->escaped(); - } + $r .= $this->getLogText( $block, $queryParams, $allLogs, $isnew, $namehidden ); $r .= ' . . '; @@ -381,7 +296,7 @@ class EnhancedChangesList extends ChangesList { } $r .= $users; - $r .= $this->numberofWatchingusers( $block0->numberofWatchingusers ); + $r .= $this->numberofWatchingusers( $block[0]->numberofWatchingusers ); $r .= ''; # Sub-entries @@ -468,6 +383,114 @@ class EnhancedChangesList extends ChangesList { return $r; } + /** + * Generates amount of changes (linking to diff ) & link to history. + * + * @param array $block + * @param array $queryParams + * @param bool $allLogs + * @param bool $isnew + * @param bool $namehidden + * @return string + */ + protected function getLogText( $block, $queryParams, $allLogs, $isnew, $namehidden ) { + # Changes message + static $nchanges = array(); + static $sinceLastVisitMsg = array(); + + $n = count( $block ); + if ( !isset( $nchanges[$n] ) ) { + $nchanges[$n] = $this->msg( 'nchanges' )->numParams( $n )->escaped(); + } + + $sinceLast = 0; + $unvisitedOldid = null; + /** @var $rcObj RCCacheEntry */ + foreach ( $block as $rcObj ) { + // Same logic as below inside main foreach + if ( $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched ) { + $sinceLast++; + $unvisitedOldid = $rcObj->mAttribs['rc_last_oldid']; + } + } + if ( !isset( $sinceLastVisitMsg[$sinceLast] ) ) { + $sinceLastVisitMsg[$sinceLast] = + $this->msg( 'enhancedrc-since-last-visit' )->numParams( $sinceLast )->escaped(); + } + + $currentRevision = 0; + foreach ( $block as $rcObj ) { + if ( !$currentRevision ) { + $currentRevision = $rcObj->mAttribs['rc_this_oldid']; + } + } + + # Total change link + $links = array(); + /** @var $block0 RecentChange */ + $block0 = $block[0]; + $last = $block[count( $block ) - 1]; + if ( !$allLogs ) { + if ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) { + $links['total-changes'] = $nchanges[$n]; + } elseif ( $isnew ) { + $links['total-changes'] = $nchanges[$n]; + } else { + $links['total-changes'] = Linker::link( + $block0->getTitle(), + $nchanges[$n], + array(), + $queryParams + array( + 'diff' => $currentRevision, + 'oldid' => $last->mAttribs['rc_last_oldid'], + ), + array( 'known', 'noclasses' ) + ); + if ( $sinceLast > 0 && $sinceLast < $n ) { + $links['total-changes-since-last'] = Linker::link( + $block0->getTitle(), + $sinceLastVisitMsg[$sinceLast], + array(), + $queryParams + array( + 'diff' => $currentRevision, + 'oldid' => $unvisitedOldid, + ), + array( 'known', 'noclasses' ) + ); + } + } + } + + # History + if ( $allLogs ) { + // don't show history link for logs + } elseif ( $namehidden || !$block0->getTitle()->exists() ) { + $links['history'] = $this->message['enhancedrc-history']; + } else { + $params = $queryParams; + $params['action'] = 'history'; + + $links['history'] = Linker::linkKnown( + $block0->getTitle(), + $this->message['enhancedrc-history'], + array(), + $params + ); + } + + # Allow others to alter, remove or add to these links + Hooks::run( 'EnhancedChangesList::getLogText', + array( $this, &$links, $block ) ); + + if ( !$links ) { + return ''; + } + + $logtext = implode( $this->message['pipe-separator'], $links ); + $logtext = $this->msg( 'parentheses' )->rawParams( $logtext )->escaped(); + return ' ' . $logtext; + } + /** * Enhanced RC ungrouped line. * -- 2.20.1