diff --git a/docs/api/model.mdx b/docs/api/model.mdx index 39096bf..83284d0 100644 --- a/docs/api/model.mdx +++ b/docs/api/model.mdx @@ -490,9 +490,17 @@ def preprocess_with_cdata(cls, content: str) -> str: return f"<{field_name}{tag_attrs}>{content}" fields_pattern = "|".join(re.escape(field_name) for field_name in field_map) - pattern = f"<({fields_pattern})((?:[^>]*?)?)>(.*?)" + pattern = f"<({fields_pattern})((?:\\s[^>]*?)?)>(.*?)" - return re.sub(pattern, wrap_with_cdata, content, flags=re.DOTALL) + updated = re.sub(pattern, wrap_with_cdata, content, flags=re.DOTALL) + + # If our updates created invalid XML, discard them + try: + ET.fromstring(updated) # noqa: S314 # nosec + except ET.ParseError: + return content + + return updated ``` diff --git a/rigging/model.py b/rigging/model.py index d44927b..cd07488 100644 --- a/rigging/model.py +++ b/rigging/model.py @@ -388,9 +388,17 @@ def wrap_with_cdata(match: re.Match[str]) -> str: return f"<{field_name}{tag_attrs}>{content}" fields_pattern = "|".join(re.escape(field_name) for field_name in field_map) - pattern = f"<({fields_pattern})((?:[^>]*?)?)>(.*?)" + pattern = f"<({fields_pattern})((?:\\s[^>]*?)?)>(.*?)" - return re.sub(pattern, wrap_with_cdata, content, flags=re.DOTALL) + updated = re.sub(pattern, wrap_with_cdata, content, flags=re.DOTALL) + + # If our updates created invalid XML, discard them + try: + ET.fromstring(updated) # noqa: S314 # nosec + except ET.ParseError: + return content + + return updated # Attempt to extract this object from an arbitrary string # which may contain other XML elements or text, returns