Skip to content

Commit 39fdc7c

Browse files
authored
Add support for EEx templates (#101)
Reuse `tree-sitter-heex` to support the more generic `EEx` templates
1 parent b50b009 commit 39fdc7c

9 files changed

Lines changed: 99 additions & 2 deletions

File tree

.tsqueryrc.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
"languages/([^/]+)/[^/]+\\.scm",
66
"grammars/([^/]+)/queries/[^/]+\\.scm"
77
],
8+
"parser_aliases": {
9+
"eex": "heex"
10+
},
811
"valid_captures": {
912
"brackets": {
1013
"open": "Captures opening brackets, braces, and quotes",

extension.toml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,44 +13,52 @@ repository = "https://github.com/zed-extensions/elixir"
1313
name = "Expert"
1414
languages = [
1515
"Elixir",
16+
"EEx",
1617
"HEEx",
1718
]
1819

1920
[language_servers.expert.language_ids]
2021
"Elixir" = "elixir"
22+
"EEx" = "eex"
2123
"HEEx" = "heex"
2224

2325
[language_servers.elixir-ls]
2426
name = "ElixirLS"
2527
languages = [
2628
"Elixir",
29+
"EEx",
2730
"HEEx",
2831
]
2932

3033
[language_servers.elixir-ls.language_ids]
3134
"Elixir" = "elixir"
35+
"EEx" = "eex"
3236
"HEEx" = "heex"
3337

3438
[language_servers.next-ls]
3539
name = "Next LS"
3640
languages = [
3741
"Elixir",
42+
"EEx",
3843
"HEEx",
3944
]
4045

4146
[language_servers.next-ls.language_ids]
4247
"Elixir" = "elixir"
48+
"EEx" = "eex"
4349
"HEEx" = "heex"
4450

4551
[language_servers.lexical]
4652
name = "Lexical"
4753
languages = [
4854
"Elixir",
55+
"EEx",
4956
"HEEx",
5057
]
5158

5259
[language_servers.lexical.language_ids]
5360
"Elixir" = "elixir"
61+
"EEx" = "eex"
5462
"HEEx" = "heex"
5563

5664
[grammars.elixir]

languages/eex/brackets.scm

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
(directive
2+
_ @open
3+
(_)
4+
"%>" @close)

languages/eex/config.toml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
name = "EEx"
2+
grammar = "heex"
3+
path_suffixes = ["eex"]
4+
block_comment = { start = "<%!-- ", prefix = "", end = " --%>", tab_size = 0 }
5+
autoclose_before = ";:.,=}])>%"
6+
brackets = [
7+
{ start = "{", end = "}", close = true, newline = true },
8+
{ start = "[", end = "]", close = true, newline = true },
9+
{ start = "(", end = ")", close = true, newline = true },
10+
{ start = "<", end = ">", close = true, newline = true },
11+
{ start = "%", end = "%", close = true, newline = true },
12+
{ start = "\"", end = "\"", close = true, newline = false, not_in = ["comment"] },
13+
{ start = "'", end = "'", close = true, newline = false, not_in = ["comment"] },
14+
{ start = "!--", end = " --", close = true, newline = false, not_in = ["comment"] },
15+
]
16+
tab_size = 2

languages/eex/highlights.scm

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
; Directive expressions can use the following tag delimiters:
2+
; `<%` and `%>`
3+
; `<%=` and `%>`
4+
; `<%%` and `%>`
5+
; `<%%=` and `%>`
6+
(directive) @keyword
7+
8+
; Comments can use the following tag delimiters:
9+
; `<%!--` and `--%>`
10+
; `<%#` and `%>`
11+
[
12+
(comment
13+
"<%!--"
14+
"--%>")
15+
(comment
16+
"<%#"
17+
"%>")
18+
] @comment

languages/eex/injections.scm

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
; Directives are standalone tags like `<%= @x %>`
2+
;
3+
; Directives with `partial_expression_value` or `ending_expression_value`
4+
; nodes are Elixir code that is part of an expression that spans multiple
5+
; `directive` nodes, so they must be combined. For example:
6+
; <%= if true do %>
7+
; Hello, tree-sitter!
8+
; <% end %>
9+
(directive
10+
[
11+
(partial_expression_value)
12+
(ending_expression_value)
13+
] @injection.content
14+
(#set! injection.language "elixir")
15+
(#set! injection.combined))
16+
17+
; Directives with `expression_value` nodes do not need to be combined.
18+
; For example: `<%= @content %>`
19+
(directive
20+
(expression_value) @injection.content
21+
(#set! injection.language "elixir"))
22+
23+
; Comment parsing languages support
24+
((comment
25+
"<%!--"
26+
"--%>") @injection.content
27+
(#set! injection.language "comment"))
28+
29+
((comment
30+
"<%#"
31+
"%>") @injection.content
32+
(#set! injection.language "comment"))

languages/eex/outline.scm

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[
2+
(comment
3+
"<%!--"
4+
"--%>")
5+
(comment
6+
"<%#"
7+
"%>")
8+
] @annotation

languages/eex/overrides.scm

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[
2+
(comment
3+
"<%!--"
4+
"--%>")
5+
(comment
6+
"<%#"
7+
"%>")
8+
] @comment

languages/heex/injections.scm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
(expression_value) @injection.content
55
(#set! injection.language "elixir"))
66

7-
; Directives are standalone tags like '<%= @x %>'
7+
; Directives are standalone tags like `<%= @x %>`
88
;
9-
; Directives with `partial_expression_value` and `ending_expression_value`
9+
; Directives with `partial_expression_value` or `ending_expression_value`
1010
; nodes are Elixir code that is part of an expression that spans multiple
1111
; `directive` nodes, so they must be combined. For example:
1212
; <%= if true do %>

0 commit comments

Comments
 (0)