fix(writer): 注入表格时渲染 caption 段落

表格 Block 的 caption 此前被 DocxInjector 丢弃,导致生成文档缺失表题。
_block_element 现按 [caption, table] 顺序返回元素,并在模板缺少 Caption
样式时回退为普通段落。该修复使 Phase5 headless e2e 的全管线验证得以成立。
This commit is contained in:
lhl
2026-08-13 11:22:48 +08:00
parent 24d3aa3b85
commit 86c3abb5fa
+12 -6
View File
@@ -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(原型简化;保留段落样式)