From 36758b38bf5854e4ed01a8744f4498be8414b34e Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 12 Dec 2008 23:59:15 +0000 Subject: [PATCH] * (bug 2391) A warning is now shown for invalid ISBN numbers on Special:Booksources. This could be called from the parser as well, but I'm a little hesitant just yet. Parser tests currently contain some bogus ISBN numbers which need to be replaced with legit ones... there's also the possibility that some books really are published with bad ISBNs... on the other hand, Amazon won't let you search for them. :) Plus the feedback as you're hitting preview might be nice... but it's also not clear what's wrong -- that is, that it's an invalid number rather than that you just didn't do something right. Do we want better feedback? --- RELEASE-NOTES | 1 + includes/specials/SpecialBooksources.php | 48 ++++++++++++++++++++++-- languages/messages/MessagesEn.php | 1 + 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 6c1cf8a151..577916cf96 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -220,6 +220,7 @@ The following extensions are migrated into MediaWiki 1.14: algorithm very similar to IE's content detection algorithm. * Cascading protection no longer requires that both edit and move are restricted to sysop, just edit=sysop is enough +* (bug 2391) A warning is now shown for invalid ISBN numbers on Special:Booksources. === Bug fixes in 1.14 === diff --git a/includes/specials/SpecialBooksources.php b/includes/specials/SpecialBooksources.php index ba91289df4..12b119d84d 100644 --- a/includes/specials/SpecialBooksources.php +++ b/includes/specials/SpecialBooksources.php @@ -30,20 +30,62 @@ class SpecialBookSources extends SpecialPage { public function execute( $isbn ) { global $wgOut, $wgRequest; $this->setHeaders(); - $this->isbn = $this->cleanIsbn( $isbn ? $isbn : $wgRequest->getText( 'isbn' ) ); + $this->isbn = self::cleanIsbn( $isbn ? $isbn : $wgRequest->getText( 'isbn' ) ); $wgOut->addWikiMsg( 'booksources-summary' ); $wgOut->addHTML( $this->makeForm() ); - if( strlen( $this->isbn ) > 0 ) + if( strlen( $this->isbn ) > 0 ) { + if( !$this->isValidIsbn( $this->isbn ) ) { + $wgOut->wrapWikiMsg( '
$1
', 'booksources-invalid-isbn' ); + } $this->showList(); + } } + /** + * Returns whether a given ISBN (10 or 13) is valid. True indicates validity. + * @param isbn ISBN passed for check + */ + public static function isValidISBN( $isbn ) { + $isbn = self::cleanIsbn( $isbn ); + $sum = 0; + $check = -1; + if( strlen( $isbn ) == 13 ) { + for( $i = 0; $i < 12; $i++ ) { + if($i % 2 == 0) { + $sum += $isbn{$i}; + } else { + $sum += 3 * $isbn{$i}; + } + } + + $check = (10 - ($sum % 10)) % 10; + if ($check == $isbn{12}) { + return true; + } + } elseif( strlen( $isbn ) == 10 ) { + for($i = 0; $i < 9; $i++) { + $sum += $isbn{$i} * ($i + 1); + } + + $check = $sum % 11; + if($check == 10) { + $check = "X"; + } + if($check == $isbn{9}) { + return true; + } + } + return false; + } + + /** * Trim ISBN and remove characters which aren't required * * @param $isbn Unclean ISBN * @return string */ - private function cleanIsbn( $isbn ) { + private static function cleanIsbn( $isbn ) { return trim( preg_replace( '![^0-9X]!', '', $isbn ) ); } diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php index 2ee6f5d0cb..a77fdf2597 100644 --- a/languages/messages/MessagesEn.php +++ b/languages/messages/MessagesEn.php @@ -2147,6 +2147,7 @@ Each row contains links to the first and second redirect, as well as the target 'booksources-isbn' => 'ISBN:', # only translate this message to other languages if you have to change it 'booksources-go' => 'Go', 'booksources-text' => 'Below is a list of links to other sites that sell new and used books, and may also have further information about books you are looking for:', +'booksources-invalid-isbn' => 'The given ISBN number does not appear to be valid; check for errors copying from the original source.', # Magic words 'rfcurl' => 'http://tools.ietf.org/html/rfc$1', # do not translate or duplicate this message to other languages -- 2.20.1