From 110c0bb72f6e378db162d83a3b427a7bb4cd2d4a Mon Sep 17 00:00:00 2001 From: Tim Starling Date: Tue, 30 Sep 2008 01:00:40 +0000 Subject: [PATCH] Revert revert r41406 of r41333, and removed one space between attributes. --- 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 bd66b48ccf..5e789346c2 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -140,6 +140,8 @@ The following extensions are migrated into MediaWiki 1.14: restriction types on the protection form. * (bug 8440) Allow preventing blocked users from editing their talk pages * Improved upload file type detection for OpenDocument formats +* 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 a7a975b1ca..78b7327b7c 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -2890,6 +2890,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..dd899fec7b 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 a8556eb24b..9e8ed0cecb 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 ); @@ -1394,11 +1395,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 @@ -1411,6 +1419,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