diff options
author | Arthur Deierlein | 2024-03-19 16:26:50 +0000 |
---|---|---|
committer | GitHub | 2024-03-19 16:26:50 +0000 |
commit | 427dd2f383ab54457ec4e7bbb9cf0d83b9d7908a (patch) | |
tree | f5cefc3f4de74b1a32b4c91292df15cd3c08b00e /runtime/queries | |
parent | d9de809a573e28c425b5da9da8c77340d2a0174e (diff) |
Add support for ember.js templates (#9902)
* feat: add support for ember .hbs (glimmer) templates
* adjust highlights to helix
* highlight this correctly in block statements
* correctly highlight attributes
* correctly highlight hash_pair
* add newline to highlights.scm
* refactor: use #any-of and #eq instead of #match
* chore: add newline to languages.toml
Diffstat (limited to 'runtime/queries')
-rw-r--r-- | runtime/queries/glimmer/highlights.scm | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/runtime/queries/glimmer/highlights.scm b/runtime/queries/glimmer/highlights.scm new file mode 100644 index 00000000..789722ad --- /dev/null +++ b/runtime/queries/glimmer/highlights.scm @@ -0,0 +1,94 @@ +; === Tag Names === + +; Tags that start with a lower case letter are HTML tags +; We'll also use this highlighting for named blocks (which start with `:`) +((tag_name) @tag + (#match? @tag "^(:)?[a-z]")) +; Tags that start with a capital letter are Glimmer components +((tag_name) @constructor + (#match? @constructor "^[A-Z]")) + +(attribute_name) @attribute + +(string_literal) @string +(number_literal) @constant.numeric.integer +(boolean_literal) @constant.builtin.boolean + +(concat_statement) @string + +; === Block Statements === + +; Highlight the brackets +(block_statement_start) @punctuation.delimiter +(block_statement_end) @punctuation.delimiter + +; Highlight `if`/`each`/`let` +(block_statement_start path: (identifier) @keyword.control.conditional) +(block_statement_end path: (identifier) @keyword.control.conditional) +((mustache_statement (identifier) @keyword.control.conditional) + (#eq? @keyword.control.conditional "else")) + +; == Mustache Statements === + +; Hightlight the whole statement, to color brackets and separators +(mustache_statement) @punctuation.delimiter + +; An identifier in a mustache expression is a variable +((mustache_statement [ + (path_expression (identifier) @variable) + (identifier) @variable + ]) + (#not-any-of? @variable "yield" "outlet" "this" "else")) +; As are arguments in a block statement +((block_statement_start argument: [ + (path_expression (identifier) @variable) + (identifier) @variable + ]) + (#not-eq? @variable "this")) +; As is an identifier in a block param +(block_params (identifier) @variable) +; As are helper arguments +((helper_invocation argument: [ + (path_expression (identifier) @variable) + (identifier) @variable + ]) + (#not-eq? @variable "this")) +; `this` should be highlighted as a built-in variable +((identifier) @variable.builtin + (#eq? @variable.builtin "this")) + +; If the identifier is just "yield" or "outlet", it's a keyword +((mustache_statement (identifier) @keyword.control.return) + (#any-of? @keyword.control.return "yield" "outlet")) + +; Helpers are functions +((helper_invocation helper: [ + (path_expression (identifier) @function) + (identifier) @function + ]) + (#not-any-of? @function "if" "yield")) + +((helper_invocation helper: (identifier) @keyword.control.conditional) + (#any-of? @keyword.control.conditional "if" "yield")) + +(hash_pair key: (identifier) @variable) +(hash_pair value: (identifier) @variable) +(hash_pair [ + (path_expression (identifier) @variable) + (identifier) @variable + ]) + +(comment_statement) @comment + +(attribute_node "=" @operator) + +(block_params "as" @keyword.control) +(block_params "|" @operator) + +[ + "<" + ">" + "</" + "/>" +] @punctuation.delimiter + |