build.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #!/usr/bin/env python
  2. import os
  3. import json
  4. from config import PATH_PARTIAL, PATH_SRC, PATH_THEME, PATH_THEME_DEST, \
  5. PATH_DEST, FILE_SITE, THEME
  6. from chevron import render
  7. from typing import Dict
  8. from shutil import copytree, rmtree
  9. DEF_THEME = 'shop'
  10. def read_json(json_file:str) -> Dict:
  11. """ read site.json """
  12. with open(json_file, "rt") as fh:
  13. return json.loads(fh.read())
  14. return {}
  15. def build_file(hash, file:str) -> str:
  16. """
  17. @file: str filename of mustache
  18. @return: str html populated.
  19. """
  20. with open(file, "rt") as fh:
  21. return render(template=fh, data=hash, partials_path=PATH_PARTIAL)
  22. def build_all():
  23. # theme
  24. global THEME
  25. if not THEME:
  26. THEME = DEF_THEME
  27. theme_src_dir = os.path.join(PATH_THEME, THEME)
  28. theme_dest_dir = PATH_THEME_DEST
  29. # remote old theme
  30. try:
  31. rmtree(theme_dest_dir)
  32. except Exception:
  33. pass
  34. # copy theme
  35. try:
  36. copytree(theme_src_dir, theme_dest_dir)
  37. except Exception as e:
  38. print('ERROR: theme error:', e)
  39. exit(-1)
  40. hash = read_json(FILE_SITE)
  41. for r, _, fl in os.walk(PATH_SRC):
  42. for f in fl:
  43. rpath = os.path.join(r, f)
  44. fn, _ = os.path.splitext(f)
  45. hash[fn] = f
  46. html_str = build_file(hash, rpath)
  47. if not html_str:
  48. print('WARNING: empty output:', rpath)
  49. del(hash[fn])
  50. rhtml = os.path.join(PATH_DEST, '{}.html'.format(fn))
  51. with open(rhtml, 'wt') as fh:
  52. fh.write(html_str)
  53. if __name__ == '__main__':
  54. build_all()