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
   --color-answer-font: #444; // same as --color-base-font
   --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
   --color-result-background: #fff;
   --color-result-border: #ddd;
@@ -180,6 +184,10 @@
   /// Answer Colors
   --color-answer-font: #bbb; // same as --color-base-font
   --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
   --color-result-background: #26292f;
   --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 {
   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
 
    main/mainresult
+   main/keyvalue
 
 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

+ 3 - 1
searx/result_types/__init__.py

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