* Added the ability to set the target attribute on external links with $wgExternalLin...
authorTim Starling <tstarling@users.mediawiki.org>
Sun, 28 Sep 2008 02:35:37 +0000 (02:35 +0000)
committerTim Starling <tstarling@users.mediawiki.org>
Sun, 28 Sep 2008 02:35:37 +0000 (02:35 +0000)
* Removed the namespace parameter from Linker::makeExternalLink(), added a generic associative array of attributes instead. Let the Parser decide whether to use rel=nofollow.

RELEASE-NOTES
includes/DefaultSettings.php
includes/Linker.php
includes/parser/Parser.php
includes/parser/ParserOptions.php
includes/parser/Parser_OldPP.php

index 13016ed..9fd8564 100644 (file)
@@ -142,6 +142,8 @@ The following extensions are migrated into MediaWiki 1.14:
 * Improved upload file type detection for OpenDocument formats
 * (bug 15739) Add $wgArticlePathForCurid to make links with only curid=# as the
   query string use the article path, rather than the script path
+* Added the ability to set the target attribute on external links with 
+  $wgExternalLinkTarget
 
 
 === Bug fixes in 1.14 ===
index b54d3b9..3521bf1 100644 (file)
@@ -2882,6 +2882,11 @@ $wgDisableInternalSearch = false;
  */
 $wgSearchForwardUrl = null;
 
+/**
+ * Set a default target for external links, e.g. _blank to pop up a new window
+ */
+$wgExternalLinkTarget = false;
+
 /**
  * If true, external URL links in wiki text will be given the
  * rel="nofollow" attribute as a hint to search engines that
index 529891c..bb1bf92 100644 (file)
@@ -990,11 +990,10 @@ class Linker {
        }
 
        /** @todo document */
