From 53ad020f1dfa28515811eba7d4fd3dc25d64fc3b Mon Sep 17 00:00:00 2001 From: Daniel Kraus Date: Tue, 16 Apr 2013 21:47:21 +0200 Subject: [PATCH] Fix case-sensitive linking when $wgCapitalLinks is false. --- LinkTitles.body.php | 39 ++++++++++++++++++++++++++++---- LinkTitles.php | 2 +- NEWS | 3 +++ release/LinkTitles-2.2.0.tar.gz | Bin 0 -> 11567 bytes 4 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 release/LinkTitles-2.2.0.tar.gz diff --git a/LinkTitles.body.php b/LinkTitles.body.php index adaec5a..eb826a2 100755 --- a/LinkTitles.body.php +++ b/LinkTitles.body.php @@ -92,6 +92,7 @@ global $wgLinkTitlesWordEndOnly; // global $wgLinkTitlesIgnoreCase; global $wgLinkTitlesSmartMode; + global $wgCapitalLinks; ( $wgLinkTitlesWordStartOnly ) ? $wordStartDelim = '\b' : $wordStartDelim = ''; ( $wgLinkTitlesWordEndOnly ) ? $wordEndDelim = '\b' : $wordEndDelim = ''; @@ -127,6 +128,14 @@ $black_list = str_replace( '_', ' ', '("' . implode( '", "',$wgLinkTitlesBlackList ) . '")' ); + // Depending on the global setting $wgCapitalLinks, we need + // different callback functions further down. + if ( $wgCapitalLinks ) { + $callBack = "LinkTitles::CallBackCaseInsensitive"; + } else { + $callBack = "LinkTitles::CallBackCaseSensitive"; + } + // Build an SQL query and fetch all page titles ordered // by length from shortest to longest. // Only titles from 'normal' pages (namespace uid = 0) @@ -159,11 +168,21 @@ // see http://stackoverflow.com/questions/10672286 $arr = preg_split( $delimiter, $text, -1, PREG_SPLIT_DELIM_CAPTURE ); + // Depending on the global configuration setting $wgCapitalLinks, + // the title has to be searched for either in a strictly case-sensitive + // way, or in a 'fuzzy' way where the first letter of the title may + // be either case. + if ( $wgCapitalLinks ) { + $searchTerm = '((?i)' . LinkTitles::$safeTitle[0] . '(?-i)' . + substr(LinkTitles::$safeTitle, 1) . ')'; + } else { + $searchTerm = '(' . LinkTitles::$safeTitle . ')'; + } + for ( $i = 0; $i < count( $arr ); $i+=2 ) { // even indexes will point to text that is not enclosed by brackets $arr[$i] = preg_replace( '/(?= 0 ) && ( $count > 0 )) { break; @@ -171,6 +190,9 @@ }; $text = implode( '', $arr ); + // If smart mode is turned on, the extension will perform a second + // pass on the page and add links with aliases where the case does + // not match. if ($wgLinkTitlesSmartMode) { // split the string by [[...]] groups // credits to inhan @ StackOverflow for suggesting preg_split @@ -181,8 +203,7 @@ // even indexes will point to text that is not enclosed by brackets $arr[$i] = preg_replace_callback( '/(?= 0 ) && ( $count > 0 )) { break; }; @@ -194,7 +215,7 @@ return true; } - static function CallBack($matches) { + static function CallBackCaseInsensitive($matches) { if ( strcmp(substr(LinkTitles::$safeTitle, 1), substr($matches[0], 1)) == 0 ) { return '[[' . $matches[0] . ']]'; } else { @@ -202,6 +223,14 @@ } } + static function CallBackCaseSensitive($matches) { + if ( strcmp(substr(LinkTitles::$safeTitle, 0), substr($matches[0], 0)) == 0 ) { + return '[[' . $matches[0] . ']]'; + } else { + return '[[' . LinkTitles::$safeTitle . '|' . $matches[0] . ']]'; + } + } + static function removeMagicWord( &$parser, &$text ) { $mw = MagicWord::get('MAG_LINKTITLES_NOAUTOLINKS'); $mw -> matchAndRemove( $text ); diff --git a/LinkTitles.php b/LinkTitles.php index f118566..48e7053 100755 --- a/LinkTitles.php +++ b/LinkTitles.php @@ -49,7 +49,7 @@ 'name' => 'LinkTitles', 'author' => '[https://www.mediawiki.org/wiki/User:Bovender Daniel Kraus]', 'url' => 'https://www.mediawiki.org/wiki/Extension:LinkTitles', - 'version' => '2.1.1', + 'version' => '2.2.0', 'descriptionmsg' => 'linktitles-desc' ); diff --git a/NEWS b/NEWS index b576436..988ac56 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,6 @@ +LinkTitles 2.2.0: 2013-04-16 +* Fix case-sensitive linking when $wgCapitalLinks is false. + LinkTitles 2.1.1: 2013-03-06 * Fix crashing bugs that occurred with older PHP versions (prior to 5.3). diff --git a/release/LinkTitles-2.2.0.tar.gz b/release/LinkTitles-2.2.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a79e26f290aef6a5e79669da702e75f9b76e3324 GIT binary patch literal 11567 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 literal 0 HcmV?d00001