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
|
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:
|
||||||
|
|||||||
Reference in New Issue
Block a user