From 97be69b950830188435b22d07b0c218cafd026c7 Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Tue, 14 Apr 2020 22:51:36 +0200 Subject: [PATCH] {%- xxx -%} merging feature --- docxtpl/__init__.py | 5 +++++ tests/merge_paragraph.py | 17 +++++++++++++++++ tests/templates/merge_paragraph_tpl.docx | Bin 0 -> 10880 bytes 3 files changed, 22 insertions(+) create mode 100644 tests/merge_paragraph.py create mode 100644 tests/templates/merge_paragraph_tpl.docx diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index 2ab1e9e..96a8997 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -109,6 +109,11 @@ class DocxTemplate(object): r'\1', src_xml,flags=re.DOTALL) + # {%- will merge with previous paragraph text + src_xml = re.sub(r'(?:(?!).)*?{%-','{%',src_xml,flags=re.DOTALL) + # -%} will merge with next paragraph text + src_xml = re.sub(r'-%}(?:(?!]).)*?]*?>','%}',src_xml,flags=re.DOTALL) + for y in ['tr', 'tc', 'p', 'r']: # replace into xml code the row/paragraph/run containing # {%y xxx %} or {{y xxx}} template tag diff --git a/tests/merge_paragraph.py b/tests/merge_paragraph.py new file mode 100644 index 0000000..90e84e3 --- /dev/null +++ b/tests/merge_paragraph.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +''' +Created : 2015-03-12 + +@author: Eric Lapouyade +''' + +from docxtpl import DocxTemplate + +tpl=DocxTemplate('templates/merge_paragraph_tpl.docx') + +context = { + 'living_in_town' : True, +} + +tpl.render(context) +tpl.save('output/merge_paragraph.docx') diff --git a/tests/templates/merge_paragraph_tpl.docx b/tests/templates/merge_paragraph_tpl.docx new file mode 100644 index 0000000000000000000000000000000000000000..71faa5a5168cf2d69650e8dfa78f35cc8b2c133c GIT binary patch literal 10880 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 literal 0 HcmV?d00001