1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- #!/usr/bin/env python
- # 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', encoding='utf-8') as f:
- f.write(page.content)
- class OfflinePage(InfoPage): # pylint: disable=missing-class-docstring
- def get_ctx(self):
- """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 # pylint: disable=import-outside-toplevel
- # 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())
|