From cdfdb50943d023ec1c1b14fe0dcdd42bb4acb9b8 Mon Sep 17 00:00:00 2001 From: Tim Starling Date: Sun, 28 Sep 2008 02:35:37 +0000 Subject: [PATCH] * Added the ability to set the target attribute on external links with $wgExternalLinkTarget * 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 | 2 ++ includes/DefaultSettings.php | 5 +++++ includes/Linker.php | 11 +++++------ includes/parser/Parser.php | 26 ++++++++++++++++++++++++-- includes/parser/ParserOptions.php | 5 +++++ includes/parser/Parser_OldPP.php | 18 ++++++++++++++++-- 6 files changed, 57 insertions(+), 10 deletions(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 13016ed1b7..9fd8564c7f 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -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 === diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index b54d3b9b53..3521bf1d72 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -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 diff --git a/includes/Linker.php b/includes/Linker.php index 529891cafe..bb1bf921f8 100644 --- a/includes/Linker.php +++ b/includes/Linker.php @@ -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 ''.$text.''; + return ''.$text.''; } /** diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index ca917f213c..1f560136ad 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -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 ö 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 diff --git a/includes/parser/ParserOptions.php b/includes/parser/ParserOptions.php index 2cde0197c3..5b8cd3ee64 100644 --- a/includes/parser/ParserOptions.php +++ b/includes/parser/ParserOptions.php @@ -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 ); } } diff --git a/includes/parser/Parser_OldPP.php b/includes/parser/Parser_OldPP.php index 415ef23fdf..106e439f47 100644 --- a/includes/parser/Parser_OldPP.php +++ b/includes/parser/Parser_OldPP.php @@ -1353,7 +1353,7 @@ class Parser_OldPP # This means that users can paste URLs directly into the text # Funny characters like ö 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 ); -- 2.20.1