52 lines
1.7 KiB
Python
52 lines
1.7 KiB
Python
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()
|