build.py 2.2 KB

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