feat(ts): add mustache parser with cloudinit filetype alias
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
vim.filetype.add({
|
||||
pattern = {
|
||||
[".*%.xml%.tmpl"] = "gotmpl",
|
||||
[".*%.cloud%-init%.yml"] = "cloudinit",
|
||||
},
|
||||
})
|
||||
|
||||
+54
-10
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user