* @return string
*/
public function beginRecentChangesList() {
- $this->rc_cache = array();
+ $this->rc_cache = [];
$this->rcMoveIndex = 0;
$this->rcCacheIndex = 0;
$this->lastdate = '';
$this->rclistOpen = false;
- $this->getOutput()->addModuleStyles( array(
+ $this->getOutput()->addModuleStyles( [
'mediawiki.special.changeslist',
'mediawiki.special.changeslist.enhanced',
- ) );
- $this->getOutput()->addModules( array(
+ ] );
+ $this->getOutput()->addModules( [
'jquery.makeCollapsible',
'mediawiki.icon',
- ) );
+ ] );
return '<div class="mw-changeslist">';
}
if ( $date != $this->lastdate ) {
# Process current cache
$ret = $this->recentChangesBlock();
- $this->rc_cache = array();
+ $this->rc_cache = [];
$ret .= Xml::element( 'h4', null, $date ) . "\n";
$this->lastdate = $date;
}
$cacheGroupingKey = $this->makeCacheGroupingKey( $cacheEntry );
if ( !isset( $this->rc_cache[$cacheGroupingKey] ) ) {
- $this->rc_cache[$cacheGroupingKey] = array();
+ $this->rc_cache[$cacheGroupingKey] = [];
}
array_push( $this->rc_cache[$cacheGroupingKey], $cacheEntry );
protected function recentChangesBlockGroup( $block ) {
# Add the namespace and title of the block as part of the class
- $classes = array( 'mw-collapsible', 'mw-collapsed', 'mw-enhanced-rc' );
+ $tableClasses = [ 'mw-collapsible', 'mw-collapsed', 'mw-enhanced-rc' ];
if ( $block[0]->mAttribs['rc_log_type'] ) {
# Log entry
- $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
+ $tableClasses[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
. $block[0]->mAttribs['rc_log_type'] );
} else {
- $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns'
+ $tableClasses[] = Sanitizer::escapeClass( 'mw-changeslist-ns'
. $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] );
}
- $classes[] = $block[0]->watched && $block[0]->mAttribs['rc_timestamp'] >= $block[0]->watched
- ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
- $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
- Html::openElement( 'tr' );
+ if ( $block[0]->watched
+ && $block[0]->mAttribs['rc_timestamp'] >= $block[0]->watched
+ ) {
+ $tableClasses[] = 'mw-changeslist-line-watched';
+ } else {
+ $tableClasses[] = 'mw-changeslist-line-not-watched';
+ }
# Collate list of users
- $userlinks = array();
+ $userlinks = [];
# Other properties
$curId = 0;
# Some catalyst variables...
$namehidden = true;
$allLogs = true;
$RCShowChangedSize = $this->getConfig()->get( 'RCShowChangedSize' );
- $collectedRcFlags = array(
+ $collectedRcFlags = [
// All are by bots?
'bot' => true,
// Includes a new page?
'minor' => true,
// Contains an unpatrolled edit?
'unpatrolled' => false,
- );
+ ];
foreach ( $block as $rcObj ) {
if ( $rcObj->mAttribs['rc_type'] == RC_NEW ) {
$collectedRcFlags['newpage'] = true;
# Sort the list and convert to text
krsort( $userlinks );
asort( $userlinks );
- $users = array();
+ $users = [];
foreach ( $userlinks as $userlink => $count ) {
$text = $userlink;
$text .= $this->getLanguage()->getDirMark();
array_push( $users, $text );
}
- $users = ' <span class="changedby">'
- . $this->msg( 'brackets' )->rawParams(
- implode( $this->message['semicolon-separator'], $users )
- )->escaped() . '</span>';
-
- $tl = '<span class="mw-collapsible-toggle mw-collapsible-arrow ' .
- 'mw-enhancedchanges-arrow mw-enhancedchanges-arrow-space"></span>';
- $r .= "<td>$tl</td>";
-
- # Main line
- $r .= '<td class="mw-enhanced-rc">' . $this->recentChangesFlags(
- $collectedRcFlags
- );
-
- # Timestamp
- $r .= ' ' . $block[0]->timestamp . ' </td><td>';
-
# Article link
+ $articleLink = '';
+ $revDeletedMsg = false;
if ( $namehidden ) {
- $r .= ' <span class="history-deleted">' .
- $this->msg( 'rev-deleted-event' )->escaped() . '</span>';
+ $revDeletedMsg = $this->msg( 'rev-deleted-event' )->escaped();
} elseif ( $allLogs ) {
- $r .= $this->maybeWatchedLink( $block[0]->link, $block[0]->watched );
+ $articleLink = $this->maybeWatchedLink( $block[0]->link, $block[0]->watched );
} else {
- $this->insertArticleLink( $r, $block[0], $block[0]->unpatrolled, $block[0]->watched );
+ $articleLink = $this->getArticleLink( $block[0], $block[0]->unpatrolled, $block[0]->watched );
}
- $r .= $this->getLanguage()->getDirMark();
-
$queryParams['curid'] = $curId;
# Sub-entries
- $lines = '';
+ $lines = [];
foreach ( $block as $i => $rcObj ) {
$line = $this->getLineData( $block, $rcObj, $queryParams );
- $lines .= $line;
if ( !$line ) {
// completely ignore this RC entry if we don't want to render it
unset( $block[$i] );
}
+ $lines[] = $line;
}
// Further down are some assumptions that $block is a 0-indexed array
// with (count-1) as last key. Let's make sure it is.
$block = array_values( $block );
- if ( empty( $block ) ) {
+
+ if ( empty( $block ) || !$lines ) {
// if we can't show anything, don't display this block altogether
return '';
}
- $r .= $this->getLogText( $block, $queryParams, $allLogs,
- $collectedRcFlags['newpage'], $namehidden );
-
- $r .= ' <span class="mw-changeslist-separator">. .</span> ';
+ $logText = $this->getLogText( $block, $queryParams, $allLogs,
+ $collectedRcFlags['newpage'], $namehidden
+ );
# Character difference (does not apply if only log items)
+ $charDifference = false;
if ( $RCShowChangedSize && !$allLogs ) {
$last = 0;
$first = count( $block ) - 1;
- # Some events (like logs) have an "empty" size, so we need to skip those...
- while ( $last < $first && $block[$last]->mAttribs['rc_new_len'] === null ) {
+ # Some events (like logs and category changes) have an "empty" size, so we need to skip those...
+ while ( $last < $first && (
+ $block[$last]->mAttribs['rc_new_len'] === null ||
+ # TODO kill the below check after March 2016 - https://phabricator.wikimedia.org/T126428
+ $block[$last]->mAttribs['rc_type'] == RC_CATEGORIZE
+ ) ) {
$last++;
}
- while ( $first > $last && $block[$first]->mAttribs['rc_old_len'] === null ) {
+ while ( $last < $first && (
+ $block[$first]->mAttribs['rc_old_len'] === null ||
+ # TODO kill the below check after March 2016 - https://phabricator.wikimedia.org/T126428
+ $block[$first]->mAttribs['rc_type'] == RC_CATEGORIZE
+ ) ) {
$first--;
}
# Get net change
- $chardiff = $this->formatCharacterDifference( $block[$first], $block[$last] );
-
- if ( $chardiff == '' ) {
- $r .= ' ';
- } else {
- $r .= ' ' . $chardiff . ' <span class="mw-changeslist-separator">. .</span> ';
- }
- }
-
- $r .= $users;
- $r .= $this->numberofWatchingusers( $block[0]->numberofWatchingusers );
- $r .= '</td></tr>';
-
- if ( !$lines ) {
- // if there are no lines to be rendered (all aborted by hook), don't render the block
- return '';
- }
-
- $r .= $lines;
- $r .= "</table>\n";
+ $charDifference = $this->formatCharacterDifference( $block[$first], $block[$last] );
+ }
+
+ $numberofWatchingusers = $this->numberofWatchingusers( $block[0]->numberofWatchingusers );
+ $usersList = $this->msg( 'brackets' )->rawParams(
+ implode( $this->message['semicolon-separator'], $users )
+ )->escaped();
+
+ $templateParams = [
+ 'articleLink' => $articleLink,
+ 'charDifference' => $charDifference,
+ 'collectedRcFlags' => $this->recentChangesFlags( $collectedRcFlags ),
+ 'languageDirMark' => $this->getLanguage()->getDirMark(),
+ 'lines' => $lines,
+ 'logText' => $logText,
+ 'numberofWatchingusers' => $numberofWatchingusers,
+ 'rev-deleted-event' => $revDeletedMsg,
+ 'tableClasses' => $tableClasses,
+ 'timestamp' => $block[0]->timestamp,
+ 'users' => $usersList,
+ ];
$this->rcCacheIndex++;
- return $r;
+ $templateParser = new TemplateParser();
+ return $templateParser->processTemplate(
+ 'EnhancedChangesListGroup',
+ $templateParams
+ );
}
/**
* @param RCCacheEntry[] $block
* @param RCCacheEntry $rcObj
* @param array $queryParams
- * @return string
+ * @return array
* @throws Exception
* @throws FatalError
* @throws MWException
*/
- protected function getLineData( array $block, RCCacheEntry $rcObj, array $queryParams = array() ) {
+ protected function getLineData( array $block, RCCacheEntry $rcObj, array $queryParams = [] ) {
$RCShowChangedSize = $this->getConfig()->get( 'RCShowChangedSize' );
# Classes to apply -- TODO implement
- $classes = array();
+ $classes = [];
$type = $rcObj->mAttribs['rc_type'];
- $data = array();
+ $data = [];
+ $lineParams = [];
- $trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
- ? ' class="mw-enhanced-watched"' : '';
+ if ( $rcObj->watched
+ && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
+ ) {
+ $lineParams['classes'] = [ 'mw-enhanced-watched' ];
+ }
$separator = ' <span class="mw-changeslist-separator">. .</span> ';
- $data['recentChangesFlags'] = array(
+ $data['recentChangesFlags'] = [
'newpage' => $type == RC_NEW,
'minor' => $rcObj->mAttribs['rc_minor'],
'unpatrolled' => $rcObj->unpatrolled,
'bot' => $rcObj->mAttribs['rc_bot'],
- );
+ ];
$params = $queryParams;
$link = Linker::linkKnown(
$rcObj->getTitle(),
$rcObj->timestamp,
- array(),
+ [],
$params
);
if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
// give the hook a chance to modify the data
$success = Hooks::run( 'EnhancedChangesListModifyLineData',
- array( $this, &$data, $block, $rcObj ) );
+ [ $this, &$data, $block, $rcObj ] );
if ( !$success ) {
// skip entry if hook aborted it
- return '';
+ return [];
}
- $line = '<tr' . $trClass . '><td></td><td class="mw-enhanced-rc">';
if ( isset( $data['recentChangesFlags'] ) ) {
- $line .= $this->recentChangesFlags( $data['recentChangesFlags'] );
+ $lineParams['recentChangesFlags'] = $this->recentChangesFlags( $data['recentChangesFlags'] );
unset( $data['recentChangesFlags'] );
}
- $line .= ' </td><td class="mw-enhanced-rc-nested">';
if ( isset( $data['timestampLink'] ) ) {
- $line .= '<span class="mw-enhanced-rc-time">' . $data['timestampLink'] . '</span>';
+ $lineParams['timestampLink'] = $data['timestampLink'];
unset( $data['timestampLink'] );
}
// everything else: makes it easier for extensions to add or remove data
- $line .= implode( '', $data );
-
- $line .= "</td></tr>\n";
+ $lineParams['data'] = array_values( $data );
- return $line;
+ return $lineParams;
}
/**
}
# Changes message
- static $nchanges = array();
- static $sinceLastVisitMsg = array();
+ static $nchanges = [];
+ static $sinceLastVisitMsg = [];
$n = count( $block );
if ( !isset( $nchanges[$n] ) ) {
}
# Total change link
- $links = array();
+ $links = [];
/** @var $block0 RecentChange */
$block0 = $block[0];
$last = $block[count( $block ) - 1];
- if ( !$allLogs && $rcObj->mAttribs['rc_type'] != RC_CATEGORIZE ) {
- if ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
- $links['total-changes'] = $nchanges[$n];
- } elseif ( $isnew ) {
+ if ( !$allLogs ) {
+ if ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ||
+ $isnew ||
+ $rcObj->mAttribs['rc_type'] == RC_CATEGORIZE
+ ) {
$links['total-changes'] = $nchanges[$n];
} else {
$links['total-changes'] = Linker::link(
$block0->getTitle(),
$nchanges[$n],
- array(),
- $queryParams + array(
+ [],
+ $queryParams + [
'diff' => $currentRevision,
'oldid' => $last->mAttribs['rc_last_oldid'],
- ),
- array( 'known', 'noclasses' )
+ ],
+ [ 'known', 'noclasses' ]
);
if ( $sinceLast > 0 && $sinceLast < $n ) {
$links['total-changes-since-last'] = Linker::link(
$block0->getTitle(),
$sinceLastVisitMsg[$sinceLast],
- array(),
- $queryParams + array(
+ [],
+ $queryParams + [
'diff' => $currentRevision,
'oldid' => $unvisitedOldid,
- ),
- array( 'known', 'noclasses' )
+ ],
+ [ 'known', 'noclasses' ]
);
}
}
$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 ) );
+ [ $this, &$links, $block ] );
if ( !$links ) {
return '';
* @return string A HTML formatted line (generated using $r)
*/
protected function recentChangesBlockLine( $rcObj ) {
- $data = array();
+ $data = [];
$query['curid'] = $rcObj->mAttribs['rc_cur_id'];
$type = $rcObj->mAttribs['rc_type'];
$logType = $rcObj->mAttribs['rc_log_type'];
- $classes = array( 'mw-enhanced-rc' );
+ $classes = $this->getHTMLClasses( $rcObj, $rcObj->watched );
+ $classes[] = 'mw-enhanced-rc';
+
if ( $logType ) {
# Log entry
$classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-' . $logType );
$classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns' .
$rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] );
}
- $classes[] = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
- ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
# Flag and Timestamp
- $data['recentChangesFlags'] = array(
+ $data['recentChangesFlags'] = [
'newpage' => $type == RC_NEW,
'minor' => $rcObj->mAttribs['rc_minor'],
'unpatrolled' => $rcObj->unpatrolled,
'bot' => $rcObj->mAttribs['rc_bot'],
- );
+ ];
// timestamp is not really a link here, but is called timestampLink
// for consistency with EnhancedChangesListModifyLineData
$data['timestampLink'] = $rcObj->timestamp;
// give the hook a chance to modify the data
$success = Hooks::run( 'EnhancedChangesListModifyBlockLineData',
- array( $this, &$data, $rcObj ) );
+ [ $this, &$data, $rcObj ] );
if ( !$success ) {
// skip entry if hook aborted it
return '';
}
- $line = Html::openElement( 'table', array( 'class' => $classes ) ) .
+ $line = Html::openElement( 'table', [ 'class' => $classes ] ) .
Html::openElement( 'tr' );
$line .= '<td class="mw-enhanced-rc"><span class="mw-enhancedchanges-arrow-space"></span>';
->rawParams( $rc->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
$pageTitle,
$this->message['hist'],
- array(),
+ [],
$query
) )->escaped();
return $retVal;