Merged ImageFunctions.php into GlobalFunctions.php
[lhc/web/wiklou.git] / includes / ChangesList.php
index 1a04930..e0183c4 100644 (file)
@@ -63,10 +63,11 @@ class ChangesList extends ContextSource {
         * This first argument used to be an User object.
         *
         * @deprecated in 1.18; use newFromContext() instead
-        * @param $unused Unused
+        * @param $unused string|User Unused
         * @return ChangesList|EnhancedChangesList|OldChangesList derivative
         */
        public static function newFromUser( $unused ) {
+               wfDeprecated( __METHOD__, '1.18' );
                return self::newFromContext( RequestContext::getMain() );
        }
 
@@ -216,9 +217,11 @@ class ChangesList extends ContextSource {
                        $formattedSizeClass = 'mw-plusminus-neg';
                }
 
+               $formattedTotalSize = wfMsgExt( 'rc-change-size-new', 'parsemag', $wgLang->formatNum( $new ) );
+
                return Html::element( $tag,
-                       array( 'dir' => 'ltr', 'class' => $formattedSizeClass ),
-                       "($formattedSize)" );
+                       array( 'dir' => 'ltr', 'class' => $formattedSizeClass, 'title' => $formattedTotalSize ),
+                       wfMessage( 'parentheses', $formattedSize )->plain() ) . $wgLang->getDirMark();
        }
 
        /**
@@ -235,7 +238,7 @@ class ChangesList extends ContextSource {
 
        public function insertDateHeader( &$s, $rc_timestamp ) {
                # Make date header if necessary
-               $date = $this->getLang()->date( $rc_timestamp, true, true );
+               $date = $this->getLanguage()->date( $rc_timestamp, true, true );
                if( $date != $this->lastdate ) {
                        if( $this->lastdate != '' ) {
                                $s .= "</ul>\n";
@@ -249,14 +252,13 @@ class ChangesList extends ContextSource {
        public function insertLog( &$s, $title, $logtype ) {
                $page = new LogPage( $logtype );
                $logname = $page->getName()->escaped();
-               $s .= '(' . Linker::linkKnown( $title, $logname ) . ')';
+               $s .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $title, $logname ) )->escaped();
        }
 
        /**
         * @param $s
         * @param $rc RecentChange
         * @param $unpatrolled
-        * @return void
         */
        public function insertDiffHist( &$s, &$rc, $unpatrolled ) {
                # Diff link
@@ -282,9 +284,9 @@ class ChangesList extends ContextSource {
                                $query
                        );
                }
-               $s .= '(' . $diffLink . $this->message['pipe-separator'];
+               $diffhist = $diffLink . $this->message['pipe-separator'];
                # History link
-               $s .= Linker::linkKnown(
+               $diffhist .= Linker::linkKnown(
                        $rc->getTitle(),
                        $this->message['hist'],
                        array(),
@@ -293,7 +295,7 @@ class ChangesList extends ContextSource {
                                'action' => 'history'
                        )
                );
-               $s .= ') . . ';
+               $s .= $this->msg( 'parentheses' )->rawParams( $diffhist )->escaped() . ' . . ';
        }
 
        /**
@@ -301,7 +303,6 @@ class ChangesList extends ContextSource {
         * @param $rc RecentChange
         * @param $unpatrolled
         * @param $watched
-        * @return void
         */
        public function insertArticleLink( &$s, &$rc, $unpatrolled, $watched ) {
                # If it's a new article, there is no diff link, but if it hasn't been
@@ -326,7 +327,7 @@ class ChangesList extends ContextSource {
                        $articlelink = "<strong class=\"mw-watched\">{$articlelink}</strong>";
                }
                # RTL/LTR marker
-               $articlelink .= $this->getLang()->getDirMark();
+               $articlelink .= $this->getLanguage()->getDirMark();
 
                wfRunHooks( 'ChangesListInsertArticleLink',
                        array(&$this, &$articlelink, &$s, &$rc, $unpatrolled, $watched) );
@@ -337,40 +338,45 @@ class ChangesList extends ContextSource {
        /**
         * @param $s
         * @param $rc RecentChange
-        * @return void
         */
        public function insertTimestamp( &$s, $rc ) {
                $s .= $this->message['semicolon-separator'] .
-                       $this->getLang()->time( $rc->mAttribs['rc_timestamp'], true, true ) . ' . . ';
+                       $this->getLanguage()->time( $rc->mAttribs['rc_timestamp'], true, true ) . ' . . ';
        }
 
-       /** Insert links to user page, user talk page and eventually a blocking link
+       /**
+        * Insert links to user page, user talk page and eventually a blocking link
         *
-        * @param $rc RecentChange
+        * @param &$s String HTML to update
+        * @param &$rc RecentChange
         */
        public function insertUserRelatedLinks( &$s, &$rc ) {
                if( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
                        $s .= ' <span class="history-deleted">' . wfMsgHtml( 'rev-deleted-user' ) . '</span>';
                } else {
-                       $s .= $this->getLang()->getDirMark() . Linker::userLink( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
+                       $s .= $this->getLanguage()->getDirMark() . Linker::userLink( $rc->mAttribs['rc_user'],
+                               $rc->mAttribs['rc_user_text'] );
                        $s .= Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
                }
        }
 
-       /** insert a formatted action
+       /**
+        * Insert a formatted action
         *
         * @param $rc RecentChange
+        * @return string
         */
        public function insertLogEntry( $rc ) {
                $formatter = LogFormatter::newFromRow( $rc->mAttribs );
                $formatter->setShowUserToolLinks( true );
-               $mark = $this->getLang()->getDirMark();
+               $mark = $this->getLanguage()->getDirMark();
                return $formatter->getActionText() . " $mark" . $formatter->getComment();
        }
 
        /** 
         * Insert a formatted comment
         * @param $rc RecentChange
+        * @return string
         */
        public function insertComment( $rc ) {
                if( $rc->mAttribs['rc_type'] != RC_MOVE && $rc->mAttribs['rc_type'] != RC_MOVE_OVER_REDIRECT ) {
@@ -393,13 +399,14 @@ class ChangesList extends ContextSource {
 
        /**
         * Returns the string which indicates the number of watching users
+        * @return string
         */
        protected function numberofWatchingusers( $count ) {
                static $cache = array();
                if( $count > 0 ) {
                        if( !isset( $cache[$count] ) ) {
                                $cache[$count] = wfMsgExt( 'number_of_watching_users_RCview',
-                                       array('parsemag', 'escape' ), $this->getLang()->formatNum( $count ) );
+                                       array('parsemag', 'escape' ), $this->getLanguage()->formatNum( $count ) );
                        }
                        return $cache[$count];
                } else {
@@ -433,6 +440,11 @@ class ChangesList extends ContextSource {
                }
        }
 
+       /**
+        * @param $link string
+        * @param $watched bool
+        * @return string
+        */
        protected function maybeWatchedLink( $link, $watched = false ) {
                if( $watched ) {
                        return '<strong class="mw-watched">' . $link . '</strong>';
@@ -443,7 +455,7 @@ class ChangesList extends ContextSource {
 
        /** Inserts a rollback link
         *
-        * @param $s
+        * @param $s string
         * @param $rc RecentChange
         */
        public function insertRollback( &$s, &$rc ) {
@@ -466,10 +478,9 @@ class ChangesList extends ContextSource {
        }
 
        /**
-        * @param $s
+        * @param $s string
         * @param $rc RecentChange
         * @param $classes
-        * @return
         */
        public function insertTags( &$s, &$rc, &$classes ) {
                if ( empty($rc->mAttribs['ts_tags']) )
@@ -483,6 +494,18 @@ class ChangesList extends ContextSource {
        public function insertExtra( &$s, &$rc, &$classes ) {
                ## Empty, used for subclassers to add anything special.
        }
+
+       protected function showAsUnpatrolled( RecentChange $rc ) {
+               $unpatrolled = false;
+               if ( !$rc->mAttribs['rc_patrolled'] ) {
+                       if ( $this->getUser()->useRCPatrol() ) {
+                               $unpatrolled = true;
+                       } elseif ( $this->getUser()->useNPPatrol() && $rc->mAttribs['rc_new'] ) {
+                               $unpatrolled = true;
+                       }
+               }
+               return $unpatrolled;
+       }
 }
 
 
@@ -494,12 +517,14 @@ class OldChangesList extends ChangesList {
         * Format a line using the old system (aka without any javascript).
         *
         * @param $rc RecentChange
+        * @return string
         */
        public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
                global $wgRCShowChangedSize;
                wfProfileIn( __METHOD__ );
+
                # Should patrol-related stuff be shown?
-               $unpatrolled = $this->getUser()->useRCPatrol() && !$rc->mAttribs['rc_patrolled'];
+               $unpatrolled = $this->showAsUnpatrolled( $rc );
 
                $dateheader = ''; // $s now contains only <li>...</li>, for hooks' convenience.
                $this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] );
@@ -559,7 +584,7 @@ class OldChangesList extends ChangesList {
                        # User tool links
                        $this->insertUserRelatedLinks( $s, $rc );
                        # LTR/RTL direction mark
-                       $s .= $this->getLang()->getDirMark();
+                       $s .= $this->getLanguage()->getDirMark();
                        $s .= $this->insertComment( $rc );
                }
 
@@ -573,7 +598,7 @@ class OldChangesList extends ChangesList {
                # How many users watch this page
                if( $rc->numberofWatchingusers > 0 ) {
                        $s .= ' ' . wfMsgExt( 'number_of_watching_users_RCview',
-                               array( 'parsemag', 'escape' ), $this->getLang()->formatNum( $rc->numberofWatchingusers ) );
+                               array( 'parsemag', 'escape' ), $this->getLanguage()->formatNum( $rc->numberofWatchingusers ) );
                }
 
                if( $this->watchlist ) {
@@ -592,6 +617,9 @@ class OldChangesList extends ChangesList {
  * Generate a list of changes using an Enhanced system (uses javascript).
  */
 class EnhancedChangesList extends ChangesList {
+
+       protected $rc_cache;
+
        /**
         * Add the JavaScript file for enhanced changeslist
         * @return String
@@ -622,7 +650,7 @@ class EnhancedChangesList extends ChangesList {
                $curIdEq = array( 'curid' => $rc->mAttribs['rc_cur_id'] );
 
                # If it's a new day, add the headline and flush the cache
-               $date = $this->getLang()->date( $rc->mAttribs['rc_timestamp'], true );
+               $date = $this->getLanguage()->date( $rc->mAttribs['rc_timestamp'], true );
                $ret = '';
                if( $date != $this->lastdate ) {
                        # Process current cache
@@ -633,11 +661,7 @@ class EnhancedChangesList extends ChangesList {
                }
 
                # Should patrol-related stuff be shown?
-               if( $this->getUser()->useRCPatrol() ) {
-                       $rc->unpatrolled = !$rc->mAttribs['rc_patrolled'];
-               } else {
-                       $rc->unpatrolled = false;
-               }
+               $rc->unpatrolled = $this->showAsUnpatrolled( $rc );
 
                $showdifflinks = true;
                # Make article link
@@ -653,23 +677,17 @@ class EnhancedChangesList extends ChangesList {
                } elseif( $type == RC_LOG ) {
                        if( $logType ) {
                                $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
-                               $clink = '(' . Linker::linkKnown( $logtitle,
-                                       LogPage::logName( $logType ) ) . ')';
+                               $logpage = new LogPage( $logType );
+                               $logname = $logpage->getName()->escaped();
+                               $clink = $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logtitle, $logname ) )->escaped();
                        } else {
                                $clink = Linker::link( $rc->getTitle() );
                        }
                        $watched = false;
                // Log entries (old format) and special pages
                } elseif( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
-                       list( $specialName, $logtype ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] );
-                       if ( $specialName == 'Log' ) {
-                               # Log updates, etc
-                               $logname = LogPage::logName( $logtype );
-                               $clink = '(' . Linker::linkKnown( $rc->getTitle(), $logname ) . ')';
-                       } else {
-                               wfDebug( "Unexpected special page in recentchanges\n" );
-                               $clink = '';
-                       }
+                       wfDebug( "Unexpected special page in recentchanges\n" );
+                       $clink = '';
                // Edits
                } else {
                        $clink = Linker::linkKnown( $rc->getTitle() );
@@ -680,7 +698,7 @@ class EnhancedChangesList extends ChangesList {
                        $showdifflinks = false;
                }
 
-               $time = $this->getLang()->time( $rc->mAttribs['rc_timestamp'], true, true );
+               $time = $this->getLanguage()->time( $rc->mAttribs['rc_timestamp'], true, true );
                $rc->watched = $watched;
                $rc->link = $clink;
                $rc->timestamp = $time;
@@ -706,13 +724,13 @@ class EnhancedChangesList extends ChangesList {
                        if ( $type != RC_NEW ) {
                                $curLink = $this->message['cur'];
                        } else {
-                               $curUrl = htmlspecialchars( $rc->getTitle()->getLinkUrl( $querycur ) );
+                               $curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) );
                                $curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
                        }
                        $diffLink = $this->message['diff'];
                } else {
-                       $diffUrl = htmlspecialchars( $rc->getTitle()->getLinkUrl( $querydiff ) );
-                       $curUrl = htmlspecialchars( $rc->getTitle()->getLinkUrl( $querycur ) );
+                       $diffUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querydiff ) );
+                       $curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) );
                        $diffLink = "<a href=\"$diffUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['diff']}</a>";
                        $curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
                }
@@ -765,6 +783,7 @@ class EnhancedChangesList extends ChangesList {
 
        /**
         * Enhanced RC group
+        * @return string
         */
        protected function recentChangesBlockGroup( $block ) {
                global $wgRCShowChangedSize;
@@ -774,9 +793,11 @@ class EnhancedChangesList extends ChangesList {
                # Add the namespace and title of the block as part of the class
                if ( $block[0]->mAttribs['rc_log_type'] ) {
                        # Log entry
-                       $classes = 'mw-collapsible mw-collapsed mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-log-' . $block[0]->mAttribs['rc_log_type'] . '-' . $block[0]->mAttribs['rc_title'] );
+                       $classes = 'mw-collapsible mw-collapsed mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-log-'
+                                       . $block[0]->mAttribs['rc_log_type'] . '-' . $block[0]->mAttribs['rc_title'] );
                } else {
-                       $classes = 'mw-collapsible mw-collapsed mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-ns' . $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] );
+                       $classes = 'mw-collapsible mw-collapsed mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-ns'
+                                       . $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] );
                }
                $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
                        Html::openElement( 'tr' );
@@ -829,9 +850,9 @@ class EnhancedChangesList extends ChangesList {
                $users = array();
                foreach( $userlinks as $userlink => $count) {
                        $text = $userlink;
-                       $text .= $this->getLang()->getDirMark();
+                       $text .= $this->getLanguage()->getDirMark();
                        if( $count > 1 ) {
-                               $text .= ' (' . $this->getLang()->formatNum( $count ) . '×)';
+                               $text .= ' ' . $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->formatNum( $count ) . '×' )->escaped();
                        }
                        array_push( $users, $text );
                }
@@ -839,16 +860,7 @@ class EnhancedChangesList extends ChangesList {
                $users = ' <span class="changedby">[' .
                        implode( $this->message['semicolon-separator'], $users ) . ']</span>';
 
-               # Title for <a> tags
-               $expandTitle = htmlspecialchars( wfMsg( 'rc-enhanced-expand' ) );
-               $closeTitle = htmlspecialchars( wfMsg( 'rc-enhanced-hide' ) );
-
-               $tl = "<span class='mw-collapsible-toggle'>"
-                       . "<span class='mw-rc-openarrow'>"
-                       . "<a href='#' title='$expandTitle'>{$this->sideArrow()}</a>"
-                       . "</span><span class='mw-rc-closearrow'>"
-                       . "<a href='#' title='$closeTitle'>{$this->downArrow()}</a>"
-                       . "</span></span>";
+               $tl = '<span class="mw-collapsible-toggle mw-enhancedchanges-arrow"></span>';
                $r .= "<td>$tl</td>";
 
                # Main line
@@ -871,29 +883,29 @@ class EnhancedChangesList extends ChangesList {
                        $this->insertArticleLink( $r, $block[0], $block[0]->unpatrolled, $block[0]->watched );
                }
 
-               $r .= $this->getLang()->getDirMark();
+               $r .= $this->getLanguage()->getDirMark();
 
                $queryParams['curid'] = $curId;
                # Changes message
                $n = count($block);
                static $nchanges = array();
                if ( !isset( $nchanges[$n] ) ) {
-                       $nchanges[$n] = wfMsgExt( 'nchanges', array( 'parsemag', 'escape' ), $this->getLang()->formatNum( $n ) );
+                       $nchanges[$n] = wfMsgExt( 'nchanges', array( 'parsemag', 'escape' ), $this->getLanguage()->formatNum( $n ) );
                }
                # Total change link
                $r .= ' ';
+               $logtext = '';
                if( !$allLogs ) {
-                       $r .= '(';
                        if( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
-                               $r .= $nchanges[$n];
+                               $logtext .= $nchanges[$n];
                        } elseif( $isnew ) {
-                               $r .= $nchanges[$n];
+                               $logtext .= $nchanges[$n];
                        } else {
                                $params = $queryParams;
                                $params['diff'] = $currentRevision;
                                $params['oldid'] = $oldid;
 
-                               $r .= Linker::link(
+                               $logtext .= Linker::link(
                                        $block[0]->getTitle(),
                                        $nchanges[$n],
                                        array(),
@@ -907,19 +919,24 @@ class EnhancedChangesList extends ChangesList {
                if( $allLogs ) {
                        // don't show history link for logs
                } elseif( $namehidden || !$block[0]->getTitle()->exists() ) {
-                       $r .= $this->message['pipe-separator'] . $this->message['hist'] . ')';
+                       $logtext .= $this->message['pipe-separator'] . $this->message['hist'];
                } else {
                        $params = $queryParams;
                        $params['action'] = 'history';
 
-                       $r .= $this->message['pipe-separator'] .
+                       $logtext .= $this->message['pipe-separator'] .
                                Linker::linkKnown(
                                        $block[0]->getTitle(),
                                        $this->message['hist'],
                                        array(),
                                        $params
-                               ) . ')';
+                               );
                }
+
+               if( $logtext !== '' ) {
+                       $r .= $this->msg( 'parentheses' )->rawParams( $logtext )->escaped();
+               }
+
                $r .= ' . . ';
 
                # Character difference (does not apply if only log items)
@@ -953,7 +970,6 @@ class EnhancedChangesList extends ChangesList {
                        $classes = array();
                        $type = $rcObj->mAttribs['rc_type'];
 
-                       #$r .= '<tr><td valign="top">'.$this->spacerArrow();
                        $r .= '<tr><td></td><td class="mw-enhanced-rc">';
                        $r .= $this->recentChangesFlags( array(
                                'newpage' => $rcObj->mAttribs['rc_new'],
@@ -992,11 +1008,7 @@ class EnhancedChangesList extends ChangesList {
                        $r .= $link . '</span>';
 
                        if ( !$type == RC_LOG || $type == RC_NEW ) {
-                               $r .= ' (';
-                               $r .= $rcObj->curlink;
-                               $r .= $this->message['pipe-separator'];
-                               $r .= $rcObj->lastlink;
-                               $r .= ')';
+                               $r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->curlink . $this->message['pipe-separator'] . $rcObj->lastlink )->escaped();
                        }
                        $r .= ' . . ';
 
@@ -1089,14 +1101,16 @@ class EnhancedChangesList extends ChangesList {
                $logType = $rcObj->mAttribs['rc_log_type'];
                if( $logType ) {
                        # Log entry
-                       $classes = 'mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-log-' . $logType . '-' . $rcObj->mAttribs['rc_title'] );
+                       $classes = 'mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-log-'
+                                       . $logType . '-' . $rcObj->mAttribs['rc_title'] );
                } else {
-                       $classes = 'mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-ns' . $rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] );
+                       $classes = 'mw-enhanced-rc ' . Sanitizer::escapeClass( 'mw-changeslist-ns' .
+                                       $rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] );
                }
                $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
                        Html::openElement( 'tr' );
 
-               $r .= '<td class="mw-enhanced-rc">' . $this->spacerArrow();
+               $r .= '<td class="mw-enhanced-rc"><span class="mw-enhancedchanges-arrow mw-enhancedchanges-arrow-space"></span>';
                # Flag and Timestamp
                if( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
                        $r .= '&#160;&#160;&#160;&#160;'; // 4 flags -> 4 spaces
@@ -1113,20 +1127,19 @@ class EnhancedChangesList extends ChangesList {
                if( $logType ) {
                        $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
                        $logname = LogPage::logName( $logType );
-                       $r .= '(' . Linker::linkKnown( $logtitle, htmlspecialchars( $logname ) ) . ')';
+                       $r .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logtitle, htmlspecialchars( $logname ) ) )->escaped();
                } else {
                        $this->insertArticleLink( $r, $rcObj, $rcObj->unpatrolled, $rcObj->watched );
                }
                # Diff and hist links
                if ( $type != RC_LOG ) {
-                       $r .= ' ('. $rcObj->difflink . $this->message['pipe-separator'];
                        $query['action'] = 'history';
-                       $r .= Linker::linkKnown(
+                       $r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
                                $rcObj->getTitle(),
                                $this->message['hist'],
                                array(),
                                $query
-                       ) . ')';
+                       ) )->escaped();
                }
                $r .= ' . . ';
                # Character diff
@@ -1185,6 +1198,7 @@ class EnhancedChangesList extends ChangesList {
        /**
         * Returns text for the end of RC
         * If enhanced RC is in use, returns pretty much all the text
+        * @return string
         */
        public function endRecentChangesList() {
                return $this->recentChangesBlock() . parent::endRecentChangesList();