Files
nvim-treesitter/scripts/update-readme.lua
Christian Clason 5a38df5627 feat(install)!: generate from json instead of requiring node
Problem: Many parsers require node/npm to evaluate the `grammar.js`
before being able to generate a parser from it.

Solution: Generate from `grammar.json` instead, which is fully resolved.
Drops `node` and `npm` as (optional) requirements for nvim-treesitter.

Note that this requires parsers to commit the generated json iff the
grammar requires evaluation (which is currently the case for all tracked
languages).
2025-05-12 18:43:40 +02:00

88 lines
2.4 KiB
Lua
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env -S nvim -l
vim.opt.runtimepath:append('.')
local util = require('nvim-treesitter.util')
local parsers = require('nvim-treesitter.parsers')
---@class Parser
---@field name string
---@field parser ParserInfo
local sorted_parsers = {}
for k, v in pairs(parsers.configs) do
table.insert(sorted_parsers, { name = k, parser = v })
end
table.sort(sorted_parsers, function(a, b)
return a.name < b.name
end)
local generated_text = [[
Language | Tier | Queries | CLI | Maintainer
-------- |:----:|:-------:|:---:| ----------
]]
local footnotes = ''
for _, v in ipairs(sorted_parsers) do
local p = v.parser
-- language
if p.install_info then
generated_text = generated_text
.. '['
.. v.name
.. ']('
.. p.install_info.url
.. ')'
.. (p.readme_note and '[^' .. v.name .. ']' or '')
.. ' | '
else
generated_text = generated_text
.. v.name
.. ' (queries only)'
.. (p.readme_note and '[^' .. v.name .. ']' or '')
.. ' | '
end
if p.readme_note then
footnotes = footnotes .. '[^' .. v.name .. ']: ' .. p.readme_note .. '\n'
end
-- tier
generated_text = generated_text .. (p.tier and parsers.tiers[p.tier] or '') .. ' | '
-- queries
generated_text = generated_text
.. '`'
.. (vim.uv.fs_stat('runtime/queries/' .. v.name .. '/highlights.scm') and 'H' or ' ')
.. (vim.uv.fs_stat('runtime/queries/' .. v.name .. '/folds.scm') and 'F' or ' ')
.. (vim.uv.fs_stat('runtime/queries/' .. v.name .. '/indents.scm') and 'I' or ' ')
.. (vim.uv.fs_stat('runtime/queries/' .. v.name .. '/injections.scm') and 'J' or ' ')
.. (vim.uv.fs_stat('runtime/queries/' .. v.name .. '/locals.scm') and 'L' or ' ')
.. '` | '
-- CLI
generated_text = generated_text
.. (p.install_info and p.install_info.generate and '' or '')
.. ' | '
-- Maintainer
generated_text = generated_text
.. (p.maintainers and table.concat(p.maintainers, ', ') or '')
.. '\n'
end
generated_text = generated_text .. footnotes
local readme = 'SUPPORTED_LANGUAGES.md'
local readme_text = util.read_file(readme)
local new_readme_text = string.gsub(
readme_text,
'<!%-%-parserinfo%-%->.*<!%-%-parserinfo%-%->',
'<!--parserinfo-->\n' .. generated_text .. '<!--parserinfo-->'
)
util.write_file(readme, new_readme_text)
if string.find(readme_text, generated_text, 1, true) then
print(readme .. ' is up-to-date\n')
else
print('New ' .. readme .. ' was written\n')
end