@@ -0,0 +1,51 @@
|
||||
from md2gost.renderable import Renderable
|
||||
from md2gost.renderable.heading import Heading
|
||||
from md2gost.renderable.toc import ToC
|
||||
from md2gost.util import create_element
|
||||
|
||||
|
||||
def _enable_update_fields_on_open(document) -> None:
|
||||
"""Ask Word to refresh fields (TOC) when the document is opened."""
|
||||
settings = document.settings.element
|
||||
# Remove existing updateFields if any
|
||||
for child in list(settings):
|
||||
if child.tag.endswith("}updateFields"):
|
||||
settings.remove(child)
|
||||
settings.append(create_element("w:updateFields", {"w:val": "true"}))
|
||||
|
||||
|
||||
class TocProcessor:
|
||||
def process(self, renderables: list[Renderable]):
|
||||
renderables_iter = iter(renderables)
|
||||
|
||||
toc = None
|
||||
for renderable in renderables_iter:
|
||||
if isinstance(renderable, ToC):
|
||||
toc = renderable
|
||||
break
|
||||
|
||||
if not toc:
|
||||
return
|
||||
|
||||
if toc.toc_mode == "native":
|
||||
# Field already in body from render; ensure dirty + updateFields
|
||||
toc.fill()
|
||||
try:
|
||||
doc = toc._paragraph._docx_paragraph.part.document
|
||||
_enable_update_fields_on_open(doc)
|
||||
except Exception:
|
||||
pass
|
||||
return
|
||||
|
||||
for renderable in renderables_iter:
|
||||
if isinstance(renderable, Heading):
|
||||
title = (renderable.text or "").strip()
|
||||
if title.upper() == "СОДЕРЖАНИЕ":
|
||||
continue
|
||||
toc.add_item(
|
||||
renderable.level,
|
||||
renderable.text,
|
||||
renderable.rendered_page,
|
||||
renderable.is_numbered,
|
||||
)
|
||||
toc.fill()
|
||||
Reference in New Issue
Block a user