From ebc770a2912edb30f57530b956c468510605dd95 Mon Sep 17 00:00:00 2001 From: ST-Imrie <117174577+ST-Imrie@users.noreply.github.com> Date: Thu, 1 May 2025 11:39:48 +0100 Subject: [PATCH] Updated RichText Jinja tags from rr/rp to r/q and updated test template --- docxtpl/template.py | 26 ++++++++++---------- tests/richtextparagraph.py | 13 +++++++++- tests/templates/richtext_paragraph_tpl.docx | Bin 18357 -> 20437 bytes 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/docxtpl/template.py b/docxtpl/template.py index e9c9cc4..20dc43e 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -160,7 +160,7 @@ class DocxTemplate(object): flags=re.DOTALL, ) src_xml = re.sub( - r"({{r.\s.*?}}|{%r.\s.*?%})", + r"({{[rq]\s.*?}}|{%[rq].\s.*?%})", r'\1', src_xml, flags=re.DOTALL, @@ -173,7 +173,7 @@ class DocxTemplate(object): r"-%}(?:(?!]|{%|{{).)*?]*?>", "%}", src_xml, flags=re.DOTALL ) - for y in ["tr", "tc", "p"]: + for y in ["tr", "tc", "p", "r"]: # replace into xml code the row/paragraph/run containing # {%y xxx %} or {{y xxx}} template tag # by {% xxx %} or {{ xx }} without any surrounding tags : @@ -184,17 +184,17 @@ class DocxTemplate(object): ) src_xml = re.sub(pat, r"\1 \2", src_xml, flags=re.DOTALL) - for y in ["p", "r"]: - # replace into xml paragraph or run containing - # {%rp xxx %} or {{rp xxx}} template tag - # by {% xxx %} or {{ xx }} without any surrounding tags - # This allow for inline {rr }} and paragraph {rp }) styling - # This is mandatory to have jinja2 generating correct xml code - pat = ( - r"](?:(?!]).)*({%%|{{)r%(y)s ([^}%%]*(?:%%}|}})).*?" - % {"y": y} - ) - src_xml = re.sub(pat, r"\1 \2", src_xml, flags=re.DOTALL) + # For paragraph level richtext + # replace into xml paragraph containing + # {%q xxx %} or {{q xxx}} template tag + # by {% xxx %} or {{ xx }} without any surrounding tags + # This allow for inline {r }} and paragraph {q }) styling + # This is mandatory to have jinja2 generating correct xml code + pat = ( + r"](?:(?!]).)*({%%|{{)q ([^}%%]*(?:%%}|}})).*?" + + ) + src_xml = re.sub(pat, r"\1 \2", src_xml, flags=re.DOTALL) for y in ["tr", "tc", "p"]: # same thing, but for {#y xxx #} (but not where y == 'r', since that diff --git a/tests/richtextparagraph.py b/tests/richtextparagraph.py index e06bf47..e63f91c 100644 --- a/tests/richtextparagraph.py +++ b/tests/richtextparagraph.py @@ -12,9 +12,20 @@ rtp = RichTextParagraph() rt = RichText() rtp.add("The rich text paragraph function allows paragraph styles to be added to text",parastyle="myrichparastyle") +rtp.add("Any built in paragraph style can be used", parastyle="IntenseQuote") +rtp.add("or you can add your own, unlocking all style options", parastyle="createdStyle") +rtp.add("To use, just create a style in your template word doc with the formatting you want and call it in the code.", parastyle="normal") rtp.add("This allows for the use of") -rtp.add("bullet\apoints.", parastyle="SquareBullet") +rtp.add("custom bullet\apoints", parastyle="SquareBullet") +rtp.add("Numbered Bullet Points", parastyle="BasicNumbered") +rtp.add("and Alpha Bullet Points.", parastyle="alphaBracketNumbering") +rtp.add("You can", parastyle="normal") +rtp.add("set the", parastyle="centerAlign") +rtp.add("text alignment", parastyle="rightAlign") +rtp.add("as well as the spacing between lines of text. Like this for example, this text has very tight spacing between the lines.\aIt also has no space between paragraphs of the same style.", parastyle="TightLineSpacing") +rtp.add("Unlike this one, which has extra large spacing between lines for when you want to space things out a bit or just write a little less.", parastyle="WideLineSpacing") +rtp.add("You can also set the background colour of a line.", parastyle="LineShadingGreen") rt.add("This works with ") rt.add("Rich ", bold=True) diff --git a/tests/templates/richtext_paragraph_tpl.docx b/tests/templates/richtext_paragraph_tpl.docx index 738c5025ba172ecaa1d41abfc64a3c1a2174eb5c..993b466d3386e91070482e66ead1938b608b40b9 100644 GIT binary patch delta 13244 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 TQbOQGGD$!w7N~N$e@y-#KPw=u delta 11253 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 sMGo+m3^~F7`FH%w1^~>t!6dRgkkNc#9a(b%7