/**
* Format a line for enhanced recentchange (aka with javascript and block of lines).
*
- * @param RecentChange $baseRC
+ * @param RecentChange $rc
* @param bool $watched
+ * @param int $linenumber (default null)
*
* @return string
*/
- public function recentChangesLine( &$baseRC, $watched = false ) {
+ public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
$date = $this->getLanguage()->userDate(
- $baseRC->mAttribs['rc_timestamp'],
+ $rc->mAttribs['rc_timestamp'],
$this->getUser()
);
$this->lastdate = $date;
}
- $cacheEntry = $this->cacheEntryFactory->newFromRecentChange( $baseRC, $watched );
+ $cacheEntry = $this->cacheEntryFactory->newFromRecentChange( $rc, $watched );
$this->addCacheEntry( $cacheEntry );
return $ret;
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 = array( '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();
# Other properties
- $unpatrolled = false;
- $isnew = false;
- $allBots = true;
- $allMinors = true;
$curId = 0;
# Some catalyst variables...
$namehidden = true;
$allLogs = true;
$RCShowChangedSize = $this->getConfig()->get( 'RCShowChangedSize' );
+ $collectedRcFlags = array(
+ // All are by bots?
+ 'bot' => true,
+ // Includes a new page?
+ 'newpage' => false,
+ // All are minor edits?
+ 'minor' => true,
+ // Contains an unpatrolled edit?
+ 'unpatrolled' => false,
+ );
foreach ( $block as $rcObj ) {
if ( $rcObj->mAttribs['rc_type'] == RC_NEW ) {
- $isnew = true;
+ $collectedRcFlags['newpage'] = true;
}
// If all log actions to this page were hidden, then don't
// give the name of the affected page for this block!
$userlinks[$u] = 0;
}
if ( $rcObj->unpatrolled ) {
- $unpatrolled = true;
+ $collectedRcFlags['unpatrolled'] = true;
}
if ( $rcObj->mAttribs['rc_type'] != RC_LOG ) {
$allLogs = false;
}
if ( !$rcObj->mAttribs['rc_bot'] ) {
- $allBots = false;
+ $collectedRcFlags['bot'] = false;
}
if ( !$rcObj->mAttribs['rc_minor'] ) {
- $allMinors = false;
+ $collectedRcFlags['minor'] = false;
}
$userlinks[$u]++;
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( array(
- 'newpage' => $isnew, # show, when one have this flag
- 'minor' => $allMinors, # show only, when all have this flag
- 'unpatrolled' => $unpatrolled, # show, when one have this flag
- 'bot' => $allBots, # show only, when all have this flag
- ) );
-
- # 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 = array();
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, $isnew, $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;
$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 = array(
+ '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
$classes = array();
$type = $rcObj->mAttribs['rc_type'];
$data = array();
+ $lineParams = array();
- $trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
- ? ' class="mw-enhanced-watched"' : '';
+ if ( $rcObj->watched
+ && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
+ ) {
+ $lineParams['classes'] = array( 'mw-enhanced-watched' );
+ }
$separator = ' <span class="mw-changeslist-separator">. .</span> ';
$data['recentChangesFlags'] = array(
if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) {
$data['logEntry'] = $this->insertLogEntry( $rcObj );
+ } elseif ( $this->isCategorizationWithoutRevision( $rcObj ) ) {
+ $data['comment'] = $this->insertComment( $rcObj );
} else {
# User links
$data['userLink'] = $rcObj->userlink;
array( $this, &$data, $block, $rcObj ) );
if ( !$success ) {
// skip entry if hook aborted it
- return '';
+ return array();
}
- $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;
}
/**
/** @var $block0 RecentChange */
$block0 = $block[0];
$last = $block[count( $block ) - 1];
- if ( !$allLogs ) {
+ if ( !$allLogs && $rcObj->mAttribs['rc_type'] != RC_CATEGORIZE ) {
if ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
$links['total-changes'] = $nchanges[$n];
} elseif ( $isnew ) {
}
# History
- if ( $allLogs ) {
+ if ( $allLogs || $rcObj->mAttribs['rc_type'] == RC_CATEGORIZE ) {
// don't show history link for logs
} elseif ( $namehidden || !$block0->getTitle()->exists() ) {
$links['history'] = $this->message['enhancedrc-history'];
}
# Diff and hist links
- if ( $type != RC_LOG ) {
+ if ( $type != RC_LOG && $type != RC_CATEGORIZE ) {
$query['action'] = 'history';
- $data['historyLink'] = ' ' . $this->msg( 'parentheses' )
- ->rawParams( $rcObj->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
- $rcObj->getTitle(),
- $this->message['hist'],
- array(),
- $query
- ) )->escaped();
+ $data['historyLink'] = $this->getDiffHistLinks( $rcObj, $query );
}
$data['separatorAfterLinks'] = ' <span class="mw-changeslist-separator">. .</span> ';
if ( $type == RC_LOG ) {
$data['logEntry'] = $this->insertLogEntry( $rcObj );
+ } elseif ( $this->isCategorizationWithoutRevision( $rcObj ) ) {
+ $data['comment'] = $this->insertComment( $rcObj );
} else {
$data['userLink'] = $rcObj->userlink;
$data['userTalkLink'] = $rcObj->usertalklink;
$data['comment'] = $this->insertComment( $rcObj );
+ if ( $type == RC_CATEGORIZE ) {
+ $data['historyLink'] = $this->getDiffHistLinks( $rcObj, $query );
+ }
$data['rollback'] = $this->getRollback( $rcObj );
}
return $line;
}
+ /**
+ * Returns value to be used in 'historyLink' element of $data param in
+ * EnhancedChangesListModifyBlockLineData hook.
+ *
+ * @since 1.27
+ *
+ * @param RCCacheEntry $rc
+ * @param array $query array of key/value pairs to append as a query string
+ * @return string HTML
+ */
+ public function getDiffHistLinks( RCCacheEntry $rc, array $query ) {
+ $pageTitle = $rc->getTitle();
+ if ( $rc->getAttribute( 'rc_type' ) == RC_CATEGORIZE ) {
+ // For categorizations we must swap the category title with the page title!
+ $pageTitle = Title::newFromID( $rc->getAttribute( 'rc_cur_id' ) );
+ }
+
+ $retVal = ' ' . $this->msg( 'parentheses' )
+ ->rawParams( $rc->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
+ $pageTitle,
+ $this->message['hist'],
+ array(),
+ $query
+ ) )->escaped();
+ return $retVal;
+ }
+
/**
* If enhanced RC is in use, this function takes the previously cached
* RC lines, arranges them, and outputs the HTML