万工-doc 规范校对 + 蓝色标注
对既有 Word 文档(.doc / .docx,典型为建筑设计初步设计说明、技术标书)按现行规范做校对,
将修改之处用蓝色字体(w:color 0000FF)精确标注,并重新输出为 .doc。
何时使用
- 用户给一个
.doc/.docx,要求"按现行规范校对 / 改一下 / 改的地方标蓝 / 输出 .doc"。 - 典型输入:初步设计说明、设计方案、技术标书、各类说明类文档。
- 注意:本 skill 只做「规范性校对 + 蓝色标注」,不做创作性重写;大段新增需用户确认。
硬约束(来自实战踩坑,违反必翻车)
- 禁止用 Word Find / Range 做定位与上色。 实测陷阱:① 裸控制字符
\u0002/\u0003Find 定位失败(上色 0);
②Range.Text字符索引与Range.Start位置不 1:1(差 ~2600);③ 子区间 Find 重复命中同一处;
④ 逐段 COM 遍历超时(SIGTERM)。一律走 XML 层确定性改写。 - Python 解释器:必须用托管 venv 的 python(已装 win32com + lxml + python-docx),
路径形如%USERPROFILE%\.workbuddy\binaries\python\envs\default\Scripts\python.exe——裸 python 无 win32com。 - lxml 版本:本环境 lxml 6.1.1 导入 etree 失败 → 锁定
lxml==5.4.0(pip install -U "lxml==5.4.0")。 inspect.py遮蔽标准库:工作目录里若同名inspect.py,会遮inspect致 lxml 链断 → 改名(如inspect_doc.py)。- doc 是 OLE2 二进制,不能直接 zip 解析;要核验蓝色须先
SaveAs2(FileFormat=16)转 docx 再解 XML。 os.remove被沙箱 safe-delete 拦截(回收站失败报错)→ 用SaveAs2直接覆盖,不要依赖删除。
流水线(确定性,推荐顺序)
origin.doc
→ [Word COM SaveAs2 FileFormat=16] → src.docx # 干净输入
→ [python-docx + lxml 改写 XML] → out.docx # 改处加 w:color 0000FF
→ [Word COM SaveAs2 FileFormat=0] → 交付.doc # 转回 .doc
→ [可选验证] 交付.doc → docx → 解析 XML 统计 0000FF + 抽样
步骤 1:doc → docx
scripts/doc_to_docx.py <in.doc> <out.docx>:Word COM DispatchEx("Word.Application.16"),SaveAs2(FileFormat=16)。
Visible=False; DisplayAlerts=0。打开前先 Stop-Process -Name WINWORD -Force 清理残留锁进程。
步骤 2:规则集
按四类建规则(见 references/rules_format.md):
- A 规范版本:旧年号→新(如 GB50034-2013→GB/T50034-2024)。
- B 编号/名称:条文编号、标准名订正(如 DB34/1466-2011→DB34/T 1466-2023)。
- C 文字错漏:缺字、错字、标点(old 以 \r 开头=段首缺字,需 at_start 锚定)。
- D 前后矛盾/待核:原句保留黑字,仅在其后加蓝色 (注:…请按现行规范核实) 注记。
每条规则:(old, new, at_start=False, note=False)。note=True 时 new 以 old 为前缀,仅对 len(old) 之后后缀标蓝。
步骤 3:XML 改写(核心)
scripts/xml_apply.py <src.docx> <rules.py> <out.docx>:
- para_text(p):跨 w:r 累加字符长度重建段落文本(含 tab/br/cr,排除 w:del)。
- split_run_at(run, k):在 run 内第 k 字符切开,返回新 run。
- 命中区间:首 run 写新文本 + color_run(0000FF),后续 run 清空(或仅对后缀标蓝)。
- at_start:old 以 \r 开头时,text[:idx].strip()!="" 则跳过(防误伤「项目位于」类)。
- 通配符:原规则 [--] 在 XML 层无 wildcard → expand_old() 展开全角/半角两个明文变体,分别 apply。
- 防自匹配:start = idx + max(len(line0), 1),避免把刚写入的 new 当成 old 再次命中。
- 遍历:iter_paragraphs() 覆盖正文 + 页眉/页脚 + 表格 + 文本框所有 w:p。
- 输出 xml_hits.json:APPLIED / ZERO / total。
步骤 4:docx → doc
scripts/docx_to_doc.py <out.docx> <交付.doc>:SaveAs2(FileFormat=0)。输出后 ls 确认 SIZE 与段数。
步骤 5:真身验证(必做,不放过)
scripts/verify_blue.py <交付.doc>:转 docx → 直解 word/document.xml + 页眉页脚,re.findall(r'w:color\s+w:val="0000FF"')
统计蓝色 run 总数,并抽样若干关键词确认落地。未跑验证不得宣称完成。
诚实降级纪律(对用户必披露)
- 假阳性主动撤销:如「淮南市属寒冷地区、应改引 JGJ26-2018」——经 WebSearch 查证(建标函〔2010〕298号、
DB34/1466-2011 条文说明"全省均属夏热冬冷")为假阳性,撤销规则、保留原文。凡断言"原文错误"须有查证证据。 - 零命中非漏改:通配符半角副本被全角变体覆盖会显示 ZERO,属正常;"残留"告警多为子串误报(如
(2018年版)内含
GB50016-2014)或 D 类设计保留原句——须逐条判读,不轻信告警。 - 待核项:D 类注记中"请按现行规范核实"的条文,若未回原文核证,必须标"待核项",严禁把推测当结论搬入。
复用注意
- 规则集是项目专属,本 skill 只提供引擎与格式模板;每次按文档实际规范年号重填
rules.py。 - 输出文件名带"(规范校订版)"以区分原始文件;旧错误同名文件用正确内容覆盖,避免交付错版。
能力边界与责任声明
- 本 skill 提供「校对 + 蓝字标注」的确定性引擎与规则格式模板,不替代设计人、校对人与审图人的专业判断。
- 规则集由使用者按文档实际规范年号填写,规则本身的正确性由使用者核验;本 skill 不预置任何项目专属规则。
- 文档中所有标蓝内容均为建议修改,请以现行规范原文为准;未经原文核证者一律标注「待核项」,不得直接作为结论使用。
- 校对结果仅供参考,正式交付前必须人工复核;未复核直接交付所产生的后果由使用者承担。