Browse Source

[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>
Markus Heiser 1 month ago
parent
commit
af5dbdf768

+ 8 - 0
client/simple/src/less/definitions.less

@@ -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;

+ 35 - 0
client/simple/src/less/result_types/keyvalue.less

@@ -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 - 0
client/simple/src/less/style.less

@@ -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 - 0
docs/dev/result_types/main/keyvalue.rst

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

+ 1 - 0
docs/dev/result_types/main_result.rst

@@ -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
searx/result_types/__init__.py

@@ -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 - 0
searx/result_types/keyvalue.py

@@ -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)

+ 21 - 0
searx/templates/simple/result_templates/keyvalue.html

@@ -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>