[ Index ] |
PHP Cross Reference of MediaWiki-1.24.0 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Implements Special:Booksources 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 18 * http://www.gnu.org/copyleft/gpl.html 19 * 20 * @file 21 * @ingroup SpecialPage 22 */ 23 24 /** 25 * Special page outputs information on sourcing a book with a particular ISBN 26 * The parser creates links to this page when dealing with ISBNs in wikitext 27 * 28 * @author Rob Church <[email protected]> 29 * @todo Validate ISBNs using the standard check-digit method 30 * @ingroup SpecialPage 31 */ 32 class SpecialBookSources extends SpecialPage { 33 /** 34 * ISBN passed to the page, if any 35 */ 36 private $isbn = ''; 37 38 /** 39 * Constructor 40 */ 41 public function __construct() { 42 parent::__construct( 'Booksources' ); 43 } 44 45 /** 46 * Show the special page 47 * 48 * @param string $isbn ISBN passed as a subpage parameter 49 */ 50 public function execute( $isbn ) { 51 $this->setHeaders(); 52 $this->outputHeader(); 53 $this->isbn = self::cleanIsbn( $isbn ? $isbn : $this->getRequest()->getText( 'isbn' ) ); 54 $this->getOutput()->addHTML( $this->makeForm() ); 55 if ( strlen( $this->isbn ) > 0 ) { 56 if ( !self::isValidISBN( $this->isbn ) ) { 57 $this->getOutput()->wrapWikiMsg( 58 "<div class=\"error\">\n$1\n</div>", 59 'booksources-invalid-isbn' 60 ); 61 } 62 $this->showList(); 63 } 64 } 65 66 /** 67 * Returns whether a given ISBN (10 or 13) is valid. True indicates validity. 68 * @param string $isbn ISBN passed for check 69 * @return bool 70 */ 71 public static function isValidISBN( $isbn ) { 72 $isbn = self::cleanIsbn( $isbn ); 73 $sum = 0; 74 if ( strlen( $isbn ) == 13 ) { 75 for ( $i = 0; $i < 12; $i++ ) { 76 if ( $i % 2 == 0 ) { 77 $sum += $isbn[$i]; 78 } else { 79 $sum += 3 * $isbn[$i]; 80 } 81 } 82 83 $check = ( 10 - ( $sum % 10 ) ) % 10; 84 if ( $check == $isbn[12] ) { 85 return true; 86 } 87 } elseif ( strlen( $isbn ) == 10 ) { 88 for ( $i = 0; $i < 9; $i++ ) { 89 $sum += $isbn[$i] * ( $i + 1 ); 90 } 91 92 $check = $sum % 11; 93 if ( $check == 10 ) { 94 $check = "X"; 95 } 96 if ( $check == $isbn[9] ) { 97 return true; 98 } 99 } 100 101 return false; 102 } 103 104 /** 105 * Trim ISBN and remove characters which aren't required 106 * 107 * @param string $isbn Unclean ISBN 108 * @return string 109 */ 110 private static function cleanIsbn( $isbn ) { 111 return trim( preg_replace( '![^0-9X]!', '', $isbn ) ); 112 } 113 114 /** 115 * Generate a form to allow users to enter an ISBN 116 * 117 * @return string 118 */ 119 private function makeForm() { 120 $form = Html::openElement( 'fieldset' ) . "\n"; 121 $form .= Html::element( 122 'legend', 123 array(), 124 $this->msg( 'booksources-search-legend' )->text() 125 ) . "\n"; 126 $form .= Html::openElement( 'form', array( 'method' => 'get', 'action' => wfScript() ) ) . "\n"; 127 $form .= Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) . "\n"; 128 $form .= '<p>' . Xml::inputLabel( 129 $this->msg( 'booksources-isbn' )->text(), 130 'isbn', 131 'isbn', 132 20, 133 $this->isbn, 134 array( 'autofocus' => true ) 135 ); 136 $form .= ' ' . Xml::submitButton( $this->msg( 'booksources-go' )->text() ) . "</p>\n"; 137 $form .= Html::closeElement( 'form' ) . "\n"; 138 $form .= Html::closeElement( 'fieldset' ) . "\n"; 139 140 return $form; 141 } 142 143 /** 144 * Determine where to get the list of book sources from, 145 * format and output them 146 * 147 * @throws MWException 148 * @return string 149 */ 150 private function showList() { 151 global $wgContLang; 152 153 # Hook to allow extensions to insert additional HTML, 154 # e.g. for API-interacting plugins and so on 155 wfRunHooks( 'BookInformation', array( $this->isbn, $this->getOutput() ) ); 156 157 # Check for a local page such as Project:Book_sources and use that if available 158 $page = $this->msg( 'booksources' )->inContentLanguage()->text(); 159 $title = Title::makeTitleSafe( NS_PROJECT, $page ); # Show list in content language 160 if ( is_object( $title ) && $title->exists() ) { 161 $rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL ); 162 $content = $rev->getContent(); 163 164 if ( $content instanceof TextContent ) { 165 //XXX: in the future, this could be stored as structured data, defining a list of book sources 166 167 $text = $content->getNativeData(); 168 $this->getOutput()->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $text ) ); 169 170 return true; 171 } else { 172 throw new MWException( "Unexpected content type for book sources: " . $content->getModel() ); 173 } 174 } 175 176 # Fall back to the defaults given in the language file 177 $this->getOutput()->addWikiMsg( 'booksources-text' ); 178 $this->getOutput()->addHTML( '<ul>' ); 179 $items = $wgContLang->getBookstoreList(); 180 foreach ( $items as $label => $url ) { 181 $this->getOutput()->addHTML( $this->makeListItem( $label, $url ) ); 182 } 183 $this->getOutput()->addHTML( '</ul>' ); 184 185 return true; 186 } 187 188 /** 189 * Format a book source list item 190 * 191 * @param string $label Book source label 192 * @param string $url Book source URL 193 * @return string 194 */ 195 private function makeListItem( $label, $url ) { 196 $url = str_replace( '$1', $this->isbn, $url ); 197 198 return Html::rawElement( 'li', array(), 199 Html::element( 'a', array( 'href' => $url, 'class' => 'external' ), $label ) ); 200 } 201 202 protected function getGroupName() { 203 return 'wiki'; 204 } 205 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 14:03:12 2014 | Cross-referenced by PHPXref 0.7.1 |