modlib/init.lua

165 lines
4.3 KiB
Lua
Raw Normal View History

2019-05-01 16:53:01 +02:00
-- Lua version check
if _VERSION then
2021-08-16 18:24:11 +02:00
-- TODO get rid of this string version checking
2021-03-27 20:10:49 +01:00
if _VERSION < "Lua 5" then
error("Outdated Lua version! modlib requires Lua 5 or greater.")
end
if _VERSION > "Lua 5.1" then
-- not throwing error("Too new Lua version! modlib requires Lua 5.1 or smaller.") anymore
unpack = unpack or table.unpack -- unpack was moved to table.unpack in Lua 5.2
2021-08-16 18:24:11 +02:00
loadstring = loadstring or load
setfenv = setfenv or function(fn, env)
2021-03-27 20:10:49 +01:00
local i = 1
while true do
2021-03-30 18:04:45 +02:00
local name = debug.getupvalue(fn, i)
2021-03-27 20:10:49 +01:00
if name == "_ENV" then
debug.setupvalue(fn, i, env)
break
elseif not name then
break
end
end
return fn
end
2021-08-16 18:24:11 +02:00
getfenv = getfenv or function(fn)
2021-03-27 20:10:49 +01:00
local i = 1
local name, val
repeat
name, val = debug.getupvalue(fn, i)
if name == "_ENV" then
return val
end
i = i + 1
until not name
end
end
2020-02-09 01:39:54 +01:00
end
2019-07-13 19:55:49 +02:00
2021-03-29 14:37:57 +02:00
local modules = {}
for _, file in pairs{
"schema",
"file",
"func",
"math",
"table",
"text",
"vector",
"quaternion",
"trie",
"kdtree",
2021-07-12 21:32:15 +02:00
"hashlist",
2022-01-19 16:45:47 +01:00
"hashheap",
2021-03-29 14:37:57 +02:00
"heap",
"ranked_set",
"binary",
"b3d",
2021-09-07 21:08:46 +02:00
"json",
2021-07-06 21:56:20 +02:00
"luon",
2021-04-21 21:11:00 +02:00
"bluon",
2021-05-04 16:18:46 +02:00
"persistence",
2022-01-09 17:32:11 +01:00
"debug",
"web"
2021-03-29 14:37:57 +02:00
} do
modules[file] = file
2021-03-29 14:37:57 +02:00
end
if minetest then
modules.minetest = "minetest"
2021-03-29 14:37:57 +02:00
end
-- aliases
-- more aliases are implemented below:
-- modlib.[mod|log|conf|player] are aliases of modlib.minetest.[mod|log|conf|player] respectively
modules.string = "text"
modules.number = "math"
2021-03-29 14:37:57 +02:00
2021-06-17 19:45:08 +02:00
local parent_dir
if not minetest then
local init_path = arg and arg[0]
parent_dir = init_path and init_path:match"^.[/\\]" or ""
end
2021-11-06 18:35:29 +01:00
local dir_delim = rawget(_G, "DIR_DELIM") or (rawget(_G, "package") and package.config and assert(package.config:match("^(.-)[\r\n]"))) or "/"
local function concat_path(path)
return table.concat(path, dir_delim)
end
2021-06-17 19:45:08 +02:00
-- only used if Minetest is available
local function get_resource(modname, resource, ...)
if not resource then
resource = modname
modname = minetest.get_current_modname()
end
return concat_path{minetest.get_modpath(modname), resource, ...}
2021-06-17 19:45:08 +02:00
end
2021-11-06 18:45:12 +01:00
local function load_module(self, module_name_or_alias)
local module_name = modules[module_name_or_alias]
if not module_name then
-- Handle modlib.[log|player] aliases for the minetest.[log|player] modules
if module_name_or_alias == "log" or module_name_or_alias == "player" then
return modlib.minetest[module_name_or_alias]
end
2021-11-06 18:45:12 +01:00
-- no such module
return
end
local environment
if module_name ~= module_name_or_alias then
-- alias handling
environment = self[module_name]
else
environment = dofile(minetest
and get_resource(self.modname, module_name .. ".lua")
or (parent_dir .. module_name .. ".lua"))
end
self[module_name_or_alias] = environment
return environment
end
local rawget, rawset = rawget, rawset
2021-03-29 14:37:57 +02:00
modlib = setmetatable({
2021-03-27 21:01:29 +01:00
-- TODO bump on release
2022-06-27 21:20:29 +02:00
version = 97,
2021-03-29 14:37:57 +02:00
modname = minetest and minetest.get_current_modname(),
2021-03-27 20:10:49 +01:00
_RG = setmetatable({}, {
__index = function(_, index)
return rawget(_G, index)
end,
__newindex = function(_, index, value)
return rawset(_G, index, value)
end
}),
assertdump = minetest and function(v, value)
2021-03-27 20:10:49 +01:00
if not v then
error(dump(value), 2)
end
end
2021-11-06 18:45:12 +01:00
}, { __index = load_module })
2021-02-01 16:22:37 +01:00
2021-11-06 18:38:08 +01:00
-- Force load file module to pass dir_delim & to set concat_path
modlib.file = assert(loadfile(get_resource"file.lua"))(dir_delim)
modlib.file.concat_path = concat_path
2021-03-29 14:37:57 +02:00
2021-08-15 22:07:31 +02:00
if minetest then
-- Force-loading of the minetest, mod and conf modules.
-- Also sets modlib.[mod|conf] -> modlib.minetest.[mod|conf] aliases.
local ml_mt = modlib.minetest
ml_mt.mod.get_resource = get_resource
modlib.mod = ml_mt.mod
ml_mt.conf.build_setting_tree()
modlib.conf = ml_mt.conf
2021-08-16 17:21:28 +02:00
-- HACK force load minetest/gametime.lua to ensure that the globalstep is registered earlier than globalsteps of mods depending on modlib
2021-08-15 22:07:31 +02:00
dofile(get_resource(modlib.modname, "minetest", "gametime.lua"))
local ie = minetest.request_insecure_environment()
if ie then
-- Force load persistence namespace to pass insecure require
-- TODO currently no need to set _G.require, lsqlite3 loads no dependencies that way
modlib.persistence = assert(loadfile(get_resource"persistence.lua"))(ie.require)
end
2021-03-04 12:18:26 +01:00
end
2020-02-28 22:12:05 +01:00
2022-01-04 13:42:46 +01:00
-- Run build scripts
-- dofile(modlib.mod.get_resource("modlib", "build", "html_entities.lua"))
2020-03-23 20:20:43 +01:00
2021-06-17 19:45:08 +02:00
-- TODO verify localizations suffice
2021-03-04 12:18:26 +01:00
return modlib