build.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. """
  13. with open(json_file, "rt") as fh:
  14. val = json.loads(fh.read())
  15. val['lambdas'] = {
  16. 'equal_output': equal_output,
  17. }
  18. return val
  19. return {}
  20. def build_file(hash, file:str) -> str:
  21. """
  22. @file: str filename of mustache
  23. @return: str html populated.
  24. """
  25. with open(file, "rt") as fh:
  26. return render(template=fh, data=hash, partials_path=PATH_PARTIAL)
  27. def build_all():
  28. # theme
  29. global THEME
  30. if not THEME:
  31. THEME = DEF_THEME
  32. theme_src_dir = os.path.join(PATH_THEME, THEME)
  33. theme_dest_dir = PATH_THEME_DEST
  34. # remote old theme
  35. try:
  36. rmtree(theme_dest_dir)
  37. except Exception:
  38. pass
  39. # copy theme
  40. try:
  41. copytree(theme_src_dir, theme_dest_dir)
  42. except Exception as e:
  43. print('ERROR: theme error:', e)
  44. exit(-1)
  45. hash = read_json(FILE_SITE)
  46. for r, _, fl in os.walk(PATH_SRC):
  47. for f in fl:
  48. rpath = os.path.join(r, f)
  49. fn, _ = os.path.splitext(f)
  50. hash['file'] = fn
  51. html_str = build_file(hash, rpath)
  52. if not html_str:
  53. print('WARNING: empty output:', rpath)
  54. rhtml = os.path.join(PATH_DEST, '{}.html'.format(fn))
  55. with open(rhtml, 'wt') as fh:
  56. fh.write(html_str)
  57. def equal_output(text, render):
  58. """
  59. mustache lambda: 实现三元语义
  60. a==b?c:d
  61. 渲染后,如果 a == b 则 最终渲染 c 否则 最终渲染 d
  62. """
  63. result = render(text)
  64. parts = result.split("?")
  65. compares = parts[0].split("==")
  66. values = parts[1].split(":")
  67. return values[0].strip() if compares[0].strip() == compares[1].strip() else values[1].strip()
  68. if __name__ == '__main__':
  69. build_all()
  70. """
  71. ,{
  72. "text": "代理加盟",
  73. "url": "agents.html"
  74. },{
  75. "text": "下载",
  76. "url": "https://twong.shotshock.shop/mobilex/download"
  77. }
  78. """