From d01994a8cc2a0af5867484a4d6185c81217f79ed Mon Sep 17 00:00:00 2001 From: rixo Date: Mon, 14 Feb 2022 19:05:39 +0100 Subject: [PATCH 1/5] copy VSCode grammar --- grammars/svelte.json | 1743 ++++++++++++++++++++++++------------------ 1 file changed, 999 insertions(+), 744 deletions(-) diff --git a/grammars/svelte.json b/grammars/svelte.json index 2d0f78d..6ca9dfc 100644 --- a/grammars/svelte.json +++ b/grammars/svelte.json @@ -1,829 +1,1084 @@ { - "name": "Svelte", - "scopeName": "source.svelte", - "fileTypes": ["svelte", "html"], - "uuid": "7582b62f-51d9-4a84-8c8d-fc189530faf6", - "patterns": [ - { - "begin": "(<)(style)\\b(?=[^>]*(?:type=('text/sass'|\"text/sass\")|lang=(sass|'sass'|\"sass\")))(?![^/>]*/>\\s*$)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.style.html" - } - }, - "end": "()", - "endCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.style.html" - }, - "3": { - "name": "punctuation.definition.tag.end.html" - } - }, - "patterns": [ - { - "include": "#tag-stuff" - }, - { - "contentName": "source.sass", - "begin": "(>)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.end.html" - } - }, - "end": "(?=)", - "patterns": [ - { - "include": "source.sass" - } - ] - } - ] + "name": "Svelte Component", + "scopeName": "source.svelte", + "fileTypes": [ + "svelte" + ], + "uuid": "7582b62f-51d9-4a84-8c8d-fc189530faf6", + "injections": { + "L:(meta.script.svelte | meta.style.svelte) (meta.lang.js | meta.lang.javascript) - (meta source)": { + "patterns": [ + { + "begin": "(?<=>)(?!)(?!)(?!)(?!)(?!)(?!)(?!)(?!)(?!)(?!)(?!)(?!)\\s", + "end": "(?=]*(?:type=('text/scss'|\"text/scss\")|lang=(scss|'scss'|\"scss\")))(?![^/>]*/>\\s*$)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.style.html" - } - }, - "end": "()", - "endCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.style.html" - }, - "3": { - "name": "punctuation.definition.tag.end.html" - } - }, - "patterns": [ - { - "include": "#tag-stuff" - }, - { - "contentName": "source.css.scss", - "begin": "(>)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.end.html" - } - }, - "end": "(?=)", - "patterns": [ - { - "include": "source.css.scss" - } - ] - } - ] + "match": "(?]*(?:type=('text/less'|\"text/less\")|lang=(less|'less'|\"less\")))(?![^/>]*/>\\s*$)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.style.html" - } - }, - "end": "()", - "endCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.style.html" - }, - "3": { - "name": "punctuation.definition.tag.end.html" - } - }, - "patterns": [ - { - "include": "#tag-stuff" - }, - { - "contentName": "source.css.less", - "begin": "(>)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.end.html" - } - }, - "end": "(?=)", - "patterns": [ - { - "include": "source.css.less" - } - ] - } - ] + "include": "#special-tags" }, { - "begin": "(<)(style)\\b(?=[^>]*(?:type=('text/stylus'|\"text/stylus\")|lang=(stylus|'stylus'|\"stylus\")))(?![^/>]*/>\\s*$)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.style.html" - } - }, - "end": "()", - "endCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.style.html" - }, - "3": { - "name": "punctuation.definition.tag.end.html" - } - }, - "patterns": [ - { - "include": "#tag-stuff" - }, - { - "contentName": "source.stylus", - "begin": "(>)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.end.html" - } - }, - "end": "(?=)", - "patterns": [ - { - "include": "source.stylus" - } - ] - } - ] + "include": "#tags" }, { - "begin": "(<)(style)\\b(?=[^>]*(?:type=('text/postcss'|\"text/postcss\")|lang=(postcss|'postcss'|\"postcss\")))(?![^/>]*/>\\s*$)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.style.html" - } + "include": "#interpolation" + }, + { + "begin": "(?<=>|})", + "end": "(?=<|{)", + "name": "text.svelte" + } + ] + }, + "comments": { + "begin": "", + "captures": { + "0": { + "name": "punctuation.definition.comment.svelte" + } + }, + "name": "comment.block.svelte", + "patterns": [ + { + "begin": "(@)(component)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.keyword.svelte" }, - "end": "()", - "endCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.style.html" - }, - "3": { - "name": "punctuation.definition.tag.end.html" + "2": { + "name": "storage.type.class.component.svelte keyword.declaration.class.component.svelte" + } + }, + "end": "(?=-->)", + "contentName": "comment.block.documentation.svelte", + "patterns": [ + { + "match": ".*?(?=-->)", + "captures": { + "0": { + "patterns": [ + { + "include": "text.html.markdown" + } + ] } + } }, - "patterns": [ - { - "include": "#tag-stuff" - }, + { + "include": "text.html.markdown" + } + ] + }, + { + "match": "\\G-?>|)|--!>", + "name": "invalid.illegal.characters-not-allowed-here.svelte" + } + ] + }, + "destructuring": { + "patterns": [ + { + "begin": "(?={)", + "end": "(?<=})", + "name": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "include": "source.ts#object-binding-pattern" + } + ] + }, + { + "begin": "(?=\\[)", + "end": "(?<=\\])", + "name": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "include": "source.ts#array-binding-pattern" + } + ] + } + ] + }, + "interpolation": { + "patterns": [ + { + "begin": "\\{", + "end": "\\}", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.svelte" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.svelte" + } + }, + "contentName": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "begin": "\\G\\s*(?={)", + "end": "(?<=})", + "patterns": [ { - "contentName": "source.css.postcss", - "begin": "(>)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.end.html" - } - }, - "end": "(?=)", - "patterns": [ - { - "include": "source.css.postcss" - } - ] + "include": "source.ts#object-literal" } - ] + ] + }, + { + "include": "source.ts" + } + ] + } + ] + }, + "special-tags": { + "patterns": [ + { + "include": "#special-tags-void" }, { - "begin": "(<)(style)\\b(?=[^>]*(?:(?:type=('text/css'|\"text/css\")|lang=(css|'css'|\"css\")))?)(?![^/>]*/>\\s*$)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.style.html" - } + "include": "#special-tags-block-begin" + }, + { + "include": "#special-tags-block-end" + } + ] + }, + "special-tags-keywords": { + "match": "([#@/:])(else\\s+if|[a-z]*)", + "captures": { + "1": { + "name": "punctuation.definition.keyword.svelte" + }, + "2": { + "patterns": [ + { + "match": "if|else\\s+if|else", + "name": "keyword.control.conditional.svelte" }, - "end": "()", - "endCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.style.html" - }, - "3": { - "name": "punctuation.definition.tag.end.html" - } + { + "match": "each|key", + "name": "keyword.control.svelte" }, - "patterns": [ - { - "include": "#tag-stuff" - }, - { - "contentName": "source.css", - "begin": "(>)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.end.html" - } - }, - "end": "(?=)", - "patterns": [ - { - "include": "source.css" - } - ] - } - ] + { + "match": "await|then|catch", + "name": "keyword.control.flow.svelte" + }, + { + "match": "html", + "name": "keyword.other.svelte" + }, + { + "match": "debug", + "name": "keyword.other.debugger.svelte" + }, + { + "match": "const", + "name": "storage.type.svelte" + } + ] + } + } + }, + "special-tags-modes": { + "patterns": [ + { + "begin": "(?<=(if|key|then|catch|html).*?)\\G", + "end": "(?=})", + "name": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "include": "source.ts" + } + ] }, { - "begin": "(<)(script)\\b(?=[^>]*(?:type=('text/typescript'|\"text/typescript\")|lang=(typescript|'typescript'|\"typescript\")))(?![^/>]*/>\\s*$)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.script.html" - } - }, - "end": "()", - "endCaptures": { + "begin": "(?<=const.*?)\\G", + "end": "(?=})", + "patterns": [ + { + "begin": "\\G\\s*([_$[:alpha:]][_$[:alnum:]]+)\\s*", + "end": "(?=\\=)", + "beginCaptures": { "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.script.html" - }, - "3": { - "name": "punctuation.definition.tag.end.html" + "name": "variable.other.constant.svelte" } + } }, - "patterns": [ - { - "include": "#tag-stuff" - }, + { + "begin": "(?=\\=)", + "end": "(?=})", + "patterns": [ { - "contentName": "source.ts", - "begin": "(>)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.end.html" - } - }, - "end": "(?=)", - "patterns": [ - { - "include": "source.ts" - } - ] + "include": "source.ts#variable-initializer" } - ] + ] + } + ] }, { - "begin": "(<)(script)\\b(?=[^>]*(?:type=('text/coffee'|\"text/coffee\")|lang=(coffee|'coffee'|\"coffee\")))(?![^/>]*/>\\s*$)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.script.html" + "begin": "(?<=each.*?)\\G", + "end": "(?=})", + "patterns": [ + { + "begin": "\\G\\s*?(?=\\S)", + "end": "(?=(?:^\\s*|\\s+)(as))", + "contentName": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "include": "source.ts" } + ] }, - "end": "()", - "endCaptures": { + { + "begin": "(as)", + "beginCaptures": { "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.script.html" - }, - "3": { - "name": "punctuation.definition.tag.end.html" + "name": "keyword.control.as.svelte" } - }, - "patterns": [ + }, + "end": "(?=})", + "patterns": [ { - "include": "#tag-stuff" + "include": "#destructuring" }, { - "contentName": "source.coffee", - "begin": "(>)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.end.html" - } - }, - "end": "(?=)", - "patterns": [ + "begin": "\\(", + "end": "\\)|(?=})", + "captures": { + "0": { + "name": "meta.brace.round.svelte" + } + }, + "contentName": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "include": "source.ts" + } + ] + }, + { + "match": "(\\s*([_$[:alpha:]][_$[:alnum:]]*)\\s*)", + "captures": { + "1": { + "name": "meta.embedded.expression.svelte source.ts", + "patterns": [ { - "include": "source.coffee" + "include": "source.ts" } - ] + ] + } + } + }, + { + "match": ",", + "name": "punctuation.separator.svelte" } - ] + ] + } + ] }, { - "begin": "(<)(script)\\b(?=[^>]*(?:(?:type=('text/javascript'|\"text/javascript\")|lang=(javascript|'javascript'|\"javascript\")))?)(?![^/>]*/>\\s*$)", - "beginCaptures": { + "begin": "(?<=await.*?)\\G", + "end": "(?=})", + "patterns": [ + { + "begin": "\\G\\s*?(?=\\S)", + "end": "\\s+(then)|(?=})", + "endCaptures": { "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.script.html" + "name": "keyword.control.flow.svelte" } - }, - "end": "()", - "endCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.html" - }, - "2": { - "name": "entity.name.tag.script.html" - }, - "3": { - "name": "punctuation.definition.tag.end.html" + }, + "contentName": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "include": "source.ts" } + ] }, - "patterns": [ + { + "begin": "(?<=then\\b)", + "end": "(?=})", + "contentName": "meta.embedded.expression.svelte source.ts", + "patterns": [ { - "include": "#tag-stuff" - }, - { - "contentName": "source.js", - "begin": "(>)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.end.html" - } - }, - "end": "(?=)", - "patterns": [ - { - "include": "source.js" - } - ] + "include": "source.ts" } - ] + ] + } + ] }, { - "begin": "({)\\s*(#if|:elseif|#await|@html)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.svelte" - }, - "2": { - "name": "keyword.control.conditional" - } - }, - "end": "}", - "endCaptures": { + "begin": "(?<=debug.*?)\\G", + "end": "(?=})", + "patterns": [ + { + "match": "[_$[:alpha:]][_$[:alnum:]]*", + "captures": { "0": { - "name": "punctuation.definition.tag.end.svelte" + "name": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "include": "source.ts" + } + ] } + } }, - "patterns": [ - { - "include": "source.ts" - } - ] + { + "match": ",", + "name": "punctuation.separator.svelte" + } + ] + } + ] + }, + "special-tags-void": { + "begin": "({)\\s*((?:[@:])(else\\s+if|[a-z]*))", + "beginCaptures": { + "1": { + "name": "punctuation.definition.block.begin.svelte" }, + "2": { + "patterns": [ + { + "include": "#special-tags-keywords" + } + ] + } + }, + "end": "\\}", + "endCaptures": { + "0": { + "name": "punctuation.definition.block.end.svelte" + } + }, + "name": "meta.special.$3.svelte", + "patterns": [ { - "match": "({)\\s*(:then|:catch)\\s+([_$[:alpha:]][_$[:alnum:]]*)\\s*(})", - "captures": { - "1": { - "name": "punctuation.definition.tag.begin.svelte" - }, - "2": { - "name": "keyword.control.conditional" - }, - "3": { - "name": "variable" - }, - "4": { - "name": "punctuation.definition.tag.end.svelte" - } + "include": "#special-tags-modes" + } + ] + }, + "special-tags-block-begin": { + "begin": "({)\\s*(#([a-z]*))", + "end": "(})", + "name": "meta.special.$3.svelte meta.special.start.svelte", + "beginCaptures": { + "1": { + "name": "punctuation.definition.block.begin.svelte" + }, + "2": { + "patterns": [ + { + "include": "#special-tags-keywords" } + ] + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.block.end.svelte" + } + }, + "patterns": [ + { + "include": "#special-tags-modes" + } + ] + }, + "special-tags-block-end": { + "begin": "({)\\s*(/([a-z]*))", + "end": "(})", + "name": "meta.special.$3.svelte meta.special.end.svelte", + "beginCaptures": { + "1": { + "name": "punctuation.definition.block.begin.svelte" }, + "2": { + "patterns": [ + { + "include": "#special-tags-keywords" + } + ] + } + }, + "endCaptures": { + "1": { + "name": "punctuation.definition.block.end.svelte" + } + } + }, + "attributes": { + "patterns": [ { - "begin": "({)\\s*(#each)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.svelte" - }, - "2": { - "name": "keyword.control.conditional" - } - }, - "end": "}", - "endCaptures": { - "0": { - "name": "punctuation.definition.tag.end.svelte" - } - }, - "patterns": [ - { - "begin": "\\s", - "end": "\\s(as)\\s+", - "endCaptures": { - "1": { - "name": "keyword.control" - } - }, - "patterns": [ - { - "include": "source.ts" - } - ] - }, - { - "match": "[_$[:alpha:]][_$[:alnum:]]*\\s*", - "name": "variable" - }, - { - "patterns": [ - { - "begin": "\\[\\s*", - "end": "]\\s*", - "patterns": [ - { - "include": "source.js" - } - ] - }, - { - "begin": "\\{\\s*", - "end": "}\\s*", - "patterns": [ - { - "include": "source.js" - } - ] - } - ] - }, - { - "match": ",\\s*([_$[:alpha:]][_$[:alnum:]]*)\\s*", - "captures": { - "1": { - "name": "variable" - } - } - }, - { - "begin": "\\(", - "end": "\\)\\s*", - "patterns": [ - { - "include": "source.ts" - } - ] - } - ] + "include": "#attributes-directives" }, { - "match": "({)\\s*(:else|/if|/each|/await)\\s*(})", - "captures": { - "1": { - "name": "punctuation.definition.tag.begin.svelte" - }, - "2": { - "name": "keyword.control.conditional" - }, - "3": { - "name": "punctuation.definition.tag.end.svelte" - } - } + "include": "#attributes-keyvalue" }, { - "begin": "{", - "beginCaptures": { - "0": { - "name": "punctuation.definition.tag.begin.svelte" - } - }, - "end": "}", - "endCaptures": { - "0": { - "name": "punctuation.definition.tag.end.svelte" - } + "include": "#attributes-interpolated" + } + ] + }, + "attributes-interpolated": { + "begin": "(?)", + "patterns": [ + { + "include": "#attributes-value" + } + ] + } + ] + }, + "attributes-value": { + "patterns": [ + { + "include": "#interpolation" }, { - "begin": "())", + "captures": { + "1": { + "name": "punctuation.definition.string.begin.svelte" }, - "end": "(/?>)", - "endCaptures": { - "1": { - "name": "punctuation.definition.tag.end.html" - } + "2": { + "name": "constant.numeric.decimal.svelte" }, - "name": "meta.tag.other.html", - "patterns": [ - { - "include": "#tag-stuff" - } - ] + "3": { + "name": "punctuation.definition.string.end.svelte" + }, + "4": { + "name": "constant.numeric.decimal.svelte" + } + } }, { - "begin": "", - "name": "comment.block" + "match": "([^\\s\"'=<>`/]|/(?!>))+", + "name": "string.unquoted.svelte", + "patterns": [ + { + "include": "#interpolation" + } + ] }, { - "match": "", - "name": "punctuation.definition.tag" + "begin": "(['\"])", + "end": "\\1", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.svelte" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.svelte" + } + }, + "name": "string.quoted.svelte", + "patterns": [ + { + "include": "#interpolation" + } + ] } - ], - "repository": { - "entities": { - "patterns": [ - { - "name": "constant.character.entity.html", - "match": "(&)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)", - "captures": { - "1": { - "name": "punctuation.definition.entity.html" - }, - "3": { - "name": "punctuation.definition.entity.html" - } - } - }, - { - "name": "invalid.illegal.bad-ampersand.html", - "match": "&" - } - ] + ] + }, + "attributes-directives-keywords": { + "patterns": [ + { + "match": "on|use|bind", + "name": "keyword.control.svelte" }, - "string-double-quoted": { - "name": "string.quoted.double.html", - "begin": "\"", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.html" - } - }, - "end": "\"", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.html" - } - }, - "patterns": [ - { - "include": "#entities" - } - ] + { + "match": "transition|in|out|animate", + "name": "keyword.other.animation.svelte" }, - "string-single-quoted": { - "name": "string.quoted.single.html", - "begin": "'", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.html" - } - }, - "end": "'", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.html" - } - }, - "patterns": [ - { - "include": "#entities" - } - ] + { + "match": "let", + "name": "storage.type.svelte" }, - "tag-generic-attribute": { - "name": "entity.other.attribute-name.html", - "match": "\\b([a-zA-Z\\-:]+)" + { + "match": "class|style", + "name": "entity.other.attribute-name.svelte" + } + ] + }, + "attributes-directives-types": { + "patterns": [ + { + "match": "(?<=(on):).*$", + "name": "entity.name.type.svelte" }, - "tag-id-attribute": { - "name": "meta.attribute-with-value.id.html", - "begin": "\\b(id)\\b\\s*(=)", - "end": "(?<='|\")", - "captures": { - "1": { - "name": "entity.other.attribute-name.id.html" - }, - "2": { - "name": "punctuation.separator.key-value.html" - } - }, - "patterns": [ - { - "name": "string.quoted.double.html", - "contentName": "meta.toc-list.id.html", - "begin": "\"", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.html" - } - }, - "end": "\"", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.html" - } - }, - "patterns": [ - { - "include": "#entities" - } - ] - }, - { - "name": "string.quoted.single.html", - "contentName": "meta.toc-list.id.html", - "begin": "'", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.html" - } - }, - "end": "'", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.html" - } - }, - "patterns": [ - { - "include": "#entities" - } - ] - } - ] + { + "match": "(?<=(bind):).*$", + "name": "variable.parameter.svelte" }, - "tag-event-handlers": { - "begin": "\\b(on):([a-zA-Z]+)=(\"|')", - "beginCaptures": { - "1": { - "name": "entity.other.attribute-name.html" - }, - "2": { - "name": "entity.other.attribute-name.html" - }, - "3": { - "name": "string.quoted.double" - } - }, - "end": "\\3", - "endCaptures": { - "0": { - "name": "string.quoted.double" - } - }, - "patterns": [ - { - "include": "source.ts" - } - ] + { + "match": "(?<=(use|transition|in|out|animate):).*$", + "name": "variable.function.svelte" }, - "tag-moustaches": { - "begin": "\\b([a-zA-Z\\-:]+)=(\"|')(?=.*{)", - "beginCaptures": { - "1": { - "name": "entity.other.attribute-name.html" - }, - "2": { - "name": "string.quoted.double" - } - }, - "end": "\\2", - "endCaptures": { - "0": { - "name": "string.quoted.double" - } + { + "match": "(?<=(let|class|style):).*$", + "name": "variable.parameter.svelte" + } + ] + }, + "attributes-directives-types-assigned": { + "patterns": [ + { + "match": "(?<=(bind):)this$", + "name": "variable.language.svelte" + }, + { + "match": "(?<=(bind):).*$", + "name": "entity.name.type.svelte" + }, + { + "match": "(?<=(class):).*$", + "name": "entity.other.attribute-name.class.svelte" + }, + { + "match": "(?<=(style):).*$", + "name": "support.type.property-name.svelte" + }, + { + "include": "#attributes-directives-types" + } + ] + }, + "attributes-directives": { + "begin": "(?)", + "patterns": [ + { + "include": "#attributes-value" + } + ] + } + ] + }, + "tags": { + "patterns": [ + { + "include": "#tags-lang" }, - "tag-moustaches-raw": { - "begin": "\\b([a-zA-Z\\-:]+)=({)", - "beginCaptures": { - "1": { - "name": "entity.other.attribute-name.html" - }, - "2": { - "name": "punctuation.definition.tag.begin.svelte" - } + { + "include": "#tags-void" + }, + { + "include": "#tags-general-end" + }, + { + "include": "#tags-general-start" + } + ] + }, + "tags-name": { + "patterns": [ + { + "match": "(svelte)(:)([a-z][\\w0-9:-]*)", + "captures": { + "1": { + "name": "keyword.control.svelte" }, - "end": "}", - "endCaptures": { - "0": { - "name": "punctuation.definition.tag.end.svelte" - } + "2": { + "name": "punctuation.definition.keyword.svelte" }, - "patterns": [ - { - "include": "source.ts" - } - ] + "3": { + "name": "entity.name.tag.svelte" + } + } }, - "tag-shorthand": { - "match": "({)\\s*([_$[:alpha:]][_$[:alnum:]]*)\\s*(})", - "captures": { - "1": { - "name": "punctuation.definition.tag.begin.svelte" - }, - "2": { - "name": "variable" - }, - "3": { - "name": "punctuation.definition.tag.end.svelte" - } + { + "match": "slot", + "name": "keyword.control.svelte" + }, + { + "match": "[A-Z][a-zA-Z0-9_]*", + "name": "support.class.component.svelte" + }, + { + "match": "[a-z][\\w0-9:]*-[\\w0-9:-]*", + "name": "meta.tag.custom.svelte entity.name.tag.svelte" + }, + { + "match": "[a-z][\\w0-9:-]*", + "name": "entity.name.tag.svelte" + } + ] + }, + "tags-start-attributes": { + "begin": "\\G", + "end": "(?=/?>)", + "name": "meta.tag.start.svelte", + "patterns": [ + { + "include": "#attributes" + } + ] + }, + "tags-lang-start-attributes": { + "begin": "\\G", + "end": "(?=/>)|>", + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.end.svelte" + } + }, + "name": "meta.tag.start.svelte", + "patterns": [ + { + "include": "#attributes" + } + ] + }, + "tags-start-node": { + "match": "(<)([^/\\s>/]*)", + "captures": { + "1": { + "name": "punctuation.definition.tag.begin.svelte" + }, + "2": { + "patterns": [ + { + "include": "#tags-name" } + ] + } + }, + "name": "meta.tag.start.svelte" + }, + "tags-end-node": { + "match": "()|(/>)", + "captures": { + "1": { + "name": "meta.tag.end.svelte punctuation.definition.tag.begin.svelte" }, - "tag-stuff": { - "patterns": [ - { - "include": "#tag-event-handlers" - }, - { - "include": "#tag-moustaches" - }, - { - "include": "#tag-moustaches-raw" - }, - { - "include": "#tag-shorthand" - }, - { - "include": "#tag-id-attribute" - }, - { - "include": "#tag-generic-attribute" - }, - { - "include": "#string-double-quoted" - }, - { - "include": "#string-single-quoted" - } - ] + "2": { + "name": "meta.tag.end.svelte", + "patterns": [ + { + "include": "#tags-name" + } + ] + }, + "3": { + "name": "meta.tag.end.svelte punctuation.definition.tag.end.svelte" + }, + "4": { + "name": "meta.tag.start.svelte punctuation.definition.tag.end.svelte" + } + } + }, + "tags-lang": { + "begin": "<(script|style|template)", + "end": "|/>", + "beginCaptures": { + "0": { + "patterns": [ + { + "include": "#tags-start-node" + } + ] + } + }, + "endCaptures": { + "0": { + "patterns": [ + { + "include": "#tags-end-node" + } + ] + } + }, + "name": "meta.$1.svelte", + "patterns": [ + { + "begin": "\\G(?=\\s*[^>]*?(type|lang)\\s*=\\s*(['\"]|)(?:text/)?(\\w+)\\2)", + "end": "(?=)", + "name": "meta.lang.$3.svelte", + "patterns": [ + { + "include": "#tags-lang-start-attributes" + } + ] + }, + { + "include": "#tags-lang-start-attributes" + } + ] + }, + "tags-void": { + "begin": "(<)(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)(?=\\s|/?>)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.svelte" + }, + "2": { + "name": "entity.name.tag.svelte" + } + }, + "end": "/?>", + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.begin.svelte" + } + }, + "name": "meta.tag.void.svelte", + "patterns": [ + { + "include": "#attributes" + } + ] + }, + "tags-general-start": { + "begin": "(<)([^/\\s>/]*)", + "end": "(/?>)", + "beginCaptures": { + "0": { + "patterns": [ + { + "include": "#tags-start-node" + } + ] + } + }, + "endCaptures": { + "1": { + "name": "meta.tag.start.svelte punctuation.definition.tag.end.svelte" + } + }, + "name": "meta.scope.tag.$2.svelte", + "patterns": [ + { + "include": "#tags-start-attributes" + } + ] + }, + "tags-general-end": { + "begin": "(]*)", + "end": "(>)", + "beginCaptures": { + "1": { + "name": "meta.tag.end.svelte punctuation.definition.tag.begin.svelte" + }, + "2": { + "name": "meta.tag.end.svelte", + "patterns": [ + { + "include": "#tags-name" + } + ] + } + }, + "endCaptures": { + "1": { + "name": "meta.tag.end.svelte punctuation.definition.tag.end.svelte" } + }, + "name": "meta.scope.tag.$2.svelte" } + } } From 331d2819b311ea480b7fb3abfda85995e71ea7b2 Mon Sep 17 00:00:00 2001 From: rixo Date: Mon, 14 Feb 2022 21:32:55 +0100 Subject: [PATCH 2/5] add cson --- grammars/svelte.cson | 1084 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1084 insertions(+) create mode 100644 grammars/svelte.cson diff --git a/grammars/svelte.cson b/grammars/svelte.cson new file mode 100644 index 0000000..6ca9dfc --- /dev/null +++ b/grammars/svelte.cson @@ -0,0 +1,1084 @@ +{ + "name": "Svelte Component", + "scopeName": "source.svelte", + "fileTypes": [ + "svelte" + ], + "uuid": "7582b62f-51d9-4a84-8c8d-fc189530faf6", + "injections": { + "L:(meta.script.svelte | meta.style.svelte) (meta.lang.js | meta.lang.javascript) - (meta source)": { + "patterns": [ + { + "begin": "(?<=>)(?!)(?!)(?!)(?!)(?!)(?!)(?!)(?!)(?!)(?!)(?!)(?!)\\s", + "end": "(?=|})", + "end": "(?=<|{)", + "name": "text.svelte" + } + ] + }, + "comments": { + "begin": "", + "captures": { + "0": { + "name": "punctuation.definition.comment.svelte" + } + }, + "name": "comment.block.svelte", + "patterns": [ + { + "begin": "(@)(component)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.keyword.svelte" + }, + "2": { + "name": "storage.type.class.component.svelte keyword.declaration.class.component.svelte" + } + }, + "end": "(?=-->)", + "contentName": "comment.block.documentation.svelte", + "patterns": [ + { + "match": ".*?(?=-->)", + "captures": { + "0": { + "patterns": [ + { + "include": "text.html.markdown" + } + ] + } + } + }, + { + "include": "text.html.markdown" + } + ] + }, + { + "match": "\\G-?>|)|--!>", + "name": "invalid.illegal.characters-not-allowed-here.svelte" + } + ] + }, + "destructuring": { + "patterns": [ + { + "begin": "(?={)", + "end": "(?<=})", + "name": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "include": "source.ts#object-binding-pattern" + } + ] + }, + { + "begin": "(?=\\[)", + "end": "(?<=\\])", + "name": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "include": "source.ts#array-binding-pattern" + } + ] + } + ] + }, + "interpolation": { + "patterns": [ + { + "begin": "\\{", + "end": "\\}", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.svelte" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.svelte" + } + }, + "contentName": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "begin": "\\G\\s*(?={)", + "end": "(?<=})", + "patterns": [ + { + "include": "source.ts#object-literal" + } + ] + }, + { + "include": "source.ts" + } + ] + } + ] + }, + "special-tags": { + "patterns": [ + { + "include": "#special-tags-void" + }, + { + "include": "#special-tags-block-begin" + }, + { + "include": "#special-tags-block-end" + } + ] + }, + "special-tags-keywords": { + "match": "([#@/:])(else\\s+if|[a-z]*)", + "captures": { + "1": { + "name": "punctuation.definition.keyword.svelte" + }, + "2": { + "patterns": [ + { + "match": "if|else\\s+if|else", + "name": "keyword.control.conditional.svelte" + }, + { + "match": "each|key", + "name": "keyword.control.svelte" + }, + { + "match": "await|then|catch", + "name": "keyword.control.flow.svelte" + }, + { + "match": "html", + "name": "keyword.other.svelte" + }, + { + "match": "debug", + "name": "keyword.other.debugger.svelte" + }, + { + "match": "const", + "name": "storage.type.svelte" + } + ] + } + } + }, + "special-tags-modes": { + "patterns": [ + { + "begin": "(?<=(if|key|then|catch|html).*?)\\G", + "end": "(?=})", + "name": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "include": "source.ts" + } + ] + }, + { + "begin": "(?<=const.*?)\\G", + "end": "(?=})", + "patterns": [ + { + "begin": "\\G\\s*([_$[:alpha:]][_$[:alnum:]]+)\\s*", + "end": "(?=\\=)", + "beginCaptures": { + "1": { + "name": "variable.other.constant.svelte" + } + } + }, + { + "begin": "(?=\\=)", + "end": "(?=})", + "patterns": [ + { + "include": "source.ts#variable-initializer" + } + ] + } + ] + }, + { + "begin": "(?<=each.*?)\\G", + "end": "(?=})", + "patterns": [ + { + "begin": "\\G\\s*?(?=\\S)", + "end": "(?=(?:^\\s*|\\s+)(as))", + "contentName": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "include": "source.ts" + } + ] + }, + { + "begin": "(as)", + "beginCaptures": { + "1": { + "name": "keyword.control.as.svelte" + } + }, + "end": "(?=})", + "patterns": [ + { + "include": "#destructuring" + }, + { + "begin": "\\(", + "end": "\\)|(?=})", + "captures": { + "0": { + "name": "meta.brace.round.svelte" + } + }, + "contentName": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "include": "source.ts" + } + ] + }, + { + "match": "(\\s*([_$[:alpha:]][_$[:alnum:]]*)\\s*)", + "captures": { + "1": { + "name": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "include": "source.ts" + } + ] + } + } + }, + { + "match": ",", + "name": "punctuation.separator.svelte" + } + ] + } + ] + }, + { + "begin": "(?<=await.*?)\\G", + "end": "(?=})", + "patterns": [ + { + "begin": "\\G\\s*?(?=\\S)", + "end": "\\s+(then)|(?=})", + "endCaptures": { + "1": { + "name": "keyword.control.flow.svelte" + } + }, + "contentName": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "include": "source.ts" + } + ] + }, + { + "begin": "(?<=then\\b)", + "end": "(?=})", + "contentName": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "include": "source.ts" + } + ] + } + ] + }, + { + "begin": "(?<=debug.*?)\\G", + "end": "(?=})", + "patterns": [ + { + "match": "[_$[:alpha:]][_$[:alnum:]]*", + "captures": { + "0": { + "name": "meta.embedded.expression.svelte source.ts", + "patterns": [ + { + "include": "source.ts" + } + ] + } + } + }, + { + "match": ",", + "name": "punctuation.separator.svelte" + } + ] + } + ] + }, + "special-tags-void": { + "begin": "({)\\s*((?:[@:])(else\\s+if|[a-z]*))", + "beginCaptures": { + "1": { + "name": "punctuation.definition.block.begin.svelte" + }, + "2": { + "patterns": [ + { + "include": "#special-tags-keywords" + } + ] + } + }, + "end": "\\}", + "endCaptures": { + "0": { + "name": "punctuation.definition.block.end.svelte" + } + }, + "name": "meta.special.$3.svelte", + "patterns": [ + { + "include": "#special-tags-modes" + } + ] + }, + "special-tags-block-begin": { + "begin": "({)\\s*(#([a-z]*))", + "end": "(})", + "name": "meta.special.$3.svelte meta.special.start.svelte", + "beginCaptures": { + "1": { + "name": "punctuation.definition.block.begin.svelte" + }, + "2": { + "patterns": [ + { + "include": "#special-tags-keywords" + } + ] + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.block.end.svelte" + } + }, + "patterns": [ + { + "include": "#special-tags-modes" + } + ] + }, + "special-tags-block-end": { + "begin": "({)\\s*(/([a-z]*))", + "end": "(})", + "name": "meta.special.$3.svelte meta.special.end.svelte", + "beginCaptures": { + "1": { + "name": "punctuation.definition.block.begin.svelte" + }, + "2": { + "patterns": [ + { + "include": "#special-tags-keywords" + } + ] + } + }, + "endCaptures": { + "1": { + "name": "punctuation.definition.block.end.svelte" + } + } + }, + "attributes": { + "patterns": [ + { + "include": "#attributes-directives" + }, + { + "include": "#attributes-keyvalue" + }, + { + "include": "#attributes-interpolated" + } + ] + }, + "attributes-interpolated": { + "begin": "(?)", + "patterns": [ + { + "include": "#attributes-value" + } + ] + } + ] + }, + "attributes-value": { + "patterns": [ + { + "include": "#interpolation" + }, + { + "match": "(?:(['\"])([0-9._]+[\\w%]{,4})(\\1))|(?:([0-9._]+[\\w%]{,4})(?=\\s|/?>))", + "captures": { + "1": { + "name": "punctuation.definition.string.begin.svelte" + }, + "2": { + "name": "constant.numeric.decimal.svelte" + }, + "3": { + "name": "punctuation.definition.string.end.svelte" + }, + "4": { + "name": "constant.numeric.decimal.svelte" + } + } + }, + { + "match": "([^\\s\"'=<>`/]|/(?!>))+", + "name": "string.unquoted.svelte", + "patterns": [ + { + "include": "#interpolation" + } + ] + }, + { + "begin": "(['\"])", + "end": "\\1", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.svelte" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.svelte" + } + }, + "name": "string.quoted.svelte", + "patterns": [ + { + "include": "#interpolation" + } + ] + } + ] + }, + "attributes-directives-keywords": { + "patterns": [ + { + "match": "on|use|bind", + "name": "keyword.control.svelte" + }, + { + "match": "transition|in|out|animate", + "name": "keyword.other.animation.svelte" + }, + { + "match": "let", + "name": "storage.type.svelte" + }, + { + "match": "class|style", + "name": "entity.other.attribute-name.svelte" + } + ] + }, + "attributes-directives-types": { + "patterns": [ + { + "match": "(?<=(on):).*$", + "name": "entity.name.type.svelte" + }, + { + "match": "(?<=(bind):).*$", + "name": "variable.parameter.svelte" + }, + { + "match": "(?<=(use|transition|in|out|animate):).*$", + "name": "variable.function.svelte" + }, + { + "match": "(?<=(let|class|style):).*$", + "name": "variable.parameter.svelte" + } + ] + }, + "attributes-directives-types-assigned": { + "patterns": [ + { + "match": "(?<=(bind):)this$", + "name": "variable.language.svelte" + }, + { + "match": "(?<=(bind):).*$", + "name": "entity.name.type.svelte" + }, + { + "match": "(?<=(class):).*$", + "name": "entity.other.attribute-name.class.svelte" + }, + { + "match": "(?<=(style):).*$", + "name": "support.type.property-name.svelte" + }, + { + "include": "#attributes-directives-types" + } + ] + }, + "attributes-directives": { + "begin": "(?)", + "patterns": [ + { + "include": "#attributes-value" + } + ] + } + ] + }, + "tags": { + "patterns": [ + { + "include": "#tags-lang" + }, + { + "include": "#tags-void" + }, + { + "include": "#tags-general-end" + }, + { + "include": "#tags-general-start" + } + ] + }, + "tags-name": { + "patterns": [ + { + "match": "(svelte)(:)([a-z][\\w0-9:-]*)", + "captures": { + "1": { + "name": "keyword.control.svelte" + }, + "2": { + "name": "punctuation.definition.keyword.svelte" + }, + "3": { + "name": "entity.name.tag.svelte" + } + } + }, + { + "match": "slot", + "name": "keyword.control.svelte" + }, + { + "match": "[A-Z][a-zA-Z0-9_]*", + "name": "support.class.component.svelte" + }, + { + "match": "[a-z][\\w0-9:]*-[\\w0-9:-]*", + "name": "meta.tag.custom.svelte entity.name.tag.svelte" + }, + { + "match": "[a-z][\\w0-9:-]*", + "name": "entity.name.tag.svelte" + } + ] + }, + "tags-start-attributes": { + "begin": "\\G", + "end": "(?=/?>)", + "name": "meta.tag.start.svelte", + "patterns": [ + { + "include": "#attributes" + } + ] + }, + "tags-lang-start-attributes": { + "begin": "\\G", + "end": "(?=/>)|>", + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.end.svelte" + } + }, + "name": "meta.tag.start.svelte", + "patterns": [ + { + "include": "#attributes" + } + ] + }, + "tags-start-node": { + "match": "(<)([^/\\s>/]*)", + "captures": { + "1": { + "name": "punctuation.definition.tag.begin.svelte" + }, + "2": { + "patterns": [ + { + "include": "#tags-name" + } + ] + } + }, + "name": "meta.tag.start.svelte" + }, + "tags-end-node": { + "match": "()|(/>)", + "captures": { + "1": { + "name": "meta.tag.end.svelte punctuation.definition.tag.begin.svelte" + }, + "2": { + "name": "meta.tag.end.svelte", + "patterns": [ + { + "include": "#tags-name" + } + ] + }, + "3": { + "name": "meta.tag.end.svelte punctuation.definition.tag.end.svelte" + }, + "4": { + "name": "meta.tag.start.svelte punctuation.definition.tag.end.svelte" + } + } + }, + "tags-lang": { + "begin": "<(script|style|template)", + "end": "|/>", + "beginCaptures": { + "0": { + "patterns": [ + { + "include": "#tags-start-node" + } + ] + } + }, + "endCaptures": { + "0": { + "patterns": [ + { + "include": "#tags-end-node" + } + ] + } + }, + "name": "meta.$1.svelte", + "patterns": [ + { + "begin": "\\G(?=\\s*[^>]*?(type|lang)\\s*=\\s*(['\"]|)(?:text/)?(\\w+)\\2)", + "end": "(?=)", + "name": "meta.lang.$3.svelte", + "patterns": [ + { + "include": "#tags-lang-start-attributes" + } + ] + }, + { + "include": "#tags-lang-start-attributes" + } + ] + }, + "tags-void": { + "begin": "(<)(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)(?=\\s|/?>)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.svelte" + }, + "2": { + "name": "entity.name.tag.svelte" + } + }, + "end": "/?>", + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.begin.svelte" + } + }, + "name": "meta.tag.void.svelte", + "patterns": [ + { + "include": "#attributes" + } + ] + }, + "tags-general-start": { + "begin": "(<)([^/\\s>/]*)", + "end": "(/?>)", + "beginCaptures": { + "0": { + "patterns": [ + { + "include": "#tags-start-node" + } + ] + } + }, + "endCaptures": { + "1": { + "name": "meta.tag.start.svelte punctuation.definition.tag.end.svelte" + } + }, + "name": "meta.scope.tag.$2.svelte", + "patterns": [ + { + "include": "#tags-start-attributes" + } + ] + }, + "tags-general-end": { + "begin": "(]*)", + "end": "(>)", + "beginCaptures": { + "1": { + "name": "meta.tag.end.svelte punctuation.definition.tag.begin.svelte" + }, + "2": { + "name": "meta.tag.end.svelte", + "patterns": [ + { + "include": "#tags-name" + } + ] + } + }, + "endCaptures": { + "1": { + "name": "meta.tag.end.svelte punctuation.definition.tag.end.svelte" + } + }, + "name": "meta.scope.tag.$2.svelte" + } + } +} From bfc5776806fccd93318b3d7342c738a5d3256f18 Mon Sep 17 00:00:00 2001 From: rixo Date: Tue, 15 Feb 2022 03:26:34 +0100 Subject: [PATCH 3/5] remove outdated grammar --- grammars/svelte.json | 1084 ------------------------------------------ 1 file changed, 1084 deletions(-) delete mode 100644 grammars/svelte.json diff --git a/grammars/svelte.json b/grammars/svelte.json deleted file mode 100644 index 6ca9dfc..0000000 --- a/grammars/svelte.json +++ /dev/null @@ -1,1084 +0,0 @@ -{ - "name": "Svelte Component", - "scopeName": "source.svelte", - "fileTypes": [ - "svelte" - ], - "uuid": "7582b62f-51d9-4a84-8c8d-fc189530faf6", - "injections": { - "L:(meta.script.svelte | meta.style.svelte) (meta.lang.js | meta.lang.javascript) - (meta source)": { - "patterns": [ - { - "begin": "(?<=>)(?!)(?!)(?!)(?!)(?!)(?!)(?!)(?!)(?!)(?!)(?!)(?!)\\s", - "end": "(?=|})", - "end": "(?=<|{)", - "name": "text.svelte" - } - ] - }, - "comments": { - "begin": "", - "captures": { - "0": { - "name": "punctuation.definition.comment.svelte" - } - }, - "name": "comment.block.svelte", - "patterns": [ - { - "begin": "(@)(component)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.keyword.svelte" - }, - "2": { - "name": "storage.type.class.component.svelte keyword.declaration.class.component.svelte" - } - }, - "end": "(?=-->)", - "contentName": "comment.block.documentation.svelte", - "patterns": [ - { - "match": ".*?(?=-->)", - "captures": { - "0": { - "patterns": [ - { - "include": "text.html.markdown" - } - ] - } - } - }, - { - "include": "text.html.markdown" - } - ] - }, - { - "match": "\\G-?>|)|--!>", - "name": "invalid.illegal.characters-not-allowed-here.svelte" - } - ] - }, - "destructuring": { - "patterns": [ - { - "begin": "(?={)", - "end": "(?<=})", - "name": "meta.embedded.expression.svelte source.ts", - "patterns": [ - { - "include": "source.ts#object-binding-pattern" - } - ] - }, - { - "begin": "(?=\\[)", - "end": "(?<=\\])", - "name": "meta.embedded.expression.svelte source.ts", - "patterns": [ - { - "include": "source.ts#array-binding-pattern" - } - ] - } - ] - }, - "interpolation": { - "patterns": [ - { - "begin": "\\{", - "end": "\\}", - "beginCaptures": { - "0": { - "name": "punctuation.section.embedded.begin.svelte" - } - }, - "endCaptures": { - "0": { - "name": "punctuation.section.embedded.end.svelte" - } - }, - "contentName": "meta.embedded.expression.svelte source.ts", - "patterns": [ - { - "begin": "\\G\\s*(?={)", - "end": "(?<=})", - "patterns": [ - { - "include": "source.ts#object-literal" - } - ] - }, - { - "include": "source.ts" - } - ] - } - ] - }, - "special-tags": { - "patterns": [ - { - "include": "#special-tags-void" - }, - { - "include": "#special-tags-block-begin" - }, - { - "include": "#special-tags-block-end" - } - ] - }, - "special-tags-keywords": { - "match": "([#@/:])(else\\s+if|[a-z]*)", - "captures": { - "1": { - "name": "punctuation.definition.keyword.svelte" - }, - "2": { - "patterns": [ - { - "match": "if|else\\s+if|else", - "name": "keyword.control.conditional.svelte" - }, - { - "match": "each|key", - "name": "keyword.control.svelte" - }, - { - "match": "await|then|catch", - "name": "keyword.control.flow.svelte" - }, - { - "match": "html", - "name": "keyword.other.svelte" - }, - { - "match": "debug", - "name": "keyword.other.debugger.svelte" - }, - { - "match": "const", - "name": "storage.type.svelte" - } - ] - } - } - }, - "special-tags-modes": { - "patterns": [ - { - "begin": "(?<=(if|key|then|catch|html).*?)\\G", - "end": "(?=})", - "name": "meta.embedded.expression.svelte source.ts", - "patterns": [ - { - "include": "source.ts" - } - ] - }, - { - "begin": "(?<=const.*?)\\G", - "end": "(?=})", - "patterns": [ - { - "begin": "\\G\\s*([_$[:alpha:]][_$[:alnum:]]+)\\s*", - "end": "(?=\\=)", - "beginCaptures": { - "1": { - "name": "variable.other.constant.svelte" - } - } - }, - { - "begin": "(?=\\=)", - "end": "(?=})", - "patterns": [ - { - "include": "source.ts#variable-initializer" - } - ] - } - ] - }, - { - "begin": "(?<=each.*?)\\G", - "end": "(?=})", - "patterns": [ - { - "begin": "\\G\\s*?(?=\\S)", - "end": "(?=(?:^\\s*|\\s+)(as))", - "contentName": "meta.embedded.expression.svelte source.ts", - "patterns": [ - { - "include": "source.ts" - } - ] - }, - { - "begin": "(as)", - "beginCaptures": { - "1": { - "name": "keyword.control.as.svelte" - } - }, - "end": "(?=})", - "patterns": [ - { - "include": "#destructuring" - }, - { - "begin": "\\(", - "end": "\\)|(?=})", - "captures": { - "0": { - "name": "meta.brace.round.svelte" - } - }, - "contentName": "meta.embedded.expression.svelte source.ts", - "patterns": [ - { - "include": "source.ts" - } - ] - }, - { - "match": "(\\s*([_$[:alpha:]][_$[:alnum:]]*)\\s*)", - "captures": { - "1": { - "name": "meta.embedded.expression.svelte source.ts", - "patterns": [ - { - "include": "source.ts" - } - ] - } - } - }, - { - "match": ",", - "name": "punctuation.separator.svelte" - } - ] - } - ] - }, - { - "begin": "(?<=await.*?)\\G", - "end": "(?=})", - "patterns": [ - { - "begin": "\\G\\s*?(?=\\S)", - "end": "\\s+(then)|(?=})", - "endCaptures": { - "1": { - "name": "keyword.control.flow.svelte" - } - }, - "contentName": "meta.embedded.expression.svelte source.ts", - "patterns": [ - { - "include": "source.ts" - } - ] - }, - { - "begin": "(?<=then\\b)", - "end": "(?=})", - "contentName": "meta.embedded.expression.svelte source.ts", - "patterns": [ - { - "include": "source.ts" - } - ] - } - ] - }, - { - "begin": "(?<=debug.*?)\\G", - "end": "(?=})", - "patterns": [ - { - "match": "[_$[:alpha:]][_$[:alnum:]]*", - "captures": { - "0": { - "name": "meta.embedded.expression.svelte source.ts", - "patterns": [ - { - "include": "source.ts" - } - ] - } - } - }, - { - "match": ",", - "name": "punctuation.separator.svelte" - } - ] - } - ] - }, - "special-tags-void": { - "begin": "({)\\s*((?:[@:])(else\\s+if|[a-z]*))", - "beginCaptures": { - "1": { - "name": "punctuation.definition.block.begin.svelte" - }, - "2": { - "patterns": [ - { - "include": "#special-tags-keywords" - } - ] - } - }, - "end": "\\}", - "endCaptures": { - "0": { - "name": "punctuation.definition.block.end.svelte" - } - }, - "name": "meta.special.$3.svelte", - "patterns": [ - { - "include": "#special-tags-modes" - } - ] - }, - "special-tags-block-begin": { - "begin": "({)\\s*(#([a-z]*))", - "end": "(})", - "name": "meta.special.$3.svelte meta.special.start.svelte", - "beginCaptures": { - "1": { - "name": "punctuation.definition.block.begin.svelte" - }, - "2": { - "patterns": [ - { - "include": "#special-tags-keywords" - } - ] - } - }, - "endCaptures": { - "0": { - "name": "punctuation.definition.block.end.svelte" - } - }, - "patterns": [ - { - "include": "#special-tags-modes" - } - ] - }, - "special-tags-block-end": { - "begin": "({)\\s*(/([a-z]*))", - "end": "(})", - "name": "meta.special.$3.svelte meta.special.end.svelte", - "beginCaptures": { - "1": { - "name": "punctuation.definition.block.begin.svelte" - }, - "2": { - "patterns": [ - { - "include": "#special-tags-keywords" - } - ] - } - }, - "endCaptures": { - "1": { - "name": "punctuation.definition.block.end.svelte" - } - } - }, - "attributes": { - "patterns": [ - { - "include": "#attributes-directives" - }, - { - "include": "#attributes-keyvalue" - }, - { - "include": "#attributes-interpolated" - } - ] - }, - "attributes-interpolated": { - "begin": "(?)", - "patterns": [ - { - "include": "#attributes-value" - } - ] - } - ] - }, - "attributes-value": { - "patterns": [ - { - "include": "#interpolation" - }, - { - "match": "(?:(['\"])([0-9._]+[\\w%]{,4})(\\1))|(?:([0-9._]+[\\w%]{,4})(?=\\s|/?>))", - "captures": { - "1": { - "name": "punctuation.definition.string.begin.svelte" - }, - "2": { - "name": "constant.numeric.decimal.svelte" - }, - "3": { - "name": "punctuation.definition.string.end.svelte" - }, - "4": { - "name": "constant.numeric.decimal.svelte" - } - } - }, - { - "match": "([^\\s\"'=<>`/]|/(?!>))+", - "name": "string.unquoted.svelte", - "patterns": [ - { - "include": "#interpolation" - } - ] - }, - { - "begin": "(['\"])", - "end": "\\1", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.svelte" - } - }, - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.svelte" - } - }, - "name": "string.quoted.svelte", - "patterns": [ - { - "include": "#interpolation" - } - ] - } - ] - }, - "attributes-directives-keywords": { - "patterns": [ - { - "match": "on|use|bind", - "name": "keyword.control.svelte" - }, - { - "match": "transition|in|out|animate", - "name": "keyword.other.animation.svelte" - }, - { - "match": "let", - "name": "storage.type.svelte" - }, - { - "match": "class|style", - "name": "entity.other.attribute-name.svelte" - } - ] - }, - "attributes-directives-types": { - "patterns": [ - { - "match": "(?<=(on):).*$", - "name": "entity.name.type.svelte" - }, - { - "match": "(?<=(bind):).*$", - "name": "variable.parameter.svelte" - }, - { - "match": "(?<=(use|transition|in|out|animate):).*$", - "name": "variable.function.svelte" - }, - { - "match": "(?<=(let|class|style):).*$", - "name": "variable.parameter.svelte" - } - ] - }, - "attributes-directives-types-assigned": { - "patterns": [ - { - "match": "(?<=(bind):)this$", - "name": "variable.language.svelte" - }, - { - "match": "(?<=(bind):).*$", - "name": "entity.name.type.svelte" - }, - { - "match": "(?<=(class):).*$", - "name": "entity.other.attribute-name.class.svelte" - }, - { - "match": "(?<=(style):).*$", - "name": "support.type.property-name.svelte" - }, - { - "include": "#attributes-directives-types" - } - ] - }, - "attributes-directives": { - "begin": "(?)", - "patterns": [ - { - "include": "#attributes-value" - } - ] - } - ] - }, - "tags": { - "patterns": [ - { - "include": "#tags-lang" - }, - { - "include": "#tags-void" - }, - { - "include": "#tags-general-end" - }, - { - "include": "#tags-general-start" - } - ] - }, - "tags-name": { - "patterns": [ - { - "match": "(svelte)(:)([a-z][\\w0-9:-]*)", - "captures": { - "1": { - "name": "keyword.control.svelte" - }, - "2": { - "name": "punctuation.definition.keyword.svelte" - }, - "3": { - "name": "entity.name.tag.svelte" - } - } - }, - { - "match": "slot", - "name": "keyword.control.svelte" - }, - { - "match": "[A-Z][a-zA-Z0-9_]*", - "name": "support.class.component.svelte" - }, - { - "match": "[a-z][\\w0-9:]*-[\\w0-9:-]*", - "name": "meta.tag.custom.svelte entity.name.tag.svelte" - }, - { - "match": "[a-z][\\w0-9:-]*", - "name": "entity.name.tag.svelte" - } - ] - }, - "tags-start-attributes": { - "begin": "\\G", - "end": "(?=/?>)", - "name": "meta.tag.start.svelte", - "patterns": [ - { - "include": "#attributes" - } - ] - }, - "tags-lang-start-attributes": { - "begin": "\\G", - "end": "(?=/>)|>", - "endCaptures": { - "0": { - "name": "punctuation.definition.tag.end.svelte" - } - }, - "name": "meta.tag.start.svelte", - "patterns": [ - { - "include": "#attributes" - } - ] - }, - "tags-start-node": { - "match": "(<)([^/\\s>/]*)", - "captures": { - "1": { - "name": "punctuation.definition.tag.begin.svelte" - }, - "2": { - "patterns": [ - { - "include": "#tags-name" - } - ] - } - }, - "name": "meta.tag.start.svelte" - }, - "tags-end-node": { - "match": "()|(/>)", - "captures": { - "1": { - "name": "meta.tag.end.svelte punctuation.definition.tag.begin.svelte" - }, - "2": { - "name": "meta.tag.end.svelte", - "patterns": [ - { - "include": "#tags-name" - } - ] - }, - "3": { - "name": "meta.tag.end.svelte punctuation.definition.tag.end.svelte" - }, - "4": { - "name": "meta.tag.start.svelte punctuation.definition.tag.end.svelte" - } - } - }, - "tags-lang": { - "begin": "<(script|style|template)", - "end": "|/>", - "beginCaptures": { - "0": { - "patterns": [ - { - "include": "#tags-start-node" - } - ] - } - }, - "endCaptures": { - "0": { - "patterns": [ - { - "include": "#tags-end-node" - } - ] - } - }, - "name": "meta.$1.svelte", - "patterns": [ - { - "begin": "\\G(?=\\s*[^>]*?(type|lang)\\s*=\\s*(['\"]|)(?:text/)?(\\w+)\\2)", - "end": "(?=)", - "name": "meta.lang.$3.svelte", - "patterns": [ - { - "include": "#tags-lang-start-attributes" - } - ] - }, - { - "include": "#tags-lang-start-attributes" - } - ] - }, - "tags-void": { - "begin": "(<)(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)(?=\\s|/?>)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.tag.begin.svelte" - }, - "2": { - "name": "entity.name.tag.svelte" - } - }, - "end": "/?>", - "endCaptures": { - "0": { - "name": "punctuation.definition.tag.begin.svelte" - } - }, - "name": "meta.tag.void.svelte", - "patterns": [ - { - "include": "#attributes" - } - ] - }, - "tags-general-start": { - "begin": "(<)([^/\\s>/]*)", - "end": "(/?>)", - "beginCaptures": { - "0": { - "patterns": [ - { - "include": "#tags-start-node" - } - ] - } - }, - "endCaptures": { - "1": { - "name": "meta.tag.start.svelte punctuation.definition.tag.end.svelte" - } - }, - "name": "meta.scope.tag.$2.svelte", - "patterns": [ - { - "include": "#tags-start-attributes" - } - ] - }, - "tags-general-end": { - "begin": "(]*)", - "end": "(>)", - "beginCaptures": { - "1": { - "name": "meta.tag.end.svelte punctuation.definition.tag.begin.svelte" - }, - "2": { - "name": "meta.tag.end.svelte", - "patterns": [ - { - "include": "#tags-name" - } - ] - } - }, - "endCaptures": { - "1": { - "name": "meta.tag.end.svelte punctuation.definition.tag.end.svelte" - } - }, - "name": "meta.scope.tag.$2.svelte" - } - } -} From db61999bd3388189ab6462fca82c1908873aece6 Mon Sep 17 00:00:00 2001 From: rixo Date: Tue, 15 Feb 2022 03:26:48 +0100 Subject: [PATCH 4/5] fix VSCode grammar to work with Atom --- grammars/svelte.cson | 110 +++++++++++++++++++++++++++++-------------- 1 file changed, 74 insertions(+), 36 deletions(-) diff --git a/grammars/svelte.cson b/grammars/svelte.cson index 6ca9dfc..da6f00a 100644 --- a/grammars/svelte.cson +++ b/grammars/svelte.cson @@ -1,12 +1,32 @@ +# This grammar was adapted from the one in the VSCode extension: +# +# https://github.com/sveltejs/language-tools/blob/6b65f0dd2dedbc9bde4802310cd451a7606b5dd0/packages/svelte-vscode/syntaxes/svelte.tmLanguage.src.yaml +# +# From now on it shouldn't be too hard to keep it in sync with the upstream one. +# +# A few things to note about current Atom (1.59) support of TextMate grammars... +# +# - Atom doesn't like wildcards in lookbehinds. Not sure where this is coming +# from since TextMate grammars use Oniguruma under the hood and Atom doesn't +# seem espcially outdated in this regard. Maybe that's me being thick again. +# +# - `injections` selectors seem flacky, and I couldn't find any spec about them. +# Neither did the guy who implemented the Atom version apparently +# (https://github.com/atom/first-mate/pull/78#issue-180769334). I had to +# expand the (... | ...) patterns to prevent a total crash of the grammar and, +# through trial and error, I determined that the presence or absence of the +# hypen `-` was of crucial importance for the injection to activate _and_ not +# leak into the whole file. But I didn't understand the underlying logic. +# { "name": "Svelte Component", "scopeName": "source.svelte", "fileTypes": [ "svelte" ], - "uuid": "7582b62f-51d9-4a84-8c8d-fc189530faf6", + "uuid": "ce5fbbd0-f7b0-42a8-a257-e731a210c57b", "injections": { - "L:(meta.script.svelte | meta.style.svelte) (meta.lang.js | meta.lang.javascript) - (meta source)": { + "L:meta.script.svelte meta.lang.js - (meta source)": { "patterns": [ { "begin": "(?<=>)(?!)(?!)(?!)(?!)(?!)(?!)", "name": "meta.tag.start.svelte", - "patterns": [ - { - "include": "#attributes" - } - ] + "include": "#attributes" }, "tags-lang-start-attributes": { "begin": "\\G", From be76703b60e183553fcc1522606c1dcd32f5850a Mon Sep 17 00:00:00 2001 From: rixo Date: Tue, 15 Feb 2022 12:41:44 +0100 Subject: [PATCH 5/5] document grammar update in changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5152e97..55c3bcb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,3 +3,4 @@ ## next - Upgrade language server ([#10](https://github.com/sveltejs/svelte-atom/pull/10)) +- Replace legacy grammar with up to date one copied from the VSCode extension ([#15](https://github.com/sveltejs/svelte-atom/pull/15), fixes [#8](https://github.com/sveltejs/svelte-atom/issues/8))