From d78a470fcd2a825f11d4c4352e718b46942bb9af Mon Sep 17 00:00:00 2001 From: Jan Drewniak Date: Wed, 18 Jan 2017 11:27:43 +0100 Subject: [PATCH] Displaying interwiki results in sidebar Displays newly designed interwiki search results in the sidebar of the specialSearch page. A prototype of this change can be viewed on this labs url: http://sistersearch.wmflabs.org/w/index.php?title=Special:Search&search=mars Bug: T149806 Change-Id: I66e4b6a502dae488d105f11cad73e145990c2327 --- autoload.php | 3 + includes/DefaultSettings.php | 19 ++ includes/specials/SpecialSearch.php | 31 ++- .../search/BasicSearchResultSetWidget.php | 2 +- .../search/InterwikiSearchResultSetWidget.php | 116 ++++++--- .../search/InterwikiSearchResultWidget.php | 86 +++++++ .../widget/search/SearchResultSetWidget.php | 18 ++ .../search/SimpleSearchResultSetWidget.php | 132 +++++++++++ languages/i18n/en.json | 1 + languages/i18n/qqq.json | 1 + resources/Resources.php | 17 ++ .../images/special.search/book-icon.png | Bin 0 -> 1536 bytes .../images/special.search/book-icon.svg | 36 +++ .../images/special.search/course-icon.png | Bin 0 -> 2125 bytes .../images/special.search/course-icon.svg | 35 +++ .../images/special.search/definition-icon.png | Bin 0 -> 981 bytes .../images/special.search/definition-icon.svg | 22 ++ .../images/special.search/dna-icon.png | Bin 0 -> 2105 bytes .../images/special.search/dna-icon.svg | 34 +++ .../images/special.search/image-icon.png | Bin 0 -> 954 bytes .../images/special.search/image-icon.svg | 16 ++ .../images/special.search/news-icon.png | Bin 0 -> 750 bytes .../images/special.search/news-icon.svg | 31 +++ .../images/special.search/quotation-icon.png | Bin 0 -> 680 bytes .../images/special.search/quotation-icon.svg | 12 + .../images/special.search/textbook-icon.png | Bin 0 -> 1187 bytes .../images/special.search/textbook-icon.svg | 28 +++ .../images/special.search/travel-icon.png | Bin 0 -> 1226 bytes .../images/special.search/travel-icon.svg | 15 ++ ...i.special.search.commonsInterwikiWidget.js | 80 +++++++ ...special.search.interwikiwidget.styles.less | 222 ++++++++++++++++++ .../mediawiki.special.search.styles.css | 15 +- 32 files changed, 927 insertions(+), 45 deletions(-) create mode 100644 includes/widget/search/InterwikiSearchResultWidget.php create mode 100644 includes/widget/search/SearchResultSetWidget.php create mode 100644 includes/widget/search/SimpleSearchResultSetWidget.php create mode 100644 resources/src/mediawiki.special/images/special.search/book-icon.png create mode 100644 resources/src/mediawiki.special/images/special.search/book-icon.svg create mode 100644 resources/src/mediawiki.special/images/special.search/course-icon.png create mode 100644 resources/src/mediawiki.special/images/special.search/course-icon.svg create mode 100644 resources/src/mediawiki.special/images/special.search/definition-icon.png create mode 100644 resources/src/mediawiki.special/images/special.search/definition-icon.svg create mode 100644 resources/src/mediawiki.special/images/special.search/dna-icon.png create mode 100644 resources/src/mediawiki.special/images/special.search/dna-icon.svg create mode 100644 resources/src/mediawiki.special/images/special.search/image-icon.png create mode 100644 resources/src/mediawiki.special/images/special.search/image-icon.svg create mode 100644 resources/src/mediawiki.special/images/special.search/news-icon.png create mode 100644 resources/src/mediawiki.special/images/special.search/news-icon.svg create mode 100644 resources/src/mediawiki.special/images/special.search/quotation-icon.png create mode 100644 resources/src/mediawiki.special/images/special.search/quotation-icon.svg create mode 100644 resources/src/mediawiki.special/images/special.search/textbook-icon.png create mode 100644 resources/src/mediawiki.special/images/special.search/textbook-icon.svg create mode 100644 resources/src/mediawiki.special/images/special.search/travel-icon.png create mode 100644 resources/src/mediawiki.special/images/special.search/travel-icon.svg create mode 100644 resources/src/mediawiki.special/mediawiki.special.search.commonsInterwikiWidget.js create mode 100644 resources/src/mediawiki.special/mediawiki.special.search.interwikiwidget.styles.less diff --git a/autoload.php b/autoload.php index a6840b4fb7..dbb7dbd349 100644 --- a/autoload.php +++ b/autoload.php @@ -936,8 +936,11 @@ $wgAutoloadLocalClasses = [ 'MediaWiki\\Widget\\Search\\DidYouMeanWidget' => __DIR__ . '/includes/widget/search/DidYouMeanWidget.php', 'MediaWiki\\Widget\\Search\\FullSearchResultWidget' => __DIR__ . '/includes/widget/search/FullSearchResultWidget.php', 'MediaWiki\\Widget\\Search\\InterwikiSearchResultSetWidget' => __DIR__ . '/includes/widget/search/InterwikiSearchResultSetWidget.php', + 'MediaWiki\\Widget\\Search\\InterwikiSearchResultWidget' => __DIR__ . '/includes/widget/search/InterwikiSearchResultWidget.php', 'MediaWiki\\Widget\\Search\\SearchFormWidget' => __DIR__ . '/includes/widget/search/SearchFormWidget.php', + 'MediaWiki\\Widget\\Search\\SearchResultSetWidget' => __DIR__ . '/includes/widget/search/SearchResultSetWidget.php', 'MediaWiki\\Widget\\Search\\SearchResultWidget' => __DIR__ . '/includes/widget/search/SearchResultWidget.php', + 'MediaWiki\\Widget\\Search\\SimpleSearchResultSetWidget' => __DIR__ . '/includes/widget/search/SimpleSearchResultSetWidget.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', diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index a7cbd96dd8..e98227dcac 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -8562,6 +8562,25 @@ $wgLearnerMemberSince = 4; # days $wgExperiencedUserEdits = 500; $wgExperiencedUserMemberSince = 30; # days +/** + * Mapping of interwiki index prefixes to descriptors that + * can be used to change the display of interwiki search results. + * + * Descriptors are appended to CSS classes of interwiki results + * which using InterwikiSearchResultWidget. + * + * Predefined descriptors include the following words: + * definition, textbook, news, quotation, book, travel, course + * + * @par Example: + * @code + * $wgInterwikiPrefixDisplayTypes = [ + * 'iwprefix' => 'definition' + *]; + * @endcode + */ +$wgInterwikiPrefixDisplayTypes = []; + /** * For really cool vim folding this needs to be at the end: * vim: foldmarker=@{,@} foldmethod=marker diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php index 34620ff9e2..b7356e7509 100644 --- a/includes/specials/SpecialSearch.php +++ b/includes/specials/SpecialSearch.php @@ -25,9 +25,11 @@ use MediaWiki\MediaWikiServices; use MediaWiki\Widget\Search\BasicSearchResultSetWidget; -use MediaWiki\Widget\Search\InterwikiSearchResultSetWidget; use MediaWiki\Widget\Search\FullSearchResultWidget; +use MediaWiki\Widget\Search\InterwikiSearchResultWidget; +use MediaWiki\Widget\Search\InterwikiSearchResultSetWidget; use MediaWiki\Widget\Search\SimpleSearchResultWidget; +use MediaWiki\Widget\Search\SimpleSearchResultSetWidget; /** * implements Special:Search - Run text & title search and display the output @@ -385,13 +387,26 @@ class SpecialSearch extends SpecialPage { // results to display. $linkRenderer = $this->getLinkRenderer(); $mainResultWidget = new FullSearchResultWidget( $this, $linkRenderer ); - $sidebarResultWidget = new SimpleSearchResultWidget( $this, $linkRenderer ); - $sidebarResultsWidget = new InterwikiSearchResultSetWidget( - $this, - $sidebarResultWidget, - $linkRenderer, - MediaWikiServices::getInstance()->getInterwikiLookup() - ); + + if ( $search->getFeatureData( 'enable-new-crossproject-page' ) ) { + + $sidebarResultWidget = new InterwikiSearchResultWidget( $this, $linkRenderer ); + $sidebarResultsWidget = new InterwikiSearchResultSetWidget( + $this, + $sidebarResultWidget, + $linkRenderer, + MediaWikiServices::getInstance()->getInterwikiLookup() + ); + } else { + $sidebarResultWidget = new SimpleSearchResultWidget( $this, $linkRenderer ); + $sidebarResultsWidget = new SimpleSearchResultSetWidget( + $this, + $sidebarResultWidget, + $linkRenderer, + MediaWikiServices::getInstance()->getInterwikiLookup() + ); + } + $widget = new BasicSearchResultSetWidget( $this, $mainResultWidget, $sidebarResultsWidget ); $out->addHTML( $widget->render( diff --git a/includes/widget/search/BasicSearchResultSetWidget.php b/includes/widget/search/BasicSearchResultSetWidget.php index 2c31bd2a43..07094afca6 100644 --- a/includes/widget/search/BasicSearchResultSetWidget.php +++ b/includes/widget/search/BasicSearchResultSetWidget.php @@ -22,7 +22,7 @@ class BasicSearchResultSetWidget { public function __construct( SpecialSearch $specialPage, SearchResultWidget $resultWidget, - InterwikiSearchResultSetWidget $sidebarWidget + SearchResultSetWidget $sidebarWidget ) { $this->specialPage = $specialPage; $this->resultWidget = $resultWidget; diff --git a/includes/widget/search/InterwikiSearchResultSetWidget.php b/includes/widget/search/InterwikiSearchResultSetWidget.php index c738483562..af1ed0525b 100644 --- a/includes/widget/search/InterwikiSearchResultSetWidget.php +++ b/includes/widget/search/InterwikiSearchResultSetWidget.php @@ -7,13 +7,14 @@ use MediaWiki\Linker\LinkRenderer; use SearchResultSet; use SpecialSearch; use Title; +use Html; /** * Renders one or more SearchResultSets into a sidebar grouped by * interwiki prefix. Includes a per-wiki header indicating where * the results are from. */ -class InterwikiSearchResultSetWidget { +class InterwikiSearchResultSetWidget implements SearchResultSetWidget { /** @var SpecialSearch */ protected $specialSearch; /** @var SearchResultWidget */ @@ -24,6 +25,10 @@ class InterwikiSearchResultSetWidget { protected $linkRenderer; /** @var InterwikiLookup */ protected $iwLookup; + /** @var $output */ + protected $output; + /** @var $iwPrefixDisplayTypes */ + protected $iwPrefixDisplayTypes; public function __construct( SpecialSearch $specialSearch, @@ -35,8 +40,11 @@ class InterwikiSearchResultSetWidget { $this->resultWidget = $resultWidget; $this->linkRenderer = $linkRenderer; $this->iwLookup = $iwLookup; + $this->output = $specialSearch->getOutput(); + $this->iwPrefixDisplayTypes = $specialSearch->getConfig()->get( + 'InterwikiPrefixDisplayTypes' + ); } - /** * @param string $term User provided search term * @param SearchResultSet|SearchResultSet[] $resultSets List of interwiki @@ -50,6 +58,9 @@ class InterwikiSearchResultSetWidget { $this->loadCustomCaptions(); + $this->output->addModules( 'mediawiki.special.search.commonsInterwikiWidget' ); + $this->output->addModuleStyles( 'mediawiki.special.search.interwikiwidget.styles' ); + $iwResults = []; foreach ( $resultSets as $resultSet ) { $result = $resultSet->next(); @@ -61,56 +72,99 @@ class InterwikiSearchResultSetWidget { } } - $out = ''; + $iwResultSetPos = 1; + $iwResultListOutput = ''; + foreach ( $iwResults as $iwPrefix => $results ) { - $out .= $this->headerHtml( $iwPrefix, $term ); - $out .= ""; + + $headerHtml = $this->headerHtml( $term, $iwPrefix ); + $footerHtml = $this->footerHtml( $term, $iwPrefix ); + $iwResultListOutput .= Html::rawElement( 'li', + [ + 'class' => 'iw-resultset iw-resultset--' . $iwDisplayType, + 'data-iw-resultset-pos' => $iwResultSetPos + ], + $headerHtml . + $iwResultItemOutput . + $footerHtml + ); + + $iwResultSetPos++; } - return - "
" . - "
" . - $this->specialSearch->msg( 'search-interwiki-caption' )->text() . - '
' . - $out . - "
"; + return Html::rawElement( + 'div', + [ 'id' => 'mw-interwiki-results' ], + Html::rawElement( + 'p', + [ 'class' => 'iw-headline' ], + $this->specialSearch->msg( 'search-interwiki-caption' )->escaped() + ) . + Html::rawElement( + 'ul', [ 'class' => 'iw-results', ], $iwResultListOutput + ) + ); } /** * Generates an appropriate HTML header for the given interwiki prefix * - * @param string $iwPrefix Interwiki prefix of wiki to show header for * @param string $term User provided search term + * @param string $iwPrefix Interwiki prefix of wiki to show header for * @return string HTML */ - protected function headerHtml( $iwPrefix, $term ) { + protected function headerHtml( $term, $iwPrefix ) { + + $iwDisplayType = isset( $this->iwPrefixDisplayTypes[$iwPrefix] ) + ? $this->iwPrefixDisplayTypes[$iwPrefix] + : ""; + if ( isset( $this->customCaptions[$iwPrefix] ) ) { + /* customCaptions composed by loadCustomCaptions() with pre-escaped content.*/ $caption = $this->customCaptions[$iwPrefix]; } else { $interwiki = $this->iwLookup->fetch( $iwPrefix ); $parsed = wfParseUrl( wfExpandUrl( $interwiki ? $interwiki->getURL() : '/' ) ); - $caption = $this->specialSearch->msg( 'search-interwiki-default', $parsed['host'] )->text(); + $caption = $this->specialSearch->msg( 'search-interwiki-default', $parsed['host'] )->escaped(); } - $searchLink = $this->linkRenderer->makeLink( - Title::newFromText( "$iwPrefix:Special:Search" ), - $this->specialSearch->msg( 'search-interwiki-more' )->text(), - [], - [ - 'search' => $term, - 'fulltext' => 1, - ] + + return Html::rawElement( 'div', [ 'class' => 'iw-result__header' ], + Html::rawElement( 'span', [ 'class' => 'iw-result__icon iw-result__icon--' . $iwDisplayType ] ) + . $caption ); - return - "
" . - "{$searchLink}" . - $caption . - "
"; + } + + /** + * Generates an HTML footer for the given interwiki prefix + * + * @param string $term User provided search term + * @param string $iwPrefix Interwiki prefix of wiki to show footer for + * @return string HTML + */ + protected function footerHtml( $term, $iwPrefix ) { + + $href = Title::makeTitle( NS_SPECIAL, 'Search', null, $iwPrefix )->getLocalURL( + [ 'search' => $term, 'fulltext' => 1 ] + ); + + $searchLink = Html::rawElement( + 'a', + [ 'href' => $href ], + $this->specialSearch->msg( 'search-interwiki-more' )->escaped() + ); + + return Html::rawElement( 'div', [ 'class' => 'iw-result__footer' ], $searchLink ); } protected function loadCustomCaptions() { @@ -119,7 +173,7 @@ class InterwikiSearchResultSetWidget { } $this->customCaptions = []; - $customLines = explode( "\n", $this->specialSearch->msg( 'search-interwiki-custom' )->text() ); + $customLines = explode( "\n", $this->specialSearch->msg( 'search-interwiki-custom' )->escaped() ); foreach ( $customLines as $line ) { $parts = explode( ':', $line, 2 ); if ( count( $parts ) === 2 ) { diff --git a/includes/widget/search/InterwikiSearchResultWidget.php b/includes/widget/search/InterwikiSearchResultWidget.php new file mode 100644 index 0000000000..44229b83a5 --- /dev/null +++ b/includes/widget/search/InterwikiSearchResultWidget.php @@ -0,0 +1,86 @@ +specialSearch = $specialSearch; + $this->linkRenderer = $linkRenderer; + $this->iwPrefixDisplayTypes = $specialSearch->getConfig()->get( 'InterwikiPrefixDisplayTypes' ); + } + + /** + * @param SearchResult $result The result to render + * @param string $terms Terms to be highlighted (@see SearchResult::getTextSnippet) + * @param int $position The result position, including offset + * @return string HTML + */ + public function render( SearchResult $result, $terms, $position ) { + + $title = $result->getTitle(); + $iwPrefix = $result->getTitle()->getInterwiki(); + $titleSnippet = $result->getTitleSnippet(); + $snippet = $result->getTextSnippet( $terms ); + $displayType = isset( $this->iwPrefixDisplayTypes[$iwPrefix] ) + ? $this->iwPrefixDisplayTypes[$iwPrefix] + : ""; + + if ( $titleSnippet ) { + $titleSnippet = new HtmlArmor( $titleSnippet ); + } else { + $titleSnippet = null; + } + + $link = $this->linkRenderer->makeLink( $title, $titleSnippet ); + + $redirectTitle = $result->getRedirectTitle(); + $redirect = ''; + if ( $redirectTitle !== null ) { + + $redirectText = $result->getRedirectSnippet(); + + if ( $redirectText ) { + $redirectText = new HtmlArmor( $redirectText ); + } else { + $redirectText = null; + } + + $redirect = Html::rawElement( 'span', [ 'class' => 'iw-result__redirect' ], + $this->specialSearch->msg( 'search-redirect' )->rawParams( + $this->linkRenderer->makeLink( $redirectTitle, $redirectText ) + )->escaped() + ); + } + + switch ( $displayType ) { + case 'definition': + return "
" . + "{$link} {$redirect}: " . + $snippet . + "
"; + case 'quotation': + return "
{$snippet}
" . + "
{$link} {$redirect}
"; + default: + return "
{$link} {$redirect}
" . + "
{$snippet}
"; + }; + } +} diff --git a/includes/widget/search/SearchResultSetWidget.php b/includes/widget/search/SearchResultSetWidget.php new file mode 100644 index 0000000000..6df6e65c2a --- /dev/null +++ b/includes/widget/search/SearchResultSetWidget.php @@ -0,0 +1,18 @@ +specialSearch = $specialSearch; + $this->resultWidget = $resultWidget; + $this->linkRenderer = $linkRenderer; + $this->iwLookup = $iwLookup; + } + + /** + * @param string $term User provided search term + * @param SearchResultSet|SearchResultSet[] $resultSets List of interwiki + * results to render. + * @return string HTML + */ + public function render( $term, $resultSets ) { + if ( !is_array( $resultSets ) ) { + $resultSets = [ $resultSets ]; + } + + $this->loadCustomCaptions(); + + $iwResults = []; + foreach ( $resultSets as $resultSet ) { + $result = $resultSet->next(); + while ( $result ) { + if ( !$result->isBrokenTitle() ) { + $iwResults[$result->getTitle()->getInterwiki()][] = $result; + } + $result = $resultSet->next(); + } + } + + $out = ''; + foreach ( $iwResults as $iwPrefix => $results ) { + $out .= $this->headerHtml( $iwPrefix, $term ); + $out .= ""; + } + + return + "
" . + "
" . + $this->specialSearch->msg( 'search-interwiki-caption' )->escaped() . + '
' . + $out . + "
"; + } + + /** + * Generates an appropriate HTML header for the given interwiki prefix + * + * @param string $iwPrefix Interwiki prefix of wiki to show header for + * @param string $term User provided search term + * @return string HTML + */ + protected function headerHtml( $iwPrefix, $term ) { + if ( isset( $this->customCaptions[$iwPrefix] ) ) { + $caption = $this->customCaptions[$iwPrefix]; + } else { + $interwiki = $this->iwLookup->fetch( $iwPrefix ); + $parsed = wfParseUrl( wfExpandUrl( $interwiki ? $interwiki->getURL() : '/' ) ); + $caption = $this->specialSearch->msg( 'search-interwiki-default', $parsed['host'] )->escaped(); + } + + $href = Title::makeTitle( NS_SPECIAL, 'Search', null, $iwPrefix )->getLocalURL( + [ 'search' => $term, 'fulltext' => 1 ] + ); + $searchLink = Html::rawElement( + 'a', + [ 'href' => $href ], + $this->specialSearch->msg( 'search-interwiki-more' )->escaped() + ); + + return + "
" . + "{$searchLink}" . + $caption . + "
"; + } + + protected function loadCustomCaptions() { + if ( $this->customCaptions !== null ) { + return; + } + + $this->customCaptions = []; + $customLines = explode( "\n", $this->specialSearch->msg( 'search-interwiki-custom' )->escaped() ); + foreach ( $customLines as $line ) { + $parts = explode( ':', $line, 2 ); + if ( count( $parts ) === 2 ) { + $this->customCaptions[$parts[0]] = $parts[1]; + } + } + } +} diff --git a/languages/i18n/en.json b/languages/i18n/en.json index 81d9af1f29..b1e97be366 100644 --- a/languages/i18n/en.json +++ b/languages/i18n/en.json @@ -1002,6 +1002,7 @@ "search-interwiki-default": "Results from $1:", "search-interwiki-custom": "", "search-interwiki-more": "(more)", + "search-interwiki-more-results": "more results", "search-relatedarticle": "Related", "searchrelated": "related", "searchall": "all", diff --git a/languages/i18n/qqq.json b/languages/i18n/qqq.json index b141ffc00d..6ad64aa74c 100644 --- a/languages/i18n/qqq.json +++ b/languages/i18n/qqq.json @@ -1188,6 +1188,7 @@ "search-interwiki-default": "Parameters:\n* $1 - the hostname of the remote wiki from where the additional results listed below are returned", "search-interwiki-custom": "#REDIRECT [[MediaWiki:Wmf-search-interwiki-custom/qqq]]", "search-interwiki-more": "{{Identical|More}}", + "search-interwiki-more-results": "Label for a link that leads to more search results from a given wiki.", "search-relatedarticle": "This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is \"More Like This\" functionality. Microsoft glossary defines MLT as \"A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry.\"[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]\n{{Identical|Related}}", "searchrelated": "This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is \"More Like This\" functionality. Microsoft glossary defines MLT as \"A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry.\"[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]\n{{Identical|Related}}", "searchall": "{{Identical|All}}", diff --git a/resources/Resources.php b/resources/Resources.php index f14787f815..7e64b77702 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -1983,6 +1983,23 @@ return [ 'styles' => 'resources/src/mediawiki.special/mediawiki.special.search.styles.css', 'targets' => [ 'desktop', 'mobile' ], ], + 'mediawiki.special.search.interwikiwidget.styles' => [ + 'styles' => 'resources/src/mediawiki.special/' + . 'mediawiki.special.search.interwikiwidget.styles.less', + 'targets' => [ 'desktop', 'mobile' ] + ], + 'mediawiki.special.search.commonsInterwikiWidget' => [ + 'scripts' => 'resources/src/mediawiki.special/mediawiki.special.search.commonsInterwikiWidget.js', + 'dependencies' => [ + 'mediawiki.Uri', + 'mediawiki.jqueryMsg' + ], + 'targets' => [ 'desktop', 'mobile' ], + 'messages' => [ + 'search-interwiki-more', + 'searchprofile-images' + ], + ], 'mediawiki.special.undelete' => [ 'scripts' => 'resources/src/mediawiki.special/mediawiki.special.undelete.js', ], diff --git a/resources/src/mediawiki.special/images/special.search/book-icon.png b/resources/src/mediawiki.special/images/special.search/book-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..07e3ec746e7edcbbfe7abc473da2815c9b4f0327 GIT binary patch literal 1536 zcmV+b2LJhqP)w$E0g~|+^1!7j?5cLm&4=^0!-&yL0HYe8Njim z{dO=VeW1iON$ahGOWsMJK@rG3Y!%UWKL>bK(ouY>*XwC{dAT{<78e&aGc%*RyE|Q6 zU|co79LLAUy1&1VUF=EPX+2;Nhz&{G(Q{T-R)ieOMIPskNk3!M$A(PKITE=jdov2m z0j8(k+S;1d*Vp?%j-qZra~vL`=%!)u-!fXqoBnXPpj_mxuC6u;9kp5EJ3HvNX?+-T zfFF43;i36?aYO3>xV^n~Uw}SnPcYXhR-K-n*7o+cHaGhWQY{~^I6H$%^lMb|*a0IE zw+GDrJ|5OIKobWISgd+*aG<$4jNMK9rhp9rOSdjgfd3`w=Y@rZCiZIF_c_%}1Yiaj z1|r<}=H{kzu!)>!T^gUd?lOi`E8yNREirw5e*VO|-8l09y#&SnDe05rIE`WQ*GdW) zD?k9a9{*!Xhyz6kU^qxAgWS}E>53S0%8H)U-v0qQNdZ4mvj>xTvDg>@hjmGDu`Mkv zHMw&TU@O>pJtq)?qkjm`xj9vS%hJBwxb{%Mbc`Fi@Q8yO5HMZn3)$QQV8n7mE?bRko!*|h(ZE82d_0GA5Q#VP(w!saF3gr#Gs zW%?Q~;HUr(#3iCF{3-x5cm^D6Xk3b8c6PR?c$jFw5D4)IP+YX65vy1erp{GQ6AhTu z5@#S(MqG#assWb@ z81x)VHz*BD#}bpc%K^qUx#uE>bJyU=uy=VHipS-On{NgOzN=-gT~V__QV<>jjRFs|iVx>WnP zSgfZ@SlUXgVQI!laRWdU#yG1j99fz*W7#YH32jD<1s5`N>0REj=hGLPdfiC z@h~ggeY3PgHW_KQR3fP68Gnt$V)OI!y1Kfm>89qL?8h`Vny~BcEw-Q7I+cDOX6M=O zl75u*x1@hxfc$$&zexJ7q7POAAHS{EH#T|w(;j>jYjR@AUdwus(igk>3OZv)89VaE z(#8$A$wKW$wAmpD*viDNG;dmawSYZvTE9Phb literal 0 HcmV?d00001 diff --git a/resources/src/mediawiki.special/images/special.search/book-icon.svg b/resources/src/mediawiki.special/images/special.search/book-icon.svg new file mode 100644 index 0000000000..6c3fa5f2aa --- /dev/null +++ b/resources/src/mediawiki.special/images/special.search/book-icon.svg @@ -0,0 +1,36 @@ + + + + wikisource-icon + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/src/mediawiki.special/images/special.search/course-icon.png b/resources/src/mediawiki.special/images/special.search/course-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9aad230aac1917275a1f745314c2226346c3cb53 GIT binary patch literal 2125 zcmV-T2(tHyP)=EZG-y5knVO1i(+@o8FrT0-I?7xyEBq#Z?f66d+)jD zyXSoOJZ2dFXM_FE@L~k;f8F9E79O#%4ks{p<*u9p{v(QyQ? z)3Z1$E8S!=CGmg#dN#nj`%jUuoePXJ_k*H+~X7b90vXxfv0O#tE}# z&F-$mQ&n-n zZqKf0#VW2-;&}kz)?-IIUdhYVJNd`>@hQm4eg;LwB>^DiTE1Vm8|7=?)D^Il$n;$7 zcT3g|0Nmf#dnRrAwAp&?nx6gu-dtOb%teb;MRs+aLt{e&9PP)^*Vm`l)&X)Z54bNW z0;XBS-|DKZy*sL_q7FOr7d(NQ+Fh#F?Cgw5hQ{1bXV!w}x0!61sHRt7j_gn-x>iuwjV= z&_#Bzsp(>2!E5PiTBfF^qUlgGX3o4XWC~fcZqIJfntI&AYC2f0R@aJ^1zqLq-U?fE zFxSwvG6sP%E!9Dn30*3|BQ7ou_RU*RT1t(Mz(GK_Z`&eT)W|`HO_yOoVX=#+tQ2!; zF^>l9U{DN4Gp64g!nIkmXXD7xR#>fp{keY&=vmwxPa0zOZ10UwB65A{;!_9I{zU^I=rlH-Rjy_ee@g!pk{%VdHqno&vrhpux>Q zMZj`i2lKb-;Nh@wm2P0N^668jV#Y1;lfVX3M@hIKz{MC^N5{dg*6#`dJm|jK3dXV| zfln`dGC+C9=U;NU6H$SHJK9fx++E8ceijv#ggscfJo2iE6H_Y_&G9vn8u$T#gKumq z3GbRTA)s_T+;S8P7e39cKZPQ?;pw)H{$1qKJpwZDPuuA=oIC6c&|;;3<~!j2H?G zZGiP~>2QD^pT7X}AD@r$DJi(;-f6H{EaLR;?(_KV*I#k+Vxc#fjg)^B(V>o>eD>O^tzr6n&! zsh_UPmeHeA9*L^OLy|dOu_+)2oM=wq*~92L++ax&H8;oxa7;;4Ibfy6fYIn=^6Ao` z+MWAhcsRf{0O(17$dChGzAXRCmX_wH{zZ_q6(!J zv52n~kpliMi9rYOjSnOjSJiY-0!(hQPi=v`9`*s2UMHgF7Eysd{(3qF@Ki*T>{j2m zF7In80j3jFwO0S7-~HW(Ai%-csQ91{y=q9`@@^mfO#tLi&!mH+Z~9FafV?hE3X!Gh zIg`KH9Nf=}05}HY8n=`uSX--hyt~Ea94MY^dnBN}lW0!hS#O;7QAp-eSYBA%+(Y;- z(L5&Nn*&kkWattuz~U=RL)Xf{u#^GfLtO@;)?ywL`pCghbz>LK1z5g~ugJ*0Z4~xL z^XgyhD#s>4GvL^^yY;I_0N;8W7^}gEg^fMmTQB_|OHG?Z^tNQ<00000NkvXXu0mjf D9SI-Y literal 0 HcmV?d00001 diff --git a/resources/src/mediawiki.special/images/special.search/course-icon.svg b/resources/src/mediawiki.special/images/special.search/course-icon.svg new file mode 100644 index 0000000000..4fab1f3d4a --- /dev/null +++ b/resources/src/mediawiki.special/images/special.search/course-icon.svg @@ -0,0 +1,35 @@ + + + + wikiversity-icon + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/src/mediawiki.special/images/special.search/definition-icon.png b/resources/src/mediawiki.special/images/special.search/definition-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b279f4ed049c91c5907ea695758ca6a268ec9fc1 GIT binary patch literal 981 zcmV;`11kK9P)*|OU@CZQD)%X(hyGp6P%RExRnnrhac5riZ<6{3)bdQdXaC*vw!&oWRaGAsjuu>v* zm-!dcZ8RFVy1M#)fS;eA|E#XA{sQnQjhu)wt+h$%vN1d!k3qHpv;nZsP&TO#(`=h?D|gNhm*2$9CyR4F`tP;vG^tDKepkKe0X~rb|`BYinz$)oPf{ zX1KfK@;EQmY86{sTM}$Whs`M}r2z?0E59`4ixqF_xCfwwpuL{xTmKlP`{K6_xpVu9v-6G?V97;_4PIO_Vz?9CIMpL z$Y#7WO2hEuTHF6ikh8v-CHzdwkWv6<3SL}X;Oy)SJfPb{`pL-&j*pKe zSdESi)NnXVP5V*+9*st5Hk+u|>&9tY&t#V@OT?DM{rx?*x3^P=cn8e%dwF@8YcMtl z?RFddo+WHz=jZ39;Sp?B8F&YrmcAB5R(diB1js8J298aR%`Qv415RsDmU%kAva*u6 zCR6A3_STeuwBEe}COdREPtrQBP5aBsOR(`t#4F%vqep0A2ypN$#rBQkD)|o#>iuole_al(L5H+MAb-++KD%o%c1G^~y5H+FXsNXf^BmAWQWfauFKJM_ma}lg94e#6RxW~HgZkoj?6{kOO+SEY%*kyK$1>G zaX{4N7_yqRi%JRv?MF8vUI4o=RJ3jY{2Ecwg``L+T;dg-qmK4MN{5tAPnl4|NwEn{ z%dyE6tsa_IXj-9Zy+=UWrFp|%+uYp5!^49ayt}(=-=HbFM04%2hWQsehl{X?l(g2o zN$+tI`y`K7GcFhGxhNJ;h#eb6SVT(nMQh#I*x2|znM{80w~g`weikw$eq=24@DTCv zFMywgcwDTJne;7RF~e{E@!4mmSYHdVHUyCU{Pk@bSHK*`*L7*UQi!V`H$t$y7@L3c zo?v?sz#n(fqlEz2WAK+UbzpcYVfHvlVAx~umooJ~d-nEQVn*=P00000NkvXXu0mjf D68YXx literal 0 HcmV?d00001 diff --git a/resources/src/mediawiki.special/images/special.search/definition-icon.svg b/resources/src/mediawiki.special/images/special.search/definition-icon.svg new file mode 100644 index 0000000000..1d58906244 --- /dev/null +++ b/resources/src/mediawiki.special/images/special.search/definition-icon.svg @@ -0,0 +1,22 @@ + + + + wiktionary-icon + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/src/mediawiki.special/images/special.search/dna-icon.png b/resources/src/mediawiki.special/images/special.search/dna-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..76ae7b97c30cf8ba426aaaa0ff866ef05d637b8b GIT binary patch literal 2105 zcmV-92*&q`P)(lxLjzGCMop-|o&vJFtAo_cP!7eDB{g z?>mefjx%S@jBjpk&g61AN+y%)P3uI|#~9mo_-fy&nah{9w6y%QwY9aUv$K-`8b>*H z4YV`BsZ?s|)~#DT3L!KM&;tVly9(L~;B)8BeR}QMwUtt-R5d?9kBp2c(0Rt#s7os| z=XL`4-o1M(Cr+H`E|p4ESfJ^}#YNq`2N`4Y%>vzUz<2N7J$dZdv75zWQJ8O`P^iKJ zUj}Fy$Pm1`7-Pj|fNnJ4wJg@uJGEI1GImSc%A*7qg?M)d6% zA0MZgnHf)hXw;@@+=F}NK&o1D4Z4vU&J$5u3EbP;E6f%H<_*xMPs602J$t4eDKf^| z-xR6&@pMk21#ajI+@Q4I{^R&Zxi=Q7_z>bB+kykMr=` zxw*LtFl}vZ^yJACb#8$%<|S$usOtr61B+Y)N+qH$=Nz08zTFDbZf~!)T9`guK#q2o z5xXA100k%YNHP%tEF=d&Z*b1N4}(-?Ms3~SiD-f`HtRyWn6p;EHn5lvsii8?Ld!2+ zy!dn9zI|^mEiF-BUv&oJoHxa+YXJ<6LbKjVKuQXV=ofHCve|5IYHCW{YD-g^Sv!r^ zaRK{*ohG8Jj~NPc*3A}wFE1}w+Y=U)d6+j8xO3|f)F645m093QCXbp{Lp zUlHP+Va>JLbzeW{(ur+8JT^8aOkECVgUzf)oxT5)pJIQ5G$RvwY6_AUcC6F&)lJY&N)ZU5zGU88oXK` z8u3_WjCsU529`*-vP2@mZM7$GUZb9j2_YqXbdE8m_;Msa=bU3n)V999PF-DHgs7~v zjpOF)<)TvXS4-XGRXr-x7i0EXPFg0Gs2Y?cg)3Ce@Ebuc#P8$)> zUyd~^N-+Sgbr5Ql&;FQ6HDL)LD!LWm@7C5vDNW`)TEFg{}f^MMcmjLoOR1OjkV z`xjSZ|L!iNF`le7K8XV|#|ZU^8XMEHftpc5%y&MM6uYh3{E z2op%j-SJap zT6`3p5#VnT`BBbMW~h!@l@c^nFA+s95^~N5o<4p0*};Pchm?$%ADqH0_~ZKIR$xeV&RZ+~VugJQ)yZ<M&clZf*DhVU^eaGKxNyOXtS$iy${M4( z5w}QayMInDL&=v*M={U1_ta3`uy!81hq0eM8 zQ@LF3D~rIjbSndKy95lM1NpEsjpB)5u6rw=x#krf67d8HGW?m;DO<#_n1| z*D{~a2X!lBgKZ{YZ#N!Z>bJYr(!gu@ZXTy;Nmqg1ANJc_t3HO@JdOb7w-u@;?KVxr zN;3#a8 literal 0 HcmV?d00001 diff --git a/resources/src/mediawiki.special/images/special.search/dna-icon.svg b/resources/src/mediawiki.special/images/special.search/dna-icon.svg new file mode 100644 index 0000000000..b6472d2975 --- /dev/null +++ b/resources/src/mediawiki.special/images/special.search/dna-icon.svg @@ -0,0 +1,34 @@ + + + + wikispecies-icon + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/src/mediawiki.special/images/special.search/image-icon.png b/resources/src/mediawiki.special/images/special.search/image-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1ebbc7414e883573255e478ef28d3c8fa70b0e8c GIT binary patch literal 954 zcmV;r14aCaP)p8Hpl&RqSc0j9mc8Y}C&)wssK>;9=E zAry2|f`ut2R zvRU1fFX{1k95EZWx3@RFzP?6)kT##Aqob|M_`TchMsjzs@)(YTU9Z==zrPpXCmB*l z(&y*ro1X!DadF|obUA>L@x#NzCU6Q8-(_KoMY+4X+uRG&fG%j^0h6om@9&$O1#G*W zZyVd`bTpsOHyCejZbV)eu<(FwhLAD&nT6Rn8039*^*xqz|Jhlg5js3zf}_u3RN7rR zo5mJO!Ivp!6fhPcr-cO!n=dafo0uAnw3%jq_{jMB`Z~IZ{(O7O?lYH#1#IUYt;bAL zxk9uq1|U5gD^d%BkCt}+&StZyGP@YX?(y;a0HyMPhr?micU{a*k&lm$y<_Q)=Y*BC z2MKP)ZTIs^GHgqbvGMpgaXXrsbUQ_s%cZChIV~*11oQRvZ#PNrEYgDwD5fkkY8D(m z!UMJk2DW*ZmmDSMH#( c)WI?Q7yYVdOvD8fmjD0&07*qoM6N<$f)=~cRR910 literal 0 HcmV?d00001 diff --git a/resources/src/mediawiki.special/images/special.search/image-icon.svg b/resources/src/mediawiki.special/images/special.search/image-icon.svg new file mode 100644 index 0000000000..b68762e09c --- /dev/null +++ b/resources/src/mediawiki.special/images/special.search/image-icon.svg @@ -0,0 +1,16 @@ + + + + commons-icon + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/resources/src/mediawiki.special/images/special.search/news-icon.png b/resources/src/mediawiki.special/images/special.search/news-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6b79590dd378408a2af524c8719b8d86a909f2e7 GIT binary patch literal 750 zcmVC(P6!0^E6RpyL2J?IMc6hIu(DfzxY zss0jR>UaQf)ut>3Pz&%Qfb#&5S)5*Ov{iwra4+SK==azNdP|xV`3hqHE)R1kk#klB zmKqw*iGSwW3|uyUZOR(H9(h|%-)gdk5Ylu`0e5=UPPj1OqHSpxJG(9YBTn%xZTb+lu zw0ls|jFZj6~-Q zJk$oj1%PddOPq`^4f!V*{yZhnH1pC@o3z5+MOIih8rooY(k!Iu;T?t1zBKe6*6dia zk9ldSV9hFO=HaXq3T0-%_sXLde^f#?J`UkIkc8L#sAY0Viz_9~osV#(#AK&Qc#Ht^ zqZUaRmXI-fhD*Rmbk4w~OH0i@l*D6NnYiF7em<-gDR5RMh!)X4(OvHg2fTks3*R*TW2+@toM^$M~9t1U9>kQJDf6>ru0#u?@n zzp*sh_ZArQ(^UzkZt-{>EF-_hLMO1})$Ob_M5Vy&IOeOwG1!^2w-+$I%tWEt%Mv&v zy9oEcSfI2vjfbg#(5$wYv9(tZvy(;7ES + + + wikinews-icon + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/src/mediawiki.special/images/special.search/quotation-icon.png b/resources/src/mediawiki.special/images/special.search/quotation-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9d3ade30b800778a1c603b218caca5b95d56ffd6 GIT binary patch literal 680 zcmV;Z0$2TsP)oo*H5QXn%AOtdy0U{s+M1Tm80TCbqM1Tko0U|&IoNIf|8M{4QRoy+z>{k8RAM>dG z>T#=fCRj3?EEz8xc+oTN8TJe>SOoem>2&}bz>hed{Xy(jgFpH`iuvmUcpJbTfSs1Z z2LPKr0Tc2#_*-fDh_clL-UV<1fCrehK7biOf_4S6H(-{}1pxkbSxsPOk^b5hq^{nQ z4Ab#J$f{JWwSWmp*mmi5`L3E_I=mCI+CE4PUzVL7OMiB16vBr ztTMY+s{))8=@MY}?6s9N++Pfw8)QLj?Pbq&|U`C9Kg~pgw9yIA#coCl`u-3RnsuWxU%+h*SdaeOW zSC;JVhZ0sDQ3K3%kt>|WwgB8~ZcN<6jg9T2F}4lMSZx|$W>>S>TxHD4*g>`J!)l_o zm^4BHwkY!&0IL$mfVBZWRj#$ad`Q6Bq5o`HGgIYf5v!~KOTg?${(+Y)E83BlYV{&J zz!LD6L>jKw5G%flOA0?ANM;tR=7qI@v&t(%)q6#yfGzzb1y0IXb6pFZT~R{==KM{4 zIcWm(@4ytBl)WjpA+2U`R!bw0LON%)GAxy>_5*+xSn|i~=D&xQ9+nQ^z#S3t3`?bx zxb7w0+1Md!-opju<)Y=HHI0C)bU_=rO1nzWl#h?4f`0O`KV=q+-M&2438#NnFsX@X9jLGk9`A-XO=xKBeoF$ O0000 + + + wikiquote-icon + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/resources/src/mediawiki.special/images/special.search/textbook-icon.png b/resources/src/mediawiki.special/images/special.search/textbook-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0de2821fadb8eefc22668577731d7b2bea2aa5fb GIT binary patch literal 1187 zcmV;U1YG-xP)O@ zdpw?!Wb?~RlKEy+p%W{W6XT^b@OQWP*}|u8;TaLNN=(9KkGb@_tQ)IVpNO9HfAIZSvX40twFPaeM1%=0RYbtg&(CymaS`lzG#U}=5z)SY z0SIsF=n1(ZqMt-GEJG{;et(Y}y5H~9(~~l60l3rY(Ea^=a9s2GoZFigHUXQC4y4|& zYkCmi@pw$Px3@vy)oMjoS1=ke1l;9DV7*!y*FFevwOXZS(`BF!oGi--pAazmXti3@ zZntT@Uen#(9qMC~RBK664gxG0h*5_vtaf-nVmV-0VB)xJHXHtXL_`nLXB-3=gTA>5 zd*^bwy#(5B6$v_-y z82`d7O$6=5(b=&BW0!gp0AnrTc#4)|2L=EZZX-%Ubgk2yly*C@U$Mj;`{nV4Fw#=-^N1j9@*Fa*G2QCvnCa84L_fiW=<@cB}y zSi|rEE4gU4h2Vezy4@}d5BwaIi(+6{=jEk%{v#KK-y|0PA}}6dg_-aSBnRMS4-Zxj zz$+J11GeNMJZmzUD4l$LZEen8xtJQTB^QzMd3)Q6sd~N684&#G4Ku~SN3ezgQjm+h zOpwq+W_^d2z1il#8W+ z1(6P_>?4*oA8pA+xHTpc6Q^@(T-PZVQv{aEMd$IBB5;{7v%r@suv9JLOcj`8=1alJVadgmfeUic18;?yDFaLIk63asWnk%B2}>@f3|x?lf%UwTi>U)k z-!AUL%+!IUZx?rRF?C>gu`_oLRflvEGBR0~?c|~e7+N@XPYYKTd^Z4~Xw2lFYpvlH zPwrBS;D}XKlw8C!_`(a+6U$g51*PPo2>7e_v?Ny^0E?`Jaf?R^tmL9AU&a|xt=E-o z6#=`1e||I&;`$DT^I}?F_~+YWQ2Jt9*~?}s%tR6ao``<VhnXt_5MwCZ?1=%FH12<` z4%hbHYvPf8Ct%TRpMgcwlyIf9g%dWOXy_+r;lIH%Nn1o-+8zJ^002ovPDHLkV1ji^ B9v%Py literal 0 HcmV?d00001 diff --git a/resources/src/mediawiki.special/images/special.search/textbook-icon.svg b/resources/src/mediawiki.special/images/special.search/textbook-icon.svg new file mode 100644 index 0000000000..52446b88b1 --- /dev/null +++ b/resources/src/mediawiki.special/images/special.search/textbook-icon.svg @@ -0,0 +1,28 @@ + + + + wikibooks-icon + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/src/mediawiki.special/images/special.search/travel-icon.png b/resources/src/mediawiki.special/images/special.search/travel-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9540e5b568abc9422696c1134c72322a4362e2e5 GIT binary patch literal 1226 zcmV;*1U37KP)Br5IvhHk)KS4CqN`bt_qn9Pk<6^h$r9;kgGzd1PDcV0zV~?A(c=^-BGjsou28r zbMN=FyIr-xes_NQ%<1XwnVv1|G1=NhED)EJ}l^I07n4)1n^<_?F)d< zb1(RufC=ytfXe{RHvoA9;5mR7b1c9dfbRmh4uF7rg^WK2aKCq;)PG9A*8tp`2&lzJ z;2ir&FYqY<(_A0T1XKaP0f1&dN_qj)bP2Xqeginr+9_*K&@}aC=>bfj1l%gW25X>W zIwv~61aQ##mNzG00&kKrfEiAnRXp!20A~RlGTIORze@5gr;2#Sy8}LMrBSG$dADp z<;rkhM^a0gFS9f&WI5&A>6^zi+p&EY!`|R&&(@Ss3M+-^wdt%5n~!#$^x50fMQe&M ztk_koslDqd>oMRh?ons|tG%Cl_=S0DfITy_d&S%1QFfDJ9?RBar}o~wUi<2ehhkT; zrpzn4cP$G{HWmp z0Ig+*lmIJ-u+CtqTMk%eb|t{oFmJJh2&;LUs1B)*ir)*K+G996**XCZ z>Aaf&cQG7gF50fuoY_9aST=Ci9*zQ0;j4IBX+W-=R({!Fhw1{XysrmjUBZ$&=!D~N z3gUJZ)p1V&Zao$%;??bmH?DX48P2q*fHD!4kSo)ZiF<=ND*(LH=6P9(I_Na#(tGZ- zw2Aq2*Lj$xLr0aW_6-)fvZe{Jo8H!veD6+cWr!*hC%~icv^I@p0{&V$ywn&bVDIYG z)^n8k&v{Mj)w#OwrAsX5gR6y6^`VkgMsGS(a8kObXU&w9K$neW+Hnjug@&wdrc~h?;ahQ0e-X z-`)Y(7BhS4rk4lj1$I^yy$WPgg<}k0nw|F`CE;Y=YpZ~s15-sf_P+?=j`M0D%|o!< z(_W!{Vco|7j+nP+TGq7HEd~322XL%npRFP9-*7#EYmUs*_Zxtx1E8zbO{W{wUKF^) z_5w~Ji%hBKMB%3A&k5Lq;R2)*jCv7IaFYYHN-Ps_mnlxw oc^~jpE4i-Y>@&Qs%uJ=%UjT|KOv|rYh5!Hn07*qoM6N<$f_)@GLjV8( literal 0 HcmV?d00001 diff --git a/resources/src/mediawiki.special/images/special.search/travel-icon.svg b/resources/src/mediawiki.special/images/special.search/travel-icon.svg new file mode 100644 index 0000000000..c61da34f03 --- /dev/null +++ b/resources/src/mediawiki.special/images/special.search/travel-icon.svg @@ -0,0 +1,15 @@ + + + + wikivoyage-icon + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/resources/src/mediawiki.special/mediawiki.special.search.commonsInterwikiWidget.js b/resources/src/mediawiki.special/mediawiki.special.search.commonsInterwikiWidget.js new file mode 100644 index 0000000000..3810ac1b0a --- /dev/null +++ b/resources/src/mediawiki.special/mediawiki.special.search.commonsInterwikiWidget.js @@ -0,0 +1,80 @@ +( function ( mw, $ ) { + + var api = new mw.Api(), + pageUrl = new mw.Uri(), + imagesText = new mw.Message( mw.messages, 'searchprofile-images' ), + moreResultsText = new mw.Message( mw.messages, 'search-interwiki-more' ); + + function itemTemplate( results ) { + + var resultOutput = '', i, result, imageCaption, imageThumbnailSrc; + + for ( i = 0; i < results.length; i++ ) { + result = results[ i ], + imageCaption = mw.html.element( 'span', { 'class': 'iw-result__mini-gallery__caption' }, result.title ); + imageThumbnailSrc = ( result.thumbnail ) ? result.thumbnail.source : ''; + resultOutput += ''; + } + + return resultOutput; + } + + function itemWrapperTemplate( pageQuery, itemTemplateOutput ) { + + return '
  • ' + + '
    ' + + '' + + '' + imagesText.escaped() + '' + + '
    ' + + '
    ' + + /* template output has been sanitized by mw.html.element */ + itemTemplateOutput + + '
    ' + + '' + + '
  • '; + + } + + api.get( { + action: 'query', + generator: 'search', + gsrsearch: pageUrl.query.search, + gsrnamespace: mw.config.get( 'wgNamespaceIds' ).file, + gsrlimit: 3, + prop: 'pageimages', + pilimit: 3, + piprop: 'thumbnail', + pithumbsize: 300, + formatversion: 2 + } ) + .done( function ( resp ) { + var results = ( resp.query && resp.query.pages ) ? resp.query.pages : false, + multimediaWidgetTemplate; + + if ( !results ) { + return; + } + + results.sort( function( a, b ) { + return b.index - a.index; + } ); + + multimediaWidgetTemplate = itemWrapperTemplate( pageUrl.query.search, itemTemplate( results ) ); + /* we really only need to wait for document ready for DOM manipulation */ + $( function () { + $( '.iw-results' ).prepend( multimediaWidgetTemplate ); + } ); + } ); + +}( mediaWiki, jQuery ) ); diff --git a/resources/src/mediawiki.special/mediawiki.special.search.interwikiwidget.styles.less b/resources/src/mediawiki.special/mediawiki.special.search.interwikiwidget.styles.less new file mode 100644 index 0000000000..923b81a019 --- /dev/null +++ b/resources/src/mediawiki.special/mediawiki.special.search.interwikiwidget.styles.less @@ -0,0 +1,222 @@ +/* interwiki search results */ +/*==========================*/ + +#mw-interwiki-results { + float: right; + width: 30%; +} + +.iw-headline { + font-weight: bold; + font-size: 1rem; + font-size: 16px; + opacity: 0.7; +} + +.iw-results { + list-style: none; + margin: 0; +} + +.iw-resultset { + margin-bottom: 1.2em; + background-color: #f2f4f7; + vertical-align: top; + width: 100%; + float: left; + list-style-type: none; +} + +/* clearfix */ +.iw-result:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; +} + +* html .interwiki-result { zoom: 1; } /* IE6 */ +*:first-child+html .iw-resultset { zoom: 1; } /* IE7 */ + +/* padding each .iw-resultset section seperately. +This allows us greater flexibility in the design. +For example changing the background color on the +header and footer. */ +.iw-result__header, +.iw-result__title, +.iw-result__content, +.iw-result__footer { + padding-left: 0.85em; + padding-right: 0.85em; + padding-top: 0.25em; + padding-bottom: 0.25em; +} + +/* definition titles appear inline, +to resemble a traditional dictionary definition */ +.iw-resultset--definition .iw-result__title { + display: inline; + padding: 0; +} + +.iw-resultset > div:first-child { + padding-top: 0.85em; +} + +.iw-resultset > div:last-child { + padding-bottom: 0.85em; +} + +.iw-result__title { + font-size: 16px; /* rem fallback */ + font-size: 1rem; +} + +.iw-result__title a.extiw { + color: #252525; + font-weight: bold; +} + +.iw-result__content:after { /* clearfix */ + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; +} + +.iw-result__footer { + float: right; +} + +.iw-result__icon { + display: inline-block; + width: 24px; + height: 24px; + vertical-align: middle; + margin-right: 0.25em; + background: url( images/special.search/definition-icon.svg ) no-repeat 0 0; + background-size: 100% 100%; +} + +@interwikiContentTypes: definition, travel, quotation, book, course, news, textbook, image; + +.generate-iwIcons(); + +.generate-iwIcons( @i:1 ) when ( @i =< length( @interwikiContentTypes ) ) { + @iwIcon: extract( @interwikiContentTypes, @i ); + + .iw-result__icon--@{iwIcon} { + /* stylelint-disable-next-line function-url-quotes */ + background-image: url( 'images/special.search/@{iwIcon}-icon.png' ); + /* stylelint-disable-next-line function-url-quotes */ + background-image: url( 'images/special.search/@{iwIcon}-icon.svg' ); + } + + .generate-iwIcons( @i + 1 ); +} + +/* image search result */ +.iw-result__mini-gallery { + position: relative; + float: left; + width: 60%; + height: 200px; + box-sizing: border-box; + padding: 0.25rem; +} + +.iw-result__mini-gallery__image { + display: block; + position: relative; + width: 100%; + height: 100%; + background-size: cover; + background-repeat: no-repeat; + background-position: center center; +} + +.iw-result__mini-gallery__image:hover > .iw-result__mini-gallery__caption { + visibility: visible; +} + +.iw-result__mini-gallery__image > .iw-result__mini-gallery__caption { /* image gallery text */ + visibility: hidden; + position: absolute; + bottom: 0; + left: 0; + text-align: center; + color: #fff; + text-shadow: 0 0 10px rgba( 0, 0, 0, 0.4 ); /* improves legibility on white background*/ + font-size: 0.8em; + padding: 5px; + background-color: rgba( 0, 0, 0, 0.5 ); +} + +.iw-result__mini-gallery:nth-child(2), +.iw-result__mini-gallery:nth-child(3) { /* second and third images are small */ + width: 40%; + height: 100px; +} + +/* different types of interwiki result boxes */ +/* quotation box */ +.iw-resultset--quotation .iw-result__content { + border-left: 4px solid #afb1b5; + margin-left: 1em; + padding-top: 0; + margin-top: 0.25em; +} +.iw-resultset--quotation .iw-result__title{ + margin-left: 1em; +} +.iw-result--quotation .iw-result__title:before{ + content: ' — '; + display: inline-block; +} +.iw-result--quotation .iw-result__footer { + text-align: right; +} + +/* no results +span the interwiki results across the bottom of the page. +*/ + +.mw-search-nonefound ~ #mw-search-interwiki { + width: 100%; +} + +.mw-search-nonefound ~ #mw-search-interwiki .iw-resultset { + width: 30%; + max-width: 300px; + margin-left: 0.5em; + margin-right: 0.5em; +} + +/* mobile */ +@media only screen and ( max-width:768px ) { + #mw-interwiki-results { + width: 100%; + } + .mw-search-results { + max-width: none !important; + } + .iw-resultset { + width: 45% !important; + margin-left: 0.5em !important; + margin-right: 0.5em !important; + } + +} + +@media only screen and ( max-width:600px ) { + .iw-resultset { + width: 100% !important; + margin-left: 0 !important; + margin-right: 0 !important; + max-width: none !important; + } +} diff --git a/resources/src/mediawiki.special/mediawiki.special.search.styles.css b/resources/src/mediawiki.special/mediawiki.special.search.styles.css index ebe9ed94ce..9559f20cd3 100644 --- a/resources/src/mediawiki.special/mediawiki.special.search.styles.css +++ b/resources/src/mediawiki.special/mediawiki.special.search.styles.css @@ -29,13 +29,11 @@ .mw-search-nonefound + .mw-search-interwiki-header { margin-top: 0; } -.searchresult { - font-size: 95%; - max-width: 38em; -} + .mw-search-results { - margin-left: 0; + margin: 0; float: left; + max-width: 60%; } .mw-search-visualclear { clear: both; @@ -93,6 +91,10 @@ float: left; width: 100%; } + +/* Advanced options menu */ +/*==========================*/ + #mw-searchoptions { margin: 0; padding: 0.5em 0.75em 0.75em 0.75em; @@ -127,12 +129,14 @@ padding-left: 6em; font-size: 85%; } + #mw-search-interwiki { float: right; width: 18em; border: 1px solid #a2a9b1; margin-top: 2ex; } + .searchalttitle, #mw-search-interwiki li { font-size: 95%; @@ -153,6 +157,7 @@ background-color: #eaecf0; border-top: 1px solid #c8ccd1; } + .searchdidyoumean { font-size: 127%; margin-top: 0.8em; -- 2.20.1