diff --git a/lockfile.json b/lockfile.json index 87802b789..efc5510e0 100644 --- a/lockfile.json +++ b/lockfile.json @@ -806,6 +806,9 @@ "templ": { "revision": "def9849184de71a797c4e2b2837df85abeccf92c" }, + "tera": { + "revision": "ae37c8f0e55b3b969caf5433940553374c87430c" + }, "terraform": { "revision": "9e3ec9848f28d26845ba300fd73c740459b83e9b" }, diff --git a/lua/nvim-treesitter/parsers.lua b/lua/nvim-treesitter/parsers.lua index 8a3acf2c6..9eeb40019 100644 --- a/lua/nvim-treesitter/parsers.lua +++ b/lua/nvim-treesitter/parsers.lua @@ -2325,6 +2325,14 @@ list.tcl = { maintainers = { "@lewis6991" }, } +list.tera = { + install_info = { + url = "https://github.com/uncenter/tree-sitter-tera", + files = { "src/parser.c", "src/scanner.c" }, + }, + maintainers = { "@uncenter" }, +} + list.terraform = { install_info = { url = "https://github.com/MichaHoffmann/tree-sitter-hcl", diff --git a/queries/tera/highlights.scm b/queries/tera/highlights.scm new file mode 100644 index 000000000..637b3d150 --- /dev/null +++ b/queries/tera/highlights.scm @@ -0,0 +1,158 @@ +; Variables +;---------- +(identifier) @variable + +((identifier) @variable.builtin + (#any-of? @variable.builtin "loop" "__tera_context")) + +; Properties +;----------- +(member_expression + property: (identifier)? @variable.other.member) + +; Literals +;----------- +(string) @string + +(bool) @constant.builtin + +(number) @constant.numeric + +; Tokens +;----------- +[ + "." + "," +] @punctuation.delimiter + +[ + "*" + "/" + "%" + "|" + "+" + "-" + "~" + "=" + "==" + "!=" + "<" + ">" + "<=" + ">=" +] @operator + +[ + "(" + ")" + "[" + "]" + "{%" + "%}" + "-%}" + "{%-" + "}}" + "{{" + "-}}" + "{{-" + "::" +] @punctuation.bracket + +; Tags +;----------- +(comment_tag) @comment + +; Keywords +;----------- +[ + "if" + "elif" + "else" + "endif" +] @keyword.control.conditional + +[ + "for" + "endfor" +] @keyword.control.repeat + +[ + "include" + "import" + "extends" +] @keyword.control.import + +[ + "in" + "and" + "or" + "not" + "is" +] @keyword.operator + +[ + "break" + "continue" +] @keyword.control.return + +[ + "set" + "set_global" + "filter" + "endfilter" + "block" + "endblock" + "macro" + "endmacro" + "raw" + "endraw" + "as" +] @keyword + +; Functions +;----------- +(macro_statement + name: (identifier) @function + (parameter_list + parameter: (identifier) @variable.parameter + (optional_parameter + name: (identifier) @variable.parameter))) + +(call_expression + scope: (identifier)? @namespace + name: (identifier) @function) + +(call_expression + name: (identifier) @function.builtin + (#any-of? @function.builtin + ; Functions - https://keats.github.io/tera/docs/#built-in-functions + "range" "now" "throw" "get_random" "get_env")) + +(test_expression + test: (identifier) @function) + +(test_expression + test: (identifier) @function.builtin + (#any-of? @function.builtin + ; Tests - https://keats.github.io/tera/docs/#built-in-tests + "defined" "undefined" "odd" "even" "string" "number" "divisibleby" "iterable" "object" + "starting_with" "ending_with" "containing" "matching")) + +(filter_expression + filter: (identifier) @function.method) + +(filter_expression + filter: (identifier) @function.builtin + (#any-of? @function.builtin + ; Filters - https://keats.github.io/tera/docs/#built-in-filters + "lower" "upper" "wordcount" "capitalize" "replace" "addslashes" "slugify" "title" "trim" + "trim_start" "trim_end" "trim_start_matches" "trim_end_matches" "truncate" "linebreaksbr" + "spaceless" "indent" "striptags" "first" "last" "nth" "join" "length" "reverse" "sort" "unique" + "slice" "group_by" "filter" "map" "concat" "urlencode" "urlencode_strict" "abs" "pluralize" + "round" "filesizeformat" "date" "escape" "escape_xml" "safe" "get" "split" "int" "float" + "json_encode" "as_str" "default")) + +; Namespaces +;----------- +(import_statement + scope: (identifier) @namespace) diff --git a/queries/tera/injections.scm b/queries/tera/injections.scm new file mode 100644 index 000000000..636a17a07 --- /dev/null +++ b/queries/tera/injections.scm @@ -0,0 +1,4 @@ +(frontmatter + (content) @injection.content + (#set! injection.language "yaml") + (#set! injection.combined))