summaryrefslogtreecommitdiff
path: root/searxng_extra/docs_prebuild
blob: f19d59800750552a17858b1e3d0885f504ed9b28 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/env python
# lint: pylint
# SPDX-License-Identifier: AGPL-3.0-or-later

"""Script that implements some prebuild tasks needed by target docs.prebuild
"""

import sys
import os.path
import time
from contextlib import contextmanager
from searx import settings, get_setting, locales
from searx.infopage import InfoPageSet, InfoPage


_doc_user = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'docs', 'user'))


def main():
    locales.locales_initialize()
    base_url = get_setting('server.base_url', None)
    if base_url:
        infopageset_ctx = _instance_infosetset_ctx(base_url)
    else:
        infopageset_ctx = _offline_infosetset_ctx()

    with infopageset_ctx as infopageset:
        for _, _, page in infopageset.iter_pages('en'):
            fname = os.path.join(_doc_user, os.path.basename(page.fname))
            with open(fname, 'w') as f:
                f.write(page.content)


class OfflinePage(InfoPage):

    def get_ctx(self):  # pylint: disable=no-self-use
        """Jinja context to render :py:obj:`DocPage.content` for offline purpose (no
        links to SearXNG instance)"""

        ctx = super().get_ctx()
        ctx['link'] = lambda name, url: '`%s`' % name
        ctx['search'] = lambda query: '`%s`' % query

        return ctx


@contextmanager
def _offline_infosetset_ctx():
    yield InfoPageSet(OfflinePage)


@contextmanager
def _instance_infosetset_ctx(base_url):
    # The url_for functions in the jinja templates need all routes to be
    # registered in the Flask app.

    settings['server']['secret_key'] = ''
    from searx.webapp import app

    # Specify base_url so that url_for() works for base_urls.  If base_url is
    # specified, then these values from are given preference over any Flask's
    # generics (see flaskfix.py).

    with app.test_request_context(base_url=base_url):
        yield InfoPageSet()

    # The searx.webapp import from above fires some HTTP requests, that's
    # why we get a RuntimeError::
    #
    #     RuntimeError: The connection pool was closed while 1 HTTP \
    #       requests/responses were still in-flight.
    #
    # Closing network won't help ..
    #   from searx.network import network
    #   network.done()

    # waiting some seconds before ending the comand line was the only solution I
    # found ..

    time.sleep(3)


if __name__ == '__main__':
    sys.exit(main())