diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index 99d28cc..b5bb828 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -88,17 +88,28 @@ 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>)(.*?){%\s*vm\s*%}.*?(.*?)(<\/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'{%\s*vm\s*%}') - num = len(pat_num_vm.findall(src_xml)) - for i in range(0,num): - src_xml = re.sub(pat_vm,vMerge,src_xml) - + def tc(m): + def vMerge(m1): + return ( + '' + + m1.group(1) + # Everything between ```` and ````. + "{% if loop.first %}" + + m1.group(2) + # Everything before ``{% vm %}``. + m1.group(3) + # Everything after ``{% vm %}``. + "{% endif %}" + + m1.group(4) # ````. + ) + return re.sub( + r'(.*?)(.*?)(?:{%\s*vm\s*%})(.*?)()', + vMerge, + m.group(), # Everything between ```` and ```` with ``{% vm %}`` inside. + flags=re.DOTALL, + ) + src_xml = re.sub(r'](?:(?!]).)*?{%\s*vm\s*%}.*?]', tc, src_xml, flags=re.DOTALL) + def clean_tags(m): return m.group(0).replace(r"‘","'").replace('<','<').replace('>','>') src_xml = re.sub(r'(?<=\{[\{%])(.*?)(?=[\}%]})',clean_tags,src_xml) diff --git a/tests/test_files/vertical_merge_nested.docx b/tests/test_files/vertical_merge_nested.docx new file mode 100644 index 0000000..d8fe976 Binary files /dev/null and b/tests/test_files/vertical_merge_nested.docx differ diff --git a/tests/test_files/vertical_merge_nested_tpl.docx b/tests/test_files/vertical_merge_nested_tpl.docx new file mode 100644 index 0000000..095d64e Binary files /dev/null and b/tests/test_files/vertical_merge_nested_tpl.docx differ diff --git a/tests/vertical_merge_nested.py b/tests/vertical_merge_nested.py new file mode 100644 index 0000000..f2eced8 --- /dev/null +++ b/tests/vertical_merge_nested.py @@ -0,0 +1,5 @@ +from docxtpl import DocxTemplate + +tpl = DocxTemplate('test_files/vertical_merge_nested.docx') +tpl.render() +tpl.save('test_files/word2016.docx')