Cleanup some docs (includes/[s-z])
[lhc/web/wiklou.git] / includes / search / SearchResult.php
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 * Return a new SearchResult and initializes it with a row.
66 *
67 * @param object $row
68 * @return SearchResult
69 */
70 public static function newFromRow( $row ) {
71 $result = new self();
72 $result->initFromRow( $row );
73 return $result;
74 }
75
76 public function __construct( $row = null ) {
77 if ( !is_null( $row ) ) {
78 // Backwards compatibility with pre-1.17 callers
79 $this->initFromRow( $row );
80 }
81 }
82
83 /**
84 * Initialize from a database row. Makes a Title and passes that to
85 * initFromTitle.
86 *
87 * @param object $row
88 */
89 protected function initFromRow( $row ) {
90 $this->initFromTitle( Title::makeTitle( $row->page_namespace, $row->page_title ) );
91 }
92
93 /**
94 * Initialize from a Title and if possible initializes a corresponding
95 * Revision and File.
96 *
97 * @param Title $title
98 */
99 protected function initFromTitle( $title ) {
100 $this->mTitle = $title;
101 if ( !is_null( $this->mTitle ) ) {
102 $id = false;
103 wfRunHooks( 'SearchResultInitFromTitle', array( $title, &$id ) );
104 $this->mRevision = Revision::newFromTitle(
105 $this->mTitle, $id, Revision::READ_NORMAL );
106 if ( $this->mTitle->getNamespace() === NS_FILE ) {
107 $this->mImage = wfFindFile( $this->mTitle );
108 }
109 }
110 }
111
112 /**
113 * Check if this is result points to an invalid title
114 *
115 * @return bool
116 */
117 function isBrokenTitle() {
118 return is_null( $this->mTitle );
119 }
120
121 /**
122 * Check if target page is missing, happens when index is out of date
123 *
124 * @return bool
125 */
126 function isMissingRevision() {
127 return !$this->mRevision && !$this->mImage;
128 }
129
130 /**
131 * @return Title
132 */
133 function getTitle() {
134 return $this->mTitle;
135 }
136
137 /**
138 * Get the file for this page, if one exists
139 * @return File|null
140 */
141 function getFile() {
142 return $this->mImage;
143 }
144
145 /**
146 * @return float|null If not supported
147 */
148 function getScore() {
149 return null;
150 }
151
152 /**
153 * Lazy initialization of article text from DB
154 */
155 protected function initText() {
156 if ( !isset( $this->mText ) ) {
157 if ( $this->mRevision != null ) {
158 $this->mText = SearchEngine::create()
159 ->getTextFromContent( $this->mTitle, $this->mRevision->getContent() );
160 } else { // TODO: can we fetch raw wikitext for commons images?
161 $this->mText = '';
162 }
163 }
164 }
165
166 /**
167 * @param array $terms Terms to highlight
168 * @return string Highlighted text snippet, null (and not '') if not supported
169 */
170 function getTextSnippet( $terms ) {
171 global $wgAdvancedSearchHighlighting;
172 $this->initText();
173
174 // TODO: make highliter take a content object. Make ContentHandler a factory for SearchHighliter.
175 list( $contextlines, $contextchars ) = SearchEngine::userHighlightPrefs();
176 $h = new SearchHighlighter();
177 if ( $wgAdvancedSearchHighlighting ) {
178 return $h->highlightText( $this->mText, $terms, $contextlines, $contextchars );
179 } else {
180 return $h->highlightSimple( $this->mText, $terms, $contextlines, $contextchars );
181 }
182 }
183
184 /**
185 * @return string Highlighted title, '' if not supported
186 */
187 function getTitleSnippet() {
188 return '';
189 }
190
191 /**
192 * @return string Highlighted redirect name (redirect to this page), '' if none or not supported
193 */
194 function getRedirectSnippet() {
195 return '';
196 }
197
198 /**
199 * @return Title Title object for the redirect to this page, null if none or not supported
200 */
201 function getRedirectTitle() {
202 return null;
203 }
204
205 /**
206 * @return string Highlighted relevant section name, null if none or not supported
207 */
208 function getSectionSnippet() {
209 return '';
210 }
211
212 /**
213 * @return Title Title object (pagename+fragment) for the section, null if none or not supported
214 */
215 function getSectionTitle() {
216 return null;
217 }
218
219 /**
220 * @return string Timestamp
221 */
222 function getTimestamp() {
223 if ( $this->mRevision ) {
224 return $this->mRevision->getTimestamp();
225 } elseif ( $this->mImage ) {
226 return $this->mImage->getTimestamp();
227 }
228 return '';
229 }
230
231 /**
232 * @return int Number of words
233 */
234 function getWordCount() {
235 $this->initText();
236 return str_word_count( $this->mText );
237 }
238
239 /**
240 * @return int Size in bytes
241 */
242 function getByteSize() {
243 $this->initText();
244 return strlen( $this->mText );
245 }
246
247 /**
248 * @return bool If hit has related articles
249 */
250 function hasRelated() {
251 return false;
252 }
253
254 /**
255 * @return string Interwiki prefix of the title (return iw even if title is broken)
256 */
257 function getInterwikiPrefix() {
258 return '';
259 }
260
261 /**
262 * @return string Interwiki namespace of the title (since we likely can't resolve it locally)
263 */
264 function getInterwikiNamespaceText() {
265 return '';
266 }
267
268 /**
269 * Did this match file contents (eg: PDF/DJVU)?
270 * @return bool
271 */
272 function isFileMatch() {
273 return false;
274 }
275 }