.oO SearXNG Developer Documentation Oo.
Loading...
Searching...
No Matches
online_dictionary.py
Go to the documentation of this file.
1# SPDX-License-Identifier: AGPL-3.0-or-later
2"""Processor used for ``online_dictionary`` engines."""
3
4import typing as t
5import re
6
7from searx.sxng_locales import sxng_locales
8from .online import OnlineProcessor, OnlineParams
9
10if t.TYPE_CHECKING:
11 from searx.search.models import SearchQuery
12
13search_syntax = re.compile(r".*?([a-z]+)-([a-z]+) (.+)$", re.I)
14"""Search syntax used for from/to language (e.g. ``en-de``)"""
15
16FromToType: t.TypeAlias = tuple[bool, str, str]
17"""Type of a language descriptions in the context of a ``online_dictionary``."""
18
19
20class DictParams(t.TypedDict):
21 """Dictionary request parameters."""
22
23 from_lang: FromToType
24 """Language from which is to be translated."""
25
26 to_lang: FromToType
27 """Language to translate into."""
28
29 query: str
30 """Search term, cleaned of search syntax (*from-to* has been removed)."""
31
32
33class OnlineDictParams(DictParams, OnlineParams): # pylint: disable=duplicate-bases
34 """Request parameters of a ``online_dictionary`` engine."""
35
36
38 """Processor class for ``online_dictionary`` engines."""
39
40 engine_type: str = "online_dictionary"
41
42 def get_params(self, search_query: "SearchQuery", engine_category: str) -> OnlineDictParams | None:
43 """Returns a dictionary with the :ref:`request params <engine request
44 online_dictionary>` (:py:obj:`OnlineDictParams`). ``None`` is returned
45 if the search query does not match :py:obj:`search_syntax`."""
46
47 online_params: OnlineParams | None = super().get_params(search_query, engine_category)
48 if online_params is None:
49 return None
50 m = search_syntax.match(search_query.query)
51 if not m:
52 return None
53
54 from_lang, to_lang, query = m.groups()
55 from_lang = _get_lang_descr(from_lang)
56 to_lang = _get_lang_descr(to_lang)
57 if not from_lang or not to_lang:
58 return None
59
60 params: OnlineDictParams = {
61 **online_params,
62 "from_lang": from_lang,
63 "to_lang": to_lang,
64 "query": query,
65 }
66
67 return params
68
69
70def _get_lang_descr(lang: str) -> FromToType | None:
71 """Returns language's code and language's english name if argument ``lang``
72 describes a language known by SearXNG, otherwise ``None``.
73
74 Examples:
75
76 .. code:: python
77
78 >>> _get_lang_descr("zz")
79 None
80 >>> _get_lang_descr("uk")
81 (True, "uk", "ukrainian")
82 >>> _get_lang_descr(b"uk")
83 (True, "uk", "ukrainian")
84 >>> _get_lang_descr("en")
85 (True, "en", "english")
86 >>> _get_lang_descr("EspaƱol")
87 (True, "es", "spanish")
88 >>> _get_lang_descr("Spanish")
89 (True, "es", "spanish")
90
91 """
92 lang = lang.lower()
93 is_abbr = len(lang) == 2
94 if is_abbr:
95 for l in sxng_locales:
96 if l[0][:2] == lang:
97 return (True, l[0][:2], l[3].lower())
98 return None
99 for l in sxng_locales:
100 if l[1].lower() == lang or l[3].lower() == lang:
101 return (True, l[0][:2], l[3].lower())
102 return None
OnlineDictParams|None get_params(self, "SearchQuery" search_query, str engine_category)