From 0824ca1f04e2ccde15e52a802531ab31df9fd998 Mon Sep 17 00:00:00 2001 From: Tom Selfin Date: Sat, 9 Nov 2024 10:52:34 +0200 Subject: [PATCH 1/5] Fix swap previous escapes parent, closes #178 --- src/Selection.ts | 18 ++++++++++++++++++ src/test/suite/Selection.test.ts | 20 ++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/Selection.ts b/src/Selection.ts index b53622e0..2099866a 100644 --- a/src/Selection.ts +++ b/src/Selection.ts @@ -99,6 +99,15 @@ export class Selection { public getPrevious(blocks: Block[] | undefined): Selection | undefined { const previousNode = this.selectedSiblings[0].previousNamedSibling; if (previousNode) { + // if previousNode starts with parent, ignore it + // since previous sibling assumes the same parent + // without this check, swapping with the previous sibling + // would move us out of the parent + // TODO: should this logic be moved only to "move" operations? + if (previousNode.parent?.startIndex === previousNode.startIndex) { + return undefined; + } + return new Selection([previousNode], this.version).expandToBlock(blocks); } else { return undefined; @@ -108,6 +117,15 @@ export class Selection { public getNext(blocks: Block[] | undefined): Selection | undefined { const nextNode = this.selectedSiblings.at(-1)?.nextNamedSibling; if (nextNode) { + // if nextNode ends with parent, ignore it + // since next sibling assumes the same parent + // without this check, swapping with the next sibling + // would move us out of the parent + // TODO: should this logic be moved only to "move" operations? + if (nextNode.parent?.endIndex === nextNode.endIndex) { + return undefined; + } + return new Selection([nextNode], this.version).expandToBlock(blocks); } else { return undefined; diff --git a/src/test/suite/Selection.test.ts b/src/test/suite/Selection.test.ts index df477b8a..e7481f71 100644 --- a/src/test/suite/Selection.test.ts +++ b/src/test/suite/Selection.test.ts @@ -30,6 +30,26 @@ suite("Selection", function () { return selectionText; } + suite(".getPrevious", function () { + test("Ignores previous nodes that start with parent", async () => { + const text = "@12"; + + expect(await selectionAt("html", text)).to.equal("1"); + expect(await selectionAt("html", text, ["parent"])).to.equal("1"); + expect(await selectionAt("html", text, ["parent", "add-previous"])).to.equal("1"); + }); + }); + + suite(".getNext", function () { + test("Ignores next nodes that start with parent", async () => { + const text = "1@2"; + + expect(await selectionAt("html", text)).to.equal("2"); + expect(await selectionAt("html", text, ["parent"])).to.equal("2"); + expect(await selectionAt("html", text, ["parent", "add-next"])).to.equal("2"); + }); + }); + suite(".update", function () { test("Select source_file node is undefined", async () => { expect(await selectionAt("rust", "fn main() { }@")).to.be.undefined; From ee8ce38b49b5e6eecf1aca2d286c48d19ca870aa Mon Sep 17 00:00:00 2001 From: Tom Selfin Date: Sat, 9 Nov 2024 10:52:41 +0200 Subject: [PATCH 2/5] add html block tests --- src/test/suite/BlockTrees.test.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/test/suite/BlockTrees.test.ts b/src/test/suite/BlockTrees.test.ts index c17dfa60..2da84dac 100644 --- a/src/test/suite/BlockTrees.test.ts +++ b/src/test/suite/BlockTrees.test.ts @@ -60,6 +60,30 @@ suite("BlockTrees", function () { return void vscode.window.showInformationMessage("Start blockTrees.getBlockTrees tests"); }); + test.only("resolves html blocks", async function () { + const text = "\n \n \n"; + const { fileTree } = await openDocument(text, "html"); + const lang = fileTree.parser.getLanguage() as Language; + const queries = [new Query(lang, "(element) @item")]; + const blocksTrees = getBlockTrees(fileTree.tree, queries); + + expect("\n" + blockTreesToString(text, blocksTrees)).to.equal(` ++------------------------+ +| | +| | +| +-------------------+ | +| | | | +| | | | +| +-------------------+ | +| +-------------------+ | +| | | | +| +-------------------+ | +| | +| | ++------------------------+ +`); + }); + test("resolves sequential blocks", async function () { const text = "fn foo() {}\nfn bar() {}"; const { fileTree } = await openDocument(text, "rust"); From 6d929c74884942896f58c0a255fbb9b52515a291 Mon Sep 17 00:00:00 2001 From: Tom Selfin Date: Sat, 9 Nov 2024 11:08:41 +0200 Subject: [PATCH 3/5] add html test parser --- test-parsers/tree-sitter-html/LICENSE | 21 + test-parsers/tree-sitter-html/README.md | 21 + test-parsers/tree-sitter-html/binding.gyp | 30 + .../tree-sitter-html/bindings/node/binding.cc | 20 + .../bindings/node/binding_test.js | 9 + .../tree-sitter-html/bindings/node/index.d.ts | 28 + .../tree-sitter-html/bindings/node/index.js | 7 + test-parsers/tree-sitter-html/grammar.js | 141 + test-parsers/tree-sitter-html/package.json | 112 + .../darwin-arm64/tree-sitter-html.node | Bin 0 -> 71648 bytes .../darwin-x64/tree-sitter-html.node | Bin 0 -> 39400 bytes .../prebuilds/linux-x64/tree-sitter-html.node | Bin 0 -> 51976 bytes .../prebuilds/win32-x64/tree-sitter-html.node | Bin 0 -> 194560 bytes .../tree-sitter-html/queries/highlights.scm | 13 + .../tree-sitter-html/queries/injections.scm | 7 + .../tree-sitter-html/src/grammar.json | 500 ++++ .../tree-sitter-html/src/node-types.json | 317 +++ test-parsers/tree-sitter-html/src/parser.c | 2300 +++++++++++++++++ test-parsers/tree-sitter-html/src/scanner.c | 362 +++ test-parsers/tree-sitter-html/src/tag.h | 385 +++ .../tree-sitter-html/src/tree_sitter/alloc.h | 54 + .../tree-sitter-html/src/tree_sitter/array.h | 290 +++ .../tree-sitter-html/src/tree_sitter/parser.h | 266 ++ 23 files changed, 4883 insertions(+) create mode 100644 test-parsers/tree-sitter-html/LICENSE create mode 100644 test-parsers/tree-sitter-html/README.md create mode 100644 test-parsers/tree-sitter-html/binding.gyp create mode 100644 test-parsers/tree-sitter-html/bindings/node/binding.cc create mode 100644 test-parsers/tree-sitter-html/bindings/node/binding_test.js create mode 100644 test-parsers/tree-sitter-html/bindings/node/index.d.ts create mode 100644 test-parsers/tree-sitter-html/bindings/node/index.js create mode 100644 test-parsers/tree-sitter-html/grammar.js create mode 100644 test-parsers/tree-sitter-html/package.json create mode 100644 test-parsers/tree-sitter-html/prebuilds/darwin-arm64/tree-sitter-html.node create mode 100644 test-parsers/tree-sitter-html/prebuilds/darwin-x64/tree-sitter-html.node create mode 100644 test-parsers/tree-sitter-html/prebuilds/linux-x64/tree-sitter-html.node create mode 100644 test-parsers/tree-sitter-html/prebuilds/win32-x64/tree-sitter-html.node create mode 100644 test-parsers/tree-sitter-html/queries/highlights.scm create mode 100644 test-parsers/tree-sitter-html/queries/injections.scm create mode 100644 test-parsers/tree-sitter-html/src/grammar.json create mode 100644 test-parsers/tree-sitter-html/src/node-types.json create mode 100644 test-parsers/tree-sitter-html/src/parser.c create mode 100644 test-parsers/tree-sitter-html/src/scanner.c create mode 100644 test-parsers/tree-sitter-html/src/tag.h create mode 100644 test-parsers/tree-sitter-html/src/tree_sitter/alloc.h create mode 100644 test-parsers/tree-sitter-html/src/tree_sitter/array.h create mode 100644 test-parsers/tree-sitter-html/src/tree_sitter/parser.h diff --git a/test-parsers/tree-sitter-html/LICENSE b/test-parsers/tree-sitter-html/LICENSE new file mode 100644 index 00000000..4b52d191 --- /dev/null +++ b/test-parsers/tree-sitter-html/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Max Brunsfeld + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/test-parsers/tree-sitter-html/README.md b/test-parsers/tree-sitter-html/README.md new file mode 100644 index 00000000..28684b21 --- /dev/null +++ b/test-parsers/tree-sitter-html/README.md @@ -0,0 +1,21 @@ +# tree-sitter-html + +[![CI][ci]](https://github.com/tree-sitter/tree-sitter-html/actions/workflows/ci.yml) +[![discord][discord]](https://discord.gg/w7nTvsVJhm) +[![matrix][matrix]](https://matrix.to/#/#tree-sitter-chat:matrix.org) +[![crates][crates]](https://crates.io/crates/tree-sitter-html) +[![npm][npm]](https://www.npmjs.com/package/tree-sitter-html) +[![pypi][pypi]](https://pypi.org/project/tree-sitter-html) + +HTML grammar for [tree-sitter](https://github.com/tree-sitter/tree-sitter). + +References + +- [The HTML5 Spec](https://www.w3.org/TR/html5/syntax.html) + +[ci]: https://img.shields.io/github/actions/workflow/status/tree-sitter/tree-sitter-html/ci.yml?logo=github&label=CI +[discord]: https://img.shields.io/discord/1063097320771698699?logo=discord&label=discord +[matrix]: https://img.shields.io/matrix/tree-sitter-chat%3Amatrix.org?logo=matrix&label=matrix +[npm]: https://img.shields.io/npm/v/tree-sitter-html?logo=npm +[crates]: https://img.shields.io/crates/v/tree-sitter-html?logo=rust +[pypi]: https://img.shields.io/pypi/v/tree-sitter-html?logo=pypi&logoColor=ffd242 diff --git a/test-parsers/tree-sitter-html/binding.gyp b/test-parsers/tree-sitter-html/binding.gyp new file mode 100644 index 00000000..64bfc648 --- /dev/null +++ b/test-parsers/tree-sitter-html/binding.gyp @@ -0,0 +1,30 @@ +{ + "targets": [ + { + "target_name": "tree_sitter_html_binding", + "dependencies": [ + " + +typedef struct TSLanguage TSLanguage; + +extern "C" TSLanguage *tree_sitter_html(); + +// "tree-sitter", "language" hashed with BLAKE2 +const napi_type_tag LANGUAGE_TYPE_TAG = { + 0x8AF2E5212AD58ABF, 0xD5006CAD83ABBA16 +}; + +Napi::Object Init(Napi::Env env, Napi::Object exports) { + exports["name"] = Napi::String::New(env, "html"); + auto language = Napi::External::New(env, tree_sitter_html()); + language.TypeTag(&LANGUAGE_TYPE_TAG); + exports["language"] = language; + return exports; +} + +NODE_API_MODULE(tree_sitter_html_binding, Init) diff --git a/test-parsers/tree-sitter-html/bindings/node/binding_test.js b/test-parsers/tree-sitter-html/bindings/node/binding_test.js new file mode 100644 index 00000000..afede30a --- /dev/null +++ b/test-parsers/tree-sitter-html/bindings/node/binding_test.js @@ -0,0 +1,9 @@ +/// + +const assert = require("node:assert"); +const { test } = require("node:test"); + +test("can load grammar", () => { + const parser = new (require("tree-sitter"))(); + assert.doesNotThrow(() => parser.setLanguage(require("."))); +}); diff --git a/test-parsers/tree-sitter-html/bindings/node/index.d.ts b/test-parsers/tree-sitter-html/bindings/node/index.d.ts new file mode 100644 index 00000000..efe259ee --- /dev/null +++ b/test-parsers/tree-sitter-html/bindings/node/index.d.ts @@ -0,0 +1,28 @@ +type BaseNode = { + type: string; + named: boolean; +}; + +type ChildNode = { + multiple: boolean; + required: boolean; + types: BaseNode[]; +}; + +type NodeInfo = + | (BaseNode & { + subtypes: BaseNode[]; + }) + | (BaseNode & { + fields: { [name: string]: ChildNode }; + children: ChildNode[]; + }); + +type Language = { + name: string; + language: unknown; + nodeTypeInfo: NodeInfo[]; +}; + +declare const language: Language; +export = language; diff --git a/test-parsers/tree-sitter-html/bindings/node/index.js b/test-parsers/tree-sitter-html/bindings/node/index.js new file mode 100644 index 00000000..6657bcf4 --- /dev/null +++ b/test-parsers/tree-sitter-html/bindings/node/index.js @@ -0,0 +1,7 @@ +const root = require("path").join(__dirname, "..", ".."); + +module.exports = require("node-gyp-build")(root); + +try { + module.exports.nodeTypeInfo = require("../../src/node-types.json"); +} catch (_) {} diff --git a/test-parsers/tree-sitter-html/grammar.js b/test-parsers/tree-sitter-html/grammar.js new file mode 100644 index 00000000..657b78d3 --- /dev/null +++ b/test-parsers/tree-sitter-html/grammar.js @@ -0,0 +1,141 @@ +/** + * @file HTML grammar for tree-sitter + * @author Max Brunsfeld + * @author Amaan Qureshi + * @license MIT + */ + +/// +// @ts-check + +module.exports = grammar({ + name: 'html', + + extras: $ => [ + $.comment, + /\s+/, + ], + + externals: $ => [ + $._start_tag_name, + $._script_start_tag_name, + $._style_start_tag_name, + $._end_tag_name, + $.erroneous_end_tag_name, + '/>', + $._implicit_end_tag, + $.raw_text, + $.comment, + ], + + rules: { + document: $ => repeat($._node), + + doctype: $ => seq( + ']+/, + '>', + ), + + _doctype: _ => /[Dd][Oo][Cc][Tt][Yy][Pp][Ee]/, + + _node: $ => choice( + $.doctype, + $.entity, + $.text, + $.element, + $.script_element, + $.style_element, + $.erroneous_end_tag, + ), + + element: $ => choice( + seq( + $.start_tag, + repeat($._node), + choice($.end_tag, $._implicit_end_tag), + ), + $.self_closing_tag, + ), + + script_element: $ => seq( + alias($.script_start_tag, $.start_tag), + optional($.raw_text), + $.end_tag, + ), + + style_element: $ => seq( + alias($.style_start_tag, $.start_tag), + optional($.raw_text), + $.end_tag, + ), + + start_tag: $ => seq( + '<', + alias($._start_tag_name, $.tag_name), + repeat($.attribute), + '>', + ), + + script_start_tag: $ => seq( + '<', + alias($._script_start_tag_name, $.tag_name), + repeat($.attribute), + '>', + ), + + style_start_tag: $ => seq( + '<', + alias($._style_start_tag_name, $.tag_name), + repeat($.attribute), + '>', + ), + + self_closing_tag: $ => seq( + '<', + alias($._start_tag_name, $.tag_name), + repeat($.attribute), + '/>', + ), + + end_tag: $ => seq( + '', + ), + + erroneous_end_tag: $ => seq( + '', + ), + + attribute: $ => seq( + $.attribute_name, + optional(seq( + '=', + choice( + $.attribute_value, + $.quoted_attribute_value, + ), + )), + ), + + attribute_name: _ => /[^<>"'/=\s]+/, + + attribute_value: _ => /[^<>"'=\s]+/, + + // An entity can be named, numeric (decimal), or numeric (hexacecimal). The + // longest entity name is 29 characters long, and the HTML spec says that + // no more will ever be added. + entity: _ => /&(#([xX][0-9a-fA-F]{1,6}|[0-9]{1,5})|[A-Za-z]{1,30});?/, + + quoted_attribute_value: $ => choice( + seq('\'', optional(alias(/[^']+/, $.attribute_value)), '\''), + seq('"', optional(alias(/[^"]+/, $.attribute_value)), '"'), + ), + + text: _ => /[^<>&\s]([^<>&]*[^<>&\s])?/, + }, +}); diff --git a/test-parsers/tree-sitter-html/package.json b/test-parsers/tree-sitter-html/package.json new file mode 100644 index 00000000..369bfc69 --- /dev/null +++ b/test-parsers/tree-sitter-html/package.json @@ -0,0 +1,112 @@ +{ + "name": "tree-sitter-html", + "version": "0.23.0", + "description": "HTML grammar for tree-sitter", + "repository": "github:tree-sitter/tree-sitter-html", + "license": "MIT", + "author": "Max Brunsfeld ", + "contributors": [ + "Ashi Krishnan ", + "Amaan Qureshi " + ], + "maintainers": [ + "Amaan Qureshi " + ], + "main": "bindings/node", + "types": "bindings/node", + "keywords": [ + "incremental", + "parsing", + "tree-sitter", + "html" + ], + "files": [ + "grammar.js", + "binding.gyp", + "prebuilds/**", + "bindings/node/*", + "queries/*", + "src/**" + ], + "dependencies": { + "node-addon-api": "^8.1.0", + "node-gyp-build": "^4.8.2" + }, + "peerDependencies": { + "tree-sitter": "^0.21.1" + }, + "peerDependenciesMeta": { + "tree-sitter": { + "optional": true + } + }, + "devDependencies": { + "eslint": "^8.57.0", + "eslint-config-google": "^0.14.0", + "tree-sitter-cli": "^0.23.0", + "prebuildify": "^6.0.1" + }, + "scripts": { + "install": "node-gyp-build", + "lint": "eslint grammar.js", + "prestart": "tree-sitter build --wasm", + "start": "tree-sitter playground", + "test": "node --test bindings/node/*_test.js" + }, + "tree-sitter": [ + { + "scope": "source.html", + "file-types": [ + "html" + ], + "injection-regex": "html", + "highlights": "queries/highlights.scm", + "injections": "queries/injections.scm", + "external-files": [ + "src/tag.h" + ] + } + ], + "eslintConfig": { + "env": { + "commonjs": true, + "es2021": true + }, + "extends": "google", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "rules": { + "arrow-parens": "off", + "camel-case": "off", + "indent": [ + "error", + 2, + { + "SwitchCase": 1 + } + ], + "max-len": [ + "error", + { + "code": 160, + "ignoreComments": true, + "ignoreUrls": true, + "ignoreStrings": true + } + ], + "spaced-comment": [ + "warn", + "always", + { + "line": { + "markers": [ + "/" + ] + } + } + ] + } + } +} diff --git a/test-parsers/tree-sitter-html/prebuilds/darwin-arm64/tree-sitter-html.node b/test-parsers/tree-sitter-html/prebuilds/darwin-arm64/tree-sitter-html.node new file mode 100644 index 0000000000000000000000000000000000000000..ece64c66f6c1cfb4abb3ce5eb7fd259574dd2d16 GIT binary patch literal 71648 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 GX8#8|NK8=x literal 0 HcmV?d00001 diff --git a/test-parsers/tree-sitter-html/prebuilds/darwin-x64/tree-sitter-html.node b/test-parsers/tree-sitter-html/prebuilds/darwin-x64/tree-sitter-html.node new file mode 100644 index 0000000000000000000000000000000000000000..6992900891b337ef121f05e376ea09e5c98f4e3b GIT binary patch literal 39400 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 literal 0 HcmV?d00001 diff --git a/test-parsers/tree-sitter-html/prebuilds/linux-x64/tree-sitter-html.node b/test-parsers/tree-sitter-html/prebuilds/linux-x64/tree-sitter-html.node new file mode 100644 index 0000000000000000000000000000000000000000..64108dd40f95dcbce36bddf5e19bb995bafbf8ec GIT binary patch literal 51976 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" + "" +] @punctuation.bracket diff --git a/test-parsers/tree-sitter-html/queries/injections.scm b/test-parsers/tree-sitter-html/queries/injections.scm new file mode 100644 index 00000000..71e7c3ae --- /dev/null +++ b/test-parsers/tree-sitter-html/queries/injections.scm @@ -0,0 +1,7 @@ +((script_element + (raw_text) @injection.content) + (#set! injection.language "javascript")) + +((style_element + (raw_text) @injection.content) + (#set! injection.language "css")) diff --git a/test-parsers/tree-sitter-html/src/grammar.json b/test-parsers/tree-sitter-html/src/grammar.json new file mode 100644 index 00000000..cf346240 --- /dev/null +++ b/test-parsers/tree-sitter-html/src/grammar.json @@ -0,0 +1,500 @@ +{ + "name": "html", + "rules": { + "document": { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_node" + } + }, + "doctype": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "]+" + }, + { + "type": "STRING", + "value": ">" + } + ] + }, + "_doctype": { + "type": "PATTERN", + "value": "[Dd][Oo][Cc][Tt][Yy][Pp][Ee]" + }, + "_node": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "doctype" + }, + { + "type": "SYMBOL", + "name": "entity" + }, + { + "type": "SYMBOL", + "name": "text" + }, + { + "type": "SYMBOL", + "name": "element" + }, + { + "type": "SYMBOL", + "name": "script_element" + }, + { + "type": "SYMBOL", + "name": "style_element" + }, + { + "type": "SYMBOL", + "name": "erroneous_end_tag" + } + ] + }, + "element": { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "start_tag" + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_node" + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "end_tag" + }, + { + "type": "SYMBOL", + "name": "_implicit_end_tag" + } + ] + } + ] + }, + { + "type": "SYMBOL", + "name": "self_closing_tag" + } + ] + }, + "script_element": { + "type": "SEQ", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "script_start_tag" + }, + "named": true, + "value": "start_tag" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "raw_text" + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "SYMBOL", + "name": "end_tag" + } + ] + }, + "style_element": { + "type": "SEQ", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "style_start_tag" + }, + "named": true, + "value": "start_tag" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "raw_text" + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "SYMBOL", + "name": "end_tag" + } + ] + }, + "start_tag": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "<" + }, + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_start_tag_name" + }, + "named": true, + "value": "tag_name" + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "attribute" + } + }, + { + "type": "STRING", + "value": ">" + } + ] + }, + "script_start_tag": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "<" + }, + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_script_start_tag_name" + }, + "named": true, + "value": "tag_name" + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "attribute" + } + }, + { + "type": "STRING", + "value": ">" + } + ] + }, + "style_start_tag": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "<" + }, + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_style_start_tag_name" + }, + "named": true, + "value": "tag_name" + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "attribute" + } + }, + { + "type": "STRING", + "value": ">" + } + ] + }, + "self_closing_tag": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "<" + }, + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_start_tag_name" + }, + "named": true, + "value": "tag_name" + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "attribute" + } + }, + { + "type": "STRING", + "value": "/>" + } + ] + }, + "end_tag": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "" + } + ] + }, + "erroneous_end_tag": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "" + } + ] + }, + "attribute": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "attribute_name" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "=" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "attribute_value" + }, + { + "type": "SYMBOL", + "name": "quoted_attribute_value" + } + ] + } + ] + }, + { + "type": "BLANK" + } + ] + } + ] + }, + "attribute_name": { + "type": "PATTERN", + "value": "[^<>\"'/=\\s]+" + }, + "attribute_value": { + "type": "PATTERN", + "value": "[^<>\"'=\\s]+" + }, + "entity": { + "type": "PATTERN", + "value": "&(#([xX][0-9a-fA-F]{1,6}|[0-9]{1,5})|[A-Za-z]{1,30});?" + }, + "quoted_attribute_value": { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "'" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "PATTERN", + "value": "[^']+" + }, + "named": true, + "value": "attribute_value" + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "STRING", + "value": "'" + } + ] + }, + { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "\"" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "PATTERN", + "value": "[^\"]+" + }, + "named": true, + "value": "attribute_value" + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "STRING", + "value": "\"" + } + ] + } + ] + }, + "text": { + "type": "PATTERN", + "value": "[^<>&\\s]([^<>&]*[^<>&\\s])?" + } + }, + "extras": [ + { + "type": "SYMBOL", + "name": "comment" + }, + { + "type": "PATTERN", + "value": "\\s+" + } + ], + "conflicts": [], + "precedences": [], + "externals": [ + { + "type": "SYMBOL", + "name": "_start_tag_name" + }, + { + "type": "SYMBOL", + "name": "_script_start_tag_name" + }, + { + "type": "SYMBOL", + "name": "_style_start_tag_name" + }, + { + "type": "SYMBOL", + "name": "_end_tag_name" + }, + { + "type": "SYMBOL", + "name": "erroneous_end_tag_name" + }, + { + "type": "STRING", + "value": "/>" + }, + { + "type": "SYMBOL", + "name": "_implicit_end_tag" + }, + { + "type": "SYMBOL", + "name": "raw_text" + }, + { + "type": "SYMBOL", + "name": "comment" + } + ], + "inline": [], + "supertypes": [] +} diff --git a/test-parsers/tree-sitter-html/src/node-types.json b/test-parsers/tree-sitter-html/src/node-types.json new file mode 100644 index 00000000..07fc3750 --- /dev/null +++ b/test-parsers/tree-sitter-html/src/node-types.json @@ -0,0 +1,317 @@ +[ + { + "type": "attribute", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": true, + "types": [ + { + "type": "attribute_name", + "named": true + }, + { + "type": "attribute_value", + "named": true + }, + { + "type": "quoted_attribute_value", + "named": true + } + ] + } + }, + { + "type": "doctype", + "named": true, + "fields": {} + }, + { + "type": "document", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": false, + "types": [ + { + "type": "doctype", + "named": true + }, + { + "type": "element", + "named": true + }, + { + "type": "entity", + "named": true + }, + { + "type": "erroneous_end_tag", + "named": true + }, + { + "type": "script_element", + "named": true + }, + { + "type": "style_element", + "named": true + }, + { + "type": "text", + "named": true + } + ] + } + }, + { + "type": "element", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": true, + "types": [ + { + "type": "doctype", + "named": true + }, + { + "type": "element", + "named": true + }, + { + "type": "end_tag", + "named": true + }, + { + "type": "entity", + "named": true + }, + { + "type": "erroneous_end_tag", + "named": true + }, + { + "type": "script_element", + "named": true + }, + { + "type": "self_closing_tag", + "named": true + }, + { + "type": "start_tag", + "named": true + }, + { + "type": "style_element", + "named": true + }, + { + "type": "text", + "named": true + } + ] + } + }, + { + "type": "end_tag", + "named": true, + "fields": {}, + "children": { + "multiple": false, + "required": true, + "types": [ + { + "type": "tag_name", + "named": true + } + ] + } + }, + { + "type": "erroneous_end_tag", + "named": true, + "fields": {}, + "children": { + "multiple": false, + "required": true, + "types": [ + { + "type": "erroneous_end_tag_name", + "named": true + } + ] + } + }, + { + "type": "quoted_attribute_value", + "named": true, + "fields": {}, + "children": { + "multiple": false, + "required": false, + "types": [ + { + "type": "attribute_value", + "named": true + } + ] + } + }, + { + "type": "script_element", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": true, + "types": [ + { + "type": "end_tag", + "named": true + }, + { + "type": "raw_text", + "named": true + }, + { + "type": "start_tag", + "named": true + } + ] + } + }, + { + "type": "self_closing_tag", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": true, + "types": [ + { + "type": "attribute", + "named": true + }, + { + "type": "tag_name", + "named": true + } + ] + } + }, + { + "type": "start_tag", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": true, + "types": [ + { + "type": "attribute", + "named": true + }, + { + "type": "tag_name", + "named": true + } + ] + } + }, + { + "type": "style_element", + "named": true, + "fields": {}, + "children": { + "multiple": true, + "required": true, + "types": [ + { + "type": "end_tag", + "named": true + }, + { + "type": "raw_text", + "named": true + }, + { + "type": "start_tag", + "named": true + } + ] + } + }, + { + "type": "\"", + "named": false + }, + { + "type": "'", + "named": false + }, + { + "type": "/>", + "named": false + }, + { + "type": "<", + "named": false + }, + { + "type": "", + "named": false + }, + { + "type": "attribute_name", + "named": true + }, + { + "type": "attribute_value", + "named": true + }, + { + "type": "comment", + "named": true + }, + { + "type": "doctype", + "named": false + }, + { + "type": "entity", + "named": true + }, + { + "type": "erroneous_end_tag_name", + "named": true + }, + { + "type": "raw_text", + "named": true + }, + { + "type": "tag_name", + "named": true + }, + { + "type": "text", + "named": true + } +] \ No newline at end of file diff --git a/test-parsers/tree-sitter-html/src/parser.c b/test-parsers/tree-sitter-html/src/parser.c new file mode 100644 index 00000000..a342e0c9 --- /dev/null +++ b/test-parsers/tree-sitter-html/src/parser.c @@ -0,0 +1,2300 @@ +#include "tree_sitter/parser.h" + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif + +#define LANGUAGE_VERSION 14 +#define STATE_COUNT 94 +#define LARGE_STATE_COUNT 2 +#define SYMBOL_COUNT 41 +#define ALIAS_COUNT 0 +#define TOKEN_COUNT 25 +#define EXTERNAL_TOKEN_COUNT 9 +#define FIELD_COUNT 0 +#define MAX_ALIAS_SEQUENCE_LENGTH 4 +#define PRODUCTION_ID_COUNT 1 + +enum ts_symbol_identifiers { + anon_sym_LT_BANG = 1, + aux_sym_doctype_token1 = 2, + anon_sym_GT = 3, + sym__doctype = 4, + anon_sym_LT = 5, + anon_sym_SLASH_GT = 6, + anon_sym_LT_SLASH = 7, + anon_sym_EQ = 8, + sym_attribute_name = 9, + sym_attribute_value = 10, + sym_entity = 11, + anon_sym_SQUOTE = 12, + aux_sym_quoted_attribute_value_token1 = 13, + anon_sym_DQUOTE = 14, + aux_sym_quoted_attribute_value_token2 = 15, + sym_text = 16, + sym__start_tag_name = 17, + sym__script_start_tag_name = 18, + sym__style_start_tag_name = 19, + sym__end_tag_name = 20, + sym_erroneous_end_tag_name = 21, + sym__implicit_end_tag = 22, + sym_raw_text = 23, + sym_comment = 24, + sym_document = 25, + sym_doctype = 26, + sym__node = 27, + sym_element = 28, + sym_script_element = 29, + sym_style_element = 30, + sym_start_tag = 31, + sym_script_start_tag = 32, + sym_style_start_tag = 33, + sym_self_closing_tag = 34, + sym_end_tag = 35, + sym_erroneous_end_tag = 36, + sym_attribute = 37, + sym_quoted_attribute_value = 38, + aux_sym_document_repeat1 = 39, + aux_sym_start_tag_repeat1 = 40, +}; + +static const char * const ts_symbol_names[] = { + [ts_builtin_sym_end] = "end", + [anon_sym_LT_BANG] = "", + [sym__doctype] = "doctype", + [anon_sym_LT] = "<", + [anon_sym_SLASH_GT] = "/>", + [anon_sym_LT_SLASH] = "eof(lexer); + switch (state) { + case 0: + if (eof) ADVANCE(18); + ADVANCE_MAP( + '"', 73, + '&', 3, + '\'', 70, + '/', 6, + '<', 24, + '=', 27, + '>', 22, + 'D', 9, + 'd', 9, + ); + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') SKIP(0); + END_STATE(); + case 1: + if (lookahead == '"') ADVANCE(73); + if (lookahead == '\'') ADVANCE(70); + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') SKIP(1); + if (lookahead != 0 && + (lookahead < '<' || '>' < lookahead)) ADVANCE(29); + END_STATE(); + case 2: + if (lookahead == '"') ADVANCE(73); + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') ADVANCE(74); + if (lookahead != 0) ADVANCE(75); + END_STATE(); + case 3: + if (lookahead == '#') ADVANCE(12); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(69); + END_STATE(); + case 4: + if (lookahead == '\'') ADVANCE(70); + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') ADVANCE(71); + if (lookahead != 0) ADVANCE(72); + END_STATE(); + case 5: + if (lookahead == '/') ADVANCE(6); + if (lookahead == '=') ADVANCE(27); + if (lookahead == '>') ADVANCE(22); + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') SKIP(5); + if (lookahead != 0 && + lookahead != '"' && + lookahead != '\'' && + (lookahead < '<' || '>' < lookahead)) ADVANCE(28); + END_STATE(); + case 6: + if (lookahead == '>') ADVANCE(25); + END_STATE(); + case 7: + if (lookahead == 'C' || + lookahead == 'c') ADVANCE(11); + END_STATE(); + case 8: + if (lookahead == 'E' || + lookahead == 'e') ADVANCE(23); + END_STATE(); + case 9: + if (lookahead == 'O' || + lookahead == 'o') ADVANCE(7); + END_STATE(); + case 10: + if (lookahead == 'P' || + lookahead == 'p') ADVANCE(8); + END_STATE(); + case 11: + if (lookahead == 'T' || + lookahead == 't') ADVANCE(13); + END_STATE(); + case 12: + if (lookahead == 'X' || + lookahead == 'x') ADVANCE(16); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(35); + END_STATE(); + case 13: + if (lookahead == 'Y' || + lookahead == 'y') ADVANCE(10); + END_STATE(); + case 14: + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') ADVANCE(14); + if (lookahead != 0 && + lookahead != '&' && + lookahead != '<' && + lookahead != '>') ADVANCE(76); + END_STATE(); + case 15: + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') ADVANCE(20); + if (lookahead != 0 && + lookahead != '>') ADVANCE(21); + END_STATE(); + case 16: + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'F') || + ('a' <= lookahead && lookahead <= 'f')) ADVANCE(40); + END_STATE(); + case 17: + if (eof) ADVANCE(18); + if (lookahead == '&') ADVANCE(3); + if (lookahead == '<') ADVANCE(24); + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') SKIP(17); + if (lookahead != 0 && + lookahead != '>') ADVANCE(76); + END_STATE(); + case 18: + ACCEPT_TOKEN(ts_builtin_sym_end); + END_STATE(); + case 19: + ACCEPT_TOKEN(anon_sym_LT_BANG); + END_STATE(); + case 20: + ACCEPT_TOKEN(aux_sym_doctype_token1); + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') ADVANCE(20); + if (lookahead != 0 && + lookahead != '>') ADVANCE(21); + END_STATE(); + case 21: + ACCEPT_TOKEN(aux_sym_doctype_token1); + if (lookahead != 0 && + lookahead != '>') ADVANCE(21); + END_STATE(); + case 22: + ACCEPT_TOKEN(anon_sym_GT); + END_STATE(); + case 23: + ACCEPT_TOKEN(sym__doctype); + END_STATE(); + case 24: + ACCEPT_TOKEN(anon_sym_LT); + if (lookahead == '!') ADVANCE(19); + if (lookahead == '/') ADVANCE(26); + END_STATE(); + case 25: + ACCEPT_TOKEN(anon_sym_SLASH_GT); + END_STATE(); + case 26: + ACCEPT_TOKEN(anon_sym_LT_SLASH); + END_STATE(); + case 27: + ACCEPT_TOKEN(anon_sym_EQ); + END_STATE(); + case 28: + ACCEPT_TOKEN(sym_attribute_name); + if (lookahead != 0 && + (lookahead < '\t' || '\r' < lookahead) && + lookahead != ' ' && + lookahead != '"' && + lookahead != '\'' && + lookahead != '/' && + (lookahead < '<' || '>' < lookahead)) ADVANCE(28); + END_STATE(); + case 29: + ACCEPT_TOKEN(sym_attribute_value); + if (lookahead != 0 && + (lookahead < '\t' || '\r' < lookahead) && + lookahead != ' ' && + lookahead != '"' && + lookahead != '\'' && + (lookahead < '<' || '>' < lookahead)) ADVANCE(29); + END_STATE(); + case 30: + ACCEPT_TOKEN(sym_entity); + END_STATE(); + case 31: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + END_STATE(); + case 32: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(31); + END_STATE(); + case 33: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(32); + END_STATE(); + case 34: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(33); + END_STATE(); + case 35: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('0' <= lookahead && lookahead <= '9')) ADVANCE(34); + END_STATE(); + case 36: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'F') || + ('a' <= lookahead && lookahead <= 'f')) ADVANCE(31); + END_STATE(); + case 37: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'F') || + ('a' <= lookahead && lookahead <= 'f')) ADVANCE(36); + END_STATE(); + case 38: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'F') || + ('a' <= lookahead && lookahead <= 'f')) ADVANCE(37); + END_STATE(); + case 39: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'F') || + ('a' <= lookahead && lookahead <= 'f')) ADVANCE(38); + END_STATE(); + case 40: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('0' <= lookahead && lookahead <= '9') || + ('A' <= lookahead && lookahead <= 'F') || + ('a' <= lookahead && lookahead <= 'f')) ADVANCE(39); + END_STATE(); + case 41: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(31); + END_STATE(); + case 42: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(41); + END_STATE(); + case 43: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(42); + END_STATE(); + case 44: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(43); + END_STATE(); + case 45: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(44); + END_STATE(); + case 46: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(45); + END_STATE(); + case 47: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(46); + END_STATE(); + case 48: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(47); + END_STATE(); + case 49: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(48); + END_STATE(); + case 50: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(49); + END_STATE(); + case 51: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(50); + END_STATE(); + case 52: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(51); + END_STATE(); + case 53: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(52); + END_STATE(); + case 54: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(53); + END_STATE(); + case 55: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(54); + END_STATE(); + case 56: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(55); + END_STATE(); + case 57: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(56); + END_STATE(); + case 58: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(57); + END_STATE(); + case 59: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(58); + END_STATE(); + case 60: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(59); + END_STATE(); + case 61: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(60); + END_STATE(); + case 62: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(61); + END_STATE(); + case 63: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(62); + END_STATE(); + case 64: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(63); + END_STATE(); + case 65: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(64); + END_STATE(); + case 66: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(65); + END_STATE(); + case 67: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(66); + END_STATE(); + case 68: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(67); + END_STATE(); + case 69: + ACCEPT_TOKEN(sym_entity); + if (lookahead == ';') ADVANCE(30); + if (('A' <= lookahead && lookahead <= 'Z') || + ('a' <= lookahead && lookahead <= 'z')) ADVANCE(68); + END_STATE(); + case 70: + ACCEPT_TOKEN(anon_sym_SQUOTE); + END_STATE(); + case 71: + ACCEPT_TOKEN(aux_sym_quoted_attribute_value_token1); + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') ADVANCE(71); + if (lookahead != 0 && + lookahead != '\'') ADVANCE(72); + END_STATE(); + case 72: + ACCEPT_TOKEN(aux_sym_quoted_attribute_value_token1); + if (lookahead != 0 && + lookahead != '\'') ADVANCE(72); + END_STATE(); + case 73: + ACCEPT_TOKEN(anon_sym_DQUOTE); + END_STATE(); + case 74: + ACCEPT_TOKEN(aux_sym_quoted_attribute_value_token2); + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') ADVANCE(74); + if (lookahead != 0 && + lookahead != '"') ADVANCE(75); + END_STATE(); + case 75: + ACCEPT_TOKEN(aux_sym_quoted_attribute_value_token2); + if (lookahead != 0 && + lookahead != '"') ADVANCE(75); + END_STATE(); + case 76: + ACCEPT_TOKEN(sym_text); + if (('\t' <= lookahead && lookahead <= '\r') || + lookahead == ' ') ADVANCE(14); + if (lookahead != 0 && + lookahead != '&' && + lookahead != '<' && + lookahead != '>') ADVANCE(76); + END_STATE(); + default: + return false; + } +} + +static const TSLexMode ts_lex_modes[STATE_COUNT] = { + [0] = {.lex_state = 0, .external_lex_state = 1}, + [1] = {.lex_state = 17, .external_lex_state = 2}, + [2] = {.lex_state = 17, .external_lex_state = 3}, + [3] = {.lex_state = 17, .external_lex_state = 3}, + [4] = {.lex_state = 17, .external_lex_state = 3}, + [5] = {.lex_state = 17, .external_lex_state = 3}, + [6] = {.lex_state = 17, .external_lex_state = 3}, + [7] = {.lex_state = 17, .external_lex_state = 2}, + [8] = {.lex_state = 17, .external_lex_state = 2}, + [9] = {.lex_state = 17, .external_lex_state = 3}, + [10] = {.lex_state = 17, .external_lex_state = 2}, + [11] = {.lex_state = 17, .external_lex_state = 3}, + [12] = {.lex_state = 17, .external_lex_state = 2}, + [13] = {.lex_state = 17, .external_lex_state = 2}, + [14] = {.lex_state = 17, .external_lex_state = 2}, + [15] = {.lex_state = 17, .external_lex_state = 2}, + [16] = {.lex_state = 17, .external_lex_state = 2}, + [17] = {.lex_state = 17, .external_lex_state = 2}, + [18] = {.lex_state = 17, .external_lex_state = 3}, + [19] = {.lex_state = 17, .external_lex_state = 2}, + [20] = {.lex_state = 17, .external_lex_state = 2}, + [21] = {.lex_state = 17, .external_lex_state = 3}, + [22] = {.lex_state = 17, .external_lex_state = 3}, + [23] = {.lex_state = 17, .external_lex_state = 3}, + [24] = {.lex_state = 17, .external_lex_state = 3}, + [25] = {.lex_state = 17, .external_lex_state = 3}, + [26] = {.lex_state = 17, .external_lex_state = 3}, + [27] = {.lex_state = 17, .external_lex_state = 3}, + [28] = {.lex_state = 17, .external_lex_state = 3}, + [29] = {.lex_state = 17, .external_lex_state = 3}, + [30] = {.lex_state = 17, .external_lex_state = 3}, + [31] = {.lex_state = 17, .external_lex_state = 3}, + [32] = {.lex_state = 17, .external_lex_state = 2}, + [33] = {.lex_state = 17, .external_lex_state = 2}, + [34] = {.lex_state = 17, .external_lex_state = 2}, + [35] = {.lex_state = 5, .external_lex_state = 4}, + [36] = {.lex_state = 5, .external_lex_state = 4}, + [37] = {.lex_state = 5, .external_lex_state = 4}, + [38] = {.lex_state = 5, .external_lex_state = 4}, + [39] = {.lex_state = 5, .external_lex_state = 4}, + [40] = {.lex_state = 5, .external_lex_state = 2}, + [41] = {.lex_state = 5, .external_lex_state = 2}, + [42] = {.lex_state = 5, .external_lex_state = 2}, + [43] = {.lex_state = 5, .external_lex_state = 2}, + [44] = {.lex_state = 5, .external_lex_state = 2}, + [45] = {.lex_state = 5, .external_lex_state = 4}, + [46] = {.lex_state = 1, .external_lex_state = 2}, + [47] = {.lex_state = 1, .external_lex_state = 2}, + [48] = {.lex_state = 0, .external_lex_state = 5}, + [49] = {.lex_state = 5, .external_lex_state = 4}, + [50] = {.lex_state = 5, .external_lex_state = 4}, + [51] = {.lex_state = 5, .external_lex_state = 2}, + [52] = {.lex_state = 0, .external_lex_state = 6}, + [53] = {.lex_state = 0, .external_lex_state = 5}, + [54] = {.lex_state = 0, .external_lex_state = 5}, + [55] = {.lex_state = 0, .external_lex_state = 5}, + [56] = {.lex_state = 5, .external_lex_state = 4}, + [57] = {.lex_state = 0, .external_lex_state = 6}, + [58] = {.lex_state = 5, .external_lex_state = 2}, + [59] = {.lex_state = 0, .external_lex_state = 7}, + [60] = {.lex_state = 0, .external_lex_state = 2}, + [61] = {.lex_state = 0, .external_lex_state = 5}, + [62] = {.lex_state = 2, .external_lex_state = 2}, + [63] = {.lex_state = 5, .external_lex_state = 2}, + [64] = {.lex_state = 5, .external_lex_state = 2}, + [65] = {.lex_state = 0, .external_lex_state = 5}, + [66] = {.lex_state = 0, .external_lex_state = 5}, + [67] = {.lex_state = 0, .external_lex_state = 5}, + [68] = {.lex_state = 0, .external_lex_state = 7}, + [69] = {.lex_state = 0, .external_lex_state = 2}, + [70] = {.lex_state = 0, .external_lex_state = 2}, + [71] = {.lex_state = 0, .external_lex_state = 2}, + [72] = {.lex_state = 4, .external_lex_state = 2}, + [73] = {.lex_state = 4, .external_lex_state = 2}, + [74] = {.lex_state = 2, .external_lex_state = 2}, + [75] = {.lex_state = 0, .external_lex_state = 2}, + [76] = {.lex_state = 0, .external_lex_state = 2}, + [77] = {.lex_state = 0, .external_lex_state = 2}, + [78] = {.lex_state = 0, .external_lex_state = 2}, + [79] = {.lex_state = 0, .external_lex_state = 2}, + [80] = {.lex_state = 0, .external_lex_state = 2}, + [81] = {.lex_state = 15, .external_lex_state = 2}, + [82] = {.lex_state = 0, .external_lex_state = 2}, + [83] = {.lex_state = 0, .external_lex_state = 2}, + [84] = {.lex_state = 0, .external_lex_state = 2}, + [85] = {.lex_state = 0, .external_lex_state = 8}, + [86] = {.lex_state = 0, .external_lex_state = 2}, + [87] = {.lex_state = 0, .external_lex_state = 2}, + [88] = {.lex_state = 0, .external_lex_state = 9}, + [89] = {.lex_state = 0, .external_lex_state = 8}, + [90] = {.lex_state = 15, .external_lex_state = 2}, + [91] = {.lex_state = 0, .external_lex_state = 2}, + [92] = {.lex_state = 0, .external_lex_state = 9}, + [93] = {.lex_state = 0, .external_lex_state = 2}, +}; + +static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { + [0] = { + [ts_builtin_sym_end] = ACTIONS(1), + [anon_sym_LT_BANG] = ACTIONS(1), + [anon_sym_GT] = ACTIONS(1), + [sym__doctype] = ACTIONS(1), + [anon_sym_LT] = ACTIONS(1), + [anon_sym_SLASH_GT] = ACTIONS(1), + [anon_sym_LT_SLASH] = ACTIONS(1), + [anon_sym_EQ] = ACTIONS(1), + [sym_entity] = ACTIONS(1), + [anon_sym_SQUOTE] = ACTIONS(1), + [anon_sym_DQUOTE] = ACTIONS(1), + [sym__start_tag_name] = ACTIONS(1), + [sym__script_start_tag_name] = ACTIONS(1), + [sym__style_start_tag_name] = ACTIONS(1), + [sym__end_tag_name] = ACTIONS(1), + [sym_erroneous_end_tag_name] = ACTIONS(1), + [sym__implicit_end_tag] = ACTIONS(1), + [sym_raw_text] = ACTIONS(1), + [sym_comment] = ACTIONS(3), + }, + [1] = { + [sym_document] = STATE(83), + [sym_doctype] = STATE(7), + [sym__node] = STATE(7), + [sym_element] = STATE(7), + [sym_script_element] = STATE(7), + [sym_style_element] = STATE(7), + [sym_start_tag] = STATE(2), + [sym_script_start_tag] = STATE(48), + [sym_style_start_tag] = STATE(53), + [sym_self_closing_tag] = STATE(33), + [sym_erroneous_end_tag] = STATE(7), + [aux_sym_document_repeat1] = STATE(7), + [ts_builtin_sym_end] = ACTIONS(5), + [anon_sym_LT_BANG] = ACTIONS(7), + [anon_sym_LT] = ACTIONS(9), + [anon_sym_LT_SLASH] = ACTIONS(11), + [sym_entity] = ACTIONS(13), + [sym_text] = ACTIONS(13), + [sym_comment] = ACTIONS(3), + }, +}; + +static const uint16_t ts_small_parse_table[] = { + [0] = 12, + ACTIONS(3), 1, + sym_comment, + ACTIONS(15), 1, + anon_sym_LT_BANG, + ACTIONS(17), 1, + anon_sym_LT, + ACTIONS(19), 1, + anon_sym_LT_SLASH, + ACTIONS(23), 1, + sym__implicit_end_tag, + STATE(5), 1, + sym_start_tag, + STATE(21), 1, + sym_self_closing_tag, + STATE(32), 1, + sym_end_tag, + STATE(54), 1, + sym_script_start_tag, + STATE(55), 1, + sym_style_start_tag, + ACTIONS(21), 2, + sym_entity, + sym_text, + STATE(3), 7, + sym_doctype, + sym__node, + sym_element, + sym_script_element, + sym_style_element, + sym_erroneous_end_tag, + aux_sym_document_repeat1, + [44] = 12, + ACTIONS(3), 1, + sym_comment, + ACTIONS(15), 1, + anon_sym_LT_BANG, + ACTIONS(17), 1, + anon_sym_LT, + ACTIONS(19), 1, + anon_sym_LT_SLASH, + ACTIONS(27), 1, + sym__implicit_end_tag, + STATE(5), 1, + sym_start_tag, + STATE(14), 1, + sym_end_tag, + STATE(21), 1, + sym_self_closing_tag, + STATE(54), 1, + sym_script_start_tag, + STATE(55), 1, + sym_style_start_tag, + ACTIONS(25), 2, + sym_entity, + sym_text, + STATE(6), 7, + sym_doctype, + sym__node, + sym_element, + sym_script_element, + sym_style_element, + sym_erroneous_end_tag, + aux_sym_document_repeat1, + [88] = 12, + ACTIONS(3), 1, + sym_comment, + ACTIONS(15), 1, + anon_sym_LT_BANG, + ACTIONS(17), 1, + anon_sym_LT, + ACTIONS(29), 1, + anon_sym_LT_SLASH, + ACTIONS(31), 1, + sym__implicit_end_tag, + STATE(5), 1, + sym_start_tag, + STATE(21), 1, + sym_self_closing_tag, + STATE(27), 1, + sym_end_tag, + STATE(54), 1, + sym_script_start_tag, + STATE(55), 1, + sym_style_start_tag, + ACTIONS(25), 2, + sym_entity, + sym_text, + STATE(6), 7, + sym_doctype, + sym__node, + sym_element, + sym_script_element, + sym_style_element, + sym_erroneous_end_tag, + aux_sym_document_repeat1, + [132] = 12, + ACTIONS(3), 1, + sym_comment, + ACTIONS(15), 1, + anon_sym_LT_BANG, + ACTIONS(17), 1, + anon_sym_LT, + ACTIONS(29), 1, + anon_sym_LT_SLASH, + ACTIONS(35), 1, + sym__implicit_end_tag, + STATE(5), 1, + sym_start_tag, + STATE(21), 1, + sym_self_closing_tag, + STATE(22), 1, + sym_end_tag, + STATE(54), 1, + sym_script_start_tag, + STATE(55), 1, + sym_style_start_tag, + ACTIONS(33), 2, + sym_entity, + sym_text, + STATE(4), 7, + sym_doctype, + sym__node, + sym_element, + sym_script_element, + sym_style_element, + sym_erroneous_end_tag, + aux_sym_document_repeat1, + [176] = 11, + ACTIONS(3), 1, + sym_comment, + ACTIONS(37), 1, + anon_sym_LT_BANG, + ACTIONS(40), 1, + anon_sym_LT, + ACTIONS(43), 1, + anon_sym_LT_SLASH, + ACTIONS(49), 1, + sym__implicit_end_tag, + STATE(5), 1, + sym_start_tag, + STATE(21), 1, + sym_self_closing_tag, + STATE(54), 1, + sym_script_start_tag, + STATE(55), 1, + sym_style_start_tag, + ACTIONS(46), 2, + sym_entity, + sym_text, + STATE(6), 7, + sym_doctype, + sym__node, + sym_element, + sym_script_element, + sym_style_element, + sym_erroneous_end_tag, + aux_sym_document_repeat1, + [217] = 11, + ACTIONS(3), 1, + sym_comment, + ACTIONS(7), 1, + anon_sym_LT_BANG, + ACTIONS(9), 1, + anon_sym_LT, + ACTIONS(11), 1, + anon_sym_LT_SLASH, + ACTIONS(51), 1, + ts_builtin_sym_end, + STATE(2), 1, + sym_start_tag, + STATE(33), 1, + sym_self_closing_tag, + STATE(48), 1, + sym_script_start_tag, + STATE(53), 1, + sym_style_start_tag, + ACTIONS(53), 2, + sym_entity, + sym_text, + STATE(8), 7, + sym_doctype, + sym__node, + sym_element, + sym_script_element, + sym_style_element, + sym_erroneous_end_tag, + aux_sym_document_repeat1, + [258] = 11, + ACTIONS(3), 1, + sym_comment, + ACTIONS(49), 1, + ts_builtin_sym_end, + ACTIONS(55), 1, + anon_sym_LT_BANG, + ACTIONS(58), 1, + anon_sym_LT, + ACTIONS(61), 1, + anon_sym_LT_SLASH, + STATE(2), 1, + sym_start_tag, + STATE(33), 1, + sym_self_closing_tag, + STATE(48), 1, + sym_script_start_tag, + STATE(53), 1, + sym_style_start_tag, + ACTIONS(64), 2, + sym_entity, + sym_text, + STATE(8), 7, + sym_doctype, + sym__node, + sym_element, + sym_script_element, + sym_style_element, + sym_erroneous_end_tag, + aux_sym_document_repeat1, + [299] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(69), 1, + anon_sym_LT, + ACTIONS(67), 5, + sym__implicit_end_tag, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [313] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(73), 1, + anon_sym_LT, + ACTIONS(71), 5, + ts_builtin_sym_end, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [327] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(77), 1, + anon_sym_LT, + ACTIONS(75), 5, + sym__implicit_end_tag, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [341] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(81), 1, + anon_sym_LT, + ACTIONS(79), 5, + ts_builtin_sym_end, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [355] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(85), 1, + anon_sym_LT, + ACTIONS(83), 5, + ts_builtin_sym_end, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [369] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(89), 1, + anon_sym_LT, + ACTIONS(87), 5, + ts_builtin_sym_end, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [383] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(93), 1, + anon_sym_LT, + ACTIONS(91), 5, + ts_builtin_sym_end, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [397] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(97), 1, + anon_sym_LT, + ACTIONS(95), 5, + ts_builtin_sym_end, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [411] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(101), 1, + anon_sym_LT, + ACTIONS(99), 5, + ts_builtin_sym_end, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [425] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(105), 1, + anon_sym_LT, + ACTIONS(103), 5, + sym__implicit_end_tag, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [439] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(109), 1, + anon_sym_LT, + ACTIONS(107), 5, + ts_builtin_sym_end, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [453] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(69), 1, + anon_sym_LT, + ACTIONS(67), 5, + ts_builtin_sym_end, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [467] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(113), 1, + anon_sym_LT, + ACTIONS(111), 5, + sym__implicit_end_tag, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [481] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(117), 1, + anon_sym_LT, + ACTIONS(115), 5, + sym__implicit_end_tag, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [495] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(109), 1, + anon_sym_LT, + ACTIONS(107), 5, + sym__implicit_end_tag, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [509] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(73), 1, + anon_sym_LT, + ACTIONS(71), 5, + sym__implicit_end_tag, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [523] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(81), 1, + anon_sym_LT, + ACTIONS(79), 5, + sym__implicit_end_tag, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [537] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(85), 1, + anon_sym_LT, + ACTIONS(83), 5, + sym__implicit_end_tag, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [551] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(89), 1, + anon_sym_LT, + ACTIONS(87), 5, + sym__implicit_end_tag, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [565] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(93), 1, + anon_sym_LT, + ACTIONS(91), 5, + sym__implicit_end_tag, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [579] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(97), 1, + anon_sym_LT, + ACTIONS(95), 5, + sym__implicit_end_tag, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [593] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(101), 1, + anon_sym_LT, + ACTIONS(99), 5, + sym__implicit_end_tag, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [607] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(121), 1, + anon_sym_LT, + ACTIONS(119), 5, + sym__implicit_end_tag, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [621] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(117), 1, + anon_sym_LT, + ACTIONS(115), 5, + ts_builtin_sym_end, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [635] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(113), 1, + anon_sym_LT, + ACTIONS(111), 5, + ts_builtin_sym_end, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [649] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(121), 1, + anon_sym_LT, + ACTIONS(119), 5, + ts_builtin_sym_end, + anon_sym_LT_BANG, + anon_sym_LT_SLASH, + sym_entity, + sym_text, + [663] = 4, + ACTIONS(3), 1, + sym_comment, + ACTIONS(125), 1, + sym_attribute_name, + ACTIONS(123), 2, + anon_sym_GT, + anon_sym_SLASH_GT, + STATE(35), 2, + sym_attribute, + aux_sym_start_tag_repeat1, + [678] = 5, + ACTIONS(3), 1, + sym_comment, + ACTIONS(128), 1, + anon_sym_GT, + ACTIONS(130), 1, + anon_sym_SLASH_GT, + ACTIONS(132), 1, + sym_attribute_name, + STATE(35), 2, + sym_attribute, + aux_sym_start_tag_repeat1, + [695] = 5, + ACTIONS(3), 1, + sym_comment, + ACTIONS(132), 1, + sym_attribute_name, + ACTIONS(134), 1, + anon_sym_GT, + ACTIONS(136), 1, + anon_sym_SLASH_GT, + STATE(38), 2, + sym_attribute, + aux_sym_start_tag_repeat1, + [712] = 5, + ACTIONS(3), 1, + sym_comment, + ACTIONS(128), 1, + anon_sym_GT, + ACTIONS(132), 1, + sym_attribute_name, + ACTIONS(138), 1, + anon_sym_SLASH_GT, + STATE(35), 2, + sym_attribute, + aux_sym_start_tag_repeat1, + [729] = 5, + ACTIONS(3), 1, + sym_comment, + ACTIONS(132), 1, + sym_attribute_name, + ACTIONS(134), 1, + anon_sym_GT, + ACTIONS(140), 1, + anon_sym_SLASH_GT, + STATE(36), 2, + sym_attribute, + aux_sym_start_tag_repeat1, + [746] = 4, + ACTIONS(3), 1, + sym_comment, + ACTIONS(142), 1, + anon_sym_GT, + ACTIONS(144), 1, + sym_attribute_name, + STATE(41), 2, + sym_attribute, + aux_sym_start_tag_repeat1, + [760] = 4, + ACTIONS(3), 1, + sym_comment, + ACTIONS(123), 1, + anon_sym_GT, + ACTIONS(146), 1, + sym_attribute_name, + STATE(41), 2, + sym_attribute, + aux_sym_start_tag_repeat1, + [774] = 4, + ACTIONS(3), 1, + sym_comment, + ACTIONS(144), 1, + sym_attribute_name, + ACTIONS(149), 1, + anon_sym_GT, + STATE(40), 2, + sym_attribute, + aux_sym_start_tag_repeat1, + [788] = 4, + ACTIONS(3), 1, + sym_comment, + ACTIONS(144), 1, + sym_attribute_name, + ACTIONS(151), 1, + anon_sym_GT, + STATE(44), 2, + sym_attribute, + aux_sym_start_tag_repeat1, + [802] = 4, + ACTIONS(3), 1, + sym_comment, + ACTIONS(144), 1, + sym_attribute_name, + ACTIONS(153), 1, + anon_sym_GT, + STATE(41), 2, + sym_attribute, + aux_sym_start_tag_repeat1, + [816] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(157), 1, + anon_sym_EQ, + ACTIONS(155), 3, + anon_sym_GT, + anon_sym_SLASH_GT, + sym_attribute_name, + [828] = 5, + ACTIONS(3), 1, + sym_comment, + ACTIONS(159), 1, + sym_attribute_value, + ACTIONS(161), 1, + anon_sym_SQUOTE, + ACTIONS(163), 1, + anon_sym_DQUOTE, + STATE(56), 1, + sym_quoted_attribute_value, + [844] = 5, + ACTIONS(3), 1, + sym_comment, + ACTIONS(165), 1, + sym_attribute_value, + ACTIONS(167), 1, + anon_sym_SQUOTE, + ACTIONS(169), 1, + anon_sym_DQUOTE, + STATE(58), 1, + sym_quoted_attribute_value, + [860] = 4, + ACTIONS(3), 1, + sym_comment, + ACTIONS(171), 1, + anon_sym_LT_SLASH, + ACTIONS(173), 1, + sym_raw_text, + STATE(19), 1, + sym_end_tag, + [873] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(175), 3, + anon_sym_GT, + anon_sym_SLASH_GT, + sym_attribute_name, + [882] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(177), 3, + anon_sym_GT, + anon_sym_SLASH_GT, + sym_attribute_name, + [891] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(179), 1, + anon_sym_EQ, + ACTIONS(155), 2, + anon_sym_GT, + sym_attribute_name, + [902] = 4, + ACTIONS(3), 1, + sym_comment, + ACTIONS(181), 1, + sym__start_tag_name, + ACTIONS(183), 1, + sym__script_start_tag_name, + ACTIONS(185), 1, + sym__style_start_tag_name, + [915] = 4, + ACTIONS(3), 1, + sym_comment, + ACTIONS(171), 1, + anon_sym_LT_SLASH, + ACTIONS(187), 1, + sym_raw_text, + STATE(10), 1, + sym_end_tag, + [928] = 4, + ACTIONS(3), 1, + sym_comment, + ACTIONS(189), 1, + anon_sym_LT_SLASH, + ACTIONS(191), 1, + sym_raw_text, + STATE(23), 1, + sym_end_tag, + [941] = 4, + ACTIONS(3), 1, + sym_comment, + ACTIONS(189), 1, + anon_sym_LT_SLASH, + ACTIONS(193), 1, + sym_raw_text, + STATE(24), 1, + sym_end_tag, + [954] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(195), 3, + anon_sym_GT, + anon_sym_SLASH_GT, + sym_attribute_name, + [963] = 4, + ACTIONS(3), 1, + sym_comment, + ACTIONS(183), 1, + sym__script_start_tag_name, + ACTIONS(185), 1, + sym__style_start_tag_name, + ACTIONS(197), 1, + sym__start_tag_name, + [976] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(195), 2, + anon_sym_GT, + sym_attribute_name, + [984] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(199), 1, + sym__end_tag_name, + ACTIONS(201), 1, + sym_erroneous_end_tag_name, + [994] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(171), 1, + anon_sym_LT_SLASH, + STATE(16), 1, + sym_end_tag, + [1004] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(203), 2, + sym_raw_text, + anon_sym_LT_SLASH, + [1012] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(205), 1, + anon_sym_DQUOTE, + ACTIONS(207), 1, + aux_sym_quoted_attribute_value_token2, + [1022] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(175), 2, + anon_sym_GT, + sym_attribute_name, + [1030] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(177), 2, + anon_sym_GT, + sym_attribute_name, + [1038] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(209), 2, + sym_raw_text, + anon_sym_LT_SLASH, + [1046] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(211), 2, + sym_raw_text, + anon_sym_LT_SLASH, + [1054] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(213), 2, + sym_raw_text, + anon_sym_LT_SLASH, + [1062] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(201), 1, + sym_erroneous_end_tag_name, + ACTIONS(215), 1, + sym__end_tag_name, + [1072] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(189), 1, + anon_sym_LT_SLASH, + STATE(28), 1, + sym_end_tag, + [1082] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(189), 1, + anon_sym_LT_SLASH, + STATE(29), 1, + sym_end_tag, + [1092] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(171), 1, + anon_sym_LT_SLASH, + STATE(15), 1, + sym_end_tag, + [1102] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(205), 1, + anon_sym_SQUOTE, + ACTIONS(217), 1, + aux_sym_quoted_attribute_value_token1, + [1112] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(219), 1, + anon_sym_SQUOTE, + ACTIONS(221), 1, + aux_sym_quoted_attribute_value_token1, + [1122] = 3, + ACTIONS(3), 1, + sym_comment, + ACTIONS(219), 1, + anon_sym_DQUOTE, + ACTIONS(223), 1, + aux_sym_quoted_attribute_value_token2, + [1132] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(225), 1, + anon_sym_DQUOTE, + [1139] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(227), 1, + anon_sym_DQUOTE, + [1146] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(229), 1, + sym__doctype, + [1153] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(227), 1, + anon_sym_SQUOTE, + [1160] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(231), 1, + anon_sym_GT, + [1167] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(233), 1, + anon_sym_GT, + [1174] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(235), 1, + aux_sym_doctype_token1, + [1181] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(237), 1, + anon_sym_GT, + [1188] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(239), 1, + ts_builtin_sym_end, + [1195] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(241), 1, + anon_sym_GT, + [1202] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(243), 1, + sym_erroneous_end_tag_name, + [1209] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(225), 1, + anon_sym_SQUOTE, + [1216] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(245), 1, + anon_sym_GT, + [1223] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(215), 1, + sym__end_tag_name, + [1230] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(201), 1, + sym_erroneous_end_tag_name, + [1237] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(247), 1, + aux_sym_doctype_token1, + [1244] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(249), 1, + anon_sym_GT, + [1251] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(199), 1, + sym__end_tag_name, + [1258] = 2, + ACTIONS(3), 1, + sym_comment, + ACTIONS(251), 1, + sym__doctype, +}; + +static const uint32_t ts_small_parse_table_map[] = { + [SMALL_STATE(2)] = 0, + [SMALL_STATE(3)] = 44, + [SMALL_STATE(4)] = 88, + [SMALL_STATE(5)] = 132, + [SMALL_STATE(6)] = 176, + [SMALL_STATE(7)] = 217, + [SMALL_STATE(8)] = 258, + [SMALL_STATE(9)] = 299, + [SMALL_STATE(10)] = 313, + [SMALL_STATE(11)] = 327, + [SMALL_STATE(12)] = 341, + [SMALL_STATE(13)] = 355, + [SMALL_STATE(14)] = 369, + [SMALL_STATE(15)] = 383, + [SMALL_STATE(16)] = 397, + [SMALL_STATE(17)] = 411, + [SMALL_STATE(18)] = 425, + [SMALL_STATE(19)] = 439, + [SMALL_STATE(20)] = 453, + [SMALL_STATE(21)] = 467, + [SMALL_STATE(22)] = 481, + [SMALL_STATE(23)] = 495, + [SMALL_STATE(24)] = 509, + [SMALL_STATE(25)] = 523, + [SMALL_STATE(26)] = 537, + [SMALL_STATE(27)] = 551, + [SMALL_STATE(28)] = 565, + [SMALL_STATE(29)] = 579, + [SMALL_STATE(30)] = 593, + [SMALL_STATE(31)] = 607, + [SMALL_STATE(32)] = 621, + [SMALL_STATE(33)] = 635, + [SMALL_STATE(34)] = 649, + [SMALL_STATE(35)] = 663, + [SMALL_STATE(36)] = 678, + [SMALL_STATE(37)] = 695, + [SMALL_STATE(38)] = 712, + [SMALL_STATE(39)] = 729, + [SMALL_STATE(40)] = 746, + [SMALL_STATE(41)] = 760, + [SMALL_STATE(42)] = 774, + [SMALL_STATE(43)] = 788, + [SMALL_STATE(44)] = 802, + [SMALL_STATE(45)] = 816, + [SMALL_STATE(46)] = 828, + [SMALL_STATE(47)] = 844, + [SMALL_STATE(48)] = 860, + [SMALL_STATE(49)] = 873, + [SMALL_STATE(50)] = 882, + [SMALL_STATE(51)] = 891, + [SMALL_STATE(52)] = 902, + [SMALL_STATE(53)] = 915, + [SMALL_STATE(54)] = 928, + [SMALL_STATE(55)] = 941, + [SMALL_STATE(56)] = 954, + [SMALL_STATE(57)] = 963, + [SMALL_STATE(58)] = 976, + [SMALL_STATE(59)] = 984, + [SMALL_STATE(60)] = 994, + [SMALL_STATE(61)] = 1004, + [SMALL_STATE(62)] = 1012, + [SMALL_STATE(63)] = 1022, + [SMALL_STATE(64)] = 1030, + [SMALL_STATE(65)] = 1038, + [SMALL_STATE(66)] = 1046, + [SMALL_STATE(67)] = 1054, + [SMALL_STATE(68)] = 1062, + [SMALL_STATE(69)] = 1072, + [SMALL_STATE(70)] = 1082, + [SMALL_STATE(71)] = 1092, + [SMALL_STATE(72)] = 1102, + [SMALL_STATE(73)] = 1112, + [SMALL_STATE(74)] = 1122, + [SMALL_STATE(75)] = 1132, + [SMALL_STATE(76)] = 1139, + [SMALL_STATE(77)] = 1146, + [SMALL_STATE(78)] = 1153, + [SMALL_STATE(79)] = 1160, + [SMALL_STATE(80)] = 1167, + [SMALL_STATE(81)] = 1174, + [SMALL_STATE(82)] = 1181, + [SMALL_STATE(83)] = 1188, + [SMALL_STATE(84)] = 1195, + [SMALL_STATE(85)] = 1202, + [SMALL_STATE(86)] = 1209, + [SMALL_STATE(87)] = 1216, + [SMALL_STATE(88)] = 1223, + [SMALL_STATE(89)] = 1230, + [SMALL_STATE(90)] = 1237, + [SMALL_STATE(91)] = 1244, + [SMALL_STATE(92)] = 1251, + [SMALL_STATE(93)] = 1258, +}; + +static const TSParseActionEntry ts_parse_actions[] = { + [0] = {.entry = {.count = 0, .reusable = false}}, + [1] = {.entry = {.count = 1, .reusable = false}}, RECOVER(), + [3] = {.entry = {.count = 1, .reusable = true}}, SHIFT_EXTRA(), + [5] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_document, 0, 0, 0), + [7] = {.entry = {.count = 1, .reusable = true}}, SHIFT(77), + [9] = {.entry = {.count = 1, .reusable = false}}, SHIFT(52), + [11] = {.entry = {.count = 1, .reusable = true}}, SHIFT(85), + [13] = {.entry = {.count = 1, .reusable = true}}, SHIFT(7), + [15] = {.entry = {.count = 1, .reusable = true}}, SHIFT(93), + [17] = {.entry = {.count = 1, .reusable = false}}, SHIFT(57), + [19] = {.entry = {.count = 1, .reusable = true}}, SHIFT(68), + [21] = {.entry = {.count = 1, .reusable = true}}, SHIFT(3), + [23] = {.entry = {.count = 1, .reusable = true}}, SHIFT(32), + [25] = {.entry = {.count = 1, .reusable = true}}, SHIFT(6), + [27] = {.entry = {.count = 1, .reusable = true}}, SHIFT(14), + [29] = {.entry = {.count = 1, .reusable = true}}, SHIFT(59), + [31] = {.entry = {.count = 1, .reusable = true}}, SHIFT(27), + [33] = {.entry = {.count = 1, .reusable = true}}, SHIFT(4), + [35] = {.entry = {.count = 1, .reusable = true}}, SHIFT(22), + [37] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), SHIFT_REPEAT(93), + [40] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), SHIFT_REPEAT(57), + [43] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), SHIFT_REPEAT(89), + [46] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), SHIFT_REPEAT(6), + [49] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), + [51] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_document, 1, 0, 0), + [53] = {.entry = {.count = 1, .reusable = true}}, SHIFT(8), + [55] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), SHIFT_REPEAT(77), + [58] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), SHIFT_REPEAT(52), + [61] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), SHIFT_REPEAT(85), + [64] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_document_repeat1, 2, 0, 0), SHIFT_REPEAT(8), + [67] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_end_tag, 3, 0, 0), + [69] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_end_tag, 3, 0, 0), + [71] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_style_element, 2, 0, 0), + [73] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_style_element, 2, 0, 0), + [75] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_start_tag, 3, 0, 0), + [77] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_start_tag, 3, 0, 0), + [79] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_self_closing_tag, 3, 0, 0), + [81] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_self_closing_tag, 3, 0, 0), + [83] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_erroneous_end_tag, 3, 0, 0), + [85] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_erroneous_end_tag, 3, 0, 0), + [87] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_element, 3, 0, 0), + [89] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_element, 3, 0, 0), + [91] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_script_element, 3, 0, 0), + [93] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_script_element, 3, 0, 0), + [95] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_style_element, 3, 0, 0), + [97] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_style_element, 3, 0, 0), + [99] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_doctype, 4, 0, 0), + [101] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_doctype, 4, 0, 0), + [103] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_start_tag, 4, 0, 0), + [105] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_start_tag, 4, 0, 0), + [107] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_script_element, 2, 0, 0), + [109] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_script_element, 2, 0, 0), + [111] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_element, 1, 0, 0), + [113] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_element, 1, 0, 0), + [115] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_element, 2, 0, 0), + [117] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_element, 2, 0, 0), + [119] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_self_closing_tag, 4, 0, 0), + [121] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_self_closing_tag, 4, 0, 0), + [123] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_start_tag_repeat1, 2, 0, 0), + [125] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_start_tag_repeat1, 2, 0, 0), SHIFT_REPEAT(45), + [128] = {.entry = {.count = 1, .reusable = true}}, SHIFT(18), + [130] = {.entry = {.count = 1, .reusable = true}}, SHIFT(34), + [132] = {.entry = {.count = 1, .reusable = true}}, SHIFT(45), + [134] = {.entry = {.count = 1, .reusable = true}}, SHIFT(11), + [136] = {.entry = {.count = 1, .reusable = true}}, SHIFT(25), + [138] = {.entry = {.count = 1, .reusable = true}}, SHIFT(31), + [140] = {.entry = {.count = 1, .reusable = true}}, SHIFT(12), + [142] = {.entry = {.count = 1, .reusable = true}}, SHIFT(67), + [144] = {.entry = {.count = 1, .reusable = true}}, SHIFT(51), + [146] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_start_tag_repeat1, 2, 0, 0), SHIFT_REPEAT(51), + [149] = {.entry = {.count = 1, .reusable = true}}, SHIFT(66), + [151] = {.entry = {.count = 1, .reusable = true}}, SHIFT(61), + [153] = {.entry = {.count = 1, .reusable = true}}, SHIFT(65), + [155] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_attribute, 1, 0, 0), + [157] = {.entry = {.count = 1, .reusable = true}}, SHIFT(46), + [159] = {.entry = {.count = 1, .reusable = true}}, SHIFT(56), + [161] = {.entry = {.count = 1, .reusable = true}}, SHIFT(72), + [163] = {.entry = {.count = 1, .reusable = true}}, SHIFT(62), + [165] = {.entry = {.count = 1, .reusable = true}}, SHIFT(58), + [167] = {.entry = {.count = 1, .reusable = true}}, SHIFT(73), + [169] = {.entry = {.count = 1, .reusable = true}}, SHIFT(74), + [171] = {.entry = {.count = 1, .reusable = true}}, SHIFT(88), + [173] = {.entry = {.count = 1, .reusable = true}}, SHIFT(71), + [175] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_quoted_attribute_value, 2, 0, 0), + [177] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_quoted_attribute_value, 3, 0, 0), + [179] = {.entry = {.count = 1, .reusable = true}}, SHIFT(47), + [181] = {.entry = {.count = 1, .reusable = true}}, SHIFT(39), + [183] = {.entry = {.count = 1, .reusable = true}}, SHIFT(43), + [185] = {.entry = {.count = 1, .reusable = true}}, SHIFT(42), + [187] = {.entry = {.count = 1, .reusable = true}}, SHIFT(60), + [189] = {.entry = {.count = 1, .reusable = true}}, SHIFT(92), + [191] = {.entry = {.count = 1, .reusable = true}}, SHIFT(69), + [193] = {.entry = {.count = 1, .reusable = true}}, SHIFT(70), + [195] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_attribute, 3, 0, 0), + [197] = {.entry = {.count = 1, .reusable = true}}, SHIFT(37), + [199] = {.entry = {.count = 1, .reusable = true}}, SHIFT(82), + [201] = {.entry = {.count = 1, .reusable = true}}, SHIFT(91), + [203] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_script_start_tag, 3, 0, 0), + [205] = {.entry = {.count = 1, .reusable = false}}, SHIFT(49), + [207] = {.entry = {.count = 1, .reusable = true}}, SHIFT(76), + [209] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_script_start_tag, 4, 0, 0), + [211] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_style_start_tag, 3, 0, 0), + [213] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_style_start_tag, 4, 0, 0), + [215] = {.entry = {.count = 1, .reusable = true}}, SHIFT(87), + [217] = {.entry = {.count = 1, .reusable = true}}, SHIFT(78), + [219] = {.entry = {.count = 1, .reusable = false}}, SHIFT(63), + [221] = {.entry = {.count = 1, .reusable = true}}, SHIFT(86), + [223] = {.entry = {.count = 1, .reusable = true}}, SHIFT(75), + [225] = {.entry = {.count = 1, .reusable = true}}, SHIFT(64), + [227] = {.entry = {.count = 1, .reusable = true}}, SHIFT(50), + [229] = {.entry = {.count = 1, .reusable = true}}, SHIFT(81), + [231] = {.entry = {.count = 1, .reusable = true}}, SHIFT(17), + [233] = {.entry = {.count = 1, .reusable = true}}, SHIFT(30), + [235] = {.entry = {.count = 1, .reusable = true}}, SHIFT(79), + [237] = {.entry = {.count = 1, .reusable = true}}, SHIFT(9), + [239] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), + [241] = {.entry = {.count = 1, .reusable = true}}, SHIFT(13), + [243] = {.entry = {.count = 1, .reusable = true}}, SHIFT(84), + [245] = {.entry = {.count = 1, .reusable = true}}, SHIFT(20), + [247] = {.entry = {.count = 1, .reusable = true}}, SHIFT(80), + [249] = {.entry = {.count = 1, .reusable = true}}, SHIFT(26), + [251] = {.entry = {.count = 1, .reusable = true}}, SHIFT(90), +}; + +enum ts_external_scanner_symbol_identifiers { + ts_external_token__start_tag_name = 0, + ts_external_token__script_start_tag_name = 1, + ts_external_token__style_start_tag_name = 2, + ts_external_token__end_tag_name = 3, + ts_external_token_erroneous_end_tag_name = 4, + ts_external_token_SLASH_GT = 5, + ts_external_token__implicit_end_tag = 6, + ts_external_token_raw_text = 7, + ts_external_token_comment = 8, +}; + +static const TSSymbol ts_external_scanner_symbol_map[EXTERNAL_TOKEN_COUNT] = { + [ts_external_token__start_tag_name] = sym__start_tag_name, + [ts_external_token__script_start_tag_name] = sym__script_start_tag_name, + [ts_external_token__style_start_tag_name] = sym__style_start_tag_name, + [ts_external_token__end_tag_name] = sym__end_tag_name, + [ts_external_token_erroneous_end_tag_name] = sym_erroneous_end_tag_name, + [ts_external_token_SLASH_GT] = anon_sym_SLASH_GT, + [ts_external_token__implicit_end_tag] = sym__implicit_end_tag, + [ts_external_token_raw_text] = sym_raw_text, + [ts_external_token_comment] = sym_comment, +}; + +static const bool ts_external_scanner_states[10][EXTERNAL_TOKEN_COUNT] = { + [1] = { + [ts_external_token__start_tag_name] = true, + [ts_external_token__script_start_tag_name] = true, + [ts_external_token__style_start_tag_name] = true, + [ts_external_token__end_tag_name] = true, + [ts_external_token_erroneous_end_tag_name] = true, + [ts_external_token_SLASH_GT] = true, + [ts_external_token__implicit_end_tag] = true, + [ts_external_token_raw_text] = true, + [ts_external_token_comment] = true, + }, + [2] = { + [ts_external_token_comment] = true, + }, + [3] = { + [ts_external_token__implicit_end_tag] = true, + [ts_external_token_comment] = true, + }, + [4] = { + [ts_external_token_SLASH_GT] = true, + [ts_external_token_comment] = true, + }, + [5] = { + [ts_external_token_raw_text] = true, + [ts_external_token_comment] = true, + }, + [6] = { + [ts_external_token__start_tag_name] = true, + [ts_external_token__script_start_tag_name] = true, + [ts_external_token__style_start_tag_name] = true, + [ts_external_token_comment] = true, + }, + [7] = { + [ts_external_token__end_tag_name] = true, + [ts_external_token_erroneous_end_tag_name] = true, + [ts_external_token_comment] = true, + }, + [8] = { + [ts_external_token_erroneous_end_tag_name] = true, + [ts_external_token_comment] = true, + }, + [9] = { + [ts_external_token__end_tag_name] = true, + [ts_external_token_comment] = true, + }, +}; + +#ifdef __cplusplus +extern "C" { +#endif +void *tree_sitter_html_external_scanner_create(void); +void tree_sitter_html_external_scanner_destroy(void *); +bool tree_sitter_html_external_scanner_scan(void *, TSLexer *, const bool *); +unsigned tree_sitter_html_external_scanner_serialize(void *, char *); +void tree_sitter_html_external_scanner_deserialize(void *, const char *, unsigned); + +#ifdef TREE_SITTER_HIDE_SYMBOLS +#define TS_PUBLIC +#elif defined(_WIN32) +#define TS_PUBLIC __declspec(dllexport) +#else +#define TS_PUBLIC __attribute__((visibility("default"))) +#endif + +TS_PUBLIC const TSLanguage *tree_sitter_html(void) { + static const TSLanguage language = { + .version = LANGUAGE_VERSION, + .symbol_count = SYMBOL_COUNT, + .alias_count = ALIAS_COUNT, + .token_count = TOKEN_COUNT, + .external_token_count = EXTERNAL_TOKEN_COUNT, + .state_count = STATE_COUNT, + .large_state_count = LARGE_STATE_COUNT, + .production_id_count = PRODUCTION_ID_COUNT, + .field_count = FIELD_COUNT, + .max_alias_sequence_length = MAX_ALIAS_SEQUENCE_LENGTH, + .parse_table = &ts_parse_table[0][0], + .small_parse_table = ts_small_parse_table, + .small_parse_table_map = ts_small_parse_table_map, + .parse_actions = ts_parse_actions, + .symbol_names = ts_symbol_names, + .symbol_metadata = ts_symbol_metadata, + .public_symbol_map = ts_symbol_map, + .alias_map = ts_non_terminal_alias_map, + .alias_sequences = &ts_alias_sequences[0][0], + .lex_modes = ts_lex_modes, + .lex_fn = ts_lex, + .external_scanner = { + &ts_external_scanner_states[0][0], + ts_external_scanner_symbol_map, + tree_sitter_html_external_scanner_create, + tree_sitter_html_external_scanner_destroy, + tree_sitter_html_external_scanner_scan, + tree_sitter_html_external_scanner_serialize, + tree_sitter_html_external_scanner_deserialize, + }, + .primary_state_ids = ts_primary_state_ids, + }; + return &language; +} +#ifdef __cplusplus +} +#endif diff --git a/test-parsers/tree-sitter-html/src/scanner.c b/test-parsers/tree-sitter-html/src/scanner.c new file mode 100644 index 00000000..eecef9ad --- /dev/null +++ b/test-parsers/tree-sitter-html/src/scanner.c @@ -0,0 +1,362 @@ +#include "tag.h" +#include "tree_sitter/parser.h" + +#include + +enum TokenType { + START_TAG_NAME, + SCRIPT_START_TAG_NAME, + STYLE_START_TAG_NAME, + END_TAG_NAME, + ERRONEOUS_END_TAG_NAME, + SELF_CLOSING_TAG_DELIMITER, + IMPLICIT_END_TAG, + RAW_TEXT, + COMMENT, +}; + +typedef struct { + Array(Tag) tags; +} Scanner; + +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +static inline void advance(TSLexer *lexer) { lexer->advance(lexer, false); } + +static inline void skip(TSLexer *lexer) { lexer->advance(lexer, true); } + +static unsigned serialize(Scanner *scanner, char *buffer) { + uint16_t tag_count = scanner->tags.size > UINT16_MAX ? UINT16_MAX : scanner->tags.size; + uint16_t serialized_tag_count = 0; + + unsigned size = sizeof(tag_count); + memcpy(&buffer[size], &tag_count, sizeof(tag_count)); + size += sizeof(tag_count); + + for (; serialized_tag_count < tag_count; serialized_tag_count++) { + Tag tag = scanner->tags.contents[serialized_tag_count]; + if (tag.type == CUSTOM) { + unsigned name_length = tag.custom_tag_name.size; + if (name_length > UINT8_MAX) { + name_length = UINT8_MAX; + } + if (size + 2 + name_length >= TREE_SITTER_SERIALIZATION_BUFFER_SIZE) { + break; + } + buffer[size++] = (char)tag.type; + buffer[size++] = (char)name_length; + strncpy(&buffer[size], tag.custom_tag_name.contents, name_length); + size += name_length; + } else { + if (size + 1 >= TREE_SITTER_SERIALIZATION_BUFFER_SIZE) { + break; + } + buffer[size++] = (char)tag.type; + } + } + + memcpy(&buffer[0], &serialized_tag_count, sizeof(serialized_tag_count)); + return size; +} + +static void deserialize(Scanner *scanner, const char *buffer, unsigned length) { + for (unsigned i = 0; i < scanner->tags.size; i++) { + tag_free(&scanner->tags.contents[i]); + } + array_clear(&scanner->tags); + + if (length > 0) { + unsigned size = 0; + uint16_t tag_count = 0; + uint16_t serialized_tag_count = 0; + + memcpy(&serialized_tag_count, &buffer[size], sizeof(serialized_tag_count)); + size += sizeof(serialized_tag_count); + + memcpy(&tag_count, &buffer[size], sizeof(tag_count)); + size += sizeof(tag_count); + + array_reserve(&scanner->tags, tag_count); + if (tag_count > 0) { + unsigned iter = 0; + for (iter = 0; iter < serialized_tag_count; iter++) { + Tag tag = tag_new(); + tag.type = (TagType)buffer[size++]; + if (tag.type == CUSTOM) { + uint16_t name_length = (uint8_t)buffer[size++]; + array_reserve(&tag.custom_tag_name, name_length); + tag.custom_tag_name.size = name_length; + memcpy(tag.custom_tag_name.contents, &buffer[size], name_length); + size += name_length; + } + array_push(&scanner->tags, tag); + } + // add zero tags if we didn't read enough, this is because the + // buffer had no more room but we held more tags. + for (; iter < tag_count; iter++) { + array_push(&scanner->tags, tag_new()); + } + } + } +} + +static String scan_tag_name(TSLexer *lexer) { + String tag_name = array_new(); + while (iswalnum(lexer->lookahead) || lexer->lookahead == '-' || lexer->lookahead == ':') { + array_push(&tag_name, towupper(lexer->lookahead)); + advance(lexer); + } + return tag_name; +} + +static bool scan_comment(TSLexer *lexer) { + if (lexer->lookahead != '-') { + return false; + } + advance(lexer); + if (lexer->lookahead != '-') { + return false; + } + advance(lexer); + + unsigned dashes = 0; + while (lexer->lookahead) { + switch (lexer->lookahead) { + case '-': + ++dashes; + break; + case '>': + if (dashes >= 2) { + lexer->result_symbol = COMMENT; + advance(lexer); + lexer->mark_end(lexer); + return true; + } + default: + dashes = 0; + } + advance(lexer); + } + return false; +} + +static bool scan_raw_text(Scanner *scanner, TSLexer *lexer) { + if (scanner->tags.size == 0) { + return false; + } + + lexer->mark_end(lexer); + + const char *end_delimiter = array_back(&scanner->tags)->type == SCRIPT ? "lookahead) { + if (towupper(lexer->lookahead) == end_delimiter[delimiter_index]) { + delimiter_index++; + if (delimiter_index == strlen(end_delimiter)) { + break; + } + advance(lexer); + } else { + delimiter_index = 0; + advance(lexer); + lexer->mark_end(lexer); + } + } + + lexer->result_symbol = RAW_TEXT; + return true; +} + +static void pop_tag(Scanner *scanner) { + Tag popped_tag = array_pop(&scanner->tags); + tag_free(&popped_tag); +} + +static bool scan_implicit_end_tag(Scanner *scanner, TSLexer *lexer) { + Tag *parent = scanner->tags.size == 0 ? NULL : array_back(&scanner->tags); + + bool is_closing_tag = false; + if (lexer->lookahead == '/') { + is_closing_tag = true; + advance(lexer); + } else { + if (parent && tag_is_void(parent)) { + pop_tag(scanner); + lexer->result_symbol = IMPLICIT_END_TAG; + return true; + } + } + + String tag_name = scan_tag_name(lexer); + if (tag_name.size == 0 && !lexer->eof(lexer)) { + array_delete(&tag_name); + return false; + } + + Tag next_tag = tag_for_name(tag_name); + + if (is_closing_tag) { + // The tag correctly closes the topmost element on the stack + if (scanner->tags.size > 0 && tag_eq(array_back(&scanner->tags), &next_tag)) { + tag_free(&next_tag); + return false; + } + + // Otherwise, dig deeper and queue implicit end tags (to be nice in + // the case of malformed HTML) + for (unsigned i = scanner->tags.size; i > 0; i--) { + if (scanner->tags.contents[i - 1].type == next_tag.type) { + pop_tag(scanner); + lexer->result_symbol = IMPLICIT_END_TAG; + tag_free(&next_tag); + return true; + } + } + } else if ( + parent && + ( + !tag_can_contain(parent, &next_tag) || + ((parent->type == HTML || parent->type == HEAD || parent->type == BODY) && lexer->eof(lexer)) + ) + ) { + pop_tag(scanner); + lexer->result_symbol = IMPLICIT_END_TAG; + tag_free(&next_tag); + return true; + } + + tag_free(&next_tag); + return false; +} + +static bool scan_start_tag_name(Scanner *scanner, TSLexer *lexer) { + String tag_name = scan_tag_name(lexer); + if (tag_name.size == 0) { + array_delete(&tag_name); + return false; + } + + Tag tag = tag_for_name(tag_name); + array_push(&scanner->tags, tag); + switch (tag.type) { + case SCRIPT: + lexer->result_symbol = SCRIPT_START_TAG_NAME; + break; + case STYLE: + lexer->result_symbol = STYLE_START_TAG_NAME; + break; + default: + lexer->result_symbol = START_TAG_NAME; + break; + } + return true; +} + +static bool scan_end_tag_name(Scanner *scanner, TSLexer *lexer) { + String tag_name = scan_tag_name(lexer); + + if (tag_name.size == 0) { + array_delete(&tag_name); + return false; + } + + Tag tag = tag_for_name(tag_name); + if (scanner->tags.size > 0 && tag_eq(array_back(&scanner->tags), &tag)) { + pop_tag(scanner); + lexer->result_symbol = END_TAG_NAME; + } else { + lexer->result_symbol = ERRONEOUS_END_TAG_NAME; + } + + tag_free(&tag); + return true; +} + +static bool scan_self_closing_tag_delimiter(Scanner *scanner, TSLexer *lexer) { + advance(lexer); + if (lexer->lookahead == '>') { + advance(lexer); + if (scanner->tags.size > 0) { + pop_tag(scanner); + lexer->result_symbol = SELF_CLOSING_TAG_DELIMITER; + } + return true; + } + return false; +} + +static bool scan(Scanner *scanner, TSLexer *lexer, const bool *valid_symbols) { + if (valid_symbols[RAW_TEXT] && !valid_symbols[START_TAG_NAME] && !valid_symbols[END_TAG_NAME]) { + return scan_raw_text(scanner, lexer); + } + + while (iswspace(lexer->lookahead)) { + skip(lexer); + } + + switch (lexer->lookahead) { + case '<': + lexer->mark_end(lexer); + advance(lexer); + + if (lexer->lookahead == '!') { + advance(lexer); + return scan_comment(lexer); + } + + if (valid_symbols[IMPLICIT_END_TAG]) { + return scan_implicit_end_tag(scanner, lexer); + } + break; + + case '\0': + if (valid_symbols[IMPLICIT_END_TAG]) { + return scan_implicit_end_tag(scanner, lexer); + } + break; + + case '/': + if (valid_symbols[SELF_CLOSING_TAG_DELIMITER]) { + return scan_self_closing_tag_delimiter(scanner, lexer); + } + break; + + default: + if ((valid_symbols[START_TAG_NAME] || valid_symbols[END_TAG_NAME]) && !valid_symbols[RAW_TEXT]) { + return valid_symbols[START_TAG_NAME] ? scan_start_tag_name(scanner, lexer) + : scan_end_tag_name(scanner, lexer); + } + } + + return false; +} + +void *tree_sitter_html_external_scanner_create() { + Scanner *scanner = (Scanner *)ts_calloc(1, sizeof(Scanner)); + return scanner; +} + +bool tree_sitter_html_external_scanner_scan(void *payload, TSLexer *lexer, const bool *valid_symbols) { + Scanner *scanner = (Scanner *)payload; + return scan(scanner, lexer, valid_symbols); +} + +unsigned tree_sitter_html_external_scanner_serialize(void *payload, char *buffer) { + Scanner *scanner = (Scanner *)payload; + return serialize(scanner, buffer); +} + +void tree_sitter_html_external_scanner_deserialize(void *payload, const char *buffer, unsigned length) { + Scanner *scanner = (Scanner *)payload; + deserialize(scanner, buffer, length); +} + +void tree_sitter_html_external_scanner_destroy(void *payload) { + Scanner *scanner = (Scanner *)payload; + for (unsigned i = 0; i < scanner->tags.size; i++) { + tag_free(&scanner->tags.contents[i]); + } + array_delete(&scanner->tags); + ts_free(scanner); +} diff --git a/test-parsers/tree-sitter-html/src/tag.h b/test-parsers/tree-sitter-html/src/tag.h new file mode 100644 index 00000000..b8dd7ff7 --- /dev/null +++ b/test-parsers/tree-sitter-html/src/tag.h @@ -0,0 +1,385 @@ +#include "tree_sitter/array.h" + +#include + +typedef enum { + AREA, + BASE, + BASEFONT, + BGSOUND, + BR, + COL, + COMMAND, + EMBED, + FRAME, + HR, + IMAGE, + IMG, + INPUT, + ISINDEX, + KEYGEN, + LINK, + MENUITEM, + META, + NEXTID, + PARAM, + SOURCE, + TRACK, + WBR, + END_OF_VOID_TAGS, + + A, + ABBR, + ADDRESS, + ARTICLE, + ASIDE, + AUDIO, + B, + BDI, + BDO, + BLOCKQUOTE, + BODY, + BUTTON, + CANVAS, + CAPTION, + CITE, + CODE, + COLGROUP, + DATA, + DATALIST, + DD, + DEL, + DETAILS, + DFN, + DIALOG, + DIV, + DL, + DT, + EM, + FIELDSET, + FIGCAPTION, + FIGURE, + FOOTER, + FORM, + H1, + H2, + H3, + H4, + H5, + H6, + HEAD, + HEADER, + HGROUP, + HTML, + I, + IFRAME, + INS, + KBD, + LABEL, + LEGEND, + LI, + MAIN, + MAP, + MARK, + MATH, + MENU, + METER, + NAV, + NOSCRIPT, + OBJECT, + OL, + OPTGROUP, + OPTION, + OUTPUT, + P, + PICTURE, + PRE, + PROGRESS, + Q, + RB, + RP, + RT, + RTC, + RUBY, + S, + SAMP, + SCRIPT, + SECTION, + SELECT, + SLOT, + SMALL, + SPAN, + STRONG, + STYLE, + SUB, + SUMMARY, + SUP, + SVG, + TABLE, + TBODY, + TD, + TEMPLATE, + TEXTAREA, + TFOOT, + TH, + THEAD, + TIME, + TITLE, + TR, + U, + UL, + VAR, + VIDEO, + + CUSTOM, + + END_, +} TagType; + +typedef Array(char) String; + +typedef struct { + char tag_name[16]; + TagType tag_type; +} TagMapEntry; + +typedef struct { + TagType type; + String custom_tag_name; +} Tag; + +static const TagMapEntry TAG_TYPES_BY_TAG_NAME[126] = { + {"AREA", AREA }, + {"BASE", BASE }, + {"BASEFONT", BASEFONT }, + {"BGSOUND", BGSOUND }, + {"BR", BR }, + {"COL", COL }, + {"COMMAND", COMMAND }, + {"EMBED", EMBED }, + {"FRAME", FRAME }, + {"HR", HR }, + {"IMAGE", IMAGE }, + {"IMG", IMG }, + {"INPUT", INPUT }, + {"ISINDEX", ISINDEX }, + {"KEYGEN", KEYGEN }, + {"LINK", LINK }, + {"MENUITEM", MENUITEM }, + {"META", META }, + {"NEXTID", NEXTID }, + {"PARAM", PARAM }, + {"SOURCE", SOURCE }, + {"TRACK", TRACK }, + {"WBR", WBR }, + {"A", A }, + {"ABBR", ABBR }, + {"ADDRESS", ADDRESS }, + {"ARTICLE", ARTICLE }, + {"ASIDE", ASIDE }, + {"AUDIO", AUDIO }, + {"B", B }, + {"BDI", BDI }, + {"BDO", BDO }, + {"BLOCKQUOTE", BLOCKQUOTE}, + {"BODY", BODY }, + {"BUTTON", BUTTON }, + {"CANVAS", CANVAS }, + {"CAPTION", CAPTION }, + {"CITE", CITE }, + {"CODE", CODE }, + {"COLGROUP", COLGROUP }, + {"DATA", DATA }, + {"DATALIST", DATALIST }, + {"DD", DD }, + {"DEL", DEL }, + {"DETAILS", DETAILS }, + {"DFN", DFN }, + {"DIALOG", DIALOG }, + {"DIV", DIV }, + {"DL", DL }, + {"DT", DT }, + {"EM", EM }, + {"FIELDSET", FIELDSET }, + {"FIGCAPTION", FIGCAPTION}, + {"FIGURE", FIGURE }, + {"FOOTER", FOOTER }, + {"FORM", FORM }, + {"H1", H1 }, + {"H2", H2 }, + {"H3", H3 }, + {"H4", H4 }, + {"H5", H5 }, + {"H6", H6 }, + {"HEAD", HEAD }, + {"HEADER", HEADER }, + {"HGROUP", HGROUP }, + {"HTML", HTML }, + {"I", I }, + {"IFRAME", IFRAME }, + {"INS", INS }, + {"KBD", KBD }, + {"LABEL", LABEL }, + {"LEGEND", LEGEND }, + {"LI", LI }, + {"MAIN", MAIN }, + {"MAP", MAP }, + {"MARK", MARK }, + {"MATH", MATH }, + {"MENU", MENU }, + {"METER", METER }, + {"NAV", NAV }, + {"NOSCRIPT", NOSCRIPT }, + {"OBJECT", OBJECT }, + {"OL", OL }, + {"OPTGROUP", OPTGROUP }, + {"OPTION", OPTION }, + {"OUTPUT", OUTPUT }, + {"P", P }, + {"PICTURE", PICTURE }, + {"PRE", PRE }, + {"PROGRESS", PROGRESS }, + {"Q", Q }, + {"RB", RB }, + {"RP", RP }, + {"RT", RT }, + {"RTC", RTC }, + {"RUBY", RUBY }, + {"S", S }, + {"SAMP", SAMP }, + {"SCRIPT", SCRIPT }, + {"SECTION", SECTION }, + {"SELECT", SELECT }, + {"SLOT", SLOT }, + {"SMALL", SMALL }, + {"SPAN", SPAN }, + {"STRONG", STRONG }, + {"STYLE", STYLE }, + {"SUB", SUB }, + {"SUMMARY", SUMMARY }, + {"SUP", SUP }, + {"SVG", SVG }, + {"TABLE", TABLE }, + {"TBODY", TBODY }, + {"TD", TD }, + {"TEMPLATE", TEMPLATE }, + {"TEXTAREA", TEXTAREA }, + {"TFOOT", TFOOT }, + {"TH", TH }, + {"THEAD", THEAD }, + {"TIME", TIME }, + {"TITLE", TITLE }, + {"TR", TR }, + {"U", U }, + {"UL", UL }, + {"VAR", VAR }, + {"VIDEO", VIDEO }, + {"CUSTOM", CUSTOM }, +}; + +static const TagType TAG_TYPES_NOT_ALLOWED_IN_PARAGRAPHS[] = { + ADDRESS, ARTICLE, ASIDE, BLOCKQUOTE, DETAILS, DIV, DL, + FIELDSET, FIGCAPTION, FIGURE, FOOTER, FORM, H1, H2, + H3, H4, H5, H6, HEADER, HR, MAIN, + NAV, OL, P, PRE, SECTION, +}; + +static TagType tag_type_for_name(const String *tag_name) { + for (int i = 0; i < 126; i++) { + const TagMapEntry *entry = &TAG_TYPES_BY_TAG_NAME[i]; + if ( + strlen(entry->tag_name) == tag_name->size && + memcmp(tag_name->contents, entry->tag_name, tag_name->size) == 0 + ) { + return entry->tag_type; + } + } + return CUSTOM; +} + +static inline Tag tag_new() { + Tag tag; + tag.type = END_; + tag.custom_tag_name = (String) array_new(); + return tag; +} + +static inline Tag tag_for_name(String name) { + Tag tag = tag_new(); + tag.type = tag_type_for_name(&name); + if (tag.type == CUSTOM) { + tag.custom_tag_name = name; + } else { + array_delete(&name); + } + return tag; +} + +static inline void tag_free(Tag *tag) { + if (tag->type == CUSTOM) { + array_delete(&tag->custom_tag_name); + } +} + +static inline bool tag_is_void(const Tag *self) { + return self->type < END_OF_VOID_TAGS; +} + +static inline bool tag_eq(const Tag *self, const Tag *other) { + if (self->type != other->type) return false; + if (self->type == CUSTOM) { + if (self->custom_tag_name.size != other->custom_tag_name.size) { + return false; + } + if (memcmp( + self->custom_tag_name.contents, + other->custom_tag_name.contents, + self->custom_tag_name.size + ) != 0) { + return false; + } + } + return true; +} + +static bool tag_can_contain(Tag *self, const Tag *other) { + TagType child = other->type; + + switch (self->type) { + case LI: + return child != LI; + + case DT: + case DD: + return child != DT && child != DD; + + case P: + for (int i = 0; i < 26; i++) { + if (child == TAG_TYPES_NOT_ALLOWED_IN_PARAGRAPHS[i]) { + return false; + } + } + return true; + + case COLGROUP: + return child == COL; + + case RB: + case RT: + case RP: + return child != RB && child != RT && child != RP; + + case OPTGROUP: + return child != OPTGROUP; + + case TR: + return child != TR; + + case TD: + case TH: + return child != TD && child != TH && child != TR; + + default: + return true; + } +} diff --git a/test-parsers/tree-sitter-html/src/tree_sitter/alloc.h b/test-parsers/tree-sitter-html/src/tree_sitter/alloc.h new file mode 100644 index 00000000..1f4466d7 --- /dev/null +++ b/test-parsers/tree-sitter-html/src/tree_sitter/alloc.h @@ -0,0 +1,54 @@ +#ifndef TREE_SITTER_ALLOC_H_ +#define TREE_SITTER_ALLOC_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +// Allow clients to override allocation functions +#ifdef TREE_SITTER_REUSE_ALLOCATOR + +extern void *(*ts_current_malloc)(size_t); +extern void *(*ts_current_calloc)(size_t, size_t); +extern void *(*ts_current_realloc)(void *, size_t); +extern void (*ts_current_free)(void *); + +#ifndef ts_malloc +#define ts_malloc ts_current_malloc +#endif +#ifndef ts_calloc +#define ts_calloc ts_current_calloc +#endif +#ifndef ts_realloc +#define ts_realloc ts_current_realloc +#endif +#ifndef ts_free +#define ts_free ts_current_free +#endif + +#else + +#ifndef ts_malloc +#define ts_malloc malloc +#endif +#ifndef ts_calloc +#define ts_calloc calloc +#endif +#ifndef ts_realloc +#define ts_realloc realloc +#endif +#ifndef ts_free +#define ts_free free +#endif + +#endif + +#ifdef __cplusplus +} +#endif + +#endif // TREE_SITTER_ALLOC_H_ diff --git a/test-parsers/tree-sitter-html/src/tree_sitter/array.h b/test-parsers/tree-sitter-html/src/tree_sitter/array.h new file mode 100644 index 00000000..15a3b233 --- /dev/null +++ b/test-parsers/tree-sitter-html/src/tree_sitter/array.h @@ -0,0 +1,290 @@ +#ifndef TREE_SITTER_ARRAY_H_ +#define TREE_SITTER_ARRAY_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "./alloc.h" + +#include +#include +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning(disable : 4101) +#elif defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-variable" +#endif + +#define Array(T) \ + struct { \ + T *contents; \ + uint32_t size; \ + uint32_t capacity; \ + } + +/// Initialize an array. +#define array_init(self) \ + ((self)->size = 0, (self)->capacity = 0, (self)->contents = NULL) + +/// Create an empty array. +#define array_new() \ + { NULL, 0, 0 } + +/// Get a pointer to the element at a given `index` in the array. +#define array_get(self, _index) \ + (assert((uint32_t)(_index) < (self)->size), &(self)->contents[_index]) + +/// Get a pointer to the first element in the array. +#define array_front(self) array_get(self, 0) + +/// Get a pointer to the last element in the array. +#define array_back(self) array_get(self, (self)->size - 1) + +/// Clear the array, setting its size to zero. Note that this does not free any +/// memory allocated for the array's contents. +#define array_clear(self) ((self)->size = 0) + +/// Reserve `new_capacity` elements of space in the array. If `new_capacity` is +/// less than the array's current capacity, this function has no effect. +#define array_reserve(self, new_capacity) \ + _array__reserve((Array *)(self), array_elem_size(self), new_capacity) + +/// Free any memory allocated for this array. Note that this does not free any +/// memory allocated for the array's contents. +#define array_delete(self) _array__delete((Array *)(self)) + +/// Push a new `element` onto the end of the array. +#define array_push(self, element) \ + (_array__grow((Array *)(self), 1, array_elem_size(self)), \ + (self)->contents[(self)->size++] = (element)) + +/// Increase the array's size by `count` elements. +/// New elements are zero-initialized. +#define array_grow_by(self, count) \ + do { \ + if ((count) == 0) break; \ + _array__grow((Array *)(self), count, array_elem_size(self)); \ + memset((self)->contents + (self)->size, 0, (count) * array_elem_size(self)); \ + (self)->size += (count); \ + } while (0) + +/// Append all elements from one array to the end of another. +#define array_push_all(self, other) \ + array_extend((self), (other)->size, (other)->contents) + +/// Append `count` elements to the end of the array, reading their values from the +/// `contents` pointer. +#define array_extend(self, count, contents) \ + _array__splice( \ + (Array *)(self), array_elem_size(self), (self)->size, \ + 0, count, contents \ + ) + +/// Remove `old_count` elements from the array starting at the given `index`. At +/// the same index, insert `new_count` new elements, reading their values from the +/// `new_contents` pointer. +#define array_splice(self, _index, old_count, new_count, new_contents) \ + _array__splice( \ + (Array *)(self), array_elem_size(self), _index, \ + old_count, new_count, new_contents \ + ) + +/// Insert one `element` into the array at the given `index`. +#define array_insert(self, _index, element) \ + _array__splice((Array *)(self), array_elem_size(self), _index, 0, 1, &(element)) + +/// Remove one element from the array at the given `index`. +#define array_erase(self, _index) \ + _array__erase((Array *)(self), array_elem_size(self), _index) + +/// Pop the last element off the array, returning the element by value. +#define array_pop(self) ((self)->contents[--(self)->size]) + +/// Assign the contents of one array to another, reallocating if necessary. +#define array_assign(self, other) \ + _array__assign((Array *)(self), (const Array *)(other), array_elem_size(self)) + +/// Swap one array with another +#define array_swap(self, other) \ + _array__swap((Array *)(self), (Array *)(other)) + +/// Get the size of the array contents +#define array_elem_size(self) (sizeof *(self)->contents) + +/// Search a sorted array for a given `needle` value, using the given `compare` +/// callback to determine the order. +/// +/// If an existing element is found to be equal to `needle`, then the `index` +/// out-parameter is set to the existing value's index, and the `exists` +/// out-parameter is set to true. Otherwise, `index` is set to an index where +/// `needle` should be inserted in order to preserve the sorting, and `exists` +/// is set to false. +#define array_search_sorted_with(self, compare, needle, _index, _exists) \ + _array__search_sorted(self, 0, compare, , needle, _index, _exists) + +/// Search a sorted array for a given `needle` value, using integer comparisons +/// of a given struct field (specified with a leading dot) to determine the order. +/// +/// See also `array_search_sorted_with`. +#define array_search_sorted_by(self, field, needle, _index, _exists) \ + _array__search_sorted(self, 0, _compare_int, field, needle, _index, _exists) + +/// Insert a given `value` into a sorted array, using the given `compare` +/// callback to determine the order. +#define array_insert_sorted_with(self, compare, value) \ + do { \ + unsigned _index, _exists; \ + array_search_sorted_with(self, compare, &(value), &_index, &_exists); \ + if (!_exists) array_insert(self, _index, value); \ + } while (0) + +/// Insert a given `value` into a sorted array, using integer comparisons of +/// a given struct field (specified with a leading dot) to determine the order. +/// +/// See also `array_search_sorted_by`. +#define array_insert_sorted_by(self, field, value) \ + do { \ + unsigned _index, _exists; \ + array_search_sorted_by(self, field, (value) field, &_index, &_exists); \ + if (!_exists) array_insert(self, _index, value); \ + } while (0) + +// Private + +typedef Array(void) Array; + +/// This is not what you're looking for, see `array_delete`. +static inline void _array__delete(Array *self) { + if (self->contents) { + ts_free(self->contents); + self->contents = NULL; + self->size = 0; + self->capacity = 0; + } +} + +/// This is not what you're looking for, see `array_erase`. +static inline void _array__erase(Array *self, size_t element_size, + uint32_t index) { + assert(index < self->size); + char *contents = (char *)self->contents; + memmove(contents + index * element_size, contents + (index + 1) * element_size, + (self->size - index - 1) * element_size); + self->size--; +} + +/// This is not what you're looking for, see `array_reserve`. +static inline void _array__reserve(Array *self, size_t element_size, uint32_t new_capacity) { + if (new_capacity > self->capacity) { + if (self->contents) { + self->contents = ts_realloc(self->contents, new_capacity * element_size); + } else { + self->contents = ts_malloc(new_capacity * element_size); + } + self->capacity = new_capacity; + } +} + +/// This is not what you're looking for, see `array_assign`. +static inline void _array__assign(Array *self, const Array *other, size_t element_size) { + _array__reserve(self, element_size, other->size); + self->size = other->size; + memcpy(self->contents, other->contents, self->size * element_size); +} + +/// This is not what you're looking for, see `array_swap`. +static inline void _array__swap(Array *self, Array *other) { + Array swap = *other; + *other = *self; + *self = swap; +} + +/// This is not what you're looking for, see `array_push` or `array_grow_by`. +static inline void _array__grow(Array *self, uint32_t count, size_t element_size) { + uint32_t new_size = self->size + count; + if (new_size > self->capacity) { + uint32_t new_capacity = self->capacity * 2; + if (new_capacity < 8) new_capacity = 8; + if (new_capacity < new_size) new_capacity = new_size; + _array__reserve(self, element_size, new_capacity); + } +} + +/// This is not what you're looking for, see `array_splice`. +static inline void _array__splice(Array *self, size_t element_size, + uint32_t index, uint32_t old_count, + uint32_t new_count, const void *elements) { + uint32_t new_size = self->size + new_count - old_count; + uint32_t old_end = index + old_count; + uint32_t new_end = index + new_count; + assert(old_end <= self->size); + + _array__reserve(self, element_size, new_size); + + char *contents = (char *)self->contents; + if (self->size > old_end) { + memmove( + contents + new_end * element_size, + contents + old_end * element_size, + (self->size - old_end) * element_size + ); + } + if (new_count > 0) { + if (elements) { + memcpy( + (contents + index * element_size), + elements, + new_count * element_size + ); + } else { + memset( + (contents + index * element_size), + 0, + new_count * element_size + ); + } + } + self->size += new_count - old_count; +} + +/// A binary search routine, based on Rust's `std::slice::binary_search_by`. +/// This is not what you're looking for, see `array_search_sorted_with` or `array_search_sorted_by`. +#define _array__search_sorted(self, start, compare, suffix, needle, _index, _exists) \ + do { \ + *(_index) = start; \ + *(_exists) = false; \ + uint32_t size = (self)->size - *(_index); \ + if (size == 0) break; \ + int comparison; \ + while (size > 1) { \ + uint32_t half_size = size / 2; \ + uint32_t mid_index = *(_index) + half_size; \ + comparison = compare(&((self)->contents[mid_index] suffix), (needle)); \ + if (comparison <= 0) *(_index) = mid_index; \ + size -= half_size; \ + } \ + comparison = compare(&((self)->contents[*(_index)] suffix), (needle)); \ + if (comparison == 0) *(_exists) = true; \ + else if (comparison < 0) *(_index) += 1; \ + } while (0) + +/// Helper macro for the `_sorted_by` routines below. This takes the left (existing) +/// parameter by reference in order to work with the generic sorting function above. +#define _compare_int(a, b) ((int)*(a) - (int)(b)) + +#ifdef _MSC_VER +#pragma warning(default : 4101) +#elif defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic pop +#endif + +#ifdef __cplusplus +} +#endif + +#endif // TREE_SITTER_ARRAY_H_ diff --git a/test-parsers/tree-sitter-html/src/tree_sitter/parser.h b/test-parsers/tree-sitter-html/src/tree_sitter/parser.h new file mode 100644 index 00000000..799f599b --- /dev/null +++ b/test-parsers/tree-sitter-html/src/tree_sitter/parser.h @@ -0,0 +1,266 @@ +#ifndef TREE_SITTER_PARSER_H_ +#define TREE_SITTER_PARSER_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +#define ts_builtin_sym_error ((TSSymbol)-1) +#define ts_builtin_sym_end 0 +#define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024 + +#ifndef TREE_SITTER_API_H_ +typedef uint16_t TSStateId; +typedef uint16_t TSSymbol; +typedef uint16_t TSFieldId; +typedef struct TSLanguage TSLanguage; +#endif + +typedef struct { + TSFieldId field_id; + uint8_t child_index; + bool inherited; +} TSFieldMapEntry; + +typedef struct { + uint16_t index; + uint16_t length; +} TSFieldMapSlice; + +typedef struct { + bool visible; + bool named; + bool supertype; +} TSSymbolMetadata; + +typedef struct TSLexer TSLexer; + +struct TSLexer { + int32_t lookahead; + TSSymbol result_symbol; + void (*advance)(TSLexer *, bool); + void (*mark_end)(TSLexer *); + uint32_t (*get_column)(TSLexer *); + bool (*is_at_included_range_start)(const TSLexer *); + bool (*eof)(const TSLexer *); + void (*log)(const TSLexer *, const char *, ...); +}; + +typedef enum { + TSParseActionTypeShift, + TSParseActionTypeReduce, + TSParseActionTypeAccept, + TSParseActionTypeRecover, +} TSParseActionType; + +typedef union { + struct { + uint8_t type; + TSStateId state; + bool extra; + bool repetition; + } shift; + struct { + uint8_t type; + uint8_t child_count; + TSSymbol symbol; + int16_t dynamic_precedence; + uint16_t production_id; + } reduce; + uint8_t type; +} TSParseAction; + +typedef struct { + uint16_t lex_state; + uint16_t external_lex_state; +} TSLexMode; + +typedef union { + TSParseAction action; + struct { + uint8_t count; + bool reusable; + } entry; +} TSParseActionEntry; + +typedef struct { + int32_t start; + int32_t end; +} TSCharacterRange; + +struct TSLanguage { + uint32_t version; + uint32_t symbol_count; + uint32_t alias_count; + uint32_t token_count; + uint32_t external_token_count; + uint32_t state_count; + uint32_t large_state_count; + uint32_t production_id_count; + uint32_t field_count; + uint16_t max_alias_sequence_length; + const uint16_t *parse_table; + const uint16_t *small_parse_table; + const uint32_t *small_parse_table_map; + const TSParseActionEntry *parse_actions; + const char * const *symbol_names; + const char * const *field_names; + const TSFieldMapSlice *field_map_slices; + const TSFieldMapEntry *field_map_entries; + const TSSymbolMetadata *symbol_metadata; + const TSSymbol *public_symbol_map; + const uint16_t *alias_map; + const TSSymbol *alias_sequences; + const TSLexMode *lex_modes; + bool (*lex_fn)(TSLexer *, TSStateId); + bool (*keyword_lex_fn)(TSLexer *, TSStateId); + TSSymbol keyword_capture_token; + struct { + const bool *states; + const TSSymbol *symbol_map; + void *(*create)(void); + void (*destroy)(void *); + bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist); + unsigned (*serialize)(void *, char *); + void (*deserialize)(void *, const char *, unsigned); + } external_scanner; + const TSStateId *primary_state_ids; +}; + +static inline bool set_contains(TSCharacterRange *ranges, uint32_t len, int32_t lookahead) { + uint32_t index = 0; + uint32_t size = len - index; + while (size > 1) { + uint32_t half_size = size / 2; + uint32_t mid_index = index + half_size; + TSCharacterRange *range = &ranges[mid_index]; + if (lookahead >= range->start && lookahead <= range->end) { + return true; + } else if (lookahead > range->end) { + index = mid_index; + } + size -= half_size; + } + TSCharacterRange *range = &ranges[index]; + return (lookahead >= range->start && lookahead <= range->end); +} + +/* + * Lexer Macros + */ + +#ifdef _MSC_VER +#define UNUSED __pragma(warning(suppress : 4101)) +#else +#define UNUSED __attribute__((unused)) +#endif + +#define START_LEXER() \ + bool result = false; \ + bool skip = false; \ + UNUSED \ + bool eof = false; \ + int32_t lookahead; \ + goto start; \ + next_state: \ + lexer->advance(lexer, skip); \ + start: \ + skip = false; \ + lookahead = lexer->lookahead; + +#define ADVANCE(state_value) \ + { \ + state = state_value; \ + goto next_state; \ + } + +#define ADVANCE_MAP(...) \ + { \ + static const uint16_t map[] = { __VA_ARGS__ }; \ + for (uint32_t i = 0; i < sizeof(map) / sizeof(map[0]); i += 2) { \ + if (map[i] == lookahead) { \ + state = map[i + 1]; \ + goto next_state; \ + } \ + } \ + } + +#define SKIP(state_value) \ + { \ + skip = true; \ + state = state_value; \ + goto next_state; \ + } + +#define ACCEPT_TOKEN(symbol_value) \ + result = true; \ + lexer->result_symbol = symbol_value; \ + lexer->mark_end(lexer); + +#define END_STATE() return result; + +/* + * Parse Table Macros + */ + +#define SMALL_STATE(id) ((id) - LARGE_STATE_COUNT) + +#define STATE(id) id + +#define ACTIONS(id) id + +#define SHIFT(state_value) \ + {{ \ + .shift = { \ + .type = TSParseActionTypeShift, \ + .state = (state_value) \ + } \ + }} + +#define SHIFT_REPEAT(state_value) \ + {{ \ + .shift = { \ + .type = TSParseActionTypeShift, \ + .state = (state_value), \ + .repetition = true \ + } \ + }} + +#define SHIFT_EXTRA() \ + {{ \ + .shift = { \ + .type = TSParseActionTypeShift, \ + .extra = true \ + } \ + }} + +#define REDUCE(symbol_name, children, precedence, prod_id) \ + {{ \ + .reduce = { \ + .type = TSParseActionTypeReduce, \ + .symbol = symbol_name, \ + .child_count = children, \ + .dynamic_precedence = precedence, \ + .production_id = prod_id \ + }, \ + }} + +#define RECOVER() \ + {{ \ + .type = TSParseActionTypeRecover \ + }} + +#define ACCEPT_INPUT() \ + {{ \ + .type = TSParseActionTypeAccept \ + }} + +#ifdef __cplusplus +} +#endif + +#endif // TREE_SITTER_PARSER_H_ From 29808800a0851378042ec11693a679f003504f9a Mon Sep 17 00:00:00 2001 From: Tom Selfin Date: Sat, 9 Nov 2024 11:09:09 +0200 Subject: [PATCH 4/5] remove .only test modifier --- src/test/suite/BlockTrees.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/suite/BlockTrees.test.ts b/src/test/suite/BlockTrees.test.ts index 2da84dac..df3c0d8d 100644 --- a/src/test/suite/BlockTrees.test.ts +++ b/src/test/suite/BlockTrees.test.ts @@ -60,7 +60,7 @@ suite("BlockTrees", function () { return void vscode.window.showInformationMessage("Start blockTrees.getBlockTrees tests"); }); - test.only("resolves html blocks", async function () { + test("resolves html blocks", async function () { const text = "\n \n \n"; const { fileTree } = await openDocument(text, "html"); const lang = fileTree.parser.getLanguage() as Language; From b741468700d829e56b687b84c5daa906bbbf4c36 Mon Sep 17 00:00:00 2001 From: Tom Selfin Date: Mon, 11 Nov 2024 12:14:31 +0200 Subject: [PATCH 5/5] squash me --- package.json | 7 +++ src/FileTree.ts | 1 - src/Selection.ts | 78 +++++++++++++++----------------- src/test/suite/Selection.test.ts | 13 ++---- src/test/suite/extension.test.ts | 8 ++-- 5 files changed, 53 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index c3723cea..e3b85bd7 100644 --- a/package.json +++ b/package.json @@ -248,6 +248,13 @@ } }, "configurationDefaults": { + "[html]": { + "codeBlocks.queries": [ + "(element (start_tag)) @item", + "(text) @item", + "(element (end_tag)) @item" + ] + }, "[github-actions-workflow]": { "codeBlocks.npmPackageName": "@tree-sitter-grammars/tree-sitter-yaml", "codeBlocks.parserName": "tree-sitter-yaml" diff --git a/src/FileTree.ts b/src/FileTree.ts index 079a854a..584e6f3a 100644 --- a/src/FileTree.ts +++ b/src/FileTree.ts @@ -279,7 +279,6 @@ export class FileTree implements vscode.Disposable { break; } case "swap-next": { - // TODO: if block mode, resolve previous block const nextSelection = selection.getNext(blocks); if (!nextSelection) { return err(`Can't move to ${direction}, next node of selection is null`); diff --git a/src/Selection.ts b/src/Selection.ts index 2099866a..c3f6d7c1 100644 --- a/src/Selection.ts +++ b/src/Selection.ts @@ -62,74 +62,70 @@ export class Selection { const parent = this.firstNode().parent; const range = this.getRange(); - let smallestBlockIndex: number | undefined = undefined; + let smallestBlock: Block | undefined = undefined; let smallestBlockLength: number | undefined = undefined; - for (let i = 0; i < blocks.length; i++) { - const block = blocks[i]; - - const blockRange = { - startIndex: block[0].startIndex, - endIndex: block[block.length - 1].endIndex, - }; + for (const block of blocks) { + const startIndex = block[0].startIndex; + const endIndex = block[block.length - 1].endIndex; // check if block contains selection - if (blockRange.startIndex <= range.startIndex && range.endIndex <= blockRange.endIndex) { + const contains = startIndex <= range.startIndex && range.endIndex <= endIndex; + if (contains) { // check if block is at the same hierarchy level as the selection - if ( + const isSibling = (parent === null && block[0].parent === null) || - (block[0].parent !== null && parent === block[0].parent) - ) { - const length = blockRange.endIndex - blockRange.startIndex; + (block[0].parent !== null && + parent?.startIndex === block[0].parent.startIndex && + parent?.endIndex === block[0].parent.endIndex); + + if (isSibling) { + const length = endIndex - startIndex; if (length <= (smallestBlockLength ?? length)) { - smallestBlockIndex = i; + smallestBlock = block; smallestBlockLength = length; } } } } - if (smallestBlockIndex !== undefined) { - const smallestBlock = blocks[smallestBlockIndex]; - this.selectedSiblings = smallestBlock; + if (smallestBlock === undefined) { + return this; } + this.selectedSiblings = smallestBlock; return this; } public getPrevious(blocks: Block[] | undefined): Selection | undefined { const previousNode = this.selectedSiblings[0].previousNamedSibling; - if (previousNode) { - // if previousNode starts with parent, ignore it - // since previous sibling assumes the same parent - // without this check, swapping with the previous sibling - // would move us out of the parent - // TODO: should this logic be moved only to "move" operations? - if (previousNode.parent?.startIndex === previousNode.startIndex) { - return undefined; - } + if (!previousNode) { + return undefined; + } - return new Selection([previousNode], this.version).expandToBlock(blocks); - } else { + const previous = Selection.fromNode(previousNode, this.version).expandToBlock(blocks); + const parent = this.getParent(blocks)?.toVscodeSelection(); + + if (parent !== undefined && previous.toVscodeSelection().isEqual(parent)) { return undefined; } + + return previous; } public getNext(blocks: Block[] | undefined): Selection | undefined { const nextNode = this.selectedSiblings.at(-1)?.nextNamedSibling; - if (nextNode) { - // if nextNode ends with parent, ignore it - // since next sibling assumes the same parent - // without this check, swapping with the next sibling - // would move us out of the parent - // TODO: should this logic be moved only to "move" operations? - if (nextNode.parent?.endIndex === nextNode.endIndex) { - return undefined; - } + if (!nextNode) { + return undefined; + } - return new Selection([nextNode], this.version).expandToBlock(blocks); - } else { + const next = Selection.fromNode(nextNode, this.version).expandToBlock(blocks); + const parent = this.getParent(blocks)?.toVscodeSelection(); + + if (parent !== undefined && next.toVscodeSelection().isEqual(parent)) { return undefined; } + + return next; } public getParent(blocks: Block[] | undefined): Selection | undefined { @@ -146,7 +142,7 @@ export class Selection { } if (parent) { - return new Selection([parent], this.version).expandToBlock(blocks); + return Selection.fromNode(parent, this.version).expandToBlock(blocks); } else { return undefined; } @@ -166,7 +162,7 @@ export class Selection { } if (child) { - return new Selection([child], this.version).expandToBlock(blocks); + return Selection.fromNode(child, this.version).expandToBlock(blocks); } else { return undefined; } diff --git a/src/test/suite/Selection.test.ts b/src/test/suite/Selection.test.ts index e7481f71..afb357bb 100644 --- a/src/test/suite/Selection.test.ts +++ b/src/test/suite/Selection.test.ts @@ -22,7 +22,7 @@ suite("Selection", function () { } for (const update of updates) { - selection.update(update, []); + selection.update(update, fileTree.blocks); } const selectionText = selection.getText(content); @@ -55,10 +55,9 @@ suite("Selection", function () { expect(await selectionAt("rust", "fn main() { }@")).to.be.undefined; }); - test("Update selection parent/child", async () => { - expect(await selectionAt("rust", "fn main() { @ }")).to.equal("{ }"); - expect(await selectionAt("rust", "fn main() { @ }", ["parent"])).to.equal("fn main() { }"); - expect(await selectionAt("rust", "fn main() { @ }", ["parent", "child"])).to.equal("main"); + test.only("Update selection parent/child", async () => { + expect(await selectionAt("rust", "fn foo() { fn nested() { @ } }")).to.equal("fn nested() { }"); + expect(await selectionAt("rust", "fn main() { @ }")).to.equal("fn main() { }"); expect(await selectionAt("rust", "if true { @ }", ["parent"])).to.equal("if true { }"); expect(await selectionAt("rust", "if true { @ }", ["parent", "child"])).to.equal("true"); expect( @@ -84,9 +83,7 @@ suite("Selection", function () { test("Update selection parent/child", async () => { const text = "function main() { @ }"; - expect(await selectionAt("typescriptreact", text)).to.equal("{ }"); - expect(await selectionAt("typescriptreact", text, ["parent"])).to.equal("function main() { }"); - expect(await selectionAt("typescriptreact", text, ["parent", "child"])).to.equal("main"); + expect(await selectionAt("typescriptreact", text)).to.equal("function main() { }"); }); test("Update selection previous/next", async () => { diff --git a/src/test/suite/extension.test.ts b/src/test/suite/extension.test.ts index c0975700..75c61df2 100644 --- a/src/test/suite/extension.test.ts +++ b/src/test/suite/extension.test.ts @@ -214,17 +214,17 @@ source_file [0:0 - 0:12] await testSelectionCommands({ content: "<>

@a

", selectionCommands: ["codeBlocks.selectPrevious"], - expectedSelectionContent: "

a", + expectedSelectionContent: "a", language: "typescriptreact", }); }); }); suite(".selectChild", function () { - test("contracts to first named child", async () => { + test.only("contracts to first named child", async () => { await testSelectionCommands({ - content: "pub fn foo() { @ }", - selectionCommands: ["codeBlocks.selectParent", "codeBlocks.selectChild"], + content: "pub fn foo() { fn nested() { @ } }", + selectionCommands: ["codeBlocks.selectBlock"], expectedSelectionContent: "pub", }); await testSelectionCommands({