summaryrefslogtreecommitdiff
path: root/www/wiki/includes/widget/search/BasicSearchResultSetWidget.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/includes/widget/search/BasicSearchResultSetWidget.php')
-rw-r--r--www/wiki/includes/widget/search/BasicSearchResultSetWidget.php134
1 files changed, 134 insertions, 0 deletions
diff --git a/www/wiki/includes/widget/search/BasicSearchResultSetWidget.php b/www/wiki/includes/widget/search/BasicSearchResultSetWidget.php
new file mode 100644
index 00000000..e2366405
--- /dev/null
+++ b/www/wiki/includes/widget/search/BasicSearchResultSetWidget.php
@@ -0,0 +1,134 @@
+<?php
+
+namespace MediaWiki\Widget\Search;
+
+use Message;
+use SearchResultSet;
+use SpecialSearch;
+use Status;
+
+/**
+ * Renders the search result area. Handles Title and Full-Text search results,
+ * along with inline and sidebar secondary (interwiki) results.
+ */
+class BasicSearchResultSetWidget {
+ /** @var SpecialSearch */
+ protected $specialPage;
+ /** @var SearchResultWidget */
+ protected $resultWidget;
+ /** @var InterwikiSearchResultSetWidget */
+ protected $sidebarWidget;
+
+ public function __construct(
+ SpecialSearch $specialPage,
+ SearchResultWidget $resultWidget,
+ SearchResultSetWidget $sidebarWidget
+ ) {
+ $this->specialPage = $specialPage;
+ $this->resultWidget = $resultWidget;
+ $this->sidebarWidget = $sidebarWidget;
+ }
+
+ /**
+ * @param string $term The search term to highlight
+ * @param int $offset The offset of the first result in the result set
+ * @param SearchResultSet|null $titleResultSet Results of searching only page titles
+ * @param SearchResultSet|null $textResultSet Results of general full text search.
+ * @return string HTML
+ */
+ public function render(
+ $term,
+ $offset,
+ SearchResultSet $titleResultSet = null,
+ SearchResultSet $textResultSet = null
+ ) {
+ global $wgContLang;
+
+ $hasTitle = $titleResultSet ? $titleResultSet->numRows() > 0 : false;
+ $hasText = $textResultSet ? $textResultSet->numRows() > 0 : false;
+ $hasSecondary = $textResultSet
+ ? $textResultSet->hasInterwikiResults( SearchResultSet::SECONDARY_RESULTS )
+ : false;
+ $hasSecondaryInline = $textResultSet
+ ? $textResultSet->hasInterwikiResults( SearchResultSet::INLINE_RESULTS )
+ : false;
+
+ if ( !$hasTitle && !$hasText && !$hasSecondary && !$hasSecondaryInline ) {
+ return '';
+ }
+
+ $out = '';
+ if ( $hasTitle ) {
+ $out .= $this->header( $this->specialPage->msg( 'titlematches' ) )
+ . $this->renderResultSet( $titleResultSet, $offset );
+ }
+
+ if ( $hasText ) {
+ if ( $hasTitle ) {
+ $out .= "<div class='mw-search-visualclear'></div>" .
+ $this->header( $this->specialPage->msg( 'textmatches' ) );
+ }
+ $out .= $this->renderResultSet( $textResultSet, $offset );
+ }
+
+ if ( $hasSecondaryInline ) {
+ $iwResults = $textResultSet->getInterwikiResults( SearchResultSet::INLINE_RESULTS );
+ foreach ( $iwResults as $interwiki => $results ) {
+ if ( $results instanceof Status || $results->numRows() === 0 ) {
+ // ignore bad interwikis for now
+ continue;
+ }
+ $out .=
+ "<h2 class='mw-search-interwiki-header mw-search-visualclear'>" .
+ $this->specialPage->msg( "search-interwiki-results-{$interwiki}" )->parse() .
+ "</h2>";
+ $out .= $this->renderResultSet( $results, $offset );
+ }
+ }
+
+ if ( $hasSecondary ) {
+ $out .= $this->sidebarWidget->render(
+ $term,
+ $textResultSet->getInterwikiResults( SearchResultSet::SECONDARY_RESULTS )
+ );
+ }
+
+ // Convert the whole thing to desired language variant
+ // TODO: Move this up to Special:Search?
+ return $wgContLang->convert( $out );
+ }
+
+ /**
+ * Generate a headline for a section of the search results. In prior
+ * implementations this was rendering wikitext of '==$1==', but seems
+ * a waste to call the full parser to generate this tiny bit of html
+ *
+ * @param Message $msg i18n message to use as header
+ * @return string HTML
+ */
+ protected function header( Message $msg ) {
+ return "<h2>" .
+ "<span class='mw-headline'>" . $msg->escaped() . "</span>" .
+ "</h2>";
+ }
+
+ /**
+ * @param SearchResultSet $resultSet The search results to render
+ * @param int $offset Offset of the first result in $resultSet
+ * @return string HTML
+ */
+ protected function renderResultSet( SearchResultSet $resultSet, $offset ) {
+ global $wgContLang;
+
+ $terms = $wgContLang->convertForSearchResult( $resultSet->termMatches() );
+
+ $hits = [];
+ $result = $resultSet->next();
+ while ( $result ) {
+ $hits[] .= $this->resultWidget->render( $result, $terms, $offset++ );
+ $result = $resultSet->next();
+ }
+
+ return "<ul class='mw-search-results'>" . implode( '', $hits ) . "</ul>";
+ }
+}