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") -) +;