fix: html space entities lost in component slot (#8464)

fixes #8359
pull/8515/head
xxkl1 2 years ago committed by Simon Holthausen
parent 6e1674e249
commit b95ae0ef3c

@ -4,7 +4,7 @@ export const regex_starts_with_whitespace = /^\s/;
export const regex_starts_with_whitespaces = /^[ \t\r\n]*/; export const regex_starts_with_whitespaces = /^[ \t\r\n]*/;
export const regex_ends_with_whitespace = /\s$/; export const regex_ends_with_whitespace = /\s$/;
export const regex_ends_with_whitespaces = /[ \t\r\n]*$/; export const regex_ends_with_whitespaces = /[ \t\r\n]*$/;
export const regex_only_whitespaces = /^\s+$/; export const regex_only_whitespaces = /^[ \t\n\r\f]+$/;
export const regex_whitespace_characters = /\s/g; export const regex_whitespace_characters = /\s/g;
export const regex_non_whitespace_character = /\S/; export const regex_non_whitespace_character = /\S/;

@ -109,11 +109,11 @@ function cleanChildren(node) {
node.removeChild(child); node.removeChild(child);
} }
child.data = child.data.replace(/\s+/g, '\n'); child.data = child.data.replace(/[ \t\n\r\f]+/g, '\n');
if (previous && previous.nodeType === 3) { if (previous && previous.nodeType === 3) {
previous.data += child.data; previous.data += child.data;
previous.data = previous.data.replace(/\s+/g, '\n'); previous.data = previous.data.replace(/[ \t\n\r\f]+/g, '\n');
node.removeChild(child); node.removeChild(child);
child = previous; child = previous;
@ -130,13 +130,13 @@ function cleanChildren(node) {
// collapse whitespace // collapse whitespace
if (node.firstChild && node.firstChild.nodeType === 3) { if (node.firstChild && node.firstChild.nodeType === 3) {
node.firstChild.data = node.firstChild.data.replace(/^\s+/, ''); node.firstChild.data = node.firstChild.data.replace(/^[ \t\n\r\f]+/, '');
if (!node.firstChild.data) node.removeChild(node.firstChild); if (!node.firstChild.data.length) node.removeChild(node.firstChild);
} }
if (node.lastChild && node.lastChild.nodeType === 3) { if (node.lastChild && node.lastChild.nodeType === 3) {
node.lastChild.data = node.lastChild.data.replace(/\s+$/, ''); node.lastChild.data = node.lastChild.data.replace(/[ \t\n\r\f]+$/, '');
if (!node.lastChild.data) node.removeChild(node.lastChild); if (!node.lastChild.data.length) node.removeChild(node.lastChild);
} }
} }
@ -145,7 +145,7 @@ export function normalizeHtml(window, html, preserveComments = false) {
const node = window.document.createElement('div'); const node = window.document.createElement('div');
node.innerHTML = html node.innerHTML = html
.replace(/(<!--.*?-->)/g, preserveComments ? '$1' : '') .replace(/(<!--.*?-->)/g, preserveComments ? '$1' : '')
.replace(/>[\s\r\n]+</g, '><') .replace(/>[ \t\n\r\f]+</g, '><')
.trim(); .trim();
cleanChildren(node); cleanChildren(node);
return node.innerHTML.replace(/<\/?noscript\/?>/g, ''); return node.innerHTML.replace(/<\/?noscript\/?>/g, '');

@ -0,0 +1,11 @@
export default {
html: `
<div>&nbsp;</div>
<div>
<span>&nbsp;</span>
</div>
<div>&nbsp;</div>
`
};

@ -0,0 +1,13 @@
<script>
import Component from './Component.svelte'
</script>
<Component>&nbsp;</Component>
<Component>
<span>&nbsp;</span>
</Component>
<Component>
{@html "&nbsp;"}
</Component>
Loading…
Cancel
Save