From: Erik Bernhardson Date: Tue, 15 Nov 2016 00:14:31 +0000 (-0800) Subject: Pull rendering of single result out of SpecialSearch X-Git-Tag: 1.31.0-rc.0~4307^2~1 X-Git-Url: https://git.cyclocoop.org/%7B%24www_url%7Dadmin/compta/exercices/journal.php?a=commitdiff_plain;h=6e155624fa4481f0c4fcb70e4228e53cb62ec254;hp=8e337da65b111ddbcd63beef6440e9c1cdbe7b69;p=lhc%2Fweb%2Fwiklou.git Pull rendering of single result out of SpecialSearch First step in refactoring the search results page. Pulls out widgets to render our two styles of search result, Full and Simple. Bug: T150390 Change-Id: If78cb0c29ae394f16e465c15a8e8246c1b56dcea --- diff --git a/autoload.php b/autoload.php index cdbdf1f1bc..7e94623701 100644 --- a/autoload.php +++ b/autoload.php @@ -931,6 +931,9 @@ $wgAutoloadLocalClasses = [ 'MediaWiki\\Widget\\DateTimeInputWidget' => __DIR__ . '/includes/widget/DateTimeInputWidget.php', 'MediaWiki\\Widget\\NamespaceInputWidget' => __DIR__ . '/includes/widget/NamespaceInputWidget.php', 'MediaWiki\\Widget\\SearchInputWidget' => __DIR__ . '/includes/widget/SearchInputWidget.php', + 'MediaWiki\\Widget\\Search\\FullSearchResultWidget' => __DIR__ . '/includes/widget/search/FullSearchResultWidget.php', + 'MediaWiki\\Widget\\Search\\SearchResultWidget' => __DIR__ . '/includes/widget/search/SearchResultWidget.php', + 'MediaWiki\\Widget\\Search\\SimpleSearchResultWidget' => __DIR__ . '/includes/widget/search/SimpleSearchResultWidget.php', 'MediaWiki\\Widget\\TitleInputWidget' => __DIR__ . '/includes/widget/TitleInputWidget.php', 'MediaWiki\\Widget\\UserInputWidget' => __DIR__ . '/includes/widget/UserInputWidget.php', 'MemCachedClientforWiki' => __DIR__ . '/includes/compat/MemcachedClientCompat.php', diff --git a/docs/hooks.txt b/docs/hooks.txt index 2f99fffdb0..1da39cf61b 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -2877,7 +2877,7 @@ $terms: Search terms, for highlighting function returned false. 'ShowSearchHitTitle': Customise display of search hit title/link. -&$title: Title to link to +$title: Title to link to &$text: Text to use for the link $result: The search result $terms: The search terms entered diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php index 727179af7d..255e618806 100644 --- a/includes/specials/SpecialSearch.php +++ b/includes/specials/SpecialSearch.php @@ -740,8 +740,12 @@ class SpecialSearch extends SpecialPage { } $out .= "\n"; @@ -752,181 +756,6 @@ class SpecialSearch extends SpecialPage { return $out; } - /** - * Format a single hit result - * - * @param SearchResult $result - * @param array $terms Terms to highlight - * @param int $position Position within the search results, including offset. - * - * @return string - */ - protected function showHit( SearchResult $result, $terms, $position ) { - if ( $result->isBrokenTitle() ) { - return ''; - } - - $title = $result->getTitle(); - - $titleSnippet = $result->getTitleSnippet(); - - if ( $titleSnippet == '' ) { - $titleSnippet = null; - } - - $link_t = clone $title; - $query = []; - - Hooks::run( 'ShowSearchHitTitle', - [ &$link_t, &$titleSnippet, $result, $terms, $this, &$query ] ); - - $linkRenderer = $this->getLinkRenderer(); - - if ( $titleSnippet !== null ) { - $titleSnippet = new HtmlArmor( $titleSnippet ); - } - - $link = $linkRenderer->makeKnownLink( - $link_t, - $titleSnippet, - [ 'data-serp-pos' => $position ], // HTML attributes - $query - ); - - // If page content is not readable, just return the title. - // This is not quite safe, but better than showing excerpts from non-readable pages - // Note that hiding the entry entirely would screw up paging. - if ( !$title->userCan( 'read', $this->getUser() ) ) { - return "
  • {$link}
  • \n"; - } - - // If the page doesn't *exist*... our search index is out of date. - // The least confusing at this point is to drop the result. - // You may get less results, but... oh well. :P - if ( $result->isMissingRevision() ) { - return ''; - } - - // format redirects / relevant sections - $redirectTitle = $result->getRedirectTitle(); - $redirectText = $result->getRedirectSnippet(); - $sectionTitle = $result->getSectionTitle(); - $sectionText = $result->getSectionSnippet(); - $categorySnippet = $result->getCategorySnippet(); - - $redirect = ''; - if ( !is_null( $redirectTitle ) ) { - if ( $redirectText == '' ) { - $redirectText = null; - } - - if ( $redirectText !== null ) { - $redirectText = new HtmlArmor( $redirectText ); - } - - $redirect = "" . - $this->msg( 'search-redirect' )->rawParams( - $linkRenderer->makeKnownLink( $redirectTitle, $redirectText ) )->text() . - ""; - } - - $section = ''; - if ( !is_null( $sectionTitle ) ) { - if ( $sectionText == '' ) { - $sectionText = null; - } - - if ( $sectionText !== null ) { - $sectionText = new HtmlArmor( $sectionText ); - } - - $section = "" . - $this->msg( 'search-section' )->rawParams( - $linkRenderer->makeKnownLink( $sectionTitle, $sectionText ) )->text() . - ""; - } - - $category = ''; - if ( $categorySnippet ) { - $category = "" . - $this->msg( 'search-category' )->rawParams( $categorySnippet )->text() . - ""; - } - - // format text extract - $extract = "
    " . $result->getTextSnippet( $terms ) . "
    "; - - $lang = $this->getLanguage(); - - // format description - $byteSize = $result->getByteSize(); - $wordCount = $result->getWordCount(); - $timestamp = $result->getTimestamp(); - $size = $this->msg( 'search-result-size', $lang->formatSize( $byteSize ) ) - ->numParams( $wordCount )->escaped(); - - if ( $title->getNamespace() == NS_CATEGORY ) { - $cat = Category::newFromTitle( $title ); - $size = $this->msg( 'search-result-category-size' ) - ->numParams( $cat->getPageCount(), $cat->getSubcatCount(), $cat->getFileCount() ) - ->escaped(); - } - - $date = $lang->userTimeAndDate( $timestamp, $this->getUser() ); - - $fileMatch = ''; - // Include a thumbnail for media files... - if ( $title->getNamespace() == NS_FILE ) { - $img = $result->getFile(); - $img = $img ?: wfFindFile( $title ); - if ( $result->isFileMatch() ) { - $fileMatch = "" . - $this->msg( 'search-file-match' )->escaped() . ""; - } - if ( $img ) { - $thumb = $img->transform( [ 'width' => 120, 'height' => 120 ] ); - if ( $thumb ) { - $desc = $this->msg( 'parentheses' )->rawParams( $img->getShortDesc() )->escaped(); - // Float doesn't seem to interact well with the bullets. - // Table messes up vertical alignment of the bullets. - // Bullets are therefore disabled (didn't look great anyway). - return "
  • " . - '' . - '' . - '' . - '' . - '' . - '
    ' . - $thumb->toHtml( [ 'desc-link' => true ] ) . - '' . - "{$link} {$redirect} {$category} {$section} {$fileMatch}" . - $extract . - "
    {$desc} - {$date}
    " . - '
    ' . - "
  • \n"; - } - } - } - - $html = null; - - $score = ''; - $related = ''; - if ( Hooks::run( 'ShowSearchHit', [ - $this, $result, $terms, - &$link, &$redirect, &$section, &$extract, - &$score, &$size, &$date, &$related, - &$html - ] ) ) { - $html = "
  • " . - "{$link} {$redirect} {$category} {$section} {$fileMatch}
    {$extract}\n" . - "
    {$size} - {$date}
    " . - "
  • \n"; - } - - return $html; - } - /** * Extract custom captions from search-interwiki-custom message */ @@ -948,17 +777,13 @@ class SpecialSearch extends SpecialPage { * Show results from other wikis * * @param SearchResultSet|array $matches - * @param string $query + * @param string $terms * * @return string */ - protected function showInterwiki( $matches, $query ) { + protected function showInterwiki( $matches, $terms ) { global $wgContLang; - $out = "
    " . - $this->msg( 'search-interwiki-caption' )->text() . "
    \n"; - $out .= "
    \n"; + $out = ''; + $widget = new MediaWiki\Widget\Search\SimpleSearchResultWidget( + $this, + $this->getLinkRenderer() + ); + foreach ( $iwResults as $iwPrefix => $results ) { + $out .= $this->iwHeaderHtml( $iwPrefix, $terms ); + $out .= ""; + } - // convert the whole thing to desired language variant - $out = $wgContLang->convert( $out ); + $out = + "
    " . + "
    " . + $this->msg( 'search-interwiki-caption' )->escaped() . + "
    " . + $out . + "
    "; - return $out; + // convert the whole thing to desired language variant + return $wgContLang->convert( $out ); } /** - * Show single interwiki link - * - * @param SearchResult $result - * @param string $lastInterwiki - * @param string $query - * - * @return string + * @param string $iwPrefix The interwiki prefix to render a header for + * @param string $terms The user-provided search terms */ - protected function showInterwikiHit( $result, $lastInterwiki, $query ) { - if ( $result->isBrokenTitle() ) { - return ''; - } - - $linkRenderer = $this->getLinkRenderer(); - - $title = $result->getTitle(); - - $titleSnippet = $result->getTitleSnippet(); - - if ( $titleSnippet == '' ) { - $titleSnippet = null; - } - - if ( $titleSnippet !== null ) { - $titleSnippet = new HtmlArmor( $titleSnippet ); - } - - $link = $linkRenderer->makeKnownLink( - $title, - $titleSnippet + protected function iwHeaderHtml( $iwPrefix, $terms ) { + if ( isset( $this->customCaptions[$iwPrefix] ) ) { + $caption = $this->customCaptions[$iwPrefix]; + } else { + $iwLookup = MediaWiki\MediaWikiServices::getInstance()->getInterwikiLookup(); + $interwiki = $iwLookup->fetch( $iwPrefix ); + $parsed = wfParseUrl( wfExpandUrl( $interwiki ? $interwiki->getURL() : '/' ) ); + $caption = $this->msg( 'search-interwiki-default', $parsed['host'] )->text(); + } + $searchLink = Linker::linkKnown( + Title::newFromText( "$iwPrefix:Special:Search" ), + $this->msg( 'search-interwiki-more' )->text(), + [], + [ + 'search' => $terms, + 'fulltext' => 1, + ] ); - - // format redirect if any - $redirectTitle = $result->getRedirectTitle(); - $redirectText = $result->getRedirectSnippet(); - $redirect = ''; - if ( !is_null( $redirectTitle ) ) { - if ( $redirectText == '' ) { - $redirectText = null; - } - - if ( $redirectText !== null ) { - $redirectText = new HtmlArmor( $redirectText ); - } - - $redirect = "" . - $this->msg( 'search-redirect' )->rawParams( - $linkRenderer->makeKnownLink( $redirectTitle, $redirectText ) )->text() . - ""; - } - - $out = ""; - // display project name - if ( is_null( $lastInterwiki ) || $lastInterwiki != $title->getInterwiki() ) { - if ( array_key_exists( $title->getInterwiki(), $this->customCaptions ) ) { - // captions from 'search-interwiki-custom' - $caption = $this->customCaptions[$title->getInterwiki()]; - } else { - // default is to show the hostname of the other wiki which might suck - // if there are many wikis on one hostname - $parsed = wfParseUrl( $title->getFullURL() ); - $caption = $this->msg( 'search-interwiki-default', $parsed['host'] )->text(); - } - // "more results" link (special page stuff could be localized, but we might not know target lang) - $searchTitle = Title::newFromText( $title->getInterwiki() . ":Special:Search" ); - $searchLink = $linkRenderer->makeKnownLink( - $searchTitle, - $this->msg( 'search-interwiki-more' )->text(), - [], - [ - 'search' => $query, - 'fulltext' => 'Search' - ] - ); - $out .= "
    - {$searchLink}{$caption}
    \n