Skip to content

Don't escape raw text when serializing only an element's children - #25

Merged
awolverp merged 2 commits into
awolverp:masterfrom
andersk:serialize-children-raw-text
Oct 6, 2026
Merged

awolverp merged 2 commits into
awolverp:masterfrom
andersk:serialize-children-raw-text

Conversation

@andersk

@andersk andersk commented Oct 5, 2026 •

Copy link
Copy Markdown
Contributor

With include_self=False, serialize passed TraversalScope::ChildrenOnly without the parent element's name. html5ever's serializer uses that name to decide whether the children are raw text, so the contents of <script> and <style> were escaped: "if (a < b) {}" serialized as "if (a &lt; b) {}", which changes the script.

Pass the element's name when serializing its children.

A fragment parsed with fragment_context is parsed as the contents of the context element, but its nodes become the children of the tree's document node, which serialize escapes as usual. So text parsed in a raw text context didn't round-trip:
parse('console.log("<br>")', HtmlOptions(fragment_context="script"))
serialized as 'console.log("&lt;br&gt;")', which parses back to different text.

Remember the context element in IDTreeDOM, and serialize the document node of a fragment as if its children were the children of the context element, as html5ever's serializer allows.

andersk and others added 2 commits October 5, 2026 10:36
With include_self=False, serialize passed TraversalScope::ChildrenOnly
without the parent element's name.  html5ever's serializer uses that
name to decide whether the children are raw text, so the contents of
<script> and <style> were escaped: "if (a < b) {}" serialized as
"if (a &lt; b) {}", which changes the script.

Pass the element's name when serializing its children.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Anders Kaseorg <andersk@mit.edu>
A fragment parsed with fragment_context is parsed as the contents of
the context element, but its nodes become the children of the tree's
document node, which serialize escapes as usual.  So text parsed in a
raw text context didn't round-trip:
parse('console.log("<br>")', HtmlOptions(fragment_context="script"))
serialized as 'console.log("&lt;br&gt;")', which parses back to
different text.

Remember the context element in IDTreeDOM, and serialize the document
node of a fragment as if its children were the children of the context
element, as html5ever's serializer allows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Anders Kaseorg <andersk@mit.edu>
@awolverp
awolverp merged commit 024a50c into awolverp:master Oct 6, 2026
12 checks passed
@andersk
andersk deleted the serialize-children-raw-text branch October 6, 2026 10:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants