From 2a7630a80b783853d6acf614abcb0faa6cf22d0c Mon Sep 17 00:00:00 2001 From: Arthas Date: Mon, 9 Oct 2017 23:18:25 +0800 Subject: [PATCH] add {% vm %} to make the table cell virtically merged within a {% for %} --- docxtpl/__init__.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index f1cb15d..7beeb8f 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -84,7 +84,17 @@ class DocxTemplate(object): # This is mandatory to have jinja2 generating correct xml code pat = r'](?:(?!]).)*({%%|{{)%(y)s ([^}%%]*(?:%%}|}})).*?' % {'y':y} src_xml = re.sub(pat, r'\1 \2',src_xml,flags=re.DOTALL) - + + # add vMerge + # use {% vm %} to make this table cell and its copies be vertically merged within a {% for %} + pat_vm = r'(<\/w:tcPr>.*)(<\/w:tcPr>)(.*?){%vm%}.*?(.*?)(<\/w:t>)' + def vMerge(m): + return m.group(1) + '' + m.group(2) + m.group(3) + "{% if loop.first %}"+ m.group(4) +"{% endif %}" + m.group(5) + pat_num_vm = re.compile(r'{%vm%}') + num = len(pat_num_vm.findall(src_xml)) + for i in range(0,num): + src_xml = re.sub(pat_vm,vMerge,src_xml) + def clean_tags(m): return m.group(0).replace(r"‘","'").replace('<','<').replace('>','>') src_xml = re.sub(r'(?<=\{[\{%])(.*?)(?=[\}%]})',clean_tags,src_xml)