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()