Skill-BidCreater/scripts/docx_cli.py
2026-03-14 17:00:12 +08:00

105 lines
3.8 KiB
Python

from __future__ import annotations
import argparse
from pathlib import Path
from docx_ops_lib import (
apply_patch_document,
create_docx_document,
export_outline_artifacts,
index_document,
query_nodes,
read_json,
render_docx,
write_json,
)
from outline_check import check_outline
def main() -> None:
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest="command", required=True)
index_parser = subparsers.add_parser("index")
index_parser.add_argument("--docx", required=True)
index_parser.add_argument("--out", required=True)
query_parser = subparsers.add_parser("query")
query_parser.add_argument("--docx", required=True)
query_parser.add_argument("--query-file", required=True)
query_parser.add_argument("--out", required=True)
create_parser = subparsers.add_parser("create")
create_parser.add_argument("--spec-file", required=True)
create_parser.add_argument("--report", required=True)
check_parser = subparsers.add_parser("outline-check")
check_parser.add_argument("--outline-file", required=True)
check_parser.add_argument("--report", required=True)
export_parser = subparsers.add_parser("outline-export")
export_parser.add_argument("--spec-file", required=True)
export_parser.add_argument("--report", required=True)
patch_parser = subparsers.add_parser("patch")
patch_parser.add_argument("--patch-file", required=True)
patch_parser.add_argument("--report", required=True)
patch_parser.add_argument("--render-check", action="store_true")
patch_parser.add_argument("--render-dir")
render_parser = subparsers.add_parser("render")
render_parser.add_argument("--docx", required=True)
render_parser.add_argument("--out-dir", required=True)
render_parser.add_argument("--report")
args = parser.parse_args()
if args.command == "index":
write_json(Path(args.out).resolve(), index_document(Path(args.docx).resolve()))
return
if args.command == "query":
index_data = index_document(Path(args.docx).resolve())
query_data = read_json(Path(args.query_file).resolve())
write_json(Path(args.out).resolve(), query_nodes(index_data, query_data))
return
if args.command == "create":
spec_data = read_json(Path(args.spec_file).resolve())
write_json(Path(args.report).resolve(), create_docx_document(spec_data))
return
if args.command == "outline-check":
outline_data = read_json(Path(args.outline_file).resolve())
write_json(Path(args.report).resolve(), check_outline(outline_data))
return
if args.command == "outline-export":
export_data = read_json(Path(args.spec_file).resolve())
write_json(Path(args.report).resolve(), export_outline_artifacts(export_data))
return
if args.command == "patch":
patch_data = read_json(Path(args.patch_file).resolve())
report = apply_patch_document(patch_data)
if args.render_check:
output_docx = Path(report["output_docx"]).resolve()
render_dir = Path(args.render_dir).resolve() if args.render_dir else output_docx.parent / f"{output_docx.stem}_render"
report["render"] = render_docx(
output_docx,
render_dir,
docx_style_profile=report.get("docx_style_profile", "default_bid"),
numbering_mode=report.get("numbering_mode", "explicit_text"),
document_kind=patch_data.get("document_kind", "assembled"),
)
write_json(Path(args.report).resolve(), report)
return
report = render_docx(Path(args.docx).resolve(), Path(args.out_dir).resolve())
if args.report:
write_json(Path(args.report).resolve(), report)
if __name__ == "__main__":
main()