summaryrefslogtreecommitdiff
path: root/searx/engines/lucide.py
blob: ad62f3038906e343b2c5d6710ba93fa9f20e269b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# SPDX-License-Identifier: AGPL-3.0-or-later
"""Browse one of the largest collections of copyleft icons
that can be used for own projects (e.g. apps, websites).

.. _Website: https://lucide.dev

"""

import typing as t

from searx.result_types import EngineResults

if t.TYPE_CHECKING:
    from extended_types import SXNG_Response
    from search.processors.online import OnlineParams


about = {
    "website": "https://lucide.dev/",
    "wikidata_id": None,
    "official_api_documentation": None,
    "use_official_api": True,
    "results": "JSON",
}

cdn_base_url = "https://cdn.jsdelivr.net/npm/lucide-static"
categories = ["images", "icons"]


def request(query: str, params: "OnlineParams"):
    params["url"] = f"{cdn_base_url}/tags.json"
    params['query'] = query
    return params


def response(resp: "SXNG_Response") -> EngineResults:
    res = EngineResults()
    query_parts = resp.search_params["query"].lower().split(" ")

    def is_result_match(result: tuple[str, list[str]]) -> bool:
        icon_name, tags = result

        for part in query_parts:
            if part in icon_name:
                return True

            for tag in tags:
                if part in tag:
                    return True

        return False

    filtered_results = filter(is_result_match, resp.json().items())
    for icon_name, tags in filtered_results:
        img_src = f"{cdn_base_url}/icons/{icon_name}.svg"
        res.add(
            res.types.LegacyResult(
                {
                    "template": "images.html",
                    "url": img_src,
                    "title": icon_name,
                    "content": ", ".join(tags),
                    "img_src": img_src,
                    "img_format": "SVG",
                }
            )
        )

    return res