summaryrefslogtreecommitdiff
path: root/searx/plugins/unit_converter.py
diff options
context:
space:
mode:
authorMarkus Heiser <markus.heiser@darmarit.de>2025-03-20 07:47:38 +0100
committerMarkus Heiser <markus.heiser@darmarIT.de>2025-03-29 10:16:43 +0100
commit50f92779bd9f2762d92a24a63851f4069f88297d (patch)
tree54e9a3d7b2839bf3feb30339c3e3bd63196fd1da /searx/plugins/unit_converter.py
parentd36da0a6c34761258c43424a7d948f0c554ef5c9 (diff)
[refactor] migrate plugins from "module" to class SXNGPlugin
This patch brings two major changes: - ``Result.filter_urls(..)`` to pass a filter function for URL fields - The ``enabled_plugins:`` section in SearXNG's settings do no longer exists. To understand plugin development compile documentation: $ make docs.clean docs.live and read http://0.0.0.0:8000/dev/plugins/development.html There is no longer a distinction between built-in and external plugin, all plugins are registered via the settings in the ``plugins:`` section. In SearXNG, plugins can be registered via a fully qualified class name. A configuration (`PluginCfg`) can be transferred to the plugin, e.g. to activate it by default / *opt-in* or *opt-out* from user's point of view. built-in plugins ================ The built-in plugins are all located in the namespace `searx.plugins`. .. code:: yaml plugins: searx.plugins.calculator.SXNGPlugin: active: true searx.plugins.hash_plugin.SXNGPlugin: active: true searx.plugins.self_info.SXNGPlugin: active: true searx.plugins.tracker_url_remover.SXNGPlugin: active: true searx.plugins.unit_converter.SXNGPlugin: active: true searx.plugins.ahmia_filter.SXNGPlugin: active: true searx.plugins.hostnames.SXNGPlugin: active: true searx.plugins.oa_doi_rewrite.SXNGPlugin: active: false searx.plugins.tor_check.SXNGPlugin: active: false external plugins ================ SearXNG supports *external plugins* / there is no need to install one, SearXNG runs out of the box. - Only show green hosted results: https://github.com/return42/tgwf-searx-plugins/ To get a developer installation in a SearXNG developer environment: .. code:: sh $ git clone git@github.com:return42/tgwf-searx-plugins.git $ ./manage pyenv.cmd python -m \ pip install -e tgwf-searx-plugins To register the plugin in SearXNG add ``only_show_green_results.SXNGPlugin`` to the ``plugins:``: .. code:: yaml plugins: # ... only_show_green_results.SXNGPlugin: active: false Result.filter_urls(..) ====================== The ``Result.filter_urls(..)`` can be used to filter and/or modify URL fields. In the following example, the filter function ``my_url_filter``: .. code:: python def my_url_filter(result, field_name, url_src) -> bool | str: if "google" in url_src: return False # remove URL field from result if "facebook" in url_src: new_url = url_src.replace("facebook", "fb-dummy") return new_url # return modified URL return True # leave URL in field unchanged is applied to all URL fields in the :py:obj:`Plugin.on_result` hook: .. code:: python class MyUrlFilter(Plugin): ... def on_result(self, request, search, result) -> bool: result.filter_urls(my_url_filter) return True Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
Diffstat (limited to 'searx/plugins/unit_converter.py')
-rw-r--r--searx/plugins/unit_converter.py92
1 files changed, 53 insertions, 39 deletions
diff --git a/searx/plugins/unit_converter.py b/searx/plugins/unit_converter.py
index 3b9f98945..2bab598f2 100644
--- a/searx/plugins/unit_converter.py
+++ b/searx/plugins/unit_converter.py
@@ -7,36 +7,74 @@ converters, each converter is one item in the list (compare
:py:obj:`ADDITIONAL_UNITS`). If the symbols are ambiguous, the matching units
of measurement are evaluated. The weighting in the evaluation results from the
sorting of the :py:obj:`list of unit converters<symbol_to_si>`.
-
-Enable in ``settings.yml``:
-
-.. code:: yaml
-
- enabled_plugins:
- ..
- - 'Unit converter plugin'
-
"""
-
from __future__ import annotations
+import typing
import re
import babel.numbers
from flask_babel import gettext, get_locale
from searx import data
+from searx.plugins import Plugin, PluginInfo
from searx.result_types import EngineResults
+if typing.TYPE_CHECKING:
+ from searx.search import SearchWithPlugins
+ from searx.extended_types import SXNG_Request
+ from searx.plugins import PluginCfg
+
-name = "Unit converter plugin"
-description = gettext("Convert between units")
-default_on = True
+name = ""
+description = gettext("")
-plugin_id = "unit_converter"
-preference_section = "general"
+plugin_id = ""
+preference_section = ""
CONVERT_KEYWORDS = ["in", "to", "as"]
+
+class SXNGPlugin(Plugin):
+ """Convert between units. The result is displayed in area for the
+ "answers".
+ """
+
+ id = "unit_converter"
+
+ def __init__(self, plg_cfg: "PluginCfg") -> None:
+ super().__init__(plg_cfg)
+
+ self.info = PluginInfo(
+ id=self.id,
+ name=gettext("Unit converter plugin"),
+ description=gettext("Convert between units"),
+ preference_section="general",
+ )
+
+ def post_search(self, request: "SXNG_Request", search: "SearchWithPlugins") -> EngineResults:
+ results = EngineResults()
+
+ # only convert between units on the first page
+ if search.search_query.pageno > 1:
+ return results
+
+ query = search.search_query.query
+ query_parts = query.split(" ")
+
+ if len(query_parts) < 3:
+ return results
+
+ for query_part in query_parts:
+ for keyword in CONVERT_KEYWORDS:
+ if query_part == keyword:
+ from_query, to_query = query.split(keyword, 1)
+ target_val = _parse_text_and_convert(from_query.strip(), to_query.strip())
+ if target_val:
+ results.add(results.types.Answer(answer=target_val))
+
+ return results
+
+
# inspired from https://stackoverflow.com/a/42475086
RE_MEASURE = r'''
(?P<sign>[-+]?) # +/- or nothing for positive
@@ -243,27 +281,3 @@ def _parse_text_and_convert(from_query, to_query) -> str | None:
result = babel.numbers.format_decimal(value, locale=_locale, format='#,##0.##########;-#')
return f'{result} {target_symbol}'
-
-
-def post_search(_request, search) -> EngineResults:
- results = EngineResults()
-
- # only convert between units on the first page
- if search.search_query.pageno > 1:
- return results
-
- query = search.search_query.query
- query_parts = query.split(" ")
-
- if len(query_parts) < 3:
- return results
-
- for query_part in query_parts:
- for keyword in CONVERT_KEYWORDS:
- if query_part == keyword:
- from_query, to_query = query.split(keyword, 1)
- target_val = _parse_text_and_convert(from_query.strip(), to_query.strip())
- if target_val:
- results.add(results.types.Answer(answer=target_val))
-
- return results