Skip to content
This repository was archived by the owner on Mar 24, 2022. It is now read-only.

Commit 0f129f4

Browse files
committed
Fix serializing mixed content
Fixes inikulin#333
1 parent b2d6d53 commit 0f129f4

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

packages/parse5/lib/serializer/index.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as assert from 'node:assert';
22
import * as parse5 from 'parse5';
3+
import outdent from 'outdent';
34
import { generateSerializerTests } from 'parse5-test-utils/utils/generate-serializer-tests.js';
45
import { treeAdapters } from 'parse5-test-utils/utils/common.js';
56
import type { Element } from 'parse5/dist/tree-adapters/default';
@@ -35,4 +36,18 @@ describe('serializer', () => {
3536
);
3637
});
3738
});
39+
40+
describe('Mixed content (GH-333)', () => {
41+
it('should serialize mixed content', () => {
42+
const input = outdent`
43+
<svg><style>&lt;</style></svg>
44+
<style>&lt;</style>
45+
46+
<svg><script>&lt;</script></svg>
47+
<script>&lt;</script>
48+
`;
49+
const document = parse5.parse(input);
50+
expect(parse5.serialize(document)).toContain(input);
51+
});
52+
});
3853
});

packages/parse5/lib/serializer/index.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ type InternalOptions<T extends TreeAdapterTypeMap> = Required<SerializerOptions<
7474
*/
7575
export function serialize<T extends TreeAdapterTypeMap = DefaultTreeAdapter.DefaultTreeAdapterMap>(
7676
node: T['parentNode'],
77-
options: SerializerOptions<T>
77+
options?: SerializerOptions<T>
7878
): string {
7979
const opts = { treeAdapter: DefaultTreeAdapter, scriptingEnabled: true, ...options };
8080
return serializeChildNodes(node, opts);
@@ -108,7 +108,7 @@ function serializeElement<T extends TreeAdapterTypeMap>(node: T['element'], opti
108108
const tn = options.treeAdapter.getTagName(node);
109109

110110
return `<${tn}${serializeAttributes(node, options)}>${
111-
VOID_ELEMENTS.has(tn)
111+
options.treeAdapter.getNamespaceURI(node) === NS.HTML && VOID_ELEMENTS.has(tn)
112112
? ''
113113
: `${serializeChildNodes(
114114
// Get container of the child nodes
@@ -165,7 +165,9 @@ function serializeTextNode<T extends TreeAdapterTypeMap>(node: T['textNode'], op
165165
const parent = treeAdapter.getParentNode(node);
166166
const parentTn = parent && treeAdapter.isElementNode(parent) && treeAdapter.getTagName(parent);
167167

168-
return parentTn && (UNESCAPED_TEXT.has(parentTn) || (options.scriptingEnabled && parentTn === $.NOSCRIPT))
168+
return parentTn &&
169+
treeAdapter.getNamespaceURI(parent) === NS.HTML &&
170+
(UNESCAPED_TEXT.has(parentTn) || (options.scriptingEnabled && parentTn === $.NOSCRIPT))
169171
? content
170172
: escapeString(content, false);
171173
}

0 commit comments

Comments
 (0)