search.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from pathlib import Path
  2. from typing import Dict, List
  3. from fastapi.responses import JSONResponse
  4. from nicegui import app
  5. from ..examples import examples
  6. from .code_extraction import get_full_code
  7. from .content import registry
  8. PATH = Path(__file__).parent.parent / 'static' / 'search_index.json'
  9. search_index: List[Dict[str, str]] = []
  10. sitewide_index: List[Dict[str, str]] = []
  11. examples_index: List[Dict[str, str]] = []
  12. @app.get('/static/search_index.json')
  13. def _get_search_index() -> JSONResponse:
  14. return JSONResponse(search_index)
  15. @app.get('/static/sitewide_index.json')
  16. def _get_sitewide_index() -> JSONResponse:
  17. return JSONResponse(sitewide_index)
  18. @app.get('/static/examples_index.json')
  19. def _get_examples_index() -> JSONResponse:
  20. return JSONResponse(examples_index)
  21. def build_search_index() -> None:
  22. """Build search index."""
  23. search_index[:] = _collect_documentation_parts(include_code=False) + _collect_examples()
  24. sitewide_index[:] = _collect_documentation_parts(include_code=True)
  25. examples_index[:] = _collect_examples()
  26. def _collect_documentation_parts(*, include_code: bool = False) -> List[Dict[str, str]]:
  27. return [
  28. {
  29. 'title': f'{documentation.heading.replace("*", "")}: {part.title}',
  30. 'content': part.description or part.search_text or '',
  31. 'format': part.description_format,
  32. **({'demo': get_full_code(part.demo.function) if part.demo is not None else ''} if include_code else {}),
  33. 'url': f'/documentation/{documentation.name}#{part.link_target}',
  34. }
  35. for documentation in registry.values()
  36. for part in documentation.parts
  37. ]
  38. def _collect_examples() -> List[Dict[str, str]]:
  39. return [
  40. {
  41. 'title': f'Example: {example.title}',
  42. 'content': example.description,
  43. 'format': 'md',
  44. 'url': example.url,
  45. }
  46. for example in examples
  47. ]