aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenny Powers <web@bennypowers.com>2023-03-17 11:31:11 +0200
committerAmaan Qureshi <amaanq12@gmail.com>2023-03-22 02:28:21 -0400
commit19d9af8fb0e8465a93d63c6aee23371dad9ce399 (patch)
treed5b7e1b7bf313d6177fb5efbf723d5ddbe88e2a0
parenttest: ecma injections (diff)
downloadnvim-treesitter-19d9af8fb0e8465a93d63c6aee23371dad9ce399.tar
nvim-treesitter-19d9af8fb0e8465a93d63c6aee23371dad9ce399.tar.gz
nvim-treesitter-19d9af8fb0e8465a93d63c6aee23371dad9ce399.tar.bz2
nvim-treesitter-19d9af8fb0e8465a93d63c6aee23371dad9ce399.tar.lz
nvim-treesitter-19d9af8fb0e8465a93d63c6aee23371dad9ce399.tar.xz
nvim-treesitter-19d9af8fb0e8465a93d63c6aee23371dad9ce399.tar.zst
nvim-treesitter-19d9af8fb0e8465a93d63c6aee23371dad9ce399.zip
feat(html): injections in <script type>
refactor(html): remove superfluous injection query fix(html): associate "module" type with "javascript"
-rw-r--r--lua/nvim-treesitter/query_predicates.lua23
-rw-r--r--queries/html_tags/injections.scm20
2 files changed, 33 insertions, 10 deletions
diff --git a/lua/nvim-treesitter/query_predicates.lua b/lua/nvim-treesitter/query_predicates.lua
index 2509a677c..8c0a4c947 100644
--- a/lua/nvim-treesitter/query_predicates.lua
+++ b/lua/nvim-treesitter/query_predicates.lua
@@ -119,6 +119,29 @@ query.add_predicate("has-type?", function(match, _pattern, _bufnr, pred)
return vim.tbl_contains(types, node:type())
end)
+local html_script_type_languages = {
+ ["importmap"] = "json",
+ ["module"] = "javascript",
+ ["application/ecmascript"] = "javascript",
+ ["text/ecmascript"] = "javascript",
+}
+
+---@param match string
+---@param metadata table
+---@return boolean|nil
+query.add_directive("set-lang-from-mimetype!", function(match, pattern, bufnr, predicate, metadata)
+ local capture_id = predicate[2]
+ local node = match[capture_id]
+ local type_attr_value = vim.treesitter.get_node_text(node, bufnr)
+ local configured = html_script_type_languages[type_attr_value]
+ if configured then
+ metadata.language = configured
+ else
+ local parts = vim.split(type_attr_value, "/", {})
+ metadata.language = parts[#parts]
+ end
+end)
+
-- Just avoid some annoying warnings for this directive
query.add_directive("make-range!", function() end)
diff --git a/queries/html_tags/injections.scm b/queries/html_tags/injections.scm
index 23b500590..dd971b7d9 100644
--- a/queries/html_tags/injections.scm
+++ b/queries/html_tags/injections.scm
@@ -27,23 +27,23 @@
(#not-match? @_no_type_lang "\\s(lang|type)\\s*\\=")
(raw_text) @javascript))
-(
- (script_element
- (start_tag
- (attribute
- (attribute_name) @_type
- (quoted_attribute_value (attribute_value) @_javascript)))
- (raw_text) @javascript)
- (#eq? @_type "type")
- (#any-of? @_javascript "text/javascript" "module")
-)
+; <script type="mimetype-or-well-known-script-type">
+(script_element
+ (start_tag
+ ((attribute
+ (attribute_name) @_attr (#eq? @_attr "type")
+ (quoted_attribute_value (attribute_value) @_type))))
+ (raw_text) @content (#set-lang-from-mimetype! @_type))
+; <a style="/* css */">
((attribute
(attribute_name) @_attr
(quoted_attribute_value (attribute_value) @css))
(#eq? @_attr "style"))
; lit-html style template interpolation
+; <a @click=${e => console.log(e)}>
+; <a @click="${e => console.log(e)}">
((attribute
(quoted_attribute_value (attribute_value) @javascript))
(#match? @javascript "\\$\\{")