fix: табы больше не съедаются при обработке циклов

- _normalize_loop_markers при склейке run'ов выбрасывал <w:tab/>
- теперь табы превращаются в символ \t при сборе и восстанавливаются
  как <w:tab/> при пересборке параграфа
This commit is contained in:
2026-08-03 16:16:22 +04:00
parent d02e2ac9a0
commit 17a99627bc
+18 -7
View File
@@ -102,10 +102,15 @@ def _normalize_loop_markers(doc_xml: str) -> str:
changed = False changed = False
for p in root.iter(f'{{{W_NS}}}p'): for p in root.iter(f'{{{W_NS}}}p'):
# Собираем весь текст параграфа (по всем run'ам) # Собираем весь текст параграфа (по всем run'ам),
# табы <w:tab/> превращаем в символ \t, чтобы не потерять
texts = [] texts = []
for t in p.iter(f'{{{W_NS}}}t'): for child in p.iter():
texts.append(t.text or '') tag = child.tag.split('}')[-1]
if tag == 't':
texts.append(child.text or '')
elif tag == 'tab':
texts.append('\t')
full = ''.join(texts) full = ''.join(texts)
# Интересуют параграфы с маркерами циклов ИЛИ любыми переменными {{...}} # Интересуют параграфы с маркерами циклов ИЛИ любыми переменными {{...}}
@@ -139,13 +144,19 @@ def _normalize_loop_markers(doc_xml: str) -> str:
br_el = etree.SubElement(br_r, f'{{{W_NS}}}br') br_el = etree.SubElement(br_r, f'{{{W_NS}}}br')
br_el.set(f'{{{W_NS}}}type', 'page') br_el.set(f'{{{W_NS}}}type', 'page')
# Создаём один run с полным текстом параграфа # Создаём run с полным текстом параграфа, восстанавливая табы <w:tab/>
new_r = etree.SubElement(p, f'{{{W_NS}}}r') new_r = etree.SubElement(p, f'{{{W_NS}}}r')
if rpr is not None: if rpr is not None:
new_r.append(rpr) new_r.append(rpr)
new_t = etree.SubElement(new_r, f'{{{W_NS}}}t') # Разбиваем по \t: обычный текст → <w:t>, таб → <w:tab/>
new_t.text = full parts = full.split('\t')
new_t.set('{http://www.w3.org/XML/1998/namespace}space', 'preserve') for i, part in enumerate(parts):
if part:
new_t = etree.SubElement(new_r, f'{{{W_NS}}}t')
new_t.text = part
new_t.set('{http://www.w3.org/XML/1998/namespace}space', 'preserve')
if i < len(parts) - 1:
tab_el = etree.SubElement(new_r, f'{{{W_NS}}}tab')
changed = True changed = True
if not changed: if not changed: