fix: табы больше не съедаются при обработке циклов
- _normalize_loop_markers при склейке run'ов выбрасывал <w:tab/> - теперь табы превращаются в символ \t при сборе и восстанавливаются как <w:tab/> при пересборке параграфа
This commit is contained in:
+18
-7
@@ -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'ам),
|
||||
# табы <w:tab/> превращаем в символ \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 с полным текстом параграфа, восстанавливая табы <w:tab/>
|
||||
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: обычный текст → <w:t>, таб → <w:tab/>
|
||||
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:
|
||||
|
||||
Reference in New Issue
Block a user