Skip to content

Commit a86e52b

Browse files
committed
XHTML compliance
1 parent 5884b8f commit a86e52b

File tree

4 files changed

+15
-7
lines changed

4 files changed

+15
-7
lines changed

.changeset/forty-llamas-unite.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': minor
3+
---
4+
5+
feat: XHTML compliance

packages/svelte/src/compiler/phases/3-transform/client/transform-template/template.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,11 @@ function stringify(item) {
104104
if (value !== undefined) str += `="${escape_html(value, true)}"`;
105105
}
106106

107-
str += `>`;
108-
str += item.children.map(stringify).join('');
109-
110-
if (!is_void(item.name)) {
107+
if (is_void(item.name)) {
108+
str += '/>'; // XHTML compliance
109+
} else {
110+
str += `>`;
111+
str += item.children.map(stringify).join('');
111112
str += `</${item.name}>`;
112113
}
113114

packages/svelte/src/compiler/phases/3-transform/server/visitors/RegularElement.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@ export function RegularElement(node, context) {
2424
context.state.preserve_whitespace || node.name === 'pre' || node.name === 'textarea'
2525
};
2626

27+
const node_is_void = is_void(node.name);
28+
2729
context.state.template.push(b.literal(`<${node.name}`));
2830
const body = build_element_attributes(node, { ...context, state });
29-
context.state.template.push(b.literal('>'));
31+
context.state.template.push(b.literal(node_is_void ? '/>' : '>')); // add `/>` for XHTML compliance
3032

3133
if ((node.name === 'script' || node.name === 'style') && node.fragment.nodes.length === 1) {
3234
context.state.template.push(
@@ -94,7 +96,7 @@ export function RegularElement(node, context) {
9496
);
9597
}
9698

97-
if (!is_void(node.name)) {
99+
if (!node_is_void) {
98100
state.template.push(b.literal(`</${node.name}>`));
99101
}
100102

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/** @param {string} html */
22
export function create_fragment_from_html(html) {
33
var elem = document.createElement('template');
4-
elem.innerHTML = html;
4+
elem.innerHTML = html.replaceAll('<!>', '<!---->'); // XHTML compliance
55
return elem.content;
66
}

0 commit comments

Comments
 (0)