解决意外换行问题
This commit is contained in:
35
mcp_docx.py
35
mcp_docx.py
@@ -236,40 +236,15 @@ def paragraph_replace(para_el, replacements):
|
|||||||
print(f"段落替换: {len(original_text)} -> {len(full_text)} 字符")
|
print(f"段落替换: {len(original_text)} -> {len(full_text)} 字符")
|
||||||
|
|
||||||
# 将新文本重新分配到原有的 <w:t> 元素中
|
# 将新文本重新分配到原有的 <w:t> 元素中
|
||||||
# 策略:尽量保持原有的文本分布比例
|
# 策略:将所有文本放入第一个元素,清空其他元素,避免不当切分导致换行
|
||||||
if len(t_elements) == 1:
|
_, first_t_el = t_elements[0]
|
||||||
# 只有一个 <w:t> 元素,直接替换
|
first_t_el.text = full_text
|
||||||
_, t_el = t_elements[0]
|
|
||||||
t_el.text = full_text
|
|
||||||
if full_text and (full_text[0] == ' ' or full_text[-1] == ' '):
|
if full_text and (full_text[0] == ' ' or full_text[-1] == ' '):
|
||||||
t_el.set('{http://www.w3.org/XML/1998/namespace}space', 'preserve')
|
first_t_el.set('{http://www.w3.org/XML/1998/namespace}space', 'preserve')
|
||||||
else:
|
|
||||||
# 多个 <w:t> 元素:按原始长度比例分配新文本
|
|
||||||
original_lengths = [len(t_el.text or '') for _, t_el in t_elements]
|
|
||||||
total_original = sum(original_lengths)
|
|
||||||
|
|
||||||
if total_original == 0:
|
# 清空其他 <w:t> 元素
|
||||||
# 原始都是空的,把所有文本放到第一个元素
|
|
||||||
t_elements[0][1].text = full_text
|
|
||||||
for i in range(1, len(t_elements)):
|
for i in range(1, len(t_elements)):
|
||||||
t_elements[i][1].text = ''
|
t_elements[i][1].text = ''
|
||||||
else:
|
|
||||||
# 按比例分配
|
|
||||||
pos = 0
|
|
||||||
for i, (_, t_el) in enumerate(t_elements):
|
|
||||||
if i == len(t_elements) - 1:
|
|
||||||
# 最后一个元素,取剩余所有文本
|
|
||||||
chunk = full_text[pos:]
|
|
||||||
else:
|
|
||||||
# 按比例计算应该分配的长度
|
|
||||||
ratio = original_lengths[i] / total_original
|
|
||||||
chunk_len = int(len(full_text) * ratio)
|
|
||||||
chunk = full_text[pos:pos + chunk_len]
|
|
||||||
pos += chunk_len
|
|
||||||
|
|
||||||
t_el.text = chunk
|
|
||||||
if chunk and (chunk[0] == ' ' or chunk[-1] == ' '):
|
|
||||||
t_el.set('{http://www.w3.org/XML/1998/namespace}space', 'preserve')
|
|
||||||
|
|
||||||
|
|
||||||
def ensure_rpr(run_el):
|
def ensure_rpr(run_el):
|
||||||
|
|||||||
Reference in New Issue
Block a user