| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 | #!/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 sysimport os.pathimport timefrom contextlib import contextmanagerfrom searx import settings, get_setting, localesfrom 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@contextmanagerdef _offline_infosetset_ctx():    yield InfoPageSet(OfflinePage)@contextmanagerdef _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())
 |