diff --git a/.changeset/html-self-closing-raw-text.md b/.changeset/html-self-closing-raw-text.md new file mode 100644 index 000000000..6e12877fc --- /dev/null +++ b/.changeset/html-self-closing-raw-text.md @@ -0,0 +1,5 @@ +--- +"@solidjs/html": patch +--- + +Fix the tokenizer staying in raw text mode after a self-closing raw text element such as ``, which swallowed the rest of the template as text. diff --git a/packages/html/src/tokenize.ts b/packages/html/src/tokenize.ts index 6a0df68db..c7017a728 100644 --- a/packages/html/src/tokenize.ts +++ b/packages/html/src/tokenize.ts @@ -157,6 +157,7 @@ export const tokenize = ( // ">" if ( rawTextElements.has(lastTagName) && + tokens[tokens.length - 1]?.type !== SLASH_TOKEN && tokens[tokens.length - 2]?.type !== SLASH_TOKEN ) { state = STATE_RAW_TEXT; diff --git a/packages/html/test/parse.test.ts b/packages/html/test/parse.test.ts index 24c5cae07..4a6877c38 100644 --- a/packages/html/test/parse.test.ts +++ b/packages/html/test/parse.test.ts @@ -526,6 +526,22 @@ describe("Specialized Element AST", () => { }); }); + it("raw text elements: self-closing textarea inside an element", () => { + const ast = jsx`
`; + + expect(ast).toEqual({ + type: ROOT_NODE, + children: [ + { + type: ELEMENT_NODE, + name: "div", + props: [], + children: [{ type: ELEMENT_NODE, name: "textarea", props: [], children: [] }] + } + ] + }); + }); + it("comments: braced comment ignored", () => { const ast = jsx`