build.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. # -*- coding: utf-8 -*-
  2. """新前端页面装配 —— shell.html + app.css + app.js + 语言包, 按语言出一页。
  3. 出页面之前先跑 lang.check(): 英文缺条目 / 含中文 / 占位符不一致 = **这里就 FAIL**,
  4. 不会走到用户眼前变成一处中文残留。这是新旧架构最根本的差别。
  5. """
  6. from __future__ import annotations
  7. import json
  8. import pathlib
  9. from .. import lang
  10. _HERE = pathlib.Path(__file__).resolve().parent # pages/
  11. _ASSETS = _HERE.parent / 'assets' # 前端资源件 (js/css)
  12. def _read(name: str) -> str:
  13. """资源件在 assets/,页面外壳在 pages/ —— 两处都找(P5 分目录后)。"""
  14. for d in (_HERE, _ASSETS):
  15. f = d / name
  16. if f.is_file():
  17. return f.read_text(encoding='utf-8')
  18. raise FileNotFoundError(f'前端资源件缺失: {name}(pages/ 与 assets/ 都没有)')
  19. def render(which: str = 'zh', include_records=True) -> str:
  20. if which not in lang.LANGS:
  21. raise ValueError('未知语言 %r' % which)
  22. bad = lang.check()
  23. if bad:
  24. raise RuntimeError('语言包未过闸, 拒绝出页:\n ' + '\n '.join(bad))
  25. pack = lang.pack(which)
  26. if which == 'zh':
  27. # 显示层术语映射 (app_frontEnd/configs/terms/display_map.yaml): 界面标签在这里过一遍;
  28. # 数据里的内部词由前端 displayText 用 __display_zh 同表处理 (数据与匹配逻辑一律不动)。
  29. from ..terms import humanize, pairs
  30. pack = {k: (humanize(v) if isinstance(v, str) else v) for k, v in pack.items()}
  31. pack['__display_zh'] = [list(x) for x in pairs()]
  32. if which == 'en' and include_records:
  33. from src.windscada.en_text import STANDARD_TERMS
  34. if include_records == 'terms':
  35. pack['__record_en'] = dict(STANDARD_TERMS)
  36. else:
  37. from src.windscada.data_tpl_en import RECORD_EN
  38. pack['__record_en'] = dict(RECORD_EN, **STANDARD_TERMS)
  39. # `</script>` 出现在 JSON 里会提前闭合 script 标签; `<` 一律转义
  40. packjs = json.dumps(pack, ensure_ascii=False).replace('<', '\\u003c')
  41. return (_read('shell.html')
  42. .replace('%LANG%', which)
  43. .replace('%TITLE%', pack['app.title'])
  44. .replace('%CSS%', _read('app.css'))
  45. .replace('%LANGPACK%', packjs)
  46. .replace('%CHARTS%', _read('charts.js'))
  47. .replace('%JS%', _read('app.js')))
  48. if __name__ == '__main__': # python -m app_frontEnd.app_frontEnd_guanlan.pages.build en > v2_en.html (旧路径 `python -m src.windscada.ui.build` 经兼容壳照旧可用)
  49. import sys
  50. sys.stdout.write(render(sys.argv[1] if len(sys.argv) > 1 else 'zh'))