Fix bug 20339 allow pipe-trick in log reasons
follows on from r62069 moving logic from Parser into Linker (copying brion's technique for dealing with subpages)
This commit is contained in:
parent
0443dd4c5c
commit
fe91f53371
4 changed files with 100 additions and 56 deletions
|
|
@ -835,6 +835,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
|
|||
* (bug 845) [[#foo|]], [[/bar|]] should be equivalent to [[#foo|foo]], [[/bar|bar]] (new use of "pipe trick")
|
||||
* (bug 21660) Support full-width commas for pipe trick
|
||||
* (bug 7264) Magic word to give Page Title as if pipe-trick performed on it {{pipetrick:}}
|
||||
* (bug 20339) Allow using the pipe trick in log reasons
|
||||
|
||||
=== Languages updated in 1.16 ===
|
||||
|
||||
|
|
|
|||
|
|
@ -1086,6 +1086,11 @@ class Linker {
|
|||
# Handle link renaming [[foo|text]] will show link as "text"
|
||||
if( $match[3] != "" ) {
|
||||
$text = $match[3];
|
||||
if( $match[1] === "" && $this->commentContextTitle ) {
|
||||
$match[1] = Linker::getPipeTrickLink( $text, $this->commentContextTitle );
|
||||
}
|
||||
} elseif( $match[2] == "|" ) {
|
||||
$text = Linker::getPipeTrickText( $match[1] );
|
||||
} else {
|
||||
$text = $match[1];
|
||||
}
|
||||
|
|
@ -1205,6 +1210,79 @@ class Linker {
|
|||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns valid title characters and namespace characters for pipe trick.
|
||||
*
|
||||
* FIXME: the namespace characters should not be specified like this...
|
||||
*/
|
||||
static function getPipeTrickCharacterClasses() {
|
||||
global $wgLegalTitleChars;
|
||||
return array( "[$wgLegalTitleChars]", '[ _0-9A-Za-z\x80-\xff-]' );
|
||||
}
|
||||
|
||||
/**
|
||||
* From the [[title|]] return link-text as though the used typed [[title|link-text]]
|
||||
*
|
||||
* For most links this be as though the user typed [[ns:title|title]]
|
||||
* However [[ns:title (context)|]], [[ns:title, context|]] and [[ns:title (context), context|]]
|
||||
* [[#title (context)|]] [[../context/title (context), context|]]
|
||||
* all return the |title]] with no context or indicative punctuation.
|
||||
*
|
||||
* @param string $link from [[$link|]]
|
||||
* @return string $text for [[$link|$text]]
|
||||
*/
|
||||
static function getPipeTrickText( $link ) {
|
||||
static $rexps = FALSE;
|
||||
if( !$rexps ) {
|
||||
list( $tc, $nc ) = Linker::getPipeTrickCharacterClasses();
|
||||
$rexps = array (
|
||||
# try this first, to turn "[[A, B (C)|]]" into "A, B"
|
||||
"/^(:?$nc+:|[:#\/]|$tc+\\/|)($tc+?)( \\($tc+\\)| ($tc+))$/", # [[ns:page (context)|]]
|
||||
"/^(:?$nc+:|[:#\/]|$tc+\\/|)($tc+?)( \\($tc+\\)| ($tc+)|)((?:,|,) $tc+|)$/", # [[ns:page (context), context|]]
|
||||
);
|
||||
}
|
||||
$text = urldecode( $link );
|
||||
|
||||
for( $i = 0; $i < count( $rexps ); $i++) {
|
||||
if( preg_match( $rexps[$i], $text, $m ) )
|
||||
return $m[2];
|
||||
}
|
||||
return $text;
|
||||
}
|
||||
|
||||
/**
|
||||
* From the [[|link-text]] return the title as though the user typed [[title|link-text]]
|
||||
*
|
||||
* On most pages this will return link-text or "" if the link-text is not a valid title
|
||||
* On pages like [[ns:title (context)]] and [[ns:title, context]] it will act like
|
||||
* [[ns:link-text (context)|link-text]] and [[ns:link-text, context|link-text]]
|
||||
*
|
||||
* @param string $text from [[|$text]]
|
||||
* @param Title $title to resolve the link against
|
||||
* @return string $link for [[$link|$text]]
|
||||
*/
|
||||
static function getPipeTrickLink( $text, $title ) {
|
||||
static $rexps = FALSE, $tc;
|
||||
if( !$rexps ) {
|
||||
list( $tc, $nc ) = Linker::getPipeTrickCharacterClasses();
|
||||
$rexps = array (
|
||||
"/^($nc+:|)$tc+?( \\($tc+\\)| ($tc+))$/", # [[ns:page (context)|]]
|
||||
"/^($nc+:|)$tc+?(?:(?: \\($tc+\\)| ($tc+)|)((?:,|,) $tc+|))$/" # [[ns:page (context), context|]]
|
||||
);
|
||||
}
|
||||
|
||||
if( !preg_match( "/^$tc+$/", $text ) )
|
||||
return '';
|
||||
|
||||
$t = $title->getText();
|
||||
|
||||
for( $i = 0; $i < count( $rexps ); $i++) {
|
||||
if( preg_match( $rexps[$i], $t, $m ) )
|
||||
return "$m[1]$text$m[2]";
|
||||
}
|
||||
return $text;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap a comment in standard punctuation and formatting if
|
||||
* it's non-empty, otherwise return empty string.
|
||||
|
|
|
|||
|
|
@ -1912,70 +1912,23 @@ class Parser
|
|||
return Linker::normalizeSubpageLink( $this->mTitle, $target, $text );
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns valid title characters and namespace characters for pipe trick.
|
||||
*
|
||||
* FIXME: the namespace characters should not be specified like this...
|
||||
*/
|
||||
static function getPipeTrickCharacterClasses() {
|
||||
global $wgLegalTitleChars;
|
||||
return array( "[$wgLegalTitleChars]", '[ _0-9A-Za-z\x80-\xff-]' );
|
||||
}
|
||||
|
||||
/**
|
||||
* From the [[title|]] return link-text as though the used typed [[title|link-text]]
|
||||
*
|
||||
* For most links this be as though the user typed [[ns:title|title]]
|
||||
* However [[ns:title (context)|]], [[ns:title, context|]] and [[ns:title (context), context|]]
|
||||
* [[#title (context)|]] [[../context/title (context), context|]]
|
||||
* all return the |title]] with no context or indicative punctuation.
|
||||
* @param string $link from [[$link|]]
|
||||
* @return string $text for [[$link|$text]]
|
||||
*/
|
||||
function getPipeTrickText( $link ) {
|
||||
static $rexps = FALSE;
|
||||
if( !$rexps ) {
|
||||
list( $tc, $nc ) = Parser::getPipeTrickCharacterClasses();
|
||||
$rexps = array (
|
||||
# try this first, to turn "[[A, B (C)|]]" into "A, B"
|
||||
"/^(:?$nc+:|[:#\/]|$tc+\\/|)($tc+?)( \\($tc+\\)| ($tc+))$/", # [[ns:page (context)|]]
|
||||
"/^(:?$nc+:|[:#\/]|$tc+\\/|)($tc+?)( \\($tc+\\)| ($tc+)|)((?:,|,) $tc+|)$/", # [[ns:page (context), context|]]
|
||||
);
|
||||
}
|
||||
$text = urldecode( $link );
|
||||
|
||||
for( $i = 0; $i < count( $rexps ); $i++) {
|
||||
if( preg_match( $rexps[$i], $text, $m ) )
|
||||
return $m[2];
|
||||
}
|
||||
return $text;
|
||||
return Linker::getPipeTrickText( $link );
|
||||
}
|
||||
|
||||
/**
|
||||
* From the [[|link-text]] return the title as though the user typed [[title|link-text]]
|
||||
*
|
||||
* On most pages this will return link-text or "" if the link-text is not a valid title
|
||||
* On pages like [[ns:title (context)]] and [[ns:title, context]] it will act like
|
||||
* [[ns:link-text (context)|link-text]] and [[ns:link-text, context|link-text]]
|
||||
* @param string $text from [[|$text]]
|
||||
* @param Title $title to resolve the link against
|
||||
* @return string $link for [[$link|$text]]
|
||||
*/
|
||||
function getPipeTrickLink( $text ) {
|
||||
static $rexps = FALSE, $tc;
|
||||
if( !$rexps ) {
|
||||
list( $tc, $nc ) = Parser::getPipeTrickCharacterClasses();
|
||||
$rexps = array (
|
||||
"/^($nc+:|)$tc+?( \\($tc+\\)| ($tc+))$/", # [[ns:page (context)|]]
|
||||
"/^($nc+:|)$tc+?(?:(?: \\($tc+\\)| ($tc+)|)((?:,|,) $tc+|))$/" # [[ns:page (context), context|]]
|
||||
);
|
||||
}
|
||||
|
||||
if( !preg_match( "/^$tc+$/", $text ) )
|
||||
return '';
|
||||
|
||||
$t = $this->mTitle->getText();
|
||||
|
||||
for( $i = 0; $i < count( $rexps ); $i++) {
|
||||
if( preg_match( $rexps[$i], $t, $m ) )
|
||||
return "$m[1]$text$m[2]";
|
||||
}
|
||||
return $text;
|
||||
return Linker::getPipeTrickLink( $text, $this->mTitle );
|
||||
}
|
||||
|
||||
/**#@+
|
||||
|
|
@ -4073,8 +4026,8 @@ class Parser
|
|||
|
||||
# Links of the form [[|<blah>]] or [[<blah>|]] perform pipe tricks
|
||||
# Note this only allows the # in the one position it works.
|
||||
list( $tc, $nc ) = Parser::getPipeTrickCharacterClasses();
|
||||
$pipeTrickRe = "/\[\[(?:(\\|)($tc+)|(#?$tc+)\\|)\]\]/";
|
||||
global $wgLegalTitleChars;
|
||||
$pipeTrickRe = "/\[\[(?:(\\|)([$wgLegalTitleChars]+)|(#?[$wgLegalTitleChars]+)\\|)\]\]/";
|
||||
$text = preg_replace_callback( $pipeTrickRe, array( $this, 'pstPipeTrickCallback' ), $text );
|
||||
|
||||
# Trim trailing whitespace
|
||||
|
|
|
|||
|
|
@ -7713,6 +7713,17 @@ title=[[Main Page]]
|
|||
<a href="/wiki/Main_Page#section" title="Main Page">#section</a>
|
||||
!! end
|
||||
|
||||
!! test
|
||||
Edit comment with pipe trick
|
||||
!! options
|
||||
comment
|
||||
title=[[Article (context)]]
|
||||
!! input
|
||||
[[Hello (World)|]] [[|Entry]]
|
||||
!! result
|
||||
<a href="/index.php?title=Hello_(World)&action=edit&redlink=1" class="new" title="Hello (World) (page does not exist)">Hello</a> <a href="/index.php?title=Entry_(context)&action=edit&redlink=1" class="new" title="Entry (context) (page does not exist)">Entry</a>
|
||||
!! end
|
||||
|
||||
!!article
|
||||
MediaWiki:bad image list
|
||||
!!text
|
||||
|
|
@ -7739,6 +7750,7 @@ Bar foo
|
|||
!! end
|
||||
|
||||
|
||||
|
||||
TODO:
|
||||
more images
|
||||
more tables
|
||||
|
|
|
|||
Loading…
Reference in a new issue