XHTML compliance

pull/15538/head
Rich Harris 4 months ago
parent 5884b8fa5f
commit a86e52b174

@ -0,0 +1,5 @@
---
'svelte': minor
---
feat: XHTML compliance

@ -104,10 +104,11 @@ function stringify(item) {
if (value !== undefined) str += `="${escape_html(value, true)}"`; if (value !== undefined) str += `="${escape_html(value, true)}"`;
} }
if (is_void(item.name)) {
str += '/>'; // XHTML compliance
} else {
str += `>`; str += `>`;
str += item.children.map(stringify).join(''); str += item.children.map(stringify).join('');
if (!is_void(item.name)) {
str += `</${item.name}>`; str += `</${item.name}>`;
} }

@ -24,9 +24,11 @@ export function RegularElement(node, context) {
context.state.preserve_whitespace || node.name === 'pre' || node.name === 'textarea' context.state.preserve_whitespace || node.name === 'pre' || node.name === 'textarea'
}; };
const node_is_void = is_void(node.name);
context.state.template.push(b.literal(`<${node.name}`)); context.state.template.push(b.literal(`<${node.name}`));
const body = build_element_attributes(node, { ...context, state }); const body = build_element_attributes(node, { ...context, state });
context.state.template.push(b.literal('>')); context.state.template.push(b.literal(node_is_void ? '/>' : '>')); // add `/>` for XHTML compliance
if ((node.name === 'script' || node.name === 'style') && node.fragment.nodes.length === 1) { if ((node.name === 'script' || node.name === 'style') && node.fragment.nodes.length === 1) {
context.state.template.push( context.state.template.push(
@ -94,7 +96,7 @@ export function RegularElement(node, context) {
); );
} }
if (!is_void(node.name)) { if (!node_is_void) {
state.template.push(b.literal(`</${node.name}>`)); state.template.push(b.literal(`</${node.name}>`));
} }

@ -1,6 +1,6 @@
/** @param {string} html */ /** @param {string} html */
export function create_fragment_from_html(html) { export function create_fragment_from_html(html) {
var elem = document.createElement('template'); var elem = document.createElement('template');
elem.innerHTML = html; elem.innerHTML = html.replaceAll('<!>', '<!---->'); // XHTML compliance
return elem.content; return elem.content;
} }

Loading…
Cancel
Save