From 2538b1e1ad8e5475a6c5675a8ff0804c5d30c83a Mon Sep 17 00:00:00 2001 From: YeonJuan Date: Wed, 27 Nov 2024 23:29:48 +0900 Subject: [PATCH] feat: implement templateRanges option (#22) * refactor * feat: support template syntax * feat: template syntax attributes value quote * feat: script start * impl * tokenizer * update * imple * Update token-types.ts * Update token-adapter.ts --- .gitignore | 1 + README.md | 6 +- .../__snapshots__/token-adapter.spec.ts.snap | 4 + src/parser/parse.ts | 3 +- .../template-syntax-attributes-key-value.html | 1 + .../template-syntax-attributes-key.html | 1 + ...template-syntax-attributes-value-bare.html | 1 + ...emplate-syntax-attributes-value-quote.html | 1 + .../__input__/template-syntax-attributes.html | 1 + .../template-syntax-comment-content.html | 1 + .../__input__/template-syntax-data.html | 1 + .../template-syntax-script-attributes.html | 1 + .../template-syntax-script-content.html | 1 + .../template-syntax-style-attributes.html | 1 + .../template-syntax-style-content.html | 1 + .../__output__/attributes-apostrophe.ts | 16 ++ .../__output__/attributes-bare-wrong-quote.ts | 2 + .../__tests__/__output__/attributes-bare.ts | 15 ++ .../__tests__/__output__/attributes-empty.ts | 4 + .../__output__/attributes-multiline-crlf.ts | 7 + .../__tests__/__output__/attributes-quote.ts | 16 ++ .../__tests__/__output__/comments.ts | 14 ++ .../__tests__/__output__/custom-elements.ts | 4 + .../__tests__/__output__/doctypes.ts | 6 + .../__tests__/__output__/nested-tags.ts | 6 + .../__output__/opening-closing-text.ts | 2 + .../__output__/script-elements-attributes.ts | 18 ++ .../__tests__/__output__/script-elements.ts | 5 + .../__output__/style-elements-attributes.ts | 14 ++ .../__tests__/__output__/style-elements.ts | 7 + src/tokenizer/__tests__/__output__/svg.ts | 2 + .../__tests__/__output__/tags-register.ts | 17 ++ .../template-syntax-attributes-key-value.ts | 96 +++++++++++ .../template-syntax-attributes-key.ts | 126 ++++++++++++++ .../template-syntax-attributes-value-bare.ts | 96 +++++++++++ .../template-syntax-attributes-value-quote.ts | 126 ++++++++++++++ .../__output__/template-syntax-attributes.ts | 65 ++++++++ .../template-syntax-comment-content.ts | 50 ++++++ .../__output__/template-syntax-data.ts | 97 +++++++++++ .../template-syntax-script-attributes.ts | 65 ++++++++ .../template-syntax-script-content.ts | 97 +++++++++++ .../template-syntax-style-attributes.ts | 96 +++++++++++ .../template-syntax-style-content.ts | 97 +++++++++++ .../__tests__/__output__/void-tags.ts | 1 + src/tokenizer/__tests__/tokenize.spec.ts | 139 ++++++++++++++-- src/tokenizer/handlers/attribute-key.ts | 31 +++- .../handlers/attribute-value-bare.ts | 35 +++- .../handlers/attribute-value-wrapped.ts | 37 ++++- src/tokenizer/handlers/attribute-value.ts | 4 +- src/tokenizer/handlers/comment-content.ts | 49 +++++- src/tokenizer/handlers/data.ts | 31 +++- src/tokenizer/handlers/open-tag-end.ts | 13 +- src/tokenizer/handlers/open-tag-start.ts | 8 +- src/tokenizer/handlers/script-tag-content.ts | 35 +++- src/tokenizer/handlers/style-tag-content.ts | 35 +++- src/tokenizer/tokenize.ts | 52 ++---- src/tokenizer/tokenizer-state.ts | 57 +++++++ .../__output__/attributes-apostrophe.ts | 16 ++ .../__output__/attributes-bare-wrong-quote.ts | 2 + .../__tests__/__output__/attributes-empty.ts | 4 + .../__output__/attributes-multiline-crlf.ts | 7 + .../__tests__/__output__/comments.ts | 154 +++++++++-------- .../__tests__/__output__/custom-elements.ts | 4 + .../__tests__/__output__/doctypes.ts | 6 + .../__tests__/__output__/nested-tags.ts | 6 + .../__output__/opening-closing-text.ts | 2 + .../__output__/script-elements-attributes.ts | 102 +++++++----- .../__tests__/__output__/script-elements.ts | 33 ++-- .../__output__/style-elements-attributes.ts | 70 +++++--- .../__tests__/__output__/style-elements.ts | 63 ++++--- .../__tests__/__output__/svg.ts | 2 + .../__tests__/__output__/tags-register.ts | 64 +++++-- .../template-syntax-attributes-key-value.ts | 126 ++++++++++++++ .../template-syntax-attributes-key.ts | 156 ++++++++++++++++++ .../template-syntax-attributes-value-bare.ts | 126 ++++++++++++++ .../template-syntax-attributes-value-quote.ts | 156 ++++++++++++++++++ .../__output__/template-syntax-attributes.ts | 110 ++++++++++++ .../template-syntax-comment-content.ts | 78 +++++++++ .../__output__/template-syntax-data.ts | 128 ++++++++++++++ .../template-syntax-script-attributes.ts | 108 ++++++++++++ .../template-syntax-script-content.ts | 126 ++++++++++++++ .../template-syntax-style-content.ts | 126 ++++++++++++++ .../__tests__/__output__/void-tags.ts | 1 + .../__tests__/construct-tree.spec.ts | 80 +++++++++ src/tree-constructor/handlers/comment.ts | 3 +- src/tree-constructor/handlers/script-tag.ts | 3 +- src/tree-constructor/handlers/style-tag.ts | 3 +- src/tree-constructor/handlers/tag-content.ts | 6 +- src/types/contextual-node.ts | 6 +- src/types/node.ts | 29 ++-- src/types/parse.ts | 4 +- src/types/simple-node.ts | 7 - src/types/token.ts | 15 +- src/types/tokenizer-context-handler.ts | 5 +- src/types/tokenizer-state.ts | 11 +- src/utils/create-node-from.ts | 11 +- tsconfig.json | 2 +- 97 files changed, 3355 insertions(+), 324 deletions(-) create mode 100644 src/tokenizer/__tests__/__input__/template-syntax-attributes-key-value.html create mode 100644 src/tokenizer/__tests__/__input__/template-syntax-attributes-key.html create mode 100644 src/tokenizer/__tests__/__input__/template-syntax-attributes-value-bare.html create mode 100644 src/tokenizer/__tests__/__input__/template-syntax-attributes-value-quote.html create mode 100644 src/tokenizer/__tests__/__input__/template-syntax-attributes.html create mode 100644 src/tokenizer/__tests__/__input__/template-syntax-comment-content.html create mode 100644 src/tokenizer/__tests__/__input__/template-syntax-data.html create mode 100644 src/tokenizer/__tests__/__input__/template-syntax-script-attributes.html create mode 100644 src/tokenizer/__tests__/__input__/template-syntax-script-content.html create mode 100644 src/tokenizer/__tests__/__input__/template-syntax-style-attributes.html create mode 100644 src/tokenizer/__tests__/__input__/template-syntax-style-content.html create mode 100644 src/tokenizer/__tests__/__output__/template-syntax-attributes-key-value.ts create mode 100644 src/tokenizer/__tests__/__output__/template-syntax-attributes-key.ts create mode 100644 src/tokenizer/__tests__/__output__/template-syntax-attributes-value-bare.ts create mode 100644 src/tokenizer/__tests__/__output__/template-syntax-attributes-value-quote.ts create mode 100644 src/tokenizer/__tests__/__output__/template-syntax-attributes.ts create mode 100644 src/tokenizer/__tests__/__output__/template-syntax-comment-content.ts create mode 100644 src/tokenizer/__tests__/__output__/template-syntax-data.ts create mode 100644 src/tokenizer/__tests__/__output__/template-syntax-script-attributes.ts create mode 100644 src/tokenizer/__tests__/__output__/template-syntax-script-content.ts create mode 100644 src/tokenizer/__tests__/__output__/template-syntax-style-attributes.ts create mode 100644 src/tokenizer/__tests__/__output__/template-syntax-style-content.ts create mode 100644 src/tokenizer/tokenizer-state.ts create mode 100644 src/tree-constructor/__tests__/__output__/template-syntax-attributes-key-value.ts create mode 100644 src/tree-constructor/__tests__/__output__/template-syntax-attributes-key.ts create mode 100644 src/tree-constructor/__tests__/__output__/template-syntax-attributes-value-bare.ts create mode 100644 src/tree-constructor/__tests__/__output__/template-syntax-attributes-value-quote.ts create mode 100644 src/tree-constructor/__tests__/__output__/template-syntax-attributes.ts create mode 100644 src/tree-constructor/__tests__/__output__/template-syntax-comment-content.ts create mode 100644 src/tree-constructor/__tests__/__output__/template-syntax-data.ts create mode 100644 src/tree-constructor/__tests__/__output__/template-syntax-script-attributes.ts create mode 100644 src/tree-constructor/__tests__/__output__/template-syntax-script-content.ts create mode 100644 src/tree-constructor/__tests__/__output__/template-syntax-style-content.ts delete mode 100644 src/types/simple-node.ts diff --git a/.gitignore b/.gitignore index 4599f9e..b0a9187 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ coverage dist .yarn/* !.yarn/releases +.DS_store \ No newline at end of file diff --git a/README.md b/README.md index 0ac087e..7396c79 100644 --- a/README.md +++ b/README.md @@ -470,7 +470,7 @@ interface ScriptTagNode extends BaseNode { openStart: OpenScriptTagStartNode; openEnd: OpenScriptTagEndNode; close: CloseScriptTagNode; - value?: ScriptTagContentNode; + children: ScriptTagContentNode[]; } ``` @@ -529,7 +529,7 @@ interface StyleTagNode extends BaseNode { openStart: OpenStyleTagStartNode; openEnd: OpenStyleTagEndNode; close: CloseStyleTagNode; - value?: StyleTagContentNode; + children: StyleTagContentNode[]; } ``` @@ -586,7 +586,7 @@ interface CommentNode extends BaseNode { type: "Comment"; open: CommentOpenNode; close: CommentCloseNode; - value: CommentContentNode; + children: CommentContentNode[]; } ``` diff --git a/src/parser/__tests__/__snapshots__/token-adapter.spec.ts.snap b/src/parser/__tests__/__snapshots__/token-adapter.spec.ts.snap index 750547d..9fd7543 100644 --- a/src/parser/__tests__/__snapshots__/token-adapter.spec.ts.snap +++ b/src/parser/__tests__/__snapshots__/token-adapter.spec.ts.snap @@ -8,6 +8,7 @@ exports[`parse basic 1`] = ` "attributes": [], "children": [ { + "isTemplate": false, "loc": { "end": { "column": 12, @@ -153,6 +154,7 @@ exports[`parse basic 1`] = ` "value": ">", }, { + "isTemplate": false, "loc": { "end": { "column": 12, @@ -200,6 +202,7 @@ exports[`parse token adapter 1`] = ` "attributes": [], "children": [ { + "isTemplate": false, "loc": { "end": { "column": 12, @@ -345,6 +348,7 @@ exports[`parse token adapter 1`] = ` "value": ">", }, { + "isTemplate": false, "loc": { "end": { "column": 12, diff --git a/src/parser/parse.ts b/src/parser/parse.ts index eb1c883..3a70cdb 100644 --- a/src/parser/parse.ts +++ b/src/parser/parse.ts @@ -7,7 +7,8 @@ import { Options } from "../types/parse"; export function parse(html: string, options?: Options): ParseResult { const tokenAdapter = (options && options.tokenAdapter) || defaultTokenAdapter; - const { tokens } = tokenize(html, tokenAdapter); + const templateRanges = (options && options.templateRanges) || []; + const { tokens } = tokenize(html, tokenAdapter, templateRanges); const { ast } = constructTree(tokens, undefined); return { ast: clearParent(ast), diff --git a/src/tokenizer/__tests__/__input__/template-syntax-attributes-key-value.html b/src/tokenizer/__tests__/__input__/template-syntax-attributes-key-value.html new file mode 100644 index 0000000..c4d96b1 --- /dev/null +++ b/src/tokenizer/__tests__/__input__/template-syntax-attributes-key-value.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/src/tokenizer/__tests__/__input__/template-syntax-attributes-key.html b/src/tokenizer/__tests__/__input__/template-syntax-attributes-key.html new file mode 100644 index 0000000..4a45dff --- /dev/null +++ b/src/tokenizer/__tests__/__input__/template-syntax-attributes-key.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/src/tokenizer/__tests__/__input__/template-syntax-attributes-value-bare.html b/src/tokenizer/__tests__/__input__/template-syntax-attributes-value-bare.html new file mode 100644 index 0000000..7ba8f2c --- /dev/null +++ b/src/tokenizer/__tests__/__input__/template-syntax-attributes-value-bare.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/src/tokenizer/__tests__/__input__/template-syntax-attributes-value-quote.html b/src/tokenizer/__tests__/__input__/template-syntax-attributes-value-quote.html new file mode 100644 index 0000000..d79eb8a --- /dev/null +++ b/src/tokenizer/__tests__/__input__/template-syntax-attributes-value-quote.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/src/tokenizer/__tests__/__input__/template-syntax-attributes.html b/src/tokenizer/__tests__/__input__/template-syntax-attributes.html new file mode 100644 index 0000000..3a33115 --- /dev/null +++ b/src/tokenizer/__tests__/__input__/template-syntax-attributes.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/src/tokenizer/__tests__/__input__/template-syntax-comment-content.html b/src/tokenizer/__tests__/__input__/template-syntax-comment-content.html new file mode 100644 index 0000000..8de3824 --- /dev/null +++ b/src/tokenizer/__tests__/__input__/template-syntax-comment-content.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/tokenizer/__tests__/__input__/template-syntax-data.html b/src/tokenizer/__tests__/__input__/template-syntax-data.html new file mode 100644 index 0000000..8ca013e --- /dev/null +++ b/src/tokenizer/__tests__/__input__/template-syntax-data.html @@ -0,0 +1 @@ +
${ data } text
\ No newline at end of file diff --git a/src/tokenizer/__tests__/__input__/template-syntax-script-attributes.html b/src/tokenizer/__tests__/__input__/template-syntax-script-attributes.html new file mode 100644 index 0000000..f5ee504 --- /dev/null +++ b/src/tokenizer/__tests__/__input__/template-syntax-script-attributes.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/tokenizer/__tests__/__input__/template-syntax-script-content.html b/src/tokenizer/__tests__/__input__/template-syntax-script-content.html new file mode 100644 index 0000000..f1cc4f8 --- /dev/null +++ b/src/tokenizer/__tests__/__input__/template-syntax-script-content.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/tokenizer/__tests__/__input__/template-syntax-style-attributes.html b/src/tokenizer/__tests__/__input__/template-syntax-style-attributes.html new file mode 100644 index 0000000..963796f --- /dev/null +++ b/src/tokenizer/__tests__/__input__/template-syntax-style-attributes.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/tokenizer/__tests__/__input__/template-syntax-style-content.html b/src/tokenizer/__tests__/__input__/template-syntax-style-content.html new file mode 100644 index 0000000..0809a0d --- /dev/null +++ b/src/tokenizer/__tests__/__input__/template-syntax-style-content.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/tokenizer/__tests__/__output__/attributes-apostrophe.ts b/src/tokenizer/__tests__/__output__/attributes-apostrophe.ts index 93409d4..c0dfdb2 100644 --- a/src/tokenizer/__tests__/__output__/attributes-apostrophe.ts +++ b/src/tokenizer/__tests__/__output__/attributes-apostrophe.ts @@ -34,6 +34,7 @@ export default [ { type: TokenTypes.Text, value: "\n ", + isTemplate: false, range: [5, 8], loc: { start: { @@ -64,6 +65,7 @@ export default [ { type: TokenTypes.AttributeKey, value: "class", + isTemplate: false, range: [14, 19], loc: { start: { @@ -108,6 +110,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "test class", range: [21, 31], loc: { @@ -138,6 +141,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "data-test", range: [33, 42], loc: { @@ -183,6 +187,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "data", range: [44, 54], loc: { @@ -228,6 +233,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n some text\n\n ", range: [56, 76], loc: { @@ -273,6 +279,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n another text\n\n ", range: [81, 108], loc: { @@ -303,6 +310,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "custom-attr", range: [132, 143], loc: { @@ -348,6 +356,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "custom >test", range: [145, 157], loc: { @@ -378,6 +387,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "with-spaces", range: [167, 178], loc: { @@ -423,6 +433,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "spaces test", range: [185, 196], loc: { @@ -468,6 +479,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n custom element\n text\n ", range: [205, 248], loc: { @@ -498,6 +510,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n ", range: [265, 270], loc: { @@ -528,6 +541,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n ", range: [276, 279], loc: { @@ -559,6 +573,7 @@ export default [ { type: TokenTypes.Text, value: "\n", + isTemplate: false, range: [286, 287], loc: { start: { @@ -588,6 +603,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [293, 294], loc: { diff --git a/src/tokenizer/__tests__/__output__/attributes-bare-wrong-quote.ts b/src/tokenizer/__tests__/__output__/attributes-bare-wrong-quote.ts index 7de917e..bad2b23 100644 --- a/src/tokenizer/__tests__/__output__/attributes-bare-wrong-quote.ts +++ b/src/tokenizer/__tests__/__output__/attributes-bare-wrong-quote.ts @@ -18,6 +18,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "target", range: [3, 9], loc: { @@ -48,6 +49,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "”_blank”", range: [10, 18], loc: { diff --git a/src/tokenizer/__tests__/__output__/attributes-bare.ts b/src/tokenizer/__tests__/__output__/attributes-bare.ts index 1a2b71a..43824b3 100644 --- a/src/tokenizer/__tests__/__output__/attributes-bare.ts +++ b/src/tokenizer/__tests__/__output__/attributes-bare.ts @@ -18,6 +18,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "key", range: [5, 8], loc: { @@ -48,6 +49,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "value", range: [11, 16], loc: { @@ -63,6 +65,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "and-another", range: [18, 29], loc: { @@ -93,6 +96,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "value", range: [32, 37], loc: { @@ -138,6 +142,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n\n", range: [44, 46], loc: { @@ -168,6 +173,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "some", range: [52, 56], loc: { @@ -198,6 +204,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "custom-attribute", range: [57, 73], loc: { @@ -228,6 +235,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n some text\n\n ", range: [74, 90], loc: { @@ -258,6 +266,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "and", range: [106, 109], loc: { @@ -288,6 +297,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "here", range: [110, 114], loc: { @@ -303,6 +313,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "and-even", range: [119, 127], loc: { @@ -333,6 +344,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "here", range: [130, 134], loc: { @@ -363,6 +375,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n custom element\n text\n ", range: [138, 169], loc: { @@ -393,6 +406,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [186, 187], loc: { @@ -423,6 +437,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [194, 195], loc: { diff --git a/src/tokenizer/__tests__/__output__/attributes-empty.ts b/src/tokenizer/__tests__/__output__/attributes-empty.ts index 759295b..6509b0a 100644 --- a/src/tokenizer/__tests__/__output__/attributes-empty.ts +++ b/src/tokenizer/__tests__/__output__/attributes-empty.ts @@ -33,6 +33,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n some text\n\n ", range: [7, 23], loc: { @@ -78,6 +79,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n custom element\n text\n ", range: [43, 74], loc: { @@ -109,6 +111,7 @@ export default [ { type: TokenTypes.Text, value: "\n", + isTemplate: false, range: [91, 92], loc: { start: { @@ -138,6 +141,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [99, 100], loc: { diff --git a/src/tokenizer/__tests__/__output__/attributes-multiline-crlf.ts b/src/tokenizer/__tests__/__output__/attributes-multiline-crlf.ts index 3c3cc7c..dbe1fd5 100644 --- a/src/tokenizer/__tests__/__output__/attributes-multiline-crlf.ts +++ b/src/tokenizer/__tests__/__output__/attributes-multiline-crlf.ts @@ -19,6 +19,7 @@ export default [ { type: TokenTypes.AttributeKey, range: [8, 10], + isTemplate: false, value: "id", loc: { start: { @@ -64,6 +65,7 @@ export default [ { type: TokenTypes.AttributeValue, value: "foo", + isTemplate: false, range: [12, 15], loc: { start: { @@ -94,6 +96,7 @@ export default [ { type: TokenTypes.AttributeKey, value: "style", + isTemplate: false, range: [20, 25], loc: { start: { @@ -138,6 +141,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "bar", range: [27, 30], loc: { @@ -168,6 +172,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "bool", range: [35, 39], loc: { @@ -198,6 +203,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\r\n", range: [42, 44], loc: { @@ -228,6 +234,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\r\n", range: [50, 52], loc: { diff --git a/src/tokenizer/__tests__/__output__/attributes-quote.ts b/src/tokenizer/__tests__/__output__/attributes-quote.ts index 0e7d523..c40fb22 100644 --- a/src/tokenizer/__tests__/__output__/attributes-quote.ts +++ b/src/tokenizer/__tests__/__output__/attributes-quote.ts @@ -33,6 +33,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n ", range: [5, 8], loc: { @@ -63,6 +64,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "class", range: [14, 19], loc: { @@ -108,6 +110,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "test class", range: [21, 31], loc: { @@ -138,6 +141,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "data-test", range: [33, 42], loc: { @@ -183,6 +187,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "data", range: [44, 54], loc: { @@ -228,6 +233,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n some text\n\n ", range: [56, 76], loc: { @@ -273,6 +279,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n another text\n\n ", range: [81, 108], loc: { @@ -303,6 +310,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "custom-attr", range: [132, 143], loc: { @@ -348,6 +356,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "custom >test", range: [145, 157], loc: { @@ -378,6 +387,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "with-spaces", range: [167, 178], loc: { @@ -423,6 +433,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "spaces test", range: [185, 196], loc: { @@ -468,6 +479,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n custom element\n text\n ", range: [205, 248], loc: { @@ -498,6 +510,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n ", range: [265, 270], loc: { @@ -528,6 +541,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n ", range: [276, 279], loc: { @@ -558,6 +572,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [286, 287], loc: { @@ -588,6 +603,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [293, 294], loc: { diff --git a/src/tokenizer/__tests__/__output__/comments.ts b/src/tokenizer/__tests__/__output__/comments.ts index 99cf0d0..8f0dc11 100644 --- a/src/tokenizer/__tests__/__output__/comments.ts +++ b/src/tokenizer/__tests__/__output__/comments.ts @@ -18,6 +18,7 @@ export default [ }, { type: TokenTypes.CommentContent, + isTemplate: false, value: " some comment ", range: [4, 18], loc: { @@ -49,6 +50,7 @@ export default [ { type: TokenTypes.Text, value: "\n\n", + isTemplate: false, range: [21, 23], loc: { start: { @@ -93,6 +95,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n ", range: [28, 31], loc: { @@ -138,6 +141,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n ", range: [37, 42], loc: { @@ -168,6 +172,7 @@ export default [ }, { type: TokenTypes.CommentContent, + isTemplate: false, value: "another-one", range: [46, 57], loc: { @@ -198,6 +203,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n ", range: [60, 63], loc: { @@ -228,6 +234,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n\n ", range: [70, 74], loc: { @@ -258,6 +265,7 @@ export default [ }, { type: TokenTypes.CommentContent, + isTemplate: false, value: "\n\n multi\n\n line\n ", range: [78, 98], loc: { @@ -288,6 +296,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [101, 102], loc: { @@ -318,6 +327,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n\n", range: [108, 110], loc: { @@ -348,6 +358,7 @@ export default [ }, { type: TokenTypes.CommentContent, + isTemplate: false, value: " closing\n\ncomment ", range: [114, 132], loc: { @@ -378,6 +389,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n\n", range: [135, 137], loc: { @@ -408,6 +420,7 @@ export default [ }, { type: TokenTypes.CommentContent, + isTemplate: false, value: " spaces here ", range: [141, 171], loc: { @@ -438,6 +451,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [174, 175], loc: { diff --git a/src/tokenizer/__tests__/__output__/custom-elements.ts b/src/tokenizer/__tests__/__output__/custom-elements.ts index 387d33d..dafbb46 100644 --- a/src/tokenizer/__tests__/__output__/custom-elements.ts +++ b/src/tokenizer/__tests__/__output__/custom-elements.ts @@ -33,6 +33,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n some text\n\n ", range: [12, 28], loc: { @@ -78,6 +79,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n another text\n ", range: [40, 60], loc: { @@ -108,6 +110,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [73, 74], loc: { @@ -138,6 +141,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [87, 88], loc: { diff --git a/src/tokenizer/__tests__/__output__/doctypes.ts b/src/tokenizer/__tests__/__output__/doctypes.ts index 4852415..599c1a6 100644 --- a/src/tokenizer/__tests__/__output__/doctypes.ts +++ b/src/tokenizer/__tests__/__output__/doctypes.ts @@ -34,6 +34,7 @@ export default [ { type: TokenTypes.Text, value: "\n\n", + isTemplate: false, range: [10, 12], loc: { start: { @@ -79,6 +80,7 @@ export default [ { type: TokenTypes.Text, value: "\n\n", + isTemplate: false, range: [22, 24], loc: { start: { @@ -214,6 +216,7 @@ export default [ { type: TokenTypes.Text, value: "\n\n", + isTemplate: false, range: [66, 68], loc: { start: { @@ -289,6 +292,7 @@ export default [ { type: TokenTypes.Text, value: "\n\n", + isTemplate: false, range: [90, 92], loc: { start: { @@ -454,6 +458,7 @@ export default [ { type: TokenTypes.Text, value: "\n\n", + isTemplate: false, range: [193, 195], loc: { start: { @@ -619,6 +624,7 @@ export default [ { type: TokenTypes.Text, value: "\n", + isTemplate: false, range: [303, 304], loc: { start: { diff --git a/src/tokenizer/__tests__/__output__/nested-tags.ts b/src/tokenizer/__tests__/__output__/nested-tags.ts index a629e1c..b63a4c8 100644 --- a/src/tokenizer/__tests__/__output__/nested-tags.ts +++ b/src/tokenizer/__tests__/__output__/nested-tags.ts @@ -33,6 +33,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n ", range: [5, 8], loc: { @@ -78,6 +79,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n some text\n\n ", range: [14, 34], loc: { @@ -123,6 +125,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n another text\n ", range: [40, 64], loc: { @@ -153,6 +156,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n ", range: [71, 74], loc: { @@ -183,6 +187,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [81, 82], loc: { @@ -213,6 +218,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [88, 89], loc: { diff --git a/src/tokenizer/__tests__/__output__/opening-closing-text.ts b/src/tokenizer/__tests__/__output__/opening-closing-text.ts index f833ece..8f33d83 100644 --- a/src/tokenizer/__tests__/__output__/opening-closing-text.ts +++ b/src/tokenizer/__tests__/__output__/opening-closing-text.ts @@ -3,6 +3,7 @@ import { TokenTypes } from "../../../constants"; export default [ { type: TokenTypes.Text, + isTemplate: false, value: "opening text\n\n", range: [0, 14], loc: { @@ -63,6 +64,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n\nclosing text\n", range: [25, 40], loc: { diff --git a/src/tokenizer/__tests__/__output__/script-elements-attributes.ts b/src/tokenizer/__tests__/__output__/script-elements-attributes.ts index 9776713..856416d 100644 --- a/src/tokenizer/__tests__/__output__/script-elements-attributes.ts +++ b/src/tokenizer/__tests__/__output__/script-elements-attributes.ts @@ -33,6 +33,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n dummy content\n\n ", range: [5, 25], loc: { @@ -63,6 +64,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "type", range: [33, 37], loc: { @@ -108,6 +110,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "text/javascript", range: [39, 54], loc: { @@ -138,6 +141,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "some-custom", range: [56, 67], loc: { @@ -183,6 +187,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "thing", range: [72, 77], loc: { @@ -228,6 +233,7 @@ export default [ }, { type: TokenTypes.ScriptTagContent, + isTemplate: false, value: "\n console.log('test 1')\n ", range: [80, 109], loc: { @@ -258,6 +264,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n\n ", range: [118, 122], loc: { @@ -289,6 +296,7 @@ export default [ { type: TokenTypes.AttributeKey, value: "type", + isTemplate: false, range: [134, 138], loc: { start: { @@ -333,6 +341,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "text/javascript", range: [140, 155], loc: { @@ -363,6 +372,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "async", range: [161, 166], loc: { @@ -393,6 +403,7 @@ export default [ }, { type: TokenTypes.ScriptTagContent, + isTemplate: false, value: "\n let a = '
'\n console.log(a)\n ", range: [170, 218], loc: { @@ -423,6 +434,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [227, 228], loc: { @@ -453,6 +465,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n\n", range: [234, 236], loc: { @@ -483,6 +496,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "async", range: [244, 249], loc: { @@ -498,6 +512,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "type", range: [250, 254], loc: { @@ -543,6 +558,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "text/javascript", range: [256, 271], loc: { @@ -588,6 +604,7 @@ export default [ }, { type: TokenTypes.ScriptTagContent, + isTemplate: false, value: "\n console.log('test 2')\n", range: [273, 298], loc: { @@ -618,6 +635,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [307, 308], loc: { diff --git a/src/tokenizer/__tests__/__output__/script-elements.ts b/src/tokenizer/__tests__/__output__/script-elements.ts index 0d532f7..e7b2546 100644 --- a/src/tokenizer/__tests__/__output__/script-elements.ts +++ b/src/tokenizer/__tests__/__output__/script-elements.ts @@ -3,6 +3,7 @@ import { TokenTypes } from "../../../constants"; export default [ { type: TokenTypes.Text, + isTemplate: false, value: "opening text\n\n", range: [0, 14], loc: { @@ -48,6 +49,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n ", range: [19, 22], loc: { @@ -93,6 +95,7 @@ export default [ }, { type: TokenTypes.ScriptTagContent, + isTemplate: false, value: "\n console.log('')\n ", range: [30, 53], loc: { @@ -123,6 +126,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [62, 63], loc: { @@ -153,6 +157,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n\nclosing text\n", range: [69, 84], loc: { diff --git a/src/tokenizer/__tests__/__output__/style-elements-attributes.ts b/src/tokenizer/__tests__/__output__/style-elements-attributes.ts index 114af8f..9f59df7 100644 --- a/src/tokenizer/__tests__/__output__/style-elements-attributes.ts +++ b/src/tokenizer/__tests__/__output__/style-elements-attributes.ts @@ -18,6 +18,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "type", range: [7, 11], loc: { @@ -63,6 +64,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "text/css", range: [13, 21], loc: { @@ -93,6 +95,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "custom", range: [23, 29], loc: { @@ -138,6 +141,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "attribute", range: [31, 40], loc: { @@ -183,6 +187,7 @@ export default [ }, { type: TokenTypes.StyleTagContent, + isTemplate: false, value: "\n body {\n background-color: white;\n }\n", range: [42, 85], loc: { @@ -213,6 +218,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n\n", range: [93, 95], loc: { @@ -258,6 +264,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n ", range: [100, 103], loc: { @@ -288,6 +295,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "custom", range: [114, 120], loc: { @@ -303,6 +311,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "type", range: [125, 129], loc: { @@ -348,6 +357,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "text/css", range: [131, 139], loc: { @@ -378,6 +388,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, value: "another-custom", range: [146, 160], loc: { @@ -408,6 +419,7 @@ export default [ }, { type: TokenTypes.StyleTagContent, + isTemplate: false, value: "\n body {\n background-color: red;\n }\n ", range: [164, 213], loc: { @@ -438,6 +450,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [221, 222], loc: { @@ -468,6 +481,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [228, 229], loc: { diff --git a/src/tokenizer/__tests__/__output__/style-elements.ts b/src/tokenizer/__tests__/__output__/style-elements.ts index 1aec46d..fc2989d 100644 --- a/src/tokenizer/__tests__/__output__/style-elements.ts +++ b/src/tokenizer/__tests__/__output__/style-elements.ts @@ -3,6 +3,7 @@ import { TokenTypes } from "../../../constants"; export default [ { type: TokenTypes.Text, + isTemplate: false, value: "opening text\n\n", range: [0, 14], loc: { @@ -48,6 +49,7 @@ export default [ }, { type: TokenTypes.StyleTagContent, + isTemplate: false, value: "\n body {\n background-color: white;\n }\n", range: [21, 64], loc: { @@ -78,6 +80,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n\n", range: [72, 74], loc: { @@ -123,6 +126,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n ", range: [79, 82], loc: { @@ -168,6 +172,7 @@ export default [ }, { type: TokenTypes.StyleTagContent, + isTemplate: false, value: "\n body {\n background-color: red;\n }\n ", range: [89, 138], loc: { @@ -198,6 +203,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [146, 147], loc: { @@ -228,6 +234,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n\nclosing text\n", range: [153, 168], loc: { diff --git a/src/tokenizer/__tests__/__output__/svg.ts b/src/tokenizer/__tests__/__output__/svg.ts index aa2dbc3..a449805 100644 --- a/src/tokenizer/__tests__/__output__/svg.ts +++ b/src/tokenizer/__tests__/__output__/svg.ts @@ -18,6 +18,7 @@ export default [ }, { type: TokenTypes.AttributeKey, + isTemplate: false, range: [5, 10], value: "xmlns", loc: { @@ -63,6 +64,7 @@ export default [ }, { type: TokenTypes.AttributeValue, + isTemplate: false, value: "http://www.w3.org/2000/svg", range: [12, 38], loc: { diff --git a/src/tokenizer/__tests__/__output__/tags-register.ts b/src/tokenizer/__tests__/__output__/tags-register.ts index c362a8a..61edad6 100644 --- a/src/tokenizer/__tests__/__output__/tags-register.ts +++ b/src/tokenizer/__tests__/__output__/tags-register.ts @@ -33,6 +33,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [5, 6], loc: { @@ -63,6 +64,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n\n", range: [12, 14], loc: { @@ -123,6 +125,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n\n", range: [25, 27], loc: { @@ -168,6 +171,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [33, 34], loc: { @@ -198,6 +202,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n\n", range: [41, 43], loc: { @@ -258,6 +263,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n\n", range: [56, 58], loc: { @@ -318,6 +324,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [75, 76], loc: { @@ -363,6 +370,7 @@ export default [ }, { type: TokenTypes.ScriptTagContent, + isTemplate: false, value: "\n", range: [84, 85], loc: { @@ -393,6 +401,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [94, 95], loc: { @@ -453,6 +462,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [112, 113], loc: { @@ -498,6 +508,7 @@ export default [ }, { type: TokenTypes.ScriptTagContent, + isTemplate: false, value: "\n", range: [121, 122], loc: { @@ -528,6 +539,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n\n", range: [131, 133], loc: { @@ -588,6 +600,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [148, 149], loc: { @@ -633,6 +646,7 @@ export default [ }, { type: TokenTypes.StyleTagContent, + isTemplate: false, value: "\n", range: [156, 157], loc: { @@ -663,6 +677,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [165, 166], loc: { @@ -723,6 +738,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [181, 182], loc: { @@ -783,6 +799,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n", range: [197, 198], loc: { diff --git a/src/tokenizer/__tests__/__output__/template-syntax-attributes-key-value.ts b/src/tokenizer/__tests__/__output__/template-syntax-attributes-key-value.ts new file mode 100644 index 0000000..c8a31d4 --- /dev/null +++ b/src/tokenizer/__tests__/__output__/template-syntax-attributes-key-value.ts @@ -0,0 +1,96 @@ +import { TokenTypes } from "../../../constants"; + +export default [ + { + type: TokenTypes.OpenTagStart, + value: "", + range: [20, 21], + loc: { + start: { + line: 1, + column: 20, + }, + end: { + line: 1, + column: 21, + }, + }, + }, + { + type: TokenTypes.CloseTag, + value: "", + range: [21, 27], + loc: { + start: { + line: 1, + column: 21, + }, + end: { + line: 1, + column: 27, + }, + }, + }, +]; diff --git a/src/tokenizer/__tests__/__output__/template-syntax-attributes-key.ts b/src/tokenizer/__tests__/__output__/template-syntax-attributes-key.ts new file mode 100644 index 0000000..9e71c7c --- /dev/null +++ b/src/tokenizer/__tests__/__output__/template-syntax-attributes-key.ts @@ -0,0 +1,126 @@ +import { TokenTypes } from "../../../constants"; + +export default [ + { + type: TokenTypes.OpenTagStart, + value: "", + range: [22, 23], + loc: { + start: { + line: 1, + column: 22, + }, + end: { + line: 1, + column: 23, + }, + }, + }, + { + type: TokenTypes.CloseTag, + value: "", + range: [23, 29], + loc: { + start: { + line: 1, + column: 23, + }, + end: { + line: 1, + column: 29, + }, + }, + }, +]; diff --git a/src/tokenizer/__tests__/__output__/template-syntax-attributes-value-bare.ts b/src/tokenizer/__tests__/__output__/template-syntax-attributes-value-bare.ts new file mode 100644 index 0000000..96d517e --- /dev/null +++ b/src/tokenizer/__tests__/__output__/template-syntax-attributes-value-bare.ts @@ -0,0 +1,96 @@ +import { TokenTypes } from "../../../constants"; + +export default [ + { + type: TokenTypes.OpenTagStart, + value: "", + range: [13, 14], + loc: { + start: { + line: 1, + column: 13, + }, + end: { + line: 1, + column: 14, + }, + }, + }, + { + type: TokenTypes.CloseTag, + value: "", + range: [14, 20], + loc: { + start: { + line: 1, + column: 14, + }, + end: { + line: 1, + column: 20, + }, + }, + }, +]; diff --git a/src/tokenizer/__tests__/__output__/template-syntax-attributes-value-quote.ts b/src/tokenizer/__tests__/__output__/template-syntax-attributes-value-quote.ts new file mode 100644 index 0000000..c90cf43 --- /dev/null +++ b/src/tokenizer/__tests__/__output__/template-syntax-attributes-value-quote.ts @@ -0,0 +1,126 @@ +import { TokenTypes } from "../../../constants"; + +export default [ + { + type: TokenTypes.OpenTagStart, + value: "", + range: [15, 16], + loc: { + start: { + line: 1, + column: 15, + }, + end: { + line: 1, + column: 16, + }, + }, + }, + { + type: TokenTypes.CloseTag, + value: "", + range: [16, 22], + loc: { + start: { + line: 1, + column: 16, + }, + end: { + line: 1, + column: 22, + }, + }, + }, +]; diff --git a/src/tokenizer/__tests__/__output__/template-syntax-attributes.ts b/src/tokenizer/__tests__/__output__/template-syntax-attributes.ts new file mode 100644 index 0000000..477b4ed --- /dev/null +++ b/src/tokenizer/__tests__/__output__/template-syntax-attributes.ts @@ -0,0 +1,65 @@ +import { TokenTypes } from "../../../constants"; + +export default [ + { + type: TokenTypes.OpenTagStart, + value: "", + range: [14, 15], + loc: { + start: { + line: 1, + column: 14, + }, + end: { + line: 1, + column: 15, + }, + }, + }, + { + type: TokenTypes.CloseTag, + value: "", + range: [15, 21], + loc: { + start: { + line: 1, + column: 15, + }, + end: { + line: 1, + column: 21, + }, + }, + }, +]; diff --git a/src/tokenizer/__tests__/__output__/template-syntax-comment-content.ts b/src/tokenizer/__tests__/__output__/template-syntax-comment-content.ts new file mode 100644 index 0000000..6c2fcc2 --- /dev/null +++ b/src/tokenizer/__tests__/__output__/template-syntax-comment-content.ts @@ -0,0 +1,50 @@ +import { TokenTypes } from "../../../constants"; + +export default [ + { + type: TokenTypes.CommentOpen, + value: "", + range: [14, 17], + loc: { + start: { + line: 1, + column: 14, + }, + end: { + line: 1, + column: 17, + }, + }, + }, +]; diff --git a/src/tokenizer/__tests__/__output__/template-syntax-data.ts b/src/tokenizer/__tests__/__output__/template-syntax-data.ts new file mode 100644 index 0000000..8bcc235 --- /dev/null +++ b/src/tokenizer/__tests__/__output__/template-syntax-data.ts @@ -0,0 +1,97 @@ +import { TokenTypes } from "../../../constants"; + +export default [ + { + type: TokenTypes.OpenTagStart, + value: "", + range: [4, 5], + loc: { + start: { + line: 1, + column: 4, + }, + end: { + line: 1, + column: 5, + }, + }, + }, + { + type: TokenTypes.Text, + value: " ", + isTemplate: false, + range: [5, 7], + loc: { + start: { + line: 1, + column: 5, + }, + end: { + line: 1, + column: 7, + }, + }, + }, + { + type: TokenTypes.Text, + isTemplate: true, + range: [7, 17], + value: "${ data }", + loc: { + start: { + line: 1, + column: 7, + }, + end: { + line: 1, + column: 17, + }, + }, + }, + { + type: TokenTypes.Text, + value: " text ", + isTemplate: false, + range: [17, 23], + loc: { + start: { + line: 1, + column: 17, + }, + end: { + line: 1, + column: 23, + }, + }, + }, + { + type: TokenTypes.CloseTag, + value: "", + range: [23, 29], + loc: { + start: { + line: 1, + column: 23, + }, + end: { + line: 1, + column: 29, + }, + }, + }, +]; diff --git a/src/tokenizer/__tests__/__output__/template-syntax-script-attributes.ts b/src/tokenizer/__tests__/__output__/template-syntax-script-attributes.ts new file mode 100644 index 0000000..577446f --- /dev/null +++ b/src/tokenizer/__tests__/__output__/template-syntax-script-attributes.ts @@ -0,0 +1,65 @@ +import { TokenTypes } from "../../../constants"; + +export default [ + { + type: TokenTypes.OpenScriptTagStart, + value: "", + range: [15, 16], + loc: { + start: { + line: 1, + column: 15, + }, + end: { + line: 1, + column: 16, + }, + }, + }, + { + type: TokenTypes.CloseScriptTag, + value: "", + range: [16, 25], + loc: { + start: { + line: 1, + column: 16, + }, + end: { + line: 1, + column: 25, + }, + }, + }, +]; diff --git a/src/tokenizer/__tests__/__output__/template-syntax-script-content.ts b/src/tokenizer/__tests__/__output__/template-syntax-script-content.ts new file mode 100644 index 0000000..0aa19b8 --- /dev/null +++ b/src/tokenizer/__tests__/__output__/template-syntax-script-content.ts @@ -0,0 +1,97 @@ +import { TokenTypes } from "../../../constants"; + +export default [ + { + type: TokenTypes.OpenScriptTagStart, + value: "", + range: [7, 8], + loc: { + start: { + line: 1, + column: 7, + }, + end: { + line: 1, + column: 8, + }, + }, + }, + { + type: TokenTypes.ScriptTagContent, + value: " ", + isTemplate: false, + range: [8, 9], + loc: { + start: { + line: 1, + column: 8, + }, + end: { + line: 1, + column: 9, + }, + }, + }, + { + type: TokenTypes.ScriptTagContent, + value: "${content}", + isTemplate: true, + range: [9, 19], + loc: { + start: { + line: 1, + column: 9, + }, + end: { + line: 1, + column: 19, + }, + }, + }, + { + type: TokenTypes.ScriptTagContent, + value: " ", + isTemplate: false, + range: [19, 20], + loc: { + start: { + line: 1, + column: 19, + }, + end: { + line: 1, + column: 20, + }, + }, + }, + { + type: TokenTypes.CloseScriptTag, + value: "", + range: [20, 29], + loc: { + start: { + line: 1, + column: 20, + }, + end: { + line: 1, + column: 29, + }, + }, + }, +]; diff --git a/src/tokenizer/__tests__/__output__/template-syntax-style-attributes.ts b/src/tokenizer/__tests__/__output__/template-syntax-style-attributes.ts new file mode 100644 index 0000000..3124ba6 --- /dev/null +++ b/src/tokenizer/__tests__/__output__/template-syntax-style-attributes.ts @@ -0,0 +1,96 @@ +import { TokenTypes } from "../../../constants"; + +export default [ + { + type: TokenTypes.OpenStyleTagStart, + value: "", + range: [20, 21], + loc: { + start: { + line: 1, + column: 20, + }, + end: { + line: 1, + column: 21, + }, + }, + }, + { + type: TokenTypes.CloseStyleTag, + value: "", + range: [21, 29], + loc: { + start: { + line: 1, + column: 21, + }, + end: { + line: 1, + column: 29, + }, + }, + }, +]; diff --git a/src/tokenizer/__tests__/__output__/template-syntax-style-content.ts b/src/tokenizer/__tests__/__output__/template-syntax-style-content.ts new file mode 100644 index 0000000..2d38f2a --- /dev/null +++ b/src/tokenizer/__tests__/__output__/template-syntax-style-content.ts @@ -0,0 +1,97 @@ +import { TokenTypes } from "../../../constants"; + +export default [ + { + type: TokenTypes.OpenStyleTagStart, + value: "", + range: [6, 7], + loc: { + start: { + line: 1, + column: 6, + }, + end: { + line: 1, + column: 7, + }, + }, + }, + { + type: TokenTypes.StyleTagContent, + value: " ", + isTemplate: false, + range: [7, 8], + loc: { + start: { + line: 1, + column: 7, + }, + end: { + line: 1, + column: 8, + }, + }, + }, + { + type: TokenTypes.StyleTagContent, + value: "${content}", + isTemplate: true, + range: [8, 18], + loc: { + start: { + line: 1, + column: 8, + }, + end: { + line: 1, + column: 18, + }, + }, + }, + { + type: TokenTypes.StyleTagContent, + value: " ", + isTemplate: false, + range: [18, 19], + loc: { + start: { + line: 1, + column: 18, + }, + end: { + line: 1, + column: 19, + }, + }, + }, + { + type: TokenTypes.CloseStyleTag, + value: "", + range: [19, 27], + loc: { + start: { + line: 1, + column: 19, + }, + end: { + line: 1, + column: 27, + }, + }, + }, +]; diff --git a/src/tokenizer/__tests__/__output__/void-tags.ts b/src/tokenizer/__tests__/__output__/void-tags.ts index cc41c1d..fbb970b 100644 --- a/src/tokenizer/__tests__/__output__/void-tags.ts +++ b/src/tokenizer/__tests__/__output__/void-tags.ts @@ -33,6 +33,7 @@ export default [ }, { type: TokenTypes.Text, + isTemplate: false, value: "\n\n", range: [7, 9], loc: { diff --git a/src/tokenizer/__tests__/tokenize.spec.ts b/src/tokenizer/__tests__/tokenize.spec.ts index 806607f..3f0a2fb 100644 --- a/src/tokenizer/__tests__/tokenize.spec.ts +++ b/src/tokenizer/__tests__/tokenize.spec.ts @@ -20,7 +20,20 @@ import EMPTY from "./__output__/empty"; import SVG from "./__output__/svg"; import ATTRIBUTES_MULTILINE_CRLF from "./__output__/attributes-multiline-crlf"; import ATTRIBUTES_BARE_WRONG_QUOTE from "./__output__/attributes-bare-wrong-quote"; +import TEMPLATE_SYNTAX_ATTRIBUTES from "./__output__/template-syntax-attributes"; +import TEMPLATE_SYNTAX_ATTRIBUTES_KEY from "./__output__/template-syntax-attributes-key"; +import TEMPLATE_SYNTAX_DATA from "./__output__/template-syntax-data"; +import TEMPLATE_SYNTAX_ATTRIBUTES_VALUE_BARE from "./__output__/template-syntax-attributes-value-bare"; +import TEMPLATE_SYNTAX_ATTRIBUTES_VALUE_QUOTE from "./__output__/template-syntax-attributes-value-quote"; +import TEMPLATE_SYNTAX_SCRIPT_ATTRIBUTES from "./__output__/template-syntax-script-attributes"; +import TEMPLATE_SYNTAX_STYLE_ATTRIBUTES from "./__output__/template-syntax-style-attributes"; +import TEMPLATE_SYNTAX_ATTRIBUTES_KEY_VALUE from "./__output__/template-syntax-attributes-key-value"; +import TEMPLATE_SYNTAX_SCRIPT_CONTENT from "./__output__/template-syntax-script-content"; +import TEMPLATE_SYNTAX_STYLE_CONTENT from "./__output__/template-syntax-style-content"; +import TEMPLATE_SYNTAX_COMMENT_CONTENT from "./__output__/template-syntax-comment-content"; + import { defaultTokenAdapter } from "../../token-adapter"; +import { Range } from "../../types"; describe("tokenize", () => { test.each( @@ -29,47 +42,47 @@ describe("tokenize", () => { [ "Attributes apostrophe", "attributes-apostrophe.html", - ATTRIBUTES_APOSTROPHE + ATTRIBUTES_APOSTROPHE, ], [ "Attributes bare", "attributes-bare.html", - ATTRIBUTES_BARE + ATTRIBUTES_BARE, ], [ "Attributes bare wrong quotes", "attributes-bare-wrong-quote.html", - ATTRIBUTES_BARE_WRONG_QUOTE + ATTRIBUTES_BARE_WRONG_QUOTE, ], [ "Attributes empty", "attributes-empty.html", - ATTRIBUTES_EMPTY + ATTRIBUTES_EMPTY, ], [ "Attributes quote", "attributes-quote.html", - ATTRIBUTES_QUOTE + ATTRIBUTES_QUOTE, ], [ "Comments", "comments.html", - COMMENTS + COMMENTS, ], [ "Custom elements", "custom-elements.html", - CUSTOM_ELEMENTS + CUSTOM_ELEMENTS, ], [ "Doctypes", "doctypes.html", - DOCTYPES + DOCTYPES, ], [ "Nested tags", "nested-tags.html", - NESTED_TAGS + NESTED_TAGS, ], [ "Opening and closing text", @@ -79,17 +92,17 @@ describe("tokenize", () => { [ "Script elements attributes", "script-elements-attributes.html", - SCRIPT_ELEMENTS_ATTRIBUTES + SCRIPT_ELEMENTS_ATTRIBUTES, ], [ "Script element", "script-elements.html", - SCRIPT_ELEMENTS + SCRIPT_ELEMENTS, ], [ "Tags register", "tags-register.html", - TAGS_REGISTER + TAGS_REGISTER, ], [ "Style elements attributes", @@ -104,7 +117,7 @@ describe("tokenize", () => { [ "Void tags", "void-tags.html", - VOID_TAGS + VOID_TAGS, ], [ "Empty", @@ -122,8 +135,99 @@ describe("tokenize", () => { ATTRIBUTES_MULTILINE_CRLF, (html: string) => { return html.replace(/\n/gi, "\r\n"); - } - ] + }, + ], + [ + "Template Syntax Attributes", + "template-syntax-attributes.html", + TEMPLATE_SYNTAX_ATTRIBUTES, + null, + [ + [5, 14] + ] as Range[] + ], + [ + "Template Syntax Attributes key", + "template-syntax-attributes-key.html", + TEMPLATE_SYNTAX_ATTRIBUTES_KEY, + null, + [ + [5, 14] + ] as Range[] + ], + [ + "Template Syntax Data", + "template-syntax-data.html", + TEMPLATE_SYNTAX_DATA, + null, + [ + [7, 17] + ] as Range[] + ], + [ + "Template Syntax Attributes Value Bare", + "template-syntax-attributes-value-bare.html", + TEMPLATE_SYNTAX_ATTRIBUTES_VALUE_BARE, + null, + [ + [8, 13] + ] as Range[] + ], + [ + "Template Syntax Attributes Value Quote", + "template-syntax-attributes-value-quote.html", + TEMPLATE_SYNTAX_ATTRIBUTES_VALUE_QUOTE, + null, + [ + [9, 14] + ] as Range[] + ], + [ + "Template Syntax Script Attributes", + "template-syntax-script-attributes.html", + TEMPLATE_SYNTAX_SCRIPT_ATTRIBUTES, + null, + [ + [8, 15] + ] as Range[] + ], + [ + "Template Syntax Style Attributes", + "template-syntax-style-attributes.html", + TEMPLATE_SYNTAX_STYLE_ATTRIBUTES, + null, + [ + [12, 19] + ] as Range[] + ], + [ + "Template Syntax Attributes Key Value", + "template-syntax-attributes-key-value.html", + TEMPLATE_SYNTAX_ATTRIBUTES_KEY_VALUE, null, [ + [5, 11], [12, 20] + ] as Range[] + ], + [ + "Template Syntax Script Content", + "template-syntax-script-content.html", + TEMPLATE_SYNTAX_SCRIPT_CONTENT, null, [ + [9, 19] + ] as Range[] + ], + [ + "Template Syntax Style Content", + "template-syntax-style-content.html", + TEMPLATE_SYNTAX_STYLE_CONTENT, null, [ + [8, 18] + ] as Range[] + ], + [ + "Template Syntax Comment Content", + "template-syntax-comment-content.html", + TEMPLATE_SYNTAX_COMMENT_CONTENT,null,[ + [4, 14] + ] as Range[] + ] ] )( "%s", @@ -131,14 +235,15 @@ describe("tokenize", () => { name, input, output, - process: null | ((html: string) => string) = null + process: null | ((html: string) => string) = null, + ranges: null | Range[] = null ) => { const inputPath = path.join(__dirname, "__input__", input); let html = fs.readFileSync(inputPath, "utf-8"); if (process) { html = process(html); } - const { tokens } = tokenize(html, defaultTokenAdapter); + const { tokens } = tokenize(html, defaultTokenAdapter, ranges || []); expect(tokens).toEqual(output); } ); diff --git a/src/tokenizer/handlers/attribute-key.ts b/src/tokenizer/handlers/attribute-key.ts index 7d23a1c..432d288 100644 --- a/src/tokenizer/handlers/attribute-key.ts +++ b/src/tokenizer/handlers/attribute-key.ts @@ -1,9 +1,17 @@ import { TokenizerContextTypes } from "../../constants"; import { TokenTypes } from "../../constants/token-types"; -import { calculateTokenPosition, isWhitespace } from "../../utils"; -import type { TokenizerState } from "../../types"; +import { + calculateTokenLocation, + calculateTokenPosition, + isWhitespace, +} from "../../utils"; +import type { Range, TokenizerState } from "../../types"; -export function parse(chars: string, state: TokenizerState) { +export function parse(chars: string, state: TokenizerState, charIndex: number) { + const range = state.consumeTemplateRangeAt(charIndex); + if (range) { + return parseTemplate(state, range); + } if (isKeyBreak(chars)) { return parseKeyEnd(state); } @@ -25,9 +33,26 @@ function parseKeyEnd(state: TokenizerState) { value: state.accumulatedContent, range: position.range, loc: position.loc, + isTemplate: false, }); state.accumulatedContent = ""; state.decisionBuffer = ""; state.currentContext = TokenizerContextTypes.Attributes; } + +function parseTemplate(state: TokenizerState, [start, end]: Range) { + const value = state.source.slice(start, end); + const range: Range = [start, end]; + state.tokens.push({ + type: TokenTypes.AttributeKey, + value, + range, + loc: calculateTokenLocation(state.source, range), + isTemplate: true, + }); + state.accumulatedContent = ""; + state.decisionBuffer = ""; + state.caretPosition = end; + state.currentContext = TokenizerContextTypes.Attributes; +} diff --git a/src/tokenizer/handlers/attribute-value-bare.ts b/src/tokenizer/handlers/attribute-value-bare.ts index dc31c9c..d543318 100644 --- a/src/tokenizer/handlers/attribute-value-bare.ts +++ b/src/tokenizer/handlers/attribute-value-bare.ts @@ -1,8 +1,12 @@ import { TokenizerContextTypes, TokenTypes } from "../../constants"; -import { calculateTokenPosition, isWhitespace } from "../../utils"; -import type { TokenizerState } from "../../types"; +import { + calculateTokenLocation, + calculateTokenPosition, + isWhitespace, +} from "../../utils"; +import type { Range, TokenizerState } from "../../types"; -export function parseValueEnd(state: TokenizerState) { +function parseValueEnd(state: TokenizerState) { const position = calculateTokenPosition(state, { keepBuffer: false }); state.tokens.push({ @@ -10,6 +14,7 @@ export function parseValueEnd(state: TokenizerState) { value: state.accumulatedContent, range: position.range, loc: position.loc, + isTemplate: false, }); state.accumulatedContent = ""; @@ -17,7 +22,29 @@ export function parseValueEnd(state: TokenizerState) { state.currentContext = TokenizerContextTypes.Attributes; } -export function parse(chars: string, state: TokenizerState) { +function parseTemplate(state: TokenizerState, [start, end]: Range) { + const value = state.source.slice(start, end); + const range: Range = [start, end]; + + state.tokens.push({ + type: TokenTypes.AttributeValue, + value, + range, + loc: calculateTokenLocation(state.source, range), + isTemplate: true, + }); + + state.accumulatedContent = ""; + state.decisionBuffer = ""; + state.caretPosition = end; + state.currentContext = TokenizerContextTypes.Attributes; +} + +export function parse(chars: string, state: TokenizerState, charIndex: number) { + const range = state.consumeTemplateRangeAt(charIndex); + if (range) { + return parseTemplate(state, range); + } if (isWhitespace(chars) || chars === ">" || chars === "/") { return parseValueEnd(state); } diff --git a/src/tokenizer/handlers/attribute-value-wrapped.ts b/src/tokenizer/handlers/attribute-value-wrapped.ts index b58d648..7e6b6f2 100644 --- a/src/tokenizer/handlers/attribute-value-wrapped.ts +++ b/src/tokenizer/handlers/attribute-value-wrapped.ts @@ -2,10 +2,15 @@ import { TokenizerContextTypes, TokenTypes } from "../../constants"; import { calculateTokenLocation, calculateTokenPosition } from "../../utils"; import type { Range, TokenizerState } from "../../types"; -export function parse(chars: string, state: TokenizerState) { +export function parse(chars: string, state: TokenizerState, charIndex: number) { const wrapperChar = state.contextParams[TokenizerContextTypes.AttributeValueWrapped]?.wrapper; + const range = state.consumeTemplateRangeAt(charIndex); + if (range) { + return parseTemplate(state, range); + } + if (chars === wrapperChar) { return parseWrapper(state); } @@ -19,12 +24,15 @@ function parseWrapper(state: TokenizerState) { const position = calculateTokenPosition(state, { keepBuffer: false }); const endWrapperPosition = position.range[1]; - state.tokens.push({ - type: TokenTypes.AttributeValue, - value: state.accumulatedContent, - range: position.range, - loc: position.loc, - }); + if (state.accumulatedContent) { + state.tokens.push({ + type: TokenTypes.AttributeValue, + value: state.accumulatedContent, + range: position.range, + loc: position.loc, + isTemplate: false, + }); + } const range: Range = [endWrapperPosition, endWrapperPosition + 1]; const loc = calculateTokenLocation(state.source, range); @@ -42,3 +50,18 @@ function parseWrapper(state: TokenizerState) { state.contextParams[TokenizerContextTypes.AttributeValueWrapped] = undefined; } + +function parseTemplate(state: TokenizerState, [start, end]: Range) { + const value = state.source.slice(start, end); + const range: Range = [start, end]; + state.tokens.push({ + type: TokenTypes.AttributeValue, + isTemplate: true, + value, + range, + loc: calculateTokenLocation(state.source, range), + }); + state.accumulatedContent = ""; + state.decisionBuffer = ""; + state.caretPosition = end; +} diff --git a/src/tokenizer/handlers/attribute-value.ts b/src/tokenizer/handlers/attribute-value.ts index b1033da..66cfd61 100644 --- a/src/tokenizer/handlers/attribute-value.ts +++ b/src/tokenizer/handlers/attribute-value.ts @@ -2,7 +2,7 @@ import { TokenizerContextTypes, TokenTypes } from "../../constants"; import { calculateTokenLocation, isWhitespace } from "../../utils"; import type { TokenizerState, Range } from "../../types"; -export function parse(chars: string, state: TokenizerState) { +export function parse(chars: string, state: TokenizerState, charIndex: number) { if (chars === '"' || chars === "'") { return parseWrapper(state); } @@ -11,7 +11,7 @@ export function parse(chars: string, state: TokenizerState) { return parseTagEnd(state); } - if (!isWhitespace(chars)) { + if (!isWhitespace(chars) || state.getTemplateRangeAt(charIndex)) { return parseBare(state); } diff --git a/src/tokenizer/handlers/comment-content.ts b/src/tokenizer/handlers/comment-content.ts index 3e222ea..32fb121 100644 --- a/src/tokenizer/handlers/comment-content.ts +++ b/src/tokenizer/handlers/comment-content.ts @@ -4,7 +4,11 @@ import type { Range, TokenizerState } from "../../types"; const COMMENT_END = "-->"; -export function parse(chars: string, state: TokenizerState) { +export function parse(chars: string, state: TokenizerState, charIndex: number) { + const range = state.consumeTemplateRangeAt(charIndex); + if (range) { + return parseTemplate(state, range); + } if (chars === "-" || chars === "--") { state.caretPosition++; return; @@ -27,12 +31,16 @@ function parseCommentClose(state: TokenizerState) { ]; const endLoc = calculateTokenLocation(state.source, endRange); - state.tokens.push({ - type: TokenTypes.CommentContent, - value: state.accumulatedContent, - range: position.range, - loc: position.loc, - }); + if (state.accumulatedContent.length !== 0) { + state.tokens.push({ + type: TokenTypes.CommentContent, + value: state.accumulatedContent, + range: position.range, + loc: position.loc, + isTemplate: false, + }); + } + state.tokens.push({ type: TokenTypes.CommentClose, value: state.decisionBuffer, @@ -45,3 +53,30 @@ function parseCommentClose(state: TokenizerState) { state.currentContext = TokenizerContextTypes.Data; state.caretPosition++; } + +function parseTemplate(state: TokenizerState, [start, end]: Range) { + if (state.accumulatedContent.length !== 0) { + const position = calculateTokenPosition(state, { keepBuffer: false }); + state.tokens.push({ + type: TokenTypes.CommentContent, + value: state.accumulatedContent, + range: position.range, + loc: position.loc, + isTemplate: false, + }); + } + + const value = state.source.slice(start, end); + const range: Range = [start, end]; + + state.tokens.push({ + type: TokenTypes.CommentContent, + value, + range, + loc: calculateTokenLocation(state.source, range), + isTemplate: true, + }); + state.accumulatedContent = ""; + state.decisionBuffer = ""; + state.caretPosition = end; +} diff --git a/src/tokenizer/handlers/data.ts b/src/tokenizer/handlers/data.ts index 6bc6fac..741c8c4 100644 --- a/src/tokenizer/handlers/data.ts +++ b/src/tokenizer/handlers/data.ts @@ -1,11 +1,16 @@ import { TokenizerContextTypes, TokenTypes } from "../../constants"; import { calculateTokenLocation, calculateTokenPosition } from "../../utils"; -import { Range, AnyToken, TokenizerState } from "../../types"; +import { AnyToken, Range, TokenizerState } from "../../types"; const COMMENT_START = "", @@ -63,6 +66,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n", loc: { start: { @@ -93,6 +97,7 @@ export default { children: [ { type: "Text", + isTemplate: false, value: "\n ", loc: { start: { @@ -123,6 +128,7 @@ export default { children: [ { type: "Text", + isTemplate: false, value: "\n ", loc: { start: { @@ -164,21 +170,24 @@ export default { }, range: [42, 46], }, - value: { - type: "CommentContent", - value: "another-one", - loc: { - start: { - line: 5, - column: 8, - }, - end: { - line: 5, - column: 19, + children: [ + { + type: "CommentContent", + isTemplate: false, + value: "another-one", + loc: { + start: { + line: 5, + column: 8, + }, + end: { + line: 5, + column: 19, + }, }, + range: [46, 57], }, - range: [46, 57], - }, + ], close: { type: "CommentClose", value: "-->", @@ -197,6 +206,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n ", loc: { start: { @@ -261,6 +271,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n ", loc: { start: { @@ -302,21 +313,24 @@ export default { }, range: [74, 78], }, - value: { - type: "CommentContent", - value: "\n\n multi\n\n line\n ", - loc: { - start: { - line: 8, - column: 6, - }, - end: { - line: 13, - column: 2, + children: [ + { + type: "CommentContent", + isTemplate: false, + value: "\n\n multi\n\n line\n ", + loc: { + start: { + line: 8, + column: 6, + }, + end: { + line: 13, + column: 2, + }, }, + range: [78, 98], }, - range: [78, 98], - }, + ], close: { type: "CommentClose", value: "-->", @@ -335,6 +349,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { @@ -399,6 +414,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n", loc: { start: { @@ -440,21 +456,24 @@ export default { }, range: [110, 114], }, - value: { - type: "CommentContent", - value: " closing\n\ncomment ", - loc: { - start: { - line: 16, - column: 4, - }, - end: { - line: 18, - column: 8, + children: [ + { + type: "CommentContent", + isTemplate: false, + value: " closing\n\ncomment ", + loc: { + start: { + line: 16, + column: 4, + }, + end: { + line: 18, + column: 8, + }, }, + range: [114, 132], }, - range: [114, 132], - }, + ], close: { type: "CommentClose", value: "-->", @@ -473,6 +492,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n", loc: { start: { @@ -514,21 +534,24 @@ export default { }, range: [137, 141], }, - value: { - type: "CommentContent", - value: " spaces here ", - loc: { - start: { - line: 20, - column: 4, - }, - end: { - line: 20, - column: 34, + children: [ + { + type: "CommentContent", + isTemplate: false, + value: " spaces here ", + loc: { + start: { + line: 20, + column: 4, + }, + end: { + line: 20, + column: 34, + }, }, + range: [141, 171], }, - range: [141, 171], - }, + ], close: { type: "CommentClose", value: "-->", @@ -547,6 +570,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { diff --git a/src/tree-constructor/__tests__/__output__/custom-elements.ts b/src/tree-constructor/__tests__/__output__/custom-elements.ts index 5ea730d..2f6b891 100644 --- a/src/tree-constructor/__tests__/__output__/custom-elements.ts +++ b/src/tree-constructor/__tests__/__output__/custom-elements.ts @@ -19,6 +19,7 @@ export default { children: [ { type: "Text", + isTemplate: false, value: "\n some text\n\n ", loc: { start: { @@ -49,6 +50,7 @@ export default { children: [ { type: "Text", + isTemplate: false, value: "\n another text\n ", loc: { start: { @@ -113,6 +115,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { @@ -177,6 +180,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { diff --git a/src/tree-constructor/__tests__/__output__/doctypes.ts b/src/tree-constructor/__tests__/__output__/doctypes.ts index 086252c..f4f363b 100644 --- a/src/tree-constructor/__tests__/__output__/doctypes.ts +++ b/src/tree-constructor/__tests__/__output__/doctypes.ts @@ -22,6 +22,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n", loc: { start: { line: 1, column: 10 }, end: { line: 3, column: 0 } }, range: [10, 12], @@ -46,6 +47,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n", loc: { start: { line: 3, column: 10 }, end: { line: 5, column: 0 } }, range: [22, 24], @@ -135,6 +137,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n", loc: { start: { line: 5, column: 42 }, end: { line: 7, column: 0 } }, range: [66, 68], @@ -188,6 +191,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n", loc: { start: { line: 7, column: 22 }, end: { line: 9, column: 0 } }, range: [90, 92], @@ -308,6 +312,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n", loc: { start: { line: 9, column: 101 }, end: { line: 11, column: 0 } }, range: [193, 195], @@ -434,6 +439,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { line: 15, column: 1 }, end: { line: 16, column: 0 } }, range: [303, 304], diff --git a/src/tree-constructor/__tests__/__output__/nested-tags.ts b/src/tree-constructor/__tests__/__output__/nested-tags.ts index cab8118..3c8fcd2 100644 --- a/src/tree-constructor/__tests__/__output__/nested-tags.ts +++ b/src/tree-constructor/__tests__/__output__/nested-tags.ts @@ -19,6 +19,7 @@ export default { children: [ { type: "Text", + isTemplate: false, value: "\n ", loc: { start: { @@ -49,6 +50,7 @@ export default { children: [ { type: "Text", + isTemplate: false, value: "\n some text\n\n ", loc: { start: { @@ -79,6 +81,7 @@ export default { children: [ { type: "Text", + isTemplate: false, value: "\n another text\n ", loc: { start: { @@ -143,6 +146,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n ", loc: { start: { @@ -207,6 +211,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { @@ -271,6 +276,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { diff --git a/src/tree-constructor/__tests__/__output__/opening-closing-text.ts b/src/tree-constructor/__tests__/__output__/opening-closing-text.ts index 2702666..0be9c3c 100644 --- a/src/tree-constructor/__tests__/__output__/opening-closing-text.ts +++ b/src/tree-constructor/__tests__/__output__/opening-closing-text.ts @@ -4,6 +4,7 @@ export default { children: [ { type: "Text", + isTemplate: false, value: "opening text\n\n", loc: { start: { @@ -82,6 +83,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\nclosing text\n", loc: { start: { diff --git a/src/tree-constructor/__tests__/__output__/script-elements-attributes.ts b/src/tree-constructor/__tests__/__output__/script-elements-attributes.ts index 8950621..24df6e8 100644 --- a/src/tree-constructor/__tests__/__output__/script-elements-attributes.ts +++ b/src/tree-constructor/__tests__/__output__/script-elements-attributes.ts @@ -19,6 +19,7 @@ export default { children: [ { type: "Text", + isTemplate: false, value: "\n dummy content\n\n ", loc: { start: { @@ -61,6 +62,7 @@ export default { }, key: { type: "AttributeKey", + isTemplate: false, value: "type", loc: { start: { @@ -91,6 +93,7 @@ export default { }, value: { type: "AttributeValue", + isTemplate: false, value: "text/javascript", loc: { start: { @@ -135,6 +138,7 @@ export default { }, key: { type: "AttributeKey", + isTemplate: false, value: "some-custom", loc: { start: { @@ -165,6 +169,7 @@ export default { }, value: { type: "AttributeValue", + isTemplate: false, value: "thing", loc: { start: { @@ -225,21 +230,24 @@ export default { }, range: [79, 80], }, - value: { - type: "ScriptTagContent", - value: "\n console.log('test 1')\n ", - loc: { - start: { - line: 4, - column: 57, - }, - end: { - line: 6, - column: 2, + children: [ + { + type: "ScriptTagContent", + isTemplate: false, + value: "\n console.log('test 1')\n ", + loc: { + start: { + line: 4, + column: 57, + }, + end: { + line: 6, + column: 2, + }, }, + range: [80, 109], }, - range: [80, 109], - }, + ], close: { type: "CloseScriptTag", value: "", @@ -258,6 +266,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n ", loc: { start: { @@ -300,6 +309,7 @@ export default { }, key: { type: "AttributeKey", + isTemplate: false, value: "type", loc: { start: { @@ -330,6 +340,7 @@ export default { }, value: { type: "AttributeValue", + isTemplate: false, value: "text/javascript", loc: { start: { @@ -374,6 +385,7 @@ export default { }, key: { type: "AttributeKey", + isTemplate: false, value: "async", loc: { start: { @@ -419,21 +431,24 @@ export default { }, range: [169, 170], }, - value: { - type: "ScriptTagContent", - value: "\n let a = '
'\n console.log(a)\n ", - loc: { - start: { - line: 11, - column: 3, - }, - end: { - line: 14, - column: 2, + children: [ + { + isTemplate: false, + type: "ScriptTagContent", + value: "\n let a = '
'\n console.log(a)\n ", + loc: { + start: { + line: 11, + column: 3, + }, + end: { + line: 14, + column: 2, + }, }, + range: [170, 218], }, - range: [170, 218], - }, + ], close: { type: "CloseScriptTag", value: "", @@ -452,6 +467,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { @@ -516,6 +532,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n", loc: { start: { @@ -558,6 +575,7 @@ export default { }, key: { type: "AttributeKey", + isTemplate: false, value: "async", loc: { start: { @@ -587,6 +605,7 @@ export default { }, key: { type: "AttributeKey", + isTemplate: false, value: "type", loc: { start: { @@ -617,6 +636,7 @@ export default { }, value: { type: "AttributeValue", + isTemplate: false, value: "text/javascript", loc: { start: { @@ -677,21 +697,24 @@ export default { }, range: [272, 273], }, - value: { - type: "ScriptTagContent", - value: "\n console.log('test 2')\n", - loc: { - start: { - line: 17, - column: 37, - }, - end: { - line: 19, - column: 0, + children: [ + { + type: "ScriptTagContent", + isTemplate: false, + value: "\n console.log('test 2')\n", + loc: { + start: { + line: 17, + column: 37, + }, + end: { + line: 19, + column: 0, + }, }, + range: [273, 298], }, - range: [273, 298], - }, + ], close: { type: "CloseScriptTag", value: "", @@ -710,6 +733,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { diff --git a/src/tree-constructor/__tests__/__output__/script-elements.ts b/src/tree-constructor/__tests__/__output__/script-elements.ts index 74f19b8..c777a41 100644 --- a/src/tree-constructor/__tests__/__output__/script-elements.ts +++ b/src/tree-constructor/__tests__/__output__/script-elements.ts @@ -4,6 +4,7 @@ export default { children: [ { type: "Text", + isTemplate: false, value: "opening text\n\n", loc: { start: { @@ -34,6 +35,7 @@ export default { children: [ { type: "Text", + isTemplate: false, value: "\n ", loc: { start: { @@ -91,21 +93,24 @@ export default { }, range: [29, 30], }, - value: { - type: "ScriptTagContent", - value: "\n console.log('')\n ", - loc: { - start: { - line: 4, - column: 10, - }, - end: { - line: 6, - column: 2, + children: [ + { + type: "ScriptTagContent", + isTemplate: false, + value: "\n console.log('')\n ", + loc: { + start: { + line: 4, + column: 10, + }, + end: { + line: 6, + column: 2, + }, }, + range: [30, 53], }, - range: [30, 53], - }, + ], close: { type: "CloseScriptTag", value: "", @@ -124,6 +129,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { @@ -188,6 +194,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\nclosing text\n", loc: { start: { diff --git a/src/tree-constructor/__tests__/__output__/style-elements-attributes.ts b/src/tree-constructor/__tests__/__output__/style-elements-attributes.ts index 1b5c67a..9b4a94c 100644 --- a/src/tree-constructor/__tests__/__output__/style-elements-attributes.ts +++ b/src/tree-constructor/__tests__/__output__/style-elements-attributes.ts @@ -31,6 +31,7 @@ export default { }, key: { type: "AttributeKey", + isTemplate: false, value: "type", loc: { start: { @@ -61,6 +62,7 @@ export default { }, value: { type: "AttributeValue", + isTemplate: false, value: "text/css", loc: { start: { @@ -105,6 +107,7 @@ export default { }, key: { type: "AttributeKey", + isTemplate: false, value: "custom", loc: { start: { @@ -135,6 +138,7 @@ export default { }, value: { type: "AttributeValue", + isTemplate: false, value: "attribute", loc: { start: { @@ -195,21 +199,24 @@ export default { }, range: [41, 42], }, - value: { - type: "StyleTagContent", - value: "\n body {\n background-color: white;\n }\n", - loc: { - start: { - line: 1, - column: 42, - }, - end: { - line: 5, - column: 0, + children: [ + { + type: "StyleTagContent", + isTemplate: false, + value: "\n body {\n background-color: white;\n }\n", + loc: { + start: { + line: 1, + column: 42, + }, + end: { + line: 5, + column: 0, + }, }, + range: [42, 85], }, - range: [42, 85], - }, + ], close: { type: "CloseStyleTag", value: "", @@ -228,6 +235,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n", loc: { start: { @@ -258,6 +266,7 @@ export default { children: [ { type: "Text", + isTemplate: false, value: "\n ", loc: { start: { @@ -300,6 +309,7 @@ export default { }, key: { type: "AttributeKey", + isTemplate: false, value: "custom", loc: { start: { @@ -329,6 +339,7 @@ export default { }, key: { type: "AttributeKey", + isTemplate: false, value: "type", loc: { start: { @@ -359,6 +370,7 @@ export default { }, value: { type: "AttributeValue", + isTemplate: false, value: "text/css", loc: { start: { @@ -403,6 +415,7 @@ export default { }, key: { type: "AttributeKey", + isTemplate: false, value: "another-custom", loc: { start: { @@ -448,21 +461,24 @@ export default { }, range: [163, 164], }, - value: { - type: "StyleTagContent", - value: "\n body {\n background-color: red;\n }\n ", - loc: { - start: { - line: 13, - column: 3, - }, - end: { - line: 17, - column: 2, + children: [ + { + type: "StyleTagContent", + isTemplate: false, + value: "\n body {\n background-color: red;\n }\n ", + loc: { + start: { + line: 13, + column: 3, + }, + end: { + line: 17, + column: 2, + }, }, + range: [164, 213], }, - range: [164, 213], - }, + ], close: { type: "CloseStyleTag", value: "", @@ -481,6 +497,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { @@ -545,6 +562,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { diff --git a/src/tree-constructor/__tests__/__output__/style-elements.ts b/src/tree-constructor/__tests__/__output__/style-elements.ts index fd4ed62..19cd59d 100644 --- a/src/tree-constructor/__tests__/__output__/style-elements.ts +++ b/src/tree-constructor/__tests__/__output__/style-elements.ts @@ -4,6 +4,7 @@ export default { children: [ { type: "Text", + isTemplate: false, value: "opening text\n\n", loc: { start: { @@ -61,21 +62,24 @@ export default { }, range: [20, 21], }, - value: { - type: "StyleTagContent", - value: "\n body {\n background-color: white;\n }\n", - loc: { - start: { - line: 3, - column: 7, - }, - end: { - line: 7, - column: 0, + children: [ + { + type: "StyleTagContent", + isTemplate: false, + value: "\n body {\n background-color: white;\n }\n", + loc: { + start: { + line: 3, + column: 7, + }, + end: { + line: 7, + column: 0, + }, }, + range: [21, 64], }, - range: [21, 64], - }, + ], close: { type: "CloseStyleTag", value: "", @@ -94,6 +98,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n", loc: { start: { @@ -123,6 +128,7 @@ export default { attributes: [], children: [ { + isTemplate: false, type: "Text", value: "\n ", loc: { @@ -181,21 +187,24 @@ export default { }, range: [88, 89], }, - value: { - type: "StyleTagContent", - value: "\n body {\n background-color: red;\n }\n ", - loc: { - start: { - line: 10, - column: 9, - }, - end: { - line: 14, - column: 2, + children: [ + { + isTemplate: false, + type: "StyleTagContent", + value: "\n body {\n background-color: red;\n }\n ", + loc: { + start: { + line: 10, + column: 9, + }, + end: { + line: 14, + column: 2, + }, }, + range: [89, 138], }, - range: [89, 138], - }, + ], close: { type: "CloseStyleTag", value: "", @@ -214,6 +223,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { @@ -278,6 +288,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\nclosing text\n", loc: { start: { diff --git a/src/tree-constructor/__tests__/__output__/svg.ts b/src/tree-constructor/__tests__/__output__/svg.ts index 51107ab..894dc47 100644 --- a/src/tree-constructor/__tests__/__output__/svg.ts +++ b/src/tree-constructor/__tests__/__output__/svg.ts @@ -31,6 +31,7 @@ export default { }, range: [5, 10], type: "AttributeKey", + isTemplate: false, value: "xmlns", }, loc: { @@ -73,6 +74,7 @@ export default { }, range: [12, 38], type: "AttributeValue", + isTemplate: false, value: "http://www.w3.org/2000/svg", }, }, diff --git a/src/tree-constructor/__tests__/__output__/tags-register.ts b/src/tree-constructor/__tests__/__output__/tags-register.ts index 8213bdb..db79843 100644 --- a/src/tree-constructor/__tests__/__output__/tags-register.ts +++ b/src/tree-constructor/__tests__/__output__/tags-register.ts @@ -10,6 +10,7 @@ export default { children: [ { type: "Text", + isTemplate: false, value: "\n", loc: { start: { line: 1, column: 5 }, end: { line: 2, column: 0 } }, range: [5, 6], @@ -38,6 +39,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n", loc: { start: { line: 2, column: 6 }, end: { line: 4, column: 0 } }, range: [12, 14], @@ -71,6 +73,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n", loc: { start: { line: 4, column: 11 }, end: { line: 6, column: 0 } }, range: [25, 27], @@ -83,6 +86,7 @@ export default { children: [ { type: "Text", + isTemplate: false, value: "\n", loc: { start: { line: 6, column: 6 }, end: { line: 7, column: 0 } }, range: [33, 34], @@ -111,6 +115,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n", loc: { start: { line: 7, column: 7 }, end: { line: 9, column: 0 } }, range: [41, 43], @@ -144,6 +149,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n", loc: { start: { line: 9, column: 13 }, end: { line: 11, column: 0 } }, range: [56, 58], @@ -171,9 +177,11 @@ export default { loc: { start: { line: 11, column: 8 }, end: { line: 11, column: 17 } }, range: [66, 75], }, + children: [], }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { line: 11, column: 17 }, end: { line: 12, column: 0 } }, range: [75, 76], @@ -195,12 +203,15 @@ export default { loc: { start: { line: 12, column: 7 }, end: { line: 12, column: 8 } }, range: [83, 84], }, - value: { - type: "ScriptTagContent", - value: "\n", - loc: { start: { line: 12, column: 8 }, end: { line: 13, column: 0 } }, - range: [84, 85], - }, + children: [ + { + type: "ScriptTagContent", + isTemplate: false, + value: "\n", + loc: { start: { line: 12, column: 8 }, end: { line: 13, column: 0 } }, + range: [84, 85], + }, + ], close: { type: "CloseScriptTag", value: "", @@ -210,6 +221,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { line: 13, column: 9 }, end: { line: 14, column: 0 } }, range: [94, 95], @@ -237,9 +249,11 @@ export default { loc: { start: { line: 14, column: 8 }, end: { line: 14, column: 17 } }, range: [103, 112], }, + children: [], }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { line: 14, column: 17 }, end: { line: 15, column: 0 } }, range: [112, 113], @@ -261,12 +275,15 @@ export default { loc: { start: { line: 15, column: 7 }, end: { line: 15, column: 8 } }, range: [120, 121], }, - value: { - type: "ScriptTagContent", - value: "\n", - loc: { start: { line: 15, column: 8 }, end: { line: 16, column: 0 } }, - range: [121, 122], - }, + children: [ + { + type: "ScriptTagContent", + isTemplate: false, + value: "\n", + loc: { start: { line: 15, column: 8 }, end: { line: 16, column: 0 } }, + range: [121, 122], + }, + ], close: { type: "CloseScriptTag", value: "", @@ -276,6 +293,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n\n", loc: { start: { line: 16, column: 9 }, end: { line: 18, column: 0 } }, range: [131, 133], @@ -303,9 +321,11 @@ export default { loc: { start: { line: 18, column: 7 }, end: { line: 18, column: 15 } }, range: [140, 148], }, + children: [], }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { line: 18, column: 15 }, end: { line: 19, column: 0 } }, range: [148, 149], @@ -327,12 +347,15 @@ export default { loc: { start: { line: 19, column: 6 }, end: { line: 19, column: 7 } }, range: [155, 156], }, - value: { - type: "StyleTagContent", - value: "\n", - loc: { start: { line: 19, column: 7 }, end: { line: 20, column: 0 } }, - range: [156, 157], - }, + children: [ + { + type: "StyleTagContent", + isTemplate: false, + value: "\n", + loc: { start: { line: 19, column: 7 }, end: { line: 20, column: 0 } }, + range: [156, 157], + }, + ], close: { type: "CloseStyleTag", value: "", @@ -342,6 +365,7 @@ export default { }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { line: 20, column: 8 }, end: { line: 21, column: 0 } }, range: [165, 166], @@ -369,9 +393,11 @@ export default { loc: { start: { line: 21, column: 7 }, end: { line: 21, column: 15 } }, range: [173, 181], }, + children: [], }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { line: 21, column: 15 }, end: { line: 22, column: 0 } }, range: [181, 182], @@ -399,9 +425,11 @@ export default { loc: { start: { line: 22, column: 7 }, end: { line: 22, column: 15 } }, range: [189, 197], }, + children: [], }, { type: "Text", + isTemplate: false, value: "\n", loc: { start: { line: 22, column: 15 }, end: { line: 23, column: 0 } }, range: [197, 198], diff --git a/src/tree-constructor/__tests__/__output__/template-syntax-attributes-key-value.ts b/src/tree-constructor/__tests__/__output__/template-syntax-attributes-key-value.ts new file mode 100644 index 0000000..406e3f9 --- /dev/null +++ b/src/tree-constructor/__tests__/__output__/template-syntax-attributes-key-value.ts @@ -0,0 +1,126 @@ +export default { + children: [ + { + attributes: [ + { + key: { + isTemplate: true, + loc: { + end: { + column: 11, + line: 1, + }, + start: { + column: 5, + line: 1, + }, + }, + range: [5, 11], + type: "AttributeKey", + value: "${key}", + }, + loc: { + end: { + column: 20, + line: 1, + }, + start: { + column: 5, + line: 1, + }, + }, + range: [5, 20], + type: "Attribute", + value: { + isTemplate: true, + loc: { + end: { + column: 20, + line: 1, + }, + start: { + column: 12, + line: 1, + }, + }, + range: [12, 20], + type: "AttributeValue", + value: "${value}", + }, + }, + ], + children: [], + close: { + loc: { + end: { + column: 27, + line: 1, + }, + start: { + column: 21, + line: 1, + }, + }, + range: [21, 27], + type: "CloseTag", + value: "", + }, + loc: { + end: { + column: 27, + line: 1, + }, + start: { + column: 0, + line: 1, + }, + }, + name: "div", + openEnd: { + loc: { + end: { + column: 21, + line: 1, + }, + start: { + column: 20, + line: 1, + }, + }, + range: [20, 21], + type: "OpenTagEnd", + value: ">", + }, + openStart: { + loc: { + end: { + column: 4, + line: 1, + }, + start: { + column: 0, + line: 1, + }, + }, + range: [0, 4], + type: "OpenTagStart", + value: "", + }, + loc: { + end: { + column: 29, + line: 1, + }, + start: { + column: 0, + line: 1, + }, + }, + name: "div", + openEnd: { + loc: { + end: { + column: 23, + line: 1, + }, + start: { + column: 22, + line: 1, + }, + }, + range: [22, 23], + type: "OpenTagEnd", + value: ">", + }, + openStart: { + loc: { + end: { + column: 4, + line: 1, + }, + start: { + column: 0, + line: 1, + }, + }, + range: [0, 4], + type: "OpenTagStart", + value: "", + }, + loc: { + end: { + column: 20, + line: 1, + }, + start: { + column: 0, + line: 1, + }, + }, + name: "div", + openEnd: { + loc: { + end: { + column: 14, + line: 1, + }, + start: { + column: 13, + line: 1, + }, + }, + range: [13, 14], + type: "OpenTagEnd", + value: ">", + }, + openStart: { + loc: { + end: { + column: 4, + line: 1, + }, + start: { + column: 0, + line: 1, + }, + }, + range: [0, 4], + type: "OpenTagStart", + value: "", + }, + loc: { + end: { + column: 22, + line: 1, + }, + start: { + column: 0, + line: 1, + }, + }, + name: "div", + openEnd: { + loc: { + end: { + column: 16, + line: 1, + }, + start: { + column: 15, + line: 1, + }, + }, + range: [15, 16], + type: "OpenTagEnd", + value: ">", + }, + openStart: { + loc: { + end: { + column: 4, + line: 1, + }, + start: { + column: 0, + line: 1, + }, + }, + range: [0, 4], + type: "OpenTagStart", + value: "", + }, + loc: { + end: { + column: 21, + line: 1, + }, + start: { + column: 0, + line: 1, + }, + }, + name: "div", + openEnd: { + loc: { + end: { + column: 15, + line: 1, + }, + start: { + column: 14, + line: 1, + }, + }, + range: [14, 15], + type: "OpenTagEnd", + value: ">", + }, + openStart: { + loc: { + end: { + column: 4, + line: 1, + }, + start: { + column: 0, + line: 1, + }, + }, + range: [0, 4], + type: "OpenTagStart", + value: "", + }, + loc: { + end: { + column: 17, + line: 1, + }, + start: { + column: 0, + line: 1, + }, + }, + open: { + loc: { + end: { + column: 4, + line: 1, + }, + start: { + column: 0, + line: 1, + }, + }, + range: [0, 4], + type: "CommentOpen", + value: "