Browse Source

[enh] introduce /help route

Translation will be implemented in the future.
For now the "en" in /help/en/<pagename> is hardcoded.
Martin Fischer 3 years ago
parent
commit
fb9eedbf40

+ 0 - 6
searx/templates/oscar/about.html

@@ -1,6 +0,0 @@
-{% extends "oscar/base.html" %}
-{% block title %}{{ _('about') }} - {% endblock %}
-{% block content %}
-{{ help.about | safe }}
-{% include "__common__/aboutextend.html" ignore missing %}
-{% endblock %}

+ 5 - 0
searx/templates/oscar/help.html

@@ -0,0 +1,5 @@
+{% extends "oscar/base.html" %}
+{% block title %}{{ page.title }} - {% endblock %}
+{% block content %}
+{{ page.content | safe }}
+{% endblock %}

+ 0 - 5
searx/templates/simple/about.html

@@ -1,5 +0,0 @@
-{% extends 'simple/page_with_header.html' %}
-{% block content %}
-{{ help.about | safe }}
-{% include "__common__/aboutextend.html" ignore missing %}
-{% endblock %}

+ 5 - 0
searx/templates/simple/help.html

@@ -0,0 +1,5 @@
+{% extends 'simple/page_with_header.html' %}
+{% block title %}{{ page.title }} - {% endblock %}
+{% block content %}
+{{ page.content | safe }}
+{% endblock %}

+ 21 - 6
searx/user_help.py

@@ -1,5 +1,5 @@
 # pyright: basic
 # pyright: basic
-from typing import Dict
+from typing import Dict, NamedTuple
 import os.path
 import os.path
 import pkg_resources
 import pkg_resources
 
 
@@ -10,8 +10,14 @@ import mistletoe
 from . import get_setting
 from . import get_setting
 from .version import GIT_URL
 from .version import GIT_URL
 
 
-HELP: Dict[str, str] = {}
-""" Maps a filename under help/ without the file extension to the rendered HTML. """
+
+class HelpPage(NamedTuple):
+    title: str
+    content: str
+
+
+PAGES: Dict[str, HelpPage] = {}
+""" Maps a filename under help/ without the file extension to the rendered page. """
 
 
 
 
 def render(app: flask.Flask):
 def render(app: flask.Flask):
@@ -44,6 +50,15 @@ def render(app: flask.Flask):
         if ext != '.md':
         if ext != '.md':
             continue
             continue
 
 
-        markdown = pkg_resources.resource_string(__name__, 'help/' + filename).decode()
-        markdown = define_link_targets + markdown
-        HELP[rootname] = mistletoe.markdown(markdown)
+        file_content = pkg_resources.resource_string(__name__, 'help/' + filename).decode()
+        markdown = define_link_targets + file_content
+        assert file_content.startswith('# ')
+        title = file_content.split('\n', maxsplit=1)[0].strip('# ')
+        content: str = mistletoe.markdown(markdown)
+
+        if filename == 'about.md':
+            try:
+                content += pkg_resources.resource_string(__name__, 'templates/__common__/aboutextend.html').decode()
+            except FileNotFoundError:
+                pass
+        PAGES[rootname] = HelpPage(title=title, content=content)

+ 13 - 2
searx/webapp.py

@@ -877,8 +877,19 @@ def __get_translated_errors(unresponsive_engines: Iterable[UnresponsiveEngine]):
 
 
 @app.route('/about', methods=['GET'])
 @app.route('/about', methods=['GET'])
 def about():
 def about():
-    """Render about page"""
-    return render('about.html', help=user_help.HELP)
+    """Redirect to about page"""
+    return redirect(url_for('help_page', pagename='about'))
+
+
+@app.route('/help/en/<pagename>', methods=['GET'])
+def help_page(pagename):
+    """Render help page"""
+    page = user_help.PAGES.get(pagename)
+
+    if page is None:
+        flask.abort(404)
+
+    return render('help.html', page=user_help.PAGES[pagename])
 
 
 
 
 @app.route('/autocompleter', methods=['GET', 'POST'])
 @app.route('/autocompleter', methods=['GET', 'POST'])

+ 1 - 1
tests/unit/test_webapp.py

@@ -174,7 +174,7 @@ class ViewsTestCase(SearxTestCase):
         self.assertIn(b'<description>first test content</description>', result.data)
         self.assertIn(b'<description>first test content</description>', result.data)
 
 
     def test_about(self):
     def test_about(self):
-        result = self.app.get('/about')
+        result = self.app.get('/help/en/about')
         self.assertEqual(result.status_code, 200)
         self.assertEqual(result.status_code, 200)
         self.assertIn(b'<h1>About SearXNG</h1>', result.data)
         self.assertIn(b'<h1>About SearXNG</h1>', result.data)