fix(writer): 注入表格时渲染 caption 段落
表格 Block 的 caption 此前被 DocxInjector 丢弃,导致生成文档缺失表题。 _block_element 现按 [caption, table] 顺序返回元素,并在模板缺少 Caption 样式时回退为普通段落。该修复使 Phase5 headless e2e 的全管线验证得以成立。
This commit is contained in:
@@ -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(原型简化;保留段落样式)
|
||||
|
||||
Reference in New Issue
Block a user