Merge "Fix documentation lies about debug toolbar / cache interaction"
[lhc/web/wiklou.git] / includes / changes / EnhancedChangesList.php
index ed374b0..946c6d1 100644 (file)
@@ -63,19 +63,19 @@ class EnhancedChangesList extends ChangesList {
         * @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">';
        }
@@ -102,7 +102,7 @@ class EnhancedChangesList extends 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;
                }
@@ -123,7 +123,7 @@ class EnhancedChangesList extends ChangesList {
                $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 );
@@ -161,29 +161,32 @@ class EnhancedChangesList extends ChangesList {
        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?
@@ -192,7 +195,7 @@ class EnhancedChangesList extends ChangesList {
                        'minor' => true,
                        // Contains an unpatrolled edit?
                        'unpatrolled' => false,
-               );
+               ];
                foreach ( $block as $rcObj ) {
                        if ( $rcObj->mAttribs['rc_type'] == RC_NEW ) {
                                $collectedRcFlags['newpage'] = true;
@@ -231,7 +234,7 @@ class EnhancedChangesList extends ChangesList {
                # 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();
@@ -243,125 +246,125 @@ class EnhancedChangesList extends ChangesList {
                        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 .= '&#160;' . $block[0]->timestamp . '&#160;</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;
 
@@ -379,7 +382,7 @@ class EnhancedChangesList extends ChangesList {
                        $link = Linker::linkKnown(
                                $rcObj->getTitle(),
                                $rcObj->timestamp,
-                               array(),
+                               [],
                                $params
                        );
                        if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
@@ -427,30 +430,26 @@ class EnhancedChangesList extends ChangesList {
 
                // 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 .= '&#160;</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;
        }
 
        /**
@@ -469,8 +468,8 @@ class EnhancedChangesList extends ChangesList {
                }
 
                # Changes message
-               static $nchanges = array();
-               static $sinceLastVisitMsg = array();
+               static $nchanges = [];
+               static $sinceLastVisitMsg = [];
 
                $n = count( $block );
                if ( !isset( $nchanges[$n] ) ) {
@@ -500,36 +499,37 @@ class EnhancedChangesList extends ChangesList {
                }
 
                # 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' ]
                                                );
                                }
                        }
@@ -547,14 +547,14 @@ class EnhancedChangesList extends ChangesList {
                        $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 '';
@@ -572,13 +572,15 @@ class EnhancedChangesList extends ChangesList {
         * @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 );
@@ -586,16 +588,14 @@ class EnhancedChangesList extends ChangesList {
                        $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;
@@ -649,13 +649,13 @@ class EnhancedChangesList extends ChangesList {
 
                // 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>';
 
@@ -699,7 +699,7 @@ class EnhancedChangesList extends ChangesList {
                                ->rawParams( $rc->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
                                                $pageTitle,
                                                $this->message['hist'],
-                                               array(),
+                                               [],
                                                $query
                                        ) )->escaped();
                return $retVal;