I'm using GrapesJS editor on the frontend in their MJML mode for customers to edit their templates and some time they still manage to somehow copy-paste a HTML tag like p which then causes mjml-python to throw a KeyError instead of pushing error to validation:
^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/mjml/mjml2html.py", line 243, in mjml_to_html
content = processing(mjBody, bodyHelpers, applyAttributes)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/mjml/mjml2html.py", line 123, in processing
return component.render()
^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/mjml/elements/mj_body.py", line 54, in render
children_str = self.renderChildren()
^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/mjml/elements/_base.py", line 169, in renderChildren
output += renderer(component)
^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/mjml/elements/_base.py", line 111, in <lambda>
renderer = lambda component: component.render()
^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/mjml/elements/mj_section.py", line 149, in render
return self.renderSimple()
^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/mjml/elements/mj_section.py", line 181, in renderSimple
section = self.renderSection()
^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/mjml/elements/mj_section.py", line 258, in renderSection
{self.renderWrappedChildren()}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/mjml/elements/mj_section.py", line 298, in renderWrappedChildren
{self.renderChildren(children, renderer=render_child)}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/mjml/elements/_base.py", line 169, in renderChildren
output += renderer(component)
^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/mjml/elements/mj_section.py", line 288, in render_child
{component.render()}
^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/mjml/elements/mj_column.py", line 137, in render
column_str = self.renderColumn() if (not self.hasGutter()) else self.renderGutter()
^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/mjml/elements/mj_column.py", line 254, in renderColumn
{self.renderChildren(children, renderer=render_child)}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/mjml/elements/_base.py", line 164, in renderChildren
component = initComponent(
^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/mjml/core/api.py", line 17, in initComponent
component_cls = components[name]
~~~~~~~~~~^^^^^^
KeyError: 'p'
<mj-body>
<mj-section>
<mj-column>
<mj-text>Hello World</mj-text>
<p>bug</p>
</mj-column>
</mj-section>
</mj-body>
</mjml>
I'm using GrapesJS editor on the frontend in their MJML mode for customers to edit their templates and some time they still manage to somehow copy-paste a HTML tag like
pwhich then causes mjml-python to throw a KeyError instead of pushing error to validation:For something like this:
I've changed
components[name]tocomponents.get(name)and it seems to work ok-ish as it removes the invalid tag with its contents (it's good to recover other changes but no info about the invalid tag that got removed).