From 0061b556ec3b3a3346ef2edd4f3a84efa642c74f Mon Sep 17 00:00:00 2001 From: Bart Broere Date: Tue, 17 Sep 2024 15:09:29 +0200 Subject: [PATCH] [WIP] Support rendering variables in footnotes --- docxtpl/template.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docxtpl/template.py b/docxtpl/template.py index d6d28ec..b421e64 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -350,6 +350,23 @@ def render_properties( template = jinja_env.from_string(initial) rendered = template.render(context) setattr(self.docx.core_properties, prop, rendered) + + def render_footnotes( + self, context: Dict[str, Any], jinja_env: Optional[Environment] = None + ) -> None: + if jinja_env is None: + jinja_env = Environment() + + for k, v in self.docx.sections[0].part.related_parts.items(): + if v.content_type == 'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml': + import xml.etree.ElementTree as ET + tree = ET.fromstring(v.blob) + for footnote in tree.findall('.//w:t', docx.oxml.ns.nsmap): + if hasattr(footnote, 'text'): + footnote.text = jinja_env.from_string(footnote.text).render(context) + for part in self.docx.sections[0].part.related_parts[k].package.parts: + if part.partname == v.partname: + part._blob = ET.tostring(tree, encoding='unicode').encode('utf8') def resolve_listing(self, xml): @@ -483,6 +500,8 @@ def render( self.render_properties(context, jinja_env) + self.render_footnotes(context, jinja_env) + # set rendered flag self.is_rendered = True