local fmt = string.format local function write_file(path, txt, flag) local data = type(txt) == "string" and txt or vim.inspect(txt) local uv = vim.loop uv.fs_open(path, flag, 438, function(open_err, fd) assert(not open_err, open_err) uv.fs_write(fd, data, -1, function(write_err) assert(not write_err, write_err) uv.fs_close(fd, function(close_err) assert(not close_err, close_err) end) end) end) end local function read_file(path) local uv = vim.loop local fd = assert(uv.fs_open(path, "r", 438)) local fstat = assert(uv.fs_fstat(fd)) local contents = assert(uv.fs_read(fd, fstat.size, 0)) assert(uv.fs_close(fd)) return contents end local filetype_lua_url = "https://raw.githubusercontent.com/neovim/neovim/9e1ee9fb1d747facb6fa97a32dc5e22c7dfcb346/runtime/lua/vim/filetype.lua" local languages_yaml_url = "https://raw.githubusercontent.com/github/linguist/master/lib/linguist/languages.yml" local language_stats_url = "https://raw.githubusercontent.com/oprogramador/github-languages/master/1000-pushed-after-2020-06-07.json" local awk_script = [['NR==33, NR==1010; NR==1011 {print; exit}']] vim.fn.system(fmt("curl -LSs '%s' | yq > %s", languages_yaml_url, "languages.json")) vim.fn.system(fmt("curl -LSs '%s' | awk '{print tolower($0)}' > %s", language_stats_url, "stats.json")) vim.fn.system(fmt("curl -LSs '%s' | awk %s | xargs -0 echo 'return {' > %s", filetype_lua_url, awk_script, "lua/scratch/defaults.lua")) local lang_maps = vim.json.decode(read_file("languages.json")) local stats = vim.json.decode(read_file("stats.json")) local collection = {} for lang, v in pairs(lang_maps) do if v.extensions and type(v.extensions) == "table" then for _, entry in ipairs(v.extensions) do collection[string.gsub(entry, "%.", "")] = lang:lower() end end end table.sort(collection) write_file("lua/scratch/imported.lua", "return " .. vim.inspect(collection), "w") write_file("lua/scratch/stats.lua", "return " .. vim.inspect(stats), "w") local function is_top_language(name) -- check that the language exists and has more than 5 stars return stats[name] and stats[name] > 5 end local defaults = require("scratch.defaults") local missing = {} for ext, lang in pairs(collection) do if is_top_language(lang) and not defaults[ext] then missing[ext] = lang end end table.sort(missing) write_file("lua/scratch/missing.lua", "return " .. vim.inspect(missing), "w")