From 86c3abb5fa8632455f4b1f417044c113fdb30a7b Mon Sep 17 00:00:00 2001 From: lhl Date: Thu, 13 Aug 2026 11:22:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(writer):=20=E6=B3=A8=E5=85=A5=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E6=97=B6=E6=B8=B2=E6=9F=93=20caption=20=E6=AE=B5?= =?UTF-8?q?=E8=90=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 表格 Block 的 caption 此前被 DocxInjector 丢弃,导致生成文档缺失表题。 _block_element 现按 [caption, table] 顺序返回元素,并在模板缺少 Caption 样式时回退为普通段落。该修复使 Phase5 headless e2e 的全管线验证得以成立。 --- src/genesis/writer/docx_injector.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/genesis/writer/docx_injector.py b/src/genesis/writer/docx_injector.py index 3c385c8..2d3fa71 100644 --- a/src/genesis/writer/docx_injector.py +++ b/src/genesis/writer/docx_injector.py @@ -89,23 +89,29 @@ class DocxInjector: # 逆序插入,使最终顺序正确 for block in reversed(blocks): - el = self._block_element(doc, block) - parent.insert(para_idx, el) + for el in reversed(self._block_element(doc, block)): + parent.insert(para_idx, el) - def _block_element(self, doc: DocxDocument, block: Block): + def _block_element(self, doc: DocxDocument, block: Block) -> list: if block.kind == "heading": p = doc.add_paragraph(block.text, style=f"Heading {block.level}") - return p._p + return [p._p] if block.kind == "table": + elements: list = [] + if block.text: + style = "Caption" if "Caption" in doc.styles else None + cap = doc.add_paragraph(block.text, style=style) + elements.append(cap._p) tbl = doc.add_table(rows=0, cols=len(block.rows[0]) if block.rows else 1) for r in block.rows: cells = tbl.add_row().cells for i, val in enumerate(r): cells[i].text = str(val) - return tbl._tbl # type: ignore[attr-defined] + elements.append(tbl._tbl) # type: ignore[attr-defined] + return elements # 默认 paragraph p = doc.add_paragraph(block.text) - return p._p + return [p._p] def _set_paragraph_text(self, para: Paragraph, text: str) -> None: # 清空 run,写入单 run(原型简化;保留段落样式)