feat(ts): add mustache parser with cloudinit filetype alias

This commit is contained in:
2026-05-12 06:51:52 +02:00
parent ef21d5a7ff
commit 8a88455f87
11 changed files with 131 additions and 10 deletions
+54 -10
View File
@@ -2,12 +2,17 @@ local log = require("log")
local M = {}
---@class ow.TS.Alias
---@field lang string
---@field filetypes? string[]
---@class ow.TS.Parser
---@field lang string
---@field location? string
---@field generate? boolean
---@field from_json? boolean
---@field filetypes? string[]
---@field aliases? ow.TS.Alias[]
---@class ow.TS.RepoBase
---@field src string
@@ -24,6 +29,7 @@ local M = {}
---@field generate? boolean
---@field from_json? boolean
---@field filetypes? string[]
---@field aliases? ow.TS.Alias[]
---@class ow.TS.MultiSpec : ow.TS.RepoBase
---@field parsers ow.TS.Parser[]
@@ -52,28 +58,62 @@ local function start_treesitter(buf)
end
end
---@param parser ow.TS.Parser
---@param lang string
---@param so string
local function register(parser, so)
vim.treesitter.language.add(parser.lang, { path = so })
local filetypes = { parser.lang }
if parser.filetypes then
vim.treesitter.language.register(parser.lang, parser.filetypes)
vim.list_extend(filetypes, parser.filetypes)
---@param filetypes? string[]
---@param symbol_name? string
local function register_lang(lang, so, filetypes, symbol_name)
vim.treesitter.language.add(
lang,
{ path = so, symbol_name = symbol_name }
)
local fts = { lang }
if filetypes then
vim.treesitter.language.register(lang, filetypes)
vim.list_extend(fts, filetypes)
end
vim.api.nvim_create_autocmd("FileType", {
group = vim.api.nvim_create_augroup(
"ow.ts.parser." .. parser.lang,
"ow.ts.parser." .. lang,
{ clear = true }
),
pattern = filetypes,
pattern = fts,
callback = function(ev)
start_treesitter(ev.buf)
end,
})
end
---@class ow.TS.LangEntry
---@field lang string
---@field filetypes? string[]
---@field symbol_name? string
---@param parser ow.TS.Parser
---@return ow.TS.LangEntry[]
local function parser_langs(parser)
local entries = {
{ lang = parser.lang, filetypes = parser.filetypes },
}
for _, alias in ipairs(parser.aliases or {}) do
table.insert(entries, {
lang = alias.lang,
filetypes = alias.filetypes,
symbol_name = parser.lang,
})
end
return entries
end
---@param parser ow.TS.Parser
---@param so string
local function register(parser, so)
for _, e in ipairs(parser_langs(parser)) do
register_lang(e.lang, so, e.filetypes, e.symbol_name)
end
end
---@param lang string
local function activate_open_buffers(lang)
local fts = vim.treesitter.language.get_filetypes(lang)
@@ -110,7 +150,9 @@ local function build(repo, parser)
return
end
register(parser, out)
activate_open_buffers(parser.lang)
for _, e in ipairs(parser_langs(parser)) do
activate_open_buffers(e.lang)
end
end
local function do_build()
@@ -206,6 +248,7 @@ local function spec_to_repo(spec)
generate = pick(s.generate, spec.generate),
from_json = pick(s.from_json, spec.from_json),
filetypes = s.filetypes,
aliases = s.aliases,
})
end
else
@@ -225,6 +268,7 @@ local function spec_to_repo(spec)
generate = spec.generate,
from_json = spec.from_json,
filetypes = spec.filetypes,
aliases = spec.aliases,
})
end