diff --git a/dokogen/generator.py b/dokogen/generator.py
index 02dc167..1520989 100644
--- a/dokogen/generator.py
+++ b/dokogen/generator.py
@@ -102,10 +102,15 @@ def _normalize_loop_markers(doc_xml: str) -> str:
changed = False
for p in root.iter(f'{{{W_NS}}}p'):
- # Собираем весь текст параграфа (по всем run'ам)
+ # Собираем весь текст параграфа (по всем run'ам),
+ # табы превращаем в символ \t, чтобы не потерять
texts = []
- for t in p.iter(f'{{{W_NS}}}t'):
- texts.append(t.text or '')
+ for child in p.iter():
+ tag = child.tag.split('}')[-1]
+ if tag == 't':
+ texts.append(child.text or '')
+ elif tag == 'tab':
+ texts.append('\t')
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.set(f'{{{W_NS}}}type', 'page')
- # Создаём один run с полным текстом параграфа
+ # Создаём run с полным текстом параграфа, восстанавливая табы
new_r = etree.SubElement(p, f'{{{W_NS}}}r')
if rpr is not None:
new_r.append(rpr)
- new_t = etree.SubElement(new_r, f'{{{W_NS}}}t')
- new_t.text = full
- new_t.set('{http://www.w3.org/XML/1998/namespace}space', 'preserve')
+ # Разбиваем по \t: обычный текст → , таб →
+ parts = full.split('\t')
+ 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
if not changed: