docs_prebuild 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #!/usr/bin/env python
  2. # lint: pylint
  3. # SPDX-License-Identifier: AGPL-3.0-or-later
  4. """Script that implements some prebuild tasks needed by target docs.prebuild
  5. """
  6. import sys
  7. import os.path
  8. import time
  9. from searx import settings, get_setting
  10. from searx.infopage import InfoPageSet, InfoPage
  11. _doc_user = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'docs', 'user'))
  12. def main():
  13. DOC = None
  14. base_url = get_setting('server.base_url', None)
  15. if base_url:
  16. DOC = _render_all_with_flask_ctx(base_url)
  17. else:
  18. DOC = _render_all()
  19. for pagename, page in DOC.all_pages('en'):
  20. fname = os.path.join(_doc_user, os.path.basename(page.fname))
  21. with open(fname, 'w') as f:
  22. f.write(page.content)
  23. class OfflinePage(InfoPage):
  24. def get_ctx(self): # pylint: disable=no-self-use
  25. """Jinja context to render :py:obj:`DocPage.content` for offline purpose (no
  26. links to SearXNG instance)"""
  27. ctx = super().get_ctx()
  28. ctx['link'] = lambda name, url: '`%s`' % name
  29. ctx['search'] = lambda query: '`%s`' % query
  30. return ctx
  31. def _render_all():
  32. DOC = InfoPageSet(OfflinePage)
  33. for pagename, page in DOC.all_pages('en'):
  34. page.render()
  35. return DOC
  36. def _render_all_with_flask_ctx(base_url):
  37. DOC = InfoPageSet(InfoPage, base_url)
  38. # The url_for functions in the jinja templates need all routes to be
  39. # registered in the Flask app.
  40. settings['server']['secret_key'] = "x"
  41. from searx.webapp import app
  42. # Specify base_url so that url_for() works for base_urls. If base_url is
  43. # specified, then these values from are given preference over any Flask's
  44. # generics (see flaskfix.py).
  45. with app.test_request_context(base_url=base_url):
  46. for pagename, page in DOC.all_pages('en'):
  47. page.render()
  48. # The searx.webapp import from above fires some HTTP requests, thats
  49. # why we get a RuntimeError::
  50. #
  51. # RuntimeError: The connection pool was closed while 1 HTTP \
  52. # requests/responses were still in-flight.
  53. #
  54. # Closing network won't help ..
  55. # from searx.network import network
  56. # network.done()
  57. # waiting some seconds before ending the comand line was the only solution I
  58. # found ..
  59. time.sleep(3)
  60. return DOC
  61. if __name__ == '__main__':
  62. sys.exit(main())