-       function makeExternalLink( $url, $text, $escape = true, $linktype = '', $ns = null ) {
-               $style = $this->getExternalLinkAttributes( $url, $text, 'external ' . $linktype );
-               global $wgNoFollowLinks, $wgNoFollowNsExceptions;
-               if( $wgNoFollowLinks && !(isset($ns) && in_array($ns, $wgNoFollowNsExceptions)) ) {
-                       $style .= ' rel="nofollow"';
+       function makeExternalLink( $url, $text, $escape = true, $linktype = '', $attribs = array() ) {
+               $attribsText = $this->getExternalLinkAttributes( $url, $text, 'external ' . $linktype );
+               if ( $attribs ) {
+                       $attribsText .= ' ' . Xml::expandAttributes( $attribs );
                }
                $url = htmlspecialchars( $url );
                if( $escape ) {
@@ -1006,7 +1005,7 @@ class Linker {
                        wfDebug("Hook LinkerMakeExternalLink changed the output of link with url {$url} and text {$text} to {$link}", true);
                        return $link;
                }
-               return '<a href="'.$url.'"'.$style.'>'.$text.'</a>';
+               return '<a href="'.$url.'"'.$attribsText.'>'.$text.'</a>';
        }
 
        /**
index ca917f2..1f56013 100644 (file)
@@ -1118,7 +1118,8 @@ class Parser
                $text = $this->maybeMakeExternalImage( $url );
                if ( $text === false ) {
                        # Not an image, make a link
-                       $text = $sk->makeExternalLink( $url, $wgContLang->markNoConversion($url), true, 'free', $this->mTitle->getNamespace() );
+                       $text = $sk->makeExternalLink( $url, $wgContLang->markNoConversion($url), true, 'free', 
+                               $this->getExternalLinkAttribs() );
                        # Register it in the output object...
                        # Replace unnecessary URL escape codes with their equivalent characters
                        $pasteurized = self::replaceUnusualEscapes( $url );
@@ -1393,11 +1394,18 @@ class Parser
 
                        $url = Sanitizer::cleanUrl( $url );
 
+                       if ( $this->mOptions->mExternalLinkTarget ) {
+                               $attribs = array( 'target' => $this->mOptions->mExternalLinkTarget );
+                       } else {
+                               $attribs = array();
+                       }
+
                        # Use the encoded URL
                        # This means that users can paste URLs directly into the text
                        # Funny characters like &ouml; aren't valid in URLs anyway
                        # This was changed in August 2004
-                       $s .= $sk->makeExternalLink( $url, $text, false, $linktype, $this->mTitle->getNamespace() ) . $dtrail . $trail;
+                       $s .= $sk->makeExternalLink( $url, $text, false, $linktype, $this->getExternalLinkAttribs() ) 
+                               . $dtrail . $trail;
 
                        # Register link in the output object.
                        # Replace unnecessary URL escape codes with the referenced character
@@ -1410,6 +1418,20 @@ class Parser
                return $s;
        }
 
+       function getExternalLinkAttribs() {
+               $attribs = array();
+               global $wgNoFollowLinks, $wgNoFollowNsExceptions;
+               $ns = $this->mTitle->getNamespace();
+               if( $wgNoFollowLinks && !in_array($ns, $wgNoFollowNsExceptions) ) {
+                       $attribs['rel'] = 'nofollow';
+               }
+               if ( $this->mOptions->getExternalLinkTarget() ) {
+                       $attribs['target'] = $this->mOptions->getExternalLinkTarget();
+               }
+               return $attribs;
+       }
+
+
        /**
         * Replace unusual URL escape codes with their equivalent characters
         * @param string
index 2cde019..5b8cd3e 100644 (file)
@@ -30,6 +30,7 @@ class ParserOptions
        var $mTemplateCallback;          # Callback for template fetching
        var $mEnableLimitReport;         # Enable limit report in an HTML comment on output
        var $mTimestamp;                 # Timestamp used for {{CURRENTDAY}} etc.
+       var $mExternalLinkTarget;        # Target attribute for external links
 
        var $mUser;                      # Stored user object, just used to initialise the skin
 
@@ -52,6 +53,7 @@ class ParserOptions
        function getTemplateCallback()              { return $this->mTemplateCallback; }
        function getEnableLimitReport()             { return $this->mEnableLimitReport; }
        function getCleanSignatures()               { return $this->mCleanSignatures; }
+       function getExternalLinkTarget()            { return $this->mExternalLinkTarget; }
 
        function getSkin() {
                if ( !isset( $this->mSkin ) ) {
@@ -96,6 +98,7 @@ class ParserOptions
        function enableLimitReport( $x = true )     { return wfSetVar( $this->mEnableLimitReport, $x ); }
        function setTimestamp( $x )                 { return wfSetVar( $this->mTimestamp, $x ); }
        function setCleanSignatures( $x )           { return wfSetVar( $this->mCleanSignatures, $x ); }
+       function setExternalLinkTarget( $x )        { return wfSetVar( $this->mExternalLinkTarget, $x ); }
 
        function __construct( $user = null ) {
                $this->initialiseFromUser( $user );
@@ -114,6 +117,7 @@ class ParserOptions
                global $wgUseTeX, $wgUseDynamicDates, $wgInterwikiMagic, $wgAllowExternalImages;
                global $wgAllowExternalImagesFrom, $wgEnableImageWhitelist, $wgAllowSpecialInclusion, $wgMaxArticleSize;
                global $wgMaxPPNodeCount, $wgMaxTemplateDepth, $wgMaxPPExpandDepth, $wgCleanSignatures;
+               global $wgExternalLinkTarget;
                $fname = 'ParserOptions::initialiseFromUser';
                wfProfileIn( $fname );
                if ( !$userInput ) {
@@ -151,6 +155,7 @@ class ParserOptions
                $this->mTemplateCallback = array( 'Parser', 'statelessFetchTemplate' );
                $this->mEnableLimitReport = false;
                $this->mCleanSignatures = $wgCleanSignatures;
+               $this->mExternalLinkTarget = $wgExternalLinkTarget;
                wfProfileOut( $fname );
        }
 }
index 415ef23..106e439 100644 (file)
@@ -1353,7 +1353,7 @@ class Parser_OldPP
                        # This means that users can paste URLs directly into the text
                        # Funny characters like &ouml; aren't valid in URLs anyway
                        # This was changed in August 2004
-                       $s .= $sk->makeExternalLink( $url, $text, false, $linktype, $this->mTitle->getNamespace() ) . $dtrail . $trail;
+                       $s .= $sk->makeExternalLink( $url, $text, false, $linktype, $this->getExternalLinkAttribs() ) . $dtrail . $trail;
 
                        # Register link in the output object.
                        # Replace unnecessary URL escape codes with the referenced character
@@ -1366,6 +1366,19 @@ class Parser_OldPP
                return $s;
        }
 
+       function getExternalLinkAttribs() {
+               $attribs = array();
+               global $wgNoFollowLinks, $wgNoFollowNsExceptions;
+               $ns = $this->mTitle->getNamespace();
+               if( $wgNoFollowLinks && !in_array($ns, $wgNoFollowNsExceptions) ) {
+                       $attribs['rel'] = 'nofollow';
+               }
+               if ( $this->mOptions->getExternalLinkTarget() ) {
+                       $attribs['target'] = $this->mOptions->getExternalLinkTarget();
+               }
+               return $attribs;
+       }
+
        /**
         * Replace anything that looks like a URL with a link
         * @private
@@ -1432,7 +1445,8 @@ class Parser_OldPP
                                $text = $this->maybeMakeExternalImage( $url );
                                if ( $text === false ) {
                                        # Not an image, make a link
-                                       $text = $sk->makeExternalLink( $url, $wgContLang->markNoConversion($url), true, 'free', $this->mTitle->getNamespace() );
+                                       $text = $sk->makeExternalLink( $url, $wgContLang->markNoConversion($url), true, 'free',
+                                               $this->getExternalLinkAttribs() );
                                        # Register it in the output object...
                                        # Replace unnecessary URL escape codes with their equivalent characters
                                        $pasteurized = self::replaceUnusualEscapes( $url );