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

Commit

Permalink
Fix serializing mixed content
Browse files Browse the repository at this point in the history
  • Loading branch information
fb55 committed Feb 7, 2022
1 parent 18f170c commit 67dbf72
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 3 deletions.
15 changes: 15 additions & 0 deletions packages/parse5/lib/serializer/index.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import * as assert from 'node:assert';
import * as parse5 from 'parse5';
import outdent from 'outdent';
import { generateSerializerTests } from 'parse5-test-utils/utils/generate-serializer-tests.js';
import { treeAdapters } from 'parse5-test-utils/utils/common.js';
import type { Element } from 'parse5/dist/tree-adapters/default';
Expand Down Expand Up @@ -34,4 +35,18 @@ describe('serializer', () => {
);
});
});

describe('Mixed content (GH-333)', () => {
it('should serialize mixed content', () => {
const input = outdent`
<svg><style>&lt;</style></svg>
<style>&lt;</style>
<svg><script>&lt;</script></svg>
<script>&lt;</script>
`;
const document = parse5.parse(input);
expect(parse5.serialize(document)).toContain(input);
});
});
});
8 changes: 5 additions & 3 deletions packages/parse5/lib/serializer/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ type InternalOptions<T extends TreeAdapterTypeMap> = Required<SerializerOptions<
*/
export function serialize<T extends TreeAdapterTypeMap = DefaultTreeAdapter.DefaultTreeAdapterMap>(
node: T['parentNode'],
options: SerializerOptions<T>
options?: SerializerOptions<T>
): string {
const opts = { treeAdapter: DefaultTreeAdapter, scriptingEnabled: true, ...options };
return serializeChildNodes(node, opts);
Expand Down Expand Up @@ -108,7 +108,7 @@ function serializeElement<T extends TreeAdapterTypeMap>(node: T['element'], opti
const tn = options.treeAdapter.getTagName(node);

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

return parentTn && (UNESCAPED_TEXT.has(parentTn) || (options.scriptingEnabled && parentTn === $.NOSCRIPT))
return parentTn &&
treeAdapter.getNamespaceURI(parent) === NS.HTML &&
(UNESCAPED_TEXT.has(parentTn) || (options.scriptingEnabled && parentTn === $.NOSCRIPT))
? content
: escapeString(content, false);
}
Expand Down

0 comments on commit 67dbf72

Please sign in to comment.