[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
+8
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;
@@ -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;
}
}
+3
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";
+7
View File
@@ -0,0 +1,7 @@
.. _result_types.keyvalue:
=================
Key-Value Results
=================
.. automodule:: searx.result_types.keyvalue
+1
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
+3 -1
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
+49
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)
@@ -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>