From 602831acc1989cd809f07fc584bd06a4a22d4a61 Mon Sep 17 00:00:00 2001 From: Daniel Kraus Date: Sun, 20 May 2012 14:41:07 +0200 Subject: [PATCH] Fix inadvertent page deletions; prevent self references --- HISTORY | 9 +++++++++ LinkTitles.body.php | 34 ++++++++++++++++++++++++---------- LinkTitles.php | 2 +- release.sh | 2 +- 4 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 HISTORY diff --git a/HISTORY b/HISTORY new file mode 100644 index 0000000..eb00bdf --- /dev/null +++ b/HISTORY @@ -0,0 +1,9 @@ +Extension:LinkTitles + +0.0.2: 2012-05-20 +* Prevent generation of self-references. +* Escape slashes in page titles before using them in a regexp. + +0.0.1: 2012-05-20 +* Initial release. + diff --git a/LinkTitles.body.php b/LinkTitles.body.php index 7832ef7..a5a0016 100755 --- a/LinkTitles.body.php +++ b/LinkTitles.body.php @@ -41,6 +41,10 @@ // 'minor edits' is not set. if ( !$minor ) { + // To prevent adding self-references, we now + // extract the current page's title. + $my_title = $article->getTitle()->getText(); + // Build an SQL query and fetch all page titles ordered // by length from shortest to longest. $dbr = wfGetDB( DB_SLAVE ); @@ -52,22 +56,32 @@ array( 'ORDER BY' => 'length(page_title)' )); // Iterate through the page titles + $new_text = $text; foreach( $res as $row ) { // Page titles are stored in the database with spaces // replaced by underscores. Therefore we now convert // the underscores back to spaces. $title = str_replace('_', ' ', $row->page_title); - // Now look for every occurrence of $title in the - // page $text and enclose it in double square brackets, - // unless it is already enclosed in brackets (directly - // adjacent or remotely, see http://stackoverflow.com/questions/10672286 - // Regex built with the help from Eugene @ Stackoverflow - // http://stackoverflow.com/a/10672440/270712 - $text = preg_replace( - '/(' . $title . ')([^\]]+(\[|$))/i', - '[[$1]]$2', - $text ); + if ( $title != $my_title ) { + + // Now look for every occurrence of $title in the + // page $text and enclose it in double square brackets, + // unless it is already enclosed in brackets (directly + // adjacent or remotely, see http://stackoverflow.com/questions/10672286 + // Regex built with the help from Eugene @ Stackoverflow + // http://stackoverflow.com/a/10672440/270712 + $new_text = preg_replace( + '/(\b' . str_replace('/', '\/', $title) . '\b)([^\]]+(\[|$))/i', + '[[$1]]$2', + $new_text ); + if ( $new_text == '' ) { + throw new Exception( 'new text was deleted! - title: ' . $title ); + }; + }; // if $title != $my_title + }; // foreach $res as $row + if ( $new_text != '' ) { + $text = $new_text; }; }; return true; diff --git a/LinkTitles.php b/LinkTitles.php index 286dcda..ec0c98c 100755 --- a/LinkTitles.php +++ b/LinkTitles.php @@ -36,7 +36,7 @@ 'name' => 'LinkTitles', 'author' => '[http://www.mediawiki.org/wiki/User:Bovender Daniel Kraus]', 'url' => 'http://www.mediawiki.org/wiki/Extension:LinkTitles', - 'version' => '0.0.1', + 'version' => '0.0.2', 'descriptionmsg' => 'linktitles-desc' ); diff --git a/release.sh b/release.sh index 12ecdda..4992886 100755 --- a/release.sh +++ b/release.sh @@ -4,4 +4,4 @@ # extension into two archive files that contain the current # git tag as the version number. -tar cvzf release/LinkTitles-`git describe --tags`.tar.gz gpl-*.txt LinkTitles.* --exclude '*~' --transform 's,^,LinkTitles/,' +tar cvzf release/LinkTitles-`git describe --tags`.tar.gz gpl-*.txt HISTORY LinkTitles.* --exclude '*~' --transform 's,^,LinkTitles/,'