summaryrefslogtreecommitdiff
path: root/script-beta/library.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script-beta/library.lua')
-rw-r--r--script-beta/library.lua320
1 files changed, 1 insertions, 319 deletions
diff --git a/script-beta/library.lua b/script-beta/library.lua
index a8c45738..5a48499b 100644
--- a/script-beta/library.lua
+++ b/script-beta/library.lua
@@ -7,278 +7,6 @@ local client = require 'provider.client'
local m = {}
-local function mergeEnum(lib, locale)
- if not lib or not locale then
- return
- end
- local pack = {}
- for _, enum in ipairs(lib) do
- if enum.enum then
- pack[enum.enum] = enum
- end
- if enum.code then
- pack[enum.code] = enum
- end
- end
- for _, enum in ipairs(locale) do
- if pack[enum.enum] then
- if enum.description then
- pack[enum.enum].description = enum.description
- end
- end
- if pack[enum.code] then
- if enum.description then
- pack[enum.code].description = enum.description
- end
- end
- end
-end
-
-local function mergeField(lib, locale)
- if not lib or not locale then
- return
- end
- local pack = {}
- for _, field in ipairs(lib) do
- if field.field then
- pack[field.field] = field
- end
- end
- for _, field in ipairs(locale) do
- if pack[field.field] then
- if field.description then
- pack[field.field].description = field.description
- end
- end
- end
-end
-
-local function mergeLocale(libs, locale)
- if not libs or not locale then
- return
- end
- for name in pairs(locale) do
- if libs[name] then
- if locale[name].description then
- libs[name].description = locale[name].description
- end
- mergeEnum(libs[name].enums, locale[name].enums)
- mergeField(libs[name].fields, locale[name].fields)
- end
- end
-end
-
-local function isMatchVersion(version)
- if not version then
- return true
- end
- local runtimeVersion = config.config.runtime.version
- if type(version) == 'table' then
- for i = 1, #version do
- if version[i] == runtimeVersion then
- return true
- end
- end
- else
- if version == runtimeVersion then
- return true
- end
- end
- return false
-end
-
-local function insertGlobal(tbl, key, value)
- if not isMatchVersion(value.version) then
- return false
- end
- if not value.doc then
- value.doc = key
- end
- tbl[key] = {
- type = 'library',
- name = key,
- child = {},
- value = value,
- }
- value.library = tbl[key]
- return true
-end
-
-local function insertOther(tbl, key, value)
- if not value.version then
- return
- end
- if not tbl[key] then
- tbl[key] = {}
- end
- if type(value.version) == 'string' then
- tbl[key][#tbl[key]+1] = value.version
- elseif type(value.version) == 'table' then
- for _, version in ipairs(value.version) do
- if type(version) == 'string' then
- tbl[key][#tbl[key]+1] = version
- end
- end
- end
- table.sort(tbl[key])
-end
-
-local function insertCustom(tbl, key, value, libName)
- if not tbl[key] then
- tbl[key] = {}
- end
- tbl[key][#tbl[key]+1] = libName
- table.sort(tbl[key])
-end
-
-local function isEnableGlobal(libName)
- if config.config.runtime.library[libName] then
- return true
- end
- if libName:sub(1, 1) == '@' then
- return true
- end
- return false
-end
-
-local function mergeSource(alllibs, name, lib, libName)
- if not lib.source then
- if isEnableGlobal(libName) then
- local suc = insertGlobal(alllibs.global, name, lib)
- if not suc then
- insertOther(alllibs.other, name, lib)
- end
- else
- insertCustom(alllibs.custom, name, lib, libName)
- end
- return
- end
- for _, source in ipairs(lib.source) do
- local sourceName = source.name or name
- if source.type == 'global' then
- if isEnableGlobal(libName) then
- local suc = insertGlobal(alllibs.global, sourceName, lib)
- if not suc then
- insertOther(alllibs.other, sourceName, lib)
- end
- else
- insertCustom(alllibs.custom, sourceName, lib, libName)
- end
- elseif source.type == 'library' then
- insertGlobal(alllibs.library, sourceName, lib)
- elseif source.type == 'object' then
- insertGlobal(alllibs.object, sourceName, lib)
- end
- end
-end
-
-local function copy(t)
- local new = {}
- for k, v in pairs(t) do
- new[k] = v
- end
- return new
-end
-
-local function insertChild(tbl, name, key, value)
- if not name or not key then
- return
- end
- if not isMatchVersion(value.version) then
- return
- end
- if not value.doc then
- value.doc = ('%s.%s'):format(name, key)
- end
- if not tbl[name] then
- tbl[name] = {
- type = 'library',
- name = name,
- child = {},
- }
- end
- tbl[name].child[key] = {
- type = 'library',
- name = key,
- value = value,
- }
- value.library = tbl[name].child[key]
-end
-
-local function mergeParent(alllibs, name, lib, libName)
- for _, parent in ipairs(lib.parent) do
- if parent.type == 'global' then
- if isEnableGlobal(libName) then
- insertChild(alllibs.global, parent.name, name, lib)
- end
- elseif parent.type == 'library' then
- insertChild(alllibs.library, parent.name, name, lib)
- elseif parent.type == 'object' then
- insertChild(alllibs.object, parent.name, name, lib)
- end
- end
-end
-
-local function mergeLibs(alllibs, libs, libName)
- if not libs then
- return
- end
- for _, lib in pairs(libs) do
- if lib.parent then
- mergeParent(alllibs, lib.name, lib, libName)
- else
- mergeSource(alllibs, lib.name, lib, libName)
- end
- end
-end
-
-local function loadLocale(language, relative)
- local localePath = ROOT / 'locale' / language / relative
- local localeBuf = util.loadFile(localePath:string())
- if localeBuf then
- local locale = util.container()
- xpcall(lni, log.error, localeBuf, localePath:string(), {locale})
- return locale
- end
- return nil
-end
-
-local function fix(libs)
- for name, lib in pairs(libs) do
- lib.name = lib.name or name
- end
-end
-
-local function scan(path)
- local result = {path}
- local i = 0
- return function ()
- i = i + 1
- local current = result[i]
- if not current then
- return nil
- end
- if fs.is_directory(current) then
- for path in current:list_directory() do
- result[#result+1] = path
- end
- end
- return current
- end
-end
-
-local function markLibrary(library)
- for _, lib in pairs(library) do
- lib.fields = {}
- if lib.child then
- for _, child in util.sortPairs(lib.child) do
- table.insert(lib.fields, child)
- child.parent = library
- end
- end
- end
-end
-
local function getDocFormater()
local version = config.config.runtime.version
if client.client() == 'vscode' then
@@ -462,58 +190,12 @@ local function compileMetaDoc()
end
end
-local function initFromLni()
- local id = lang.id
- m.global = util.container()
- m.library = util.container()
- m.object = util.container()
- m.other = util.container()
- m.custom = util.container()
-
- for libPath in (ROOT / 'libs'):list_directory() do
- local libName = libPath:filename():string()
- for path in scan(libPath) do
- local libs
- local buf = util.loadFile(path:string())
- if buf then
- libs = util.container()
- xpcall(lni, log.error, buf, path:string(), {libs})
- fix(libs)
- end
- local relative = fs.relative(path, ROOT)
-
- local locale = loadLocale('en-US', relative)
- mergeLocale(libs, locale)
- if id ~= 'en-US' then
- locale = loadLocale(id, relative)
- mergeLocale(libs, locale)
- end
- mergeLibs(m, libs, libName)
- end
- end
-
- markLibrary(m.global)
- markLibrary(m.library)
- markLibrary(m.object)
- markLibrary(m.other)
- markLibrary(m.custom)
-end
-
local function initFromMetaDoc()
- m.global = util.container()
- m.library = util.container()
- m.object = util.container()
- m.other = util.container()
- m.custom = util.container()
compileMetaDoc()
end
local function init()
- if DEVELOP or TEST then
- initFromMetaDoc()
- else
- initFromLni()
- end
+ initFromMetaDoc()
end
function m.init()