Merge "Bug 35671 - PHP Notice: Undefined index: gettoken in includes/api/ApiMain...
[lhc/web/wiklou.git] / includes / Linker.php
index ff9af75..918bebc 100644 (file)
@@ -20,10 +20,11 @@ class Linker {
         *
         * @param $class String: the contents of the class attribute; if an empty
         *   string is passed, which is the default value, defaults to 'external'.
+        * @return string
         * @deprecated since 1.18 Just pass the external class directly to something using Html::expandAttributes
         */
        static function getExternalLinkAttributes( $class = 'external' ) {
-               wfDeprecated( __METHOD__ );
+               wfDeprecated( __METHOD__, '1.18' );
                return self::getLinkAttributesInternal( '', $class );
        }
 
@@ -36,6 +37,7 @@ class Linker {
         * @param $unused String: unused
         * @param $class String: the contents of the class attribute; if an empty
         *   string is passed, which is the default value, defaults to 'external'.
+        * @return string
         */
        static function getInterwikiLinkAttributes( $title, $unused = null, $class = 'external' ) {
                global $wgContLang;
@@ -57,6 +59,7 @@ class Linker {
         *   not HTML-escaped
         * @param $unused String: unused
         * @param $class String: the contents of the class attribute, default none
+        * @return string
         */
        static function getInternalLinkAttributes( $title, $unused = null, $class = '' ) {
                $title = urldecode( $title );
@@ -73,6 +76,7 @@ class Linker {
         * @param $class String: the contents of the class attribute, default none
         * @param $title Mixed: optional (unescaped) string to use in the title
         *   attribute; if false, default to the name of the page we're linking to
+        * @return string
         */
        static function getInternalLinkAttributesObj( $nt, $unused = null, $class = '', $title = false ) {
                if ( $title === false ) {
@@ -135,6 +139,11 @@ class Linker {
         *      name of the target).
         * link() replaces the old functions in the makeLink() family.
         *
+        * @since 1.18 Method exists since 1.16 as non-static, made static in 1.18.
+        * You can call it using this if you want to keep compat with these:
+        * $linker = class_exists( 'DummyLinker' ) ? new DummyLinker() : new Linker();
+        * $linker->link( ... );
+        *
         * @param $target        Title  Can currently only be a Title, but this may
         *   change to support Images, literal URLs, etc.
         * @param $html          string The HTML contents of the <a> element, i.e.,
@@ -224,6 +233,7 @@ class Linker {
 
        /**
         * Identical to link(), except $options defaults to 'known'.
+        * @return string
         */
        public static function linkKnown(
                $target, $html = null, $customAttribs = array(),
@@ -236,6 +246,9 @@ class Linker {
         * Returns the Url used to link to a Title
         *
         * @param $target Title
+        * @param $query Array: query parameters
+        * @param $options Array
+        * @return String
         */
        private static function linkUrl( $target, $query, $options ) {
                wfProfileIn( __METHOD__ );
@@ -254,7 +267,7 @@ class Linker {
                        $query['action'] = 'edit';
                        $query['redlink'] = '1';
                }
-               $ret = $target->getLinkUrl( $query );
+               $ret = $target->getLinkURL( $query );
                wfProfileOut( __METHOD__ );
                return $ret;
        }
@@ -359,7 +372,7 @@ class Linker {
         */
        static function makeSizeLinkObj( $size, $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
                global $wgUser;
-               wfDeprecated( __METHOD__ );
+               wfDeprecated( __METHOD__, '1.17' );
 
                $threshold = $wgUser->getStubThreshold();
                $colour = ( $size < $threshold ) ? 'stub' : '';
@@ -602,8 +615,9 @@ class Linker {
        /**
         * Get the link parameters for MediaTransformOutput::toHtml() from given
         * frame parameters supplied by the Parser.
-        * @param $frameParams The frame parameters
-        * @param $query An optional query string to add to description page links
+        * @param $frameParams array The frame parameters
+        * @param $query string An optional query string to add to description page links
+        * @return array
         */
        private static function getImageLinkMTOParams( $frameParams, $query = '' ) {
                $mtoParams = array();
@@ -633,6 +647,7 @@ class Linker {
         * @param $params Array
         * @param $framed Boolean
         * @param $manualthumb String
+        * @return mixed
         */
        public static function makeThumbLinkObj( Title $title, $file, $label = '', $alt,
                $align = 'right', $params = array(), $framed = false , $manualthumb = "" )
@@ -841,7 +856,7 @@ class Linker {
         * This will make a broken link if $file is false.
         *
         * @param $title Title object.
-        * @param $file File|false mixed File object or false
+        * @param $file File|bool mixed File object or false
         * @param $html String: pre-sanitized HTML
         * @return String: HTML
         *
@@ -885,6 +900,7 @@ class Linker {
         * @param $escape Boolean: do we escape the link text?
         * @param $linktype String: type of external link. Gets added to the classes
         * @param $attribs Array of extra attributes to <a>
+        * @return string
         */
        public static function makeExternalLink( $url, $text, $escape = true, $linktype = '', $attribs = array() ) {
                $class = "external";
@@ -913,16 +929,23 @@ class Linker {
        /**
         * Make user link (or user contributions for unregistered users)
         * @param $userId   Integer: user id in database.
-        * @param $userText String: user name in database
+        * @param $userName String: user name in database.
+        * @param $altUserName String: text to display instead of the user name (optional)
         * @return String: HTML fragment
+        * @since 1.19 Method exists for a long time. $displayText was added in 1.19.
         */
-       public static function userLink( $userId, $userText ) {
+       public static function userLink( $userId, $userName, $altUserName = false ) {
                if ( $userId == 0 ) {
-                       $page = SpecialPage::getTitleFor( 'Contributions', $userText );
+                       $page = SpecialPage::getTitleFor( 'Contributions', $userName );
                } else {
-                       $page = Title::makeTitle( NS_USER, $userText );
+                       $page = Title::makeTitle( NS_USER, $userName );
                }
-               return self::link( $page, htmlspecialchars( $userText ), array( 'class' => 'mw-userlink' ) );
+
+               return self::link(
+                       $page,
+                       htmlspecialchars( $altUserName !== false ? $altUserName : $userName ),
+                       array( 'class' => 'mw-userlink' )
+               );
        }
 
        /**
@@ -969,8 +992,10 @@ class Linker {
                        $items[] = self::emailLink( $userId, $userText );
                }
 
+               wfRunHooks( 'UserToolLinksEdit', array( $userId, $userText, &$items ) );
+
                if ( $items ) {
-                       return ' <span class="mw-usertoollinks">(' . $wgLang->pipeList( $items ) . ')</span>';
+                       return ' <span class="mw-usertoollinks">' . wfMessage( 'parentheses' )->rawParams( $wgLang->pipeList( $items ) )->escaped() . '</span>';
                } else {
                        return '';
                }
@@ -981,6 +1006,7 @@ class Linker {
         * @param $userId Integer: user identifier
         * @param $userText String: user name or IP address
         * @param $edits Integer: user edit count (optional, for performance)
+        * @return String
         */
        public static function userToolLinksRedContribs( $userId, $userText, $edits = null ) {
                return self::userToolLinks( $userId, $userText, true, 0, $edits );
@@ -1079,6 +1105,7 @@ class Linker {
         * @param $comment String
         * @param $title Mixed: Title object (to generate link to the section in autocomment) or null
         * @param $local Boolean: whether section links should refer to local page
+        * @return mixed|String
         */
        public static function formatComment( $comment, $title = null, $local = false ) {
                wfProfileIn( __METHOD__ );
@@ -1110,7 +1137,7 @@ class Linker {
         * Called by Linker::formatComment.
         *
         * @param $comment String: comment text
-        * @param $title An optional title object used to links to sections
+        * @param $title Title|null An optional title object used to links to sections
         * @param $local Boolean: whether section links should refer to local page
         * @return String: formatted comment
         */
@@ -1132,6 +1159,7 @@ class Linker {
         * @return string
         */
        private static function formatAutocommentsCallback( $match ) {
+               global $wgLang;
                $title = self::$autocommentTitle;
                $local = self::$autocommentLocal;
 
@@ -1157,23 +1185,22 @@ class Linker {
                        }
                        if ( $sectionTitle ) {
                                $link = self::link( $sectionTitle,
-                                       htmlspecialchars( wfMsgForContent( 'sectionlink' ) ), array(), array(),
+                                       $wgLang->getArrow(), array(), array(),
                                        'noclasses' );
                        } else {
                                $link = '';
                        }
                }
-               $auto = "$link$auto";
                if ( $pre ) {
                        # written summary $presep autocomment (summary /* section */)
-                       $auto = wfMsgExt( 'autocomment-prefix', array( 'escapenoentities', 'content' ) ) . $auto;
+                       $pre .= wfMsgExt( 'autocomment-prefix', array( 'escapenoentities', 'content' ) );
                }
                if ( $post ) {
                        # autocomment $postsep written summary (/* section */ summary)
                        $auto .= wfMsgExt( 'colon-separator', array( 'escapenoentities', 'content' ) );
                }
                $auto = '<span class="autocomment">' . $auto . '</span>';
-               $comment = $pre . $auto . $post;
+               $comment = $pre . $link . $wgLang->getDirMark() . '<span dir="auto">' . $auto . $post . '</span>';
                return $comment;
        }
 
@@ -1189,7 +1216,7 @@ class Linker {
         *
         * @todo FIXME: Doesn't handle sub-links as in image thumb texts like the main parser
         * @param $comment String: text to format links in
-        * @param $title An optional title object used to links to sections
+        * @param $title Title|null An optional title object used to links to sections
         * @param $local Boolean: whether section links should refer to local page
         * @return String
         */
@@ -1372,7 +1399,8 @@ class Linker {
                        return '';
                } else {
                        $formatted = self::formatComment( $comment, $title, $local );
-                       return " <span class=\"comment\" dir=\"auto\">($formatted)</span>";
+                       $formatted = wfMessage( 'parentheses' )->rawParams( $formatted )->escaped();
+                       return " <span class=\"comment\">$formatted</span>";
                }
        }
 
@@ -1413,7 +1441,7 @@ class Linker {
                } else {
                        global $wgLang;
                        $stxt = wfMsgExt( 'nbytes', 'parsemag', $wgLang->formatNum( $size ) );
-                       $stxt = "($stxt)";
+                       $stxt = wfMessage( 'parentheses' )->rawParams( $stxt )->escaped();
                }
                $stxt = htmlspecialchars( $stxt );
                return "<span class=\"history-size\">$stxt</span>";
@@ -1457,6 +1485,7 @@ class Linker {
         * End a Table Of Contents line.
         * tocUnindent() will be used instead if we're ending a line below
         * the new level.
+        * @return string
         */
        public static function tocLineEnd() {
                return "</li>\n";
@@ -1482,7 +1511,7 @@ class Linker {
         * Generate a table of contents from a section tree
         * Currently unused.
         *
-        * @param $tree Return value of ParserOutput::getSections()
+        * @param $tree array Return value of ParserOutput::getSections()
         * @return String: HTML fragment
         */
        public static function generateTOC( $tree ) {
@@ -1535,6 +1564,7 @@ class Linker {
        /**
         * Split a link trail, return the "inside" portion and the remainder of the trail
         * as a two-element array
+        * @return array
         */
        static function splitTrail( $trail ) {
                global $wgContLang;
@@ -1562,6 +1592,7 @@ class Linker {
         * other users.
         *
         * @param $rev Revision object
+        * @return string
         */
        public static function generateRollback( $rev ) {
                return '<span class="mw-rollback-link">['
@@ -1581,7 +1612,7 @@ class Linker {
                $query = array(
                        'action' => 'rollback',
                        'from' => $rev->getUserText(),
-                       'token' => $wgUser->editToken( array( $title->getPrefixedText(), $rev->getUserText() ) ),
+                       'token' => $wgUser->getEditToken( array( $title->getPrefixedText(), $rev->getUserText() ) ),
                );
                if ( $wgRequest->getBool( 'bot' ) ) {
                        $query['bot'] = '1';
@@ -1692,7 +1723,7 @@ class Linker {
         * Format a size in bytes for output, using an appropriate
         * unit (B, KB, MB or GB) according to the magnitude in question
         *
-        * @param $size Size to format
+        * @param $size int Size to format
         * @return String
         */
        public static function formatSize( $size ) {
@@ -1713,10 +1744,6 @@ class Linker {
         *   escape), or false for no title attribute
         */
        public static function titleAttrib( $name, $options = null ) {
-               global $wgEnableTooltipsAndAccesskeys;
-               if ( !$wgEnableTooltipsAndAccesskeys )
-                       return false;
-
                wfProfileIn( __METHOD__ );
 
                $message = wfMessage( "tooltip-$name" );
@@ -1799,32 +1826,33 @@ class Linker {
         */
        public static function getRevDeleteLink( User $user, Revision $rev, Title $title ) {
                $canHide = $user->isAllowed( 'deleterevision' );
-               if ( $canHide || ( $rev->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) ) {
-                       if( !$rev->userCan( Revision::DELETED_RESTRICTED ) ) {
-                               $revdlink = Linker::revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
+               if ( !$canHide && !( $rev->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) ) {
+                       return '';
+               }
+
+               if ( !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) {
+                       return Linker::revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
+               } else {
+                       if ( $rev->getId() ) {
+                               // RevDelete links using revision ID are stable across
+                               // page deletion and undeletion; use when possible.
+                               $query = array(
+                                       'type'   => 'revision',
+                                       'target' => $title->getPrefixedDBkey(),
+                                       'ids'    => $rev->getId()
+                               );
                        } else {
-                               if ( $rev->getId() ) {
-                                       // RevDelete links using revision ID are stable across
-                                       // page deletion and undeletion; use when possible.
-                                       $query = array(
-                                               'type'   => 'revision',
-                                               'target' => $title->getPrefixedDBkey(),
-                                               'ids'    => $rev->getId()
-                                       );
-                               } else {
-                                       // Older deleted entries didn't save a revision ID.
-                                       // We have to refer to these by timestamp, ick!
-                                       $query = array(
-                                               'type'   => 'archive',
-                                               'target' => $title->getPrefixedDBkey(),
-                                               'ids'    => $rev->getTimestamp()
-                                       );
-                               }
-                               return Linker::revDeleteLink( $query,
-                                       $rev->isDeleted( File::DELETED_RESTRICTED ), $canHide );
+                               // Older deleted entries didn't save a revision ID.
+                               // We have to refer to these by timestamp, ick!
+                               $query = array(
+                                       'type'   => 'archive',
+                                       'target' => $title->getPrefixedDBkey(),
+                                       'ids'    => $rev->getTimestamp()
+                               );
                        }
+                       return Linker::revDeleteLink( $query,
+                               $rev->isDeleted( Revision::DELETED_RESTRICTED ), $canHide );
                }
-               return '';
        }
 
        /**
@@ -1842,7 +1870,7 @@ class Linker {
                $html = $delete ? wfMsgHtml( 'rev-delundel' ) : wfMsgHtml( 'rev-showdeleted' );
                $tag = $restricted ? 'strong' : 'span';
                $link = self::link( $sp, $html, array(), $query, array( 'known', 'noclasses' ) );
-               return Xml::tags( $tag, array( 'class' => 'mw-revdelundel-link' ), "($link)" );
+               return Xml::tags( $tag, array( 'class' => 'mw-revdelundel-link' ), wfMessage( 'parentheses' )->rawParams( $link )->escaped() );
        }
 
        /**
@@ -1855,7 +1883,7 @@ class Linker {
         */
        public static function revDeleteLinkDisabled( $delete = true ) {
                $html = $delete ? wfMsgHtml( 'rev-delundel' ) : wfMsgHtml( 'rev-showdeleted' );
-               return Xml::tags( 'span', array( 'class' => 'mw-revdelundel-link' ), "($html)" );
+               return Xml::tags( 'span', array( 'class' => 'mw-revdelundel-link' ), wfMessage( 'parentheses' )->rawParams( $html )->escaped() );
        }
 
        /* Deprecated methods */
@@ -1872,8 +1900,11 @@ class Linker {
         * @param $trail String: Optional trail. Alphabetic characters at the start of this string will
         *               be included in the link text. Other characters will be appended after
         *               the end of the link.
+        * @return string
         */
        static function makeBrokenLink( $title, $text = '', $query = '', $trail = '' ) {
+               wfDeprecated( __METHOD__, '1.16' );
+               
                $nt = Title::newFromText( $title );
                if ( $nt instanceof Title ) {
                        return self::makeBrokenLinkObj( $nt, $text, $query, $trail );
@@ -1898,8 +1929,11 @@ class Linker {
         *                      be included in the link text. Other characters will be appended after
         *                      the end of the link.
         * @param $prefix String: optional prefix. As trail, only before instead of after.
+        * @return string
         */
        static function makeLinkObj( $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
+               # wfDeprecated( __METHOD__, '1.16' ); // See r105985 and it's revert. Somewhere still used.
+               
                wfProfileIn( __METHOD__ );
                $query = wfCgiToArray( $query );
                list( $inside, $trail ) = self::splitTrail( $trail );
@@ -1927,11 +1961,13 @@ class Linker {
         * @param $prefix String: text before link text
         * @param $aprops String: extra attributes to the a-element
         * @param $style  String: style to apply - if empty, use getInternalLinkAttributesObj instead
-        * @return the a-element
+        * @return string the a-element
         */
        static function makeKnownLinkObj(
                $title, $text = '', $query = '', $trail = '', $prefix = '' , $aprops = '', $style = ''
        ) {
+               # wfDeprecated( __METHOD__, '1.16' ); // See r105985 and it's revert. Somewhere still used.
+               
                wfProfileIn( __METHOD__ );
 
                if ( $text == '' ) {
@@ -1963,8 +1999,11 @@ class Linker {
         *                      be included in the link text. Other characters will be appended after
         *                      the end of the link.
         * @param $prefix String: Optional prefix
+        * @return string
         */
        static function makeBrokenLinkObj( $title, $text = '', $query = '', $trail = '', $prefix = '' ) {
+               wfDeprecated( __METHOD__, '1.16' );
+               
                wfProfileIn( __METHOD__ );
 
                list( $inside, $trail ) = self::splitTrail( $trail );
@@ -1992,8 +2031,11 @@ class Linker {
         *                      be included in the link text. Other characters will be appended after
         *                      the end of the link.
         * @param $prefix String: Optional prefix
+        * @return string
         */
        static function makeColouredLinkObj( $nt, $colour, $text = '', $query = '', $trail = '', $prefix = '' ) {
+               wfDeprecated( __METHOD__, '1.16' );
+               
                if ( $colour != '' ) {
                        $style = self::getInternalLinkAttributesObj( $nt, $text, $colour );
                } else {
@@ -2004,11 +2046,9 @@ class Linker {
 
        /**
         * Returns the attributes for the tooltip and access key.
+        * @return array
         */
        public static function tooltipAndAccesskeyAttribs( $name ) {
-               global $wgEnableTooltipsAndAccesskeys;
-               if ( !$wgEnableTooltipsAndAccesskeys )
-                       return array();
                # @todo FIXME: If Sanitizer::expandAttributes() treated "false" as "output
                # no attribute" instead of "output '' as value for attribute", this
                # would be three lines.
@@ -2026,13 +2066,10 @@ class Linker {
        }
 
        /**
-        * @deprecated since 1.14
         * Returns raw bits of HTML, use titleAttrib()
+        * @return null|string
         */
        public static function tooltip( $name, $options = null ) {
-               global $wgEnableTooltipsAndAccesskeys;
-               if ( !$wgEnableTooltipsAndAccesskeys )
-                       return '';
                # @todo FIXME: If Sanitizer::expandAttributes() treated "false" as "output
                # no attribute" instead of "output '' as value for attribute", this
                # would be two lines.
@@ -2057,6 +2094,7 @@ class DummyLinker {
         *
         * @param $fname String Name of called method
         * @param $args Array Arguments to the method
+        * @return mixed
         */
        public function __call( $fname, $args ) {
                return call_user_func_array( array( 'Linker', $fname ), $args );