_drop_dds_saas_nfr.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. # -*- coding: utf-8 -*-
  2. """模块详设去掉非功能设计、SaaS部署与运维;总纲补 SaaS 章;刷新目录。"""
  3. from __future__ import annotations
  4. import sys
  5. from pathlib import Path
  6. HERE = Path(__file__).resolve().parent
  7. if str(HERE) not in sys.path:
  8. sys.path.insert(0, str(HERE))
  9. from docx import Document
  10. from _delivery_docx_polish import (
  11. SAAS_NFR_H1_RE,
  12. drop_h1_sections,
  13. force_all_text_black,
  14. insert_toc_field,
  15. latest_formal_files,
  16. open_via_temp,
  17. renumber_heading_gaps,
  18. save_via_temp,
  19. )
  20. from _fix_toc_and_numbering import refresh_one
  21. from _gen_delivery_sys_docs import write_sys_dds
  22. from _unify_ab_delivery_vnext import BASE
  23. def is_module_dds(path: Path) -> bool:
  24. name = path.name
  25. if "详细设计" not in name:
  26. return False
  27. if "总纲" in name:
  28. return False
  29. return path.parent.name in {f"S{i}" for i in range(9)}
  30. def process_module(path: Path) -> str:
  31. doc = open_via_temp(path)
  32. dropped = drop_h1_sections(doc, SAAS_NFR_H1_RE)
  33. renum = renumber_heading_gaps(doc)
  34. insert_toc_field(doc)
  35. force_all_text_black(doc)
  36. save_via_temp(doc, path)
  37. return f"{path.parent.name}/{path.name} drop={dropped} renum={renum}"
  38. def main() -> None:
  39. import _gen_delivery_sys_docs as sysgen
  40. orig = sysgen.save_doc
  41. def save_ver(doc, dest):
  42. dest = Path(dest)
  43. orig(doc, dest.with_name(f"{dest.stem}-V0.4{dest.suffix}"))
  44. sysgen.save_doc = save_ver
  45. try:
  46. write_sys_dds()
  47. finally:
  48. sysgen.save_doc = orig
  49. files = [p for p in latest_formal_files(BASE) if is_module_dds(p)]
  50. sys_dds = BASE / "00-系统总纲" / "SYS-详细设计说明书-总纲-V0.4.docx"
  51. print("modules", len(files), flush=True)
  52. for p in files:
  53. print("prep", process_module(p), flush=True)
  54. targets = files + [sys_dds]
  55. print("toc", len(targets), flush=True)
  56. for p in targets:
  57. try:
  58. print(f"OK {p.parent.name}/{p.name} {refresh_one(p)}", flush=True)
  59. except Exception as exc:
  60. print(f"FAIL {p.parent.name}/{p.name}: {exc}", flush=True)
  61. if __name__ == "__main__":
  62. main()