@@ -0,0 +1,122 @@
1+# -*- coding: utf-8 -*-
6+ @website https://wiki.gentoo.org
7+ @provide-api no (Mediawiki provides API, but Arch Wiki blocks access to it
10+ @stable no (HTML can change)
15+from searx.engines.xpath import extract_text
16+from searx.url_utils import urlencode, urljoin
18+# engine dependent config
20+language_support = True
22+base_url = 'https://wiki.gentoo.org'
25+xpath_results = '//ul[@class="mw-search-results"]/li'
26+xpath_link = './/div[@class="mw-search-result-heading"]/a'
29+# cut 'en' from 'en-US', 'de' from 'de-CH', and so on
30+def locale_to_lang_code(locale):
31+ if locale.find('-') >= 0:
32+ locale = locale.split('-')[0]
36+# wikis for some languages were moved off from the main site, we need to make
37+# requests to correct URLs to be able to get results in those languages
40+ 'base': 'https://wiki.gentoo.org',
41+ 'search': '/index.php?title=Special:Search&offset={offset}&{query}'
46+# get base & search URLs for selected language
47+def get_lang_urls(language):
48+ if language in lang_urls:
49+ return lang_urls[language]
50+ return lang_urls['en']
53+# Language names to build search requests for
54+# those languages which are hosted on the main site.
77+supported_languages = dict(lang_urls, **main_langs)
81+def request(query, params):
82+ # translate the locale (e.g. 'en-US') to language code ('en')
83+ language = locale_to_lang_code(params['language'])
85+ # if our language is hosted on the main site, we need to add its name
86+ # to the query in order to narrow the results to that language
87+ if language in main_langs:
88+ query += b' (' + main_langs[language] + b')'
90+ # prepare the request parameters
91+ query = urlencode({'search': query})
92+ offset = (params['pageno'] - 1) * 20
94+ # get request URLs for our language of choice
95+ urls = get_lang_urls(language)
96+ search_url = urls['base'] + urls['search']
98+ params['url'] = search_url.format(query=query, offset=offset)
103+# get response from search-request
105+ # get the base URL for the language in which request was made
106+ language = locale_to_lang_code(resp.search_params['language'])
107+ base_url = get_lang_urls(language)['base']
111+ dom = html.fromstring(resp.text)
114+ for result in dom.xpath(xpath_results):
115+ link = result.xpath(xpath_link)[0]
116+ href = urljoin(base_url, link.attrib.get('href'))
117+ title = extract_text(link)
119+ results.append({'url': href,