[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/includes/specials/ -> SpecialBooksources.php (source)

   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 .= '&#160;' . 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  }


Generated: Fri Nov 28 14:03:12 2014 Cross-referenced by PHPXref 0.7.1