build_search_data.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!/usr/bin/env python3
  2. import ast
  3. import json
  4. import os
  5. import textwrap
  6. import urllib.parse
  7. from pathlib import Path
  8. from icecream import ic
  9. dir_path = os.path.dirname(os.path.abspath(__file__))
  10. os.chdir(dir_path)
  11. class DemoVisitor(ast.NodeVisitor):
  12. def __init__(self, topic: str) -> None:
  13. super().__init__()
  14. self.topic = topic
  15. def visit_FunctionDef(self, node):
  16. for decorator in node.decorator_list:
  17. if isinstance(decorator, ast.Call):
  18. function = decorator.func
  19. if isinstance(function, ast.Name) and function.id == 'text_demo':
  20. title = decorator.args[0].s
  21. ic(self.topic, title)
  22. content = ' '.join([l.strip() for l in decorator.args[1].s.splitlines()]).strip()
  23. anchor = title.lower().replace(' ', '_')
  24. url = f'/documentation/{self.topic}#{anchor}'
  25. documents.append({
  26. 'title': title,
  27. 'content': content,
  28. 'url': url
  29. })
  30. self.generic_visit(node)
  31. documents = []
  32. for file in Path('./more_documentation').glob('*.py'):
  33. with open(file, 'r') as source:
  34. tree = ast.parse(source.read())
  35. DemoVisitor(file.stem.split('_')[0]).visit(tree)
  36. with open('static/search_data.json', 'w') as f:
  37. json.dump(documents, f, indent=2)