parse non-root <script> elements as a single Text node to fix hydration

pull/1087/head
Conduitry 8 years ago
parent 4b4737af9f
commit 61909fb85f

@ -434,7 +434,7 @@ export default class Element extends Node {
if (isVoidElementName(node.name)) return open + '>'; if (isVoidElementName(node.name)) return open + '>';
if (node.name === 'script') { if (node.name === 'script') {
return `${open}>${node.data}</${node.name}>`; return `${open}>${node.children[0].data}</script>`;
} }
return `${open}>${node.children.map(toHTML).join('')}</${node.name}>`; return `${open}>${node.children.map(toHTML).join('')}</${node.name}>`;

@ -69,7 +69,7 @@ export default function visitElement(
if (node.name === 'textarea' && textareaContents !== undefined) { if (node.name === 'textarea' && textareaContents !== undefined) {
generator.append(textareaContents); generator.append(textareaContents);
} else if (node.name === 'script') { } else if (node.name === 'script') {
generator.append(escape(node.data)); generator.append(node.children[0].data);
} else { } else {
node.children.forEach((child: Node) => { node.children.forEach((child: Node) => {
visit(generator, block, child); visit(generator, block, child);

@ -226,8 +226,11 @@ export default function tag(parser: Parser) {
element.end = parser.index; element.end = parser.index;
} else if (name === 'script') { } else if (name === 'script') {
// special case // special case
element.data = parser.readUntil(new RegExp(`</${name}>`)); const start = parser.index;
parser.eat(`</${name}>`, true); const data = parser.readUntil(/<\/script>/);
const end = parser.index;
element.children.push({ start, end, type: 'Text', data });
parser.eat('</script>', true);
element.end = parser.index; element.end = parser.index;
} else if (name === 'style') { } else if (name === 'style') {
// special case // special case

Loading…
Cancel
Save