1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- # SPDX-License-Identifier: AGPL-3.0-or-later
- # pylint: disable=missing-module-docstring
- from __future__ import annotations
- from functools import reduce
- from operator import mul
- import babel
- import babel.numbers
- from flask_babel import gettext
- from searx.extended_types import sxng_request
- from searx.result_types import Answer
- from searx.result_types.answer import BaseAnswer
- from . import Answerer, AnswererInfo
- kw2func = [
- ("min", min),
- ("max", max),
- ("avg", lambda args: sum(args) / len(args)),
- ("sum", sum),
- ("prod", lambda args: reduce(mul, args, 1)),
- ]
- class SXNGAnswerer(Answerer):
- """Statistics functions"""
- keywords = [kw for kw, _ in kw2func]
- def info(self):
- return AnswererInfo(
- name=gettext(self.__doc__),
- description=gettext(f"Compute {'/'.join(self.keywords)} of the arguments"),
- keywords=self.keywords,
- examples=["avg 123 548 2.04 24.2"],
- )
- def answer(self, query: str) -> list[BaseAnswer]:
- results = []
- parts = query.split()
- if len(parts) < 2:
- return results
- ui_locale = babel.Locale.parse(sxng_request.preferences.get_value('locale'), sep='-')
- try:
- args = [babel.numbers.parse_decimal(num, ui_locale, numbering_system="latn") for num in parts[1:]]
- except: # pylint: disable=bare-except
- # seems one of the args is not a float type, can't be converted to float
- return results
- for k, func in kw2func:
- if k == parts[0]:
- res = func(args)
- res = babel.numbers.format_decimal(res, locale=ui_locale)
- f_str = ', '.join(babel.numbers.format_decimal(arg, locale=ui_locale) for arg in args)
- results.append(Answer(answer=f"[{ui_locale}] {k}({f_str}) = {res} "))
- break
- return results
|