From aa7b7a77e3791eaf2a22ed7597f2cee415b6ac5d Mon Sep 17 00:00:00 2001 From: ST-Imrie <117174577+ST-Imrie@users.noreply.github.com> Date: Fri, 28 Feb 2025 17:53:26 +0000 Subject: [PATCH 1/2] Rich Text Paragraph Formatting Update --- docxtpl/__init__.py | 2 +- docxtpl/richtext.py | 45 ++++++++++++++++++++ docxtpl/template.py | 16 ++++++- tests/richtextparagraph.py | 32 ++++++++++++++ tests/templates/richtext_paragraph_tpl.docx | Bin 0 -> 18357 bytes tests/templates/richtext_tpl.docx | Bin 11440 -> 14126 bytes 6 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 tests/richtextparagraph.py create mode 100644 tests/templates/richtext_paragraph_tpl.docx diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index 1c0e1df..0ec37f1 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -9,6 +9,6 @@ __version__ = "0.19.1" # flake8: noqa from .inline_image import InlineImage from .listing import Listing -from .richtext import RichText, R +from .richtext import RichText, R, RichTextParagraph, RP from .subdoc import Subdoc from .template import DocxTemplate diff --git a/docxtpl/richtext.py b/docxtpl/richtext.py index 75c3b1c..759eed0 100644 --- a/docxtpl/richtext.py +++ b/docxtpl/richtext.py @@ -119,5 +119,50 @@ class RichText(object): def __html__(self): return self.xml +class RichTextParagraph(object): + """class to generate Rich Text Paragraphs when using templates variables + + This is much faster than using Subdoc class, + but this only for texts OUTSIDE an existing paragraph. + """ + + def __init__(self, text=None, **text_prop): + self.xml = "" + if text: + self.add(text, **text_prop) + + def add( + self, + text, + parastyle=None, + ): + + # If a RichText is added + if not isinstance(text, RichText): + text = RichText(text) + + prop = "" + if parastyle: + prop += '' % parastyle + + xml = "" + if prop: + xml += "%s" % prop + xml += text.xml + xml += "" + self.xml += xml + + def __unicode__(self): + return self.xml + + def __str__(self): + return self.xml + + def __html__(self): + return self.xml + + + R = RichText +RP = RichTextParagraph diff --git a/docxtpl/template.py b/docxtpl/template.py index b246ca7..e9c9cc4 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"({{r.\s.*?}}|{%r.\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", "r"]: + for y in ["tr", "tc", "p"]: # replace into xml code the row/paragraph/run containing # {%y xxx %} or {{y xxx}} template tag # by {% xxx %} or {{ xx }} without any surrounding tags : @@ -183,6 +183,18 @@ class DocxTemplate(object): % {"y": y} ) 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 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 new file mode 100644 index 0000000..e06bf47 --- /dev/null +++ b/tests/richtextparagraph.py @@ -0,0 +1,32 @@ +""" +Created : 2025-02-28 + +@author: Hannah Imrie +""" + +from docxtpl import DocxTemplate, RichText, RichTextParagraph + +tpl = DocxTemplate("templates/richtext_paragraph_tpl.docx") + +rtp = RichTextParagraph() +rt = RichText() + +rtp.add("The rich text paragraph function allows paragraph styles to be added to text",parastyle="myrichparastyle") + +rtp.add("This allows for the use of") +rtp.add("bullet\apoints.", parastyle="SquareBullet") + +rt.add("This works with ") +rt.add("Rich ", bold=True) +rt.add("Text ", italic=True) +rt.add("Strings", underline="single") +rt.add(" too.") + +rtp.add(rt, parastyle="SquareBullet") + +context = { + "example": rtp, +} + +tpl.render(context) +tpl.save("output/richtext_paragraph.docx") \ No newline at end of file diff --git a/tests/templates/richtext_paragraph_tpl.docx b/tests/templates/richtext_paragraph_tpl.docx new file mode 100644 index 0000000000000000000000000000000000000000..738c5025ba172ecaa1d41abfc64a3c1a2174eb5c GIT binary patch literal 18357 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 literal 11440 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 B4uk*z 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 2/2] 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