| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 | # SPDX-License-Identifier: AGPL-3.0-or-later"""Calculate mathematical expressions using ack#eval"""from flask_babel import gettextfrom searx.data import WIKIDATA_UNITSname = "Unit converter plugin"description = gettext("Convert between units")default_on = TrueCONVERT_KEYWORDS = ["in", "to", "as"]def _convert(from_value, source_si_factor, target_si_factor):    return from_value * source_si_factor / target_si_factordef _parse_text_and_convert(search, splitted_query):    if len(splitted_query) != 2 or splitted_query[0].strip() == "" or splitted_query[1].strip() == "":        return    from_value = ""    from_unit_key = ""    # only parse digits as value that belong together    read_alpha = False    for c in splitted_query[0]:        if not read_alpha and (c in ("-", ".") or str.isdigit(c)):            from_value += c            read_alpha = True        elif c != " ":            from_unit_key += c    to_unit_key = splitted_query[1].strip()    from_unit = None    to_unit = None    for unit in WIKIDATA_UNITS.values():        if unit['symbol'] == from_unit_key:            from_unit = unit        if unit['symbol'] == to_unit_key:            to_unit = unit        if from_unit and to_unit:            break    if from_unit is None or to_unit is None or to_unit.get('si_name') != from_unit.get('si_name'):        return    result = _convert(float(from_value), from_unit['to_si_factor'], to_unit['to_si_factor'])    search.result_container.answers['conversion'] = {'answer': f"{result:g} {to_unit['symbol']}"}def post_search(_request, search):    # only convert between units on the first page    if search.search_query.pageno > 1:        return True    query = search.search_query.query    query_parts = query.split(" ")    if len(query_parts) < 3:        return True    for query_part in query_parts:        for keyword in CONVERT_KEYWORDS:            if query_part == keyword:                keyword_split = query.split(keyword, 1)                _parse_text_and_convert(search, keyword_split)                return True    return True
 |