[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/includes/search/ -> SearchResult.php (source)

   1  <?php
   2  /**
   3   * Search engine result
   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 Search
  22   */
  23  
  24  /**
  25   * @todo FIXME: This class is horribly factored. It would probably be better to
  26   * have a useful base class to which you pass some standard information, then
  27   * let the fancy self-highlighters extend that.
  28   * @ingroup Search
  29   */
  30  class SearchResult {
  31  
  32      /**
  33       * @var Revision
  34       */
  35      protected $mRevision = null;
  36  
  37      /**
  38       * @var File
  39       */
  40      protected $mImage = null;
  41  
  42      /**
  43       * @var Title
  44       */
  45      protected $mTitle;
  46  
  47      /**
  48       * @var string
  49       */
  50      protected $mText;
  51  
  52      /**
  53       * Return a new SearchResult and initializes it with a title.
  54       *
  55       * @param Title $title
  56       * @return SearchResult
  57       */
  58  	public static function newFromTitle( $title ) {
  59          $result = new self();
  60          $result->initFromTitle( $title );
  61          return $result;
  62      }
  63  
  64      /**
  65       * Initialize from a Title and if possible initializes a corresponding
  66       * Revision and File.
  67       *
  68       * @param Title $title
  69       */
  70  	protected function initFromTitle( $title ) {
  71          $this->mTitle = $title;
  72          if ( !is_null( $this->mTitle ) ) {
  73              $id = false;
  74              wfRunHooks( 'SearchResultInitFromTitle', array( $title, &$id ) );
  75              $this->mRevision = Revision::newFromTitle(
  76                  $this->mTitle, $id, Revision::READ_NORMAL );
  77              if ( $this->mTitle->getNamespace() === NS_FILE ) {
  78                  $this->mImage = wfFindFile( $this->mTitle );
  79              }
  80          }
  81      }
  82  
  83      /**
  84       * Check if this is result points to an invalid title
  85       *
  86       * @return bool
  87       */
  88  	function isBrokenTitle() {
  89          return is_null( $this->mTitle );
  90      }
  91  
  92      /**
  93       * Check if target page is missing, happens when index is out of date
  94       *
  95       * @return bool
  96       */
  97  	function isMissingRevision() {
  98          return !$this->mRevision && !$this->mImage;
  99      }
 100  
 101      /**
 102       * @return Title
 103       */
 104  	function getTitle() {
 105          return $this->mTitle;
 106      }
 107  
 108      /**
 109       * Get the file for this page, if one exists
 110       * @return File|null
 111       */
 112  	function getFile() {
 113          return $this->mImage;
 114      }
 115  
 116      /**
 117       * Lazy initialization of article text from DB
 118       */
 119  	protected function initText() {
 120          if ( !isset( $this->mText ) ) {
 121              if ( $this->mRevision != null ) {
 122                  $this->mText = SearchEngine::create()
 123                      ->getTextFromContent( $this->mTitle, $this->mRevision->getContent() );
 124              } else { // TODO: can we fetch raw wikitext for commons images?
 125                  $this->mText = '';
 126              }
 127          }
 128      }
 129  
 130      /**
 131       * @param array $terms Terms to highlight
 132       * @return string Highlighted text snippet, null (and not '') if not supported
 133       */
 134  	function getTextSnippet( $terms ) {
 135          global $wgAdvancedSearchHighlighting;
 136          $this->initText();
 137  
 138          // TODO: make highliter take a content object. Make ContentHandler a factory for SearchHighliter.
 139          list( $contextlines, $contextchars ) = SearchEngine::userHighlightPrefs();
 140  
 141          $h = new SearchHighlighter();
 142          if ( count( $terms ) > 0 ) {
 143              if ( $wgAdvancedSearchHighlighting ) {
 144                  return $h->highlightText( $this->mText, $terms, $contextlines, $contextchars );
 145              } else {
 146                  return $h->highlightSimple( $this->mText, $terms, $contextlines, $contextchars );
 147              }
 148          } else {
 149              return $h->highlightNone( $this->mText, $contextlines, $contextchars );
 150          }
 151      }
 152  
 153      /**
 154       * @return string Highlighted title, '' if not supported
 155       */
 156  	function getTitleSnippet() {
 157          return '';
 158      }
 159  
 160      /**
 161       * @return string Highlighted redirect name (redirect to this page), '' if none or not supported
 162       */
 163  	function getRedirectSnippet() {
 164          return '';
 165      }
 166  
 167      /**
 168       * @return Title Title object for the redirect to this page, null if none or not supported
 169       */
 170  	function getRedirectTitle() {
 171          return null;
 172      }
 173  
 174      /**
 175       * @return string Highlighted relevant section name, null if none or not supported
 176       */
 177  	function getSectionSnippet() {
 178          return '';
 179      }
 180  
 181      /**
 182       * @return Title Title object (pagename+fragment) for the section, null if none or not supported
 183       */
 184  	function getSectionTitle() {
 185          return null;
 186      }
 187  
 188      /**
 189       * @return string Timestamp
 190       */
 191  	function getTimestamp() {
 192          if ( $this->mRevision ) {
 193              return $this->mRevision->getTimestamp();
 194          } elseif ( $this->mImage ) {
 195              return $this->mImage->getTimestamp();
 196          }
 197          return '';
 198      }
 199  
 200      /**
 201       * @return int Number of words
 202       */
 203  	function getWordCount() {
 204          $this->initText();
 205          return str_word_count( $this->mText );
 206      }
 207  
 208      /**
 209       * @return int Size in bytes
 210       */
 211  	function getByteSize() {
 212          $this->initText();
 213          return strlen( $this->mText );
 214      }
 215  
 216      /**
 217       * @return string Interwiki prefix of the title (return iw even if title is broken)
 218       */
 219  	function getInterwikiPrefix() {
 220          return '';
 221      }
 222  
 223      /**
 224       * @return string Interwiki namespace of the title (since we likely can't resolve it locally)
 225       */
 226  	function getInterwikiNamespaceText() {
 227          return '';
 228      }
 229  
 230      /**
 231       * Did this match file contents (eg: PDF/DJVU)?
 232       * @return bool
 233       */
 234  	function isFileMatch() {
 235          return false;
 236      }
 237  }


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