* @ingroup Search
*/
+use MediaWiki\MediaWikiServices;
+
/**
* Database independant search index updater
*
/** @var Content|bool Content of the page (not text) */
private $content;
+ /** @var WikiPage **/
+ private $page;
+
/**
* Constructor
*
* Perform actual update for the entry
*/
public function doUpdate() {
- global $wgDisableSearchUpdate;
+ $config = MediaWikiServices::getInstance()->getSearchEngineConfig();
- if ( $wgDisableSearchUpdate || !$this->id ) {
+ if ( $config->getConfig()->get( 'DisableSearchUpdate' ) || !$this->id ) {
return;
}
- $page = WikiPage::newFromID( $this->id, WikiPage::READ_LATEST );
-
- foreach ( SearchEngine::getSearchTypes() as $type ) {
- $search = SearchEngine::create( $type );
- $indexTitle = $this->indexTitle( $search );
+ $seFactory = MediaWikiServices::getInstance()->getSearchEngineFactory();
+ foreach ( $config->getSearchTypes() as $type ) {
+ $search = $seFactory->create( $type );
if ( !$search->supports( 'search-update' ) ) {
continue;
}
- $normalTitle = $search->normalizeText( $indexTitle );
+ $normalTitle = $this->getNormalizedTitle( $search );
- if ( $page === null ) {
+ if ( $this->getLatestPage() === null ) {
$search->delete( $this->id, $normalTitle );
continue;
} elseif ( $this->content === false ) {
$text = $search->getTextFromContent( $this->title, $this->content );
if ( !$search->textAlreadyUpdatedForIndex() ) {
- $text = self::updateText( $text );
+ $text = $this->updateText( $text, $search );
}
# Perform the actual update
* If you're using a real search engine, you'll probably want to override
* this behavior and do something nicer with the original wikitext.
* @param string $text
+ * @param SearchEngine $se Search engine
* @return string
*/
- public static function updateText( $text ) {
+ public function updateText( $text, SearchEngine $se = null ) {
global $wgContLang;
# Language-specific strip/conversion
$text = $wgContLang->normalizeForSearch( $text );
- $lc = SearchEngine::legalSearchChars() . '&#;';
+ $se = $se ?: MediaWikiServices::getInstance()->newSearchEngine();
+ $lc = $se->legalSearchChars() . '&#;';
$text = preg_replace( "/<\\/?\\s*[A-Za-z][^>]*?>/",
' ', $wgContLang->lc( " " . $text . " " ) ); # Strip HTML markup
}
/**
- * Get a string representation of a title suitable for
+ * Get WikiPage for the SearchUpdate $id using WikiPage::READ_LATEST
+ * and ensure using the same WikiPage object if there are multiple
+ * SearchEngine types.
+ *
+ * Returns null if a page has been deleted or is not found.
+ *
+ * @return WikiPage|null
+ */
+ private function getLatestPage() {
+ if ( !isset( $this->page ) ) {
+ $this->page = WikiPage::newFromID( $this->id, WikiPage::READ_LATEST );
+ }
+
+ return $this->page;
+ }
+
+ /**
+ * Get a normalized string representation of a title suitable for
* including in a search index
*
* @param SearchEngine $search
* @return string A stripped-down title string ready for the search index
*/
- private function indexTitle( SearchEngine $search ) {
+ private function getNormalizedTitle( SearchEngine $search ) {
global $wgContLang;
$ns = $this->title->getNamespace();
if ( $ns == NS_FILE ) {
$t = preg_replace( "/ (png|gif|jpg|jpeg|ogg)$/", "", $t );
}
- return trim( $t );
+
+ return $search->normalizeText( trim( $t ) );
}
}