@@ -0,0 +1,122 @@
1+# -*- coding: utf-8 -*-
2+
3+"""
4+ Gentoo Wiki
5+
6+ @website https://wiki.gentoo.org
7+ @provide-api no (Mediawiki provides API, but Arch Wiki blocks access to it
8+ @using-api no
9+ @results HTML
10+ @stable no (HTML can change)
11+ @parse url, title
12+"""
13+
14+from lxml import html
15+from searx.engines.xpath import extract_text
16+from searx.url_utils import urlencode, urljoin
17+
18+# engine dependent config
19+categories = ['it']
20+language_support = True
21+paging = True
22+base_url = 'https://wiki.gentoo.org'
23+
24+# xpath queries
25+xpath_results = '//ul[@class="mw-search-results"]/li'
26+xpath_link = './/div[@class="mw-search-result-heading"]/a'
27+
28+
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]
33+ return locale
34+
35+
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
38+lang_urls = {
39+ 'en': {
40+ 'base': 'https://wiki.gentoo.org',
41+ 'search': '/index.php?title=Special:Search&offset={offset}&{query}'
42+ }
43+}
44+
45+
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']
51+
52+
53+# Language names to build search requests for
54+# those languages which are hosted on the main site.
55+main_langs = {
56+ 'ar': 'العربية',
57+ 'bg': 'Български',
58+ 'cs': 'Česky',
59+ 'da': 'Dansk',
60+ 'el': 'Ελληνικά',
61+ 'es': 'Español',
62+ 'he': 'עברית',
63+ 'hr': 'Hrvatski',
64+ 'hu': 'Magyar',
65+ 'it': 'Italiano',
66+ 'ko': '한국어',
67+ 'lt': 'Lietuviškai',
68+ 'nl': 'Nederlands',
69+ 'pl': 'Polski',
70+ 'pt': 'Português',
71+ 'ru': 'Русский',
72+ 'sl': 'Slovenský',
73+ 'th': 'ไทย',
74+ 'uk': 'Українська',
75+ 'zh': '简体中文'
76+}
77+supported_languages = dict(lang_urls, **main_langs)
78+
79+
80+# do search-request
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'])
84+
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')'
89+
90+ # prepare the request parameters
91+ query = urlencode({'search': query})
92+ offset = (params['pageno'] - 1) * 20
93+
94+ # get request URLs for our language of choice
95+ urls = get_lang_urls(language)
96+ search_url = urls['base'] + urls['search']
97+
98+ params['url'] = search_url.format(query=query, offset=offset)
99+
100+ return params
101+
102+
103+# get response from search-request
104+def response(resp):
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']
108+
109+ results = []
110+
111+ dom = html.fromstring(resp.text)
112+
113+ # parse results
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)
118+
119+ results.append({'url': href,
120+ 'title': title})
121+
122+ return results