From 427dd2f383ab54457ec4e7bbb9cf0d83b9d7908a Mon Sep 17 00:00:00 2001 From: Arthur Deierlein Date: Tue, 19 Mar 2024 17:26:50 +0100 Subject: 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--- runtime/queries/glimmer/highlights.scm | 94 ++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 runtime/queries/glimmer/highlights.scm (limited to 'runtime/queries') 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 + -- cgit v1.2.3-70-g09d2