[mod] typification of SearXNG: add new result type KeyValue

This patch adds a new result type: KeyValue

- Python class:   searx/result_types/keyvalue.py
- Jinja template: searx/templates/simple/result_templates/keyvalue.html
- CSS (less)      client/simple/src/less/result_types/keyvalue.less

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
This commit is contained in:
Markus Heiser 2025-03-05 17:46:23 +01:00 committed by Markus Heiser
parent 8769b7c6d6
commit af5dbdf768
8 changed files with 127 additions and 1 deletions

View File

@ -57,6 +57,10 @@
/// Answer Colors /// Answer Colors
--color-answer-font: #444; // same as --color-base-font --color-answer-font: #444; // same as --color-base-font
--color-answer-background: #fff; --color-answer-background: #fff;
// colors of the KeyValue result class
--color-result-keyvalue-col-table: #fdfbff;
--color-result-keyvalue-odd: #fdfbff;
--color-result-keyvalue-even: #fff;
/// Results Colors /// Results Colors
--color-result-background: #fff; --color-result-background: #fff;
--color-result-border: #ddd; --color-result-border: #ddd;
@ -180,6 +184,10 @@
/// Answer Colors /// Answer Colors
--color-answer-font: #bbb; // same as --color-base-font --color-answer-font: #bbb; // same as --color-base-font
--color-answer-background: #26292f; --color-answer-background: #26292f;
// colors of the KeyValue result class
--color-result-keyvalue-col-table: #1e1e22;
--color-result-keyvalue-odd: #1e1e22;
--color-result-keyvalue-even: #26292f;
/// Results Colors /// Results Colors
--color-result-background: #26292f; --color-result-background: #26292f;
--color-result-border: #333; --color-result-border: #333;

View File

@ -0,0 +1,35 @@
/*
Layout of the KeyValue result class
*/
#main_results .result-keyvalue {
caption {
padding: 0.8rem 0.5rem;
font-style: italic;
caption-side: bottom;
background-color: var(--color-result-keyvalue-table);
}
.col-key {
width: 25%;
}
table {
word-break: break-word;
table-layout: fixed;
width: 100%;
background-color: var(--color-result-keyvalue-table);
}
tr.odd {
background-color: var(--color-result-keyvalue-odd);
}
tr.even {
background-color: var(--color-result-keyvalue-even);
}
th,
td {
padding: 0.3rem 0.5rem;
}
}

View File

@ -1164,3 +1164,6 @@ summary.title {
pre code { pre code {
white-space: pre-wrap; white-space: pre-wrap;
} }
// import layouts of the Result types
@import "result_types/keyvalue.less";

View File

@ -0,0 +1,7 @@
.. _result_types.keyvalue:
=================
Key-Value Results
=================
.. automodule:: searx.result_types.keyvalue

View File

@ -14,6 +14,7 @@ following types have been implemented so far ..
:maxdepth: 2 :maxdepth: 2
main/mainresult main/mainresult
main/keyvalue
The :ref:`LegacyResult <LegacyResult>` is used internally for the results that The :ref:`LegacyResult <LegacyResult>` is used internally for the results that
have not yet been typed. The templates can be used as orientation until the have not yet been typed. The templates can be used as orientation until the

View File

@ -13,7 +13,7 @@
from __future__ import annotations from __future__ import annotations
__all__ = ["Result", "MainResult", "EngineResults", "AnswerSet", "Answer", "Translations"] __all__ = ["Result", "MainResult", "KeyValue", "EngineResults", "AnswerSet", "Answer", "Translations"]
import abc import abc
@ -21,6 +21,7 @@ from searx import enginelib
from ._base import Result, MainResult, LegacyResult from ._base import Result, MainResult, LegacyResult
from .answer import AnswerSet, Answer, Translations from .answer import AnswerSet, Answer, Translations
from .keyvalue import KeyValue
class ResultList(list, abc.ABC): class ResultList(list, abc.ABC):
@ -30,6 +31,7 @@ class ResultList(list, abc.ABC):
"""The collection of result types (which have already been implemented).""" """The collection of result types (which have already been implemented)."""
Answer = Answer Answer = Answer
KeyValue = KeyValue
MainResult = MainResult MainResult = MainResult
Result = Result Result = Result
Translations = Translations Translations = Translations

View File

@ -0,0 +1,49 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
"""
Typification of the *keyvalue* results. Results of this type are rendered in
the :origin:`keyvalue.html <searx/templates/simple/result_templates/keyvalue.html>`
template.
----
.. autoclass:: KeyValue
:members:
:show-inheritance:
"""
# pylint: disable=too-few-public-methods
from __future__ import annotations
__all__ = ["KeyValue"]
import typing
from collections import OrderedDict
from ._base import MainResult
class KeyValue(MainResult, kw_only=True):
"""Simple table view which maps *key* names (first col) to *values*
(second col)."""
template: str = "keyvalue.html"
kvmap: dict[str, typing.Any] | OrderedDict[str, typing.Any]
"""Dictionary with keys and values. To sort keys, use :py:obj:`OrderedDict`."""
caption: str = ""
"""Optional caption for this result."""
key_title: str = ""
"""Optional title for the *key column*."""
value_title: str = ""
"""Optional title for the *value column*."""
def __hash__(self) -> int:
"""The KeyValues objects are checked for object identity, even if all
fields of two results have the same values, they are different from each
other.
"""
return id(self)

View File

@ -0,0 +1,21 @@
<article class="result result-keyvalue {% if result.category -%}category-{{ result.category }}{%- endif -%}">
<table>
{%- if result.caption %}<caption>{{ result.caption }}</caption>{%- endif -%}
{%- if result.key_title or result.value_title %}
<thead>
<tr>
<th class="col-key" scope="col" >{{result.key_title}}</th>
<th class="col-value" scope="col" >{{result.value_title}}</th>
</tr>
</thead>
{%- endif -%}
{%- for key, value in result.kvmap.items() -%}
<tr class="{{ loop.cycle('odd', 'even') }}">
<th class="col-key" scope="row">{{ key }}</th>{{- '' -}}
<td class="col-value">{{ value }}</td>{{- '' -}}
</tr>
{%- endfor -%}
</table>{{- '' -}}
<div class="engines">{% for engine in result.engines %}<span>{{ engine }}</span>{% endfor %}</div>{{- '' -}}
<div class="break"></div>{{- '' -}}
</article>