minetest-formspec_ast/init.lua
2022-07-18 17:50:58 +12:00

89 lines
3.0 KiB
Lua

--
-- formspec_ast: An abstract syntax tree for formspecs.
--
-- This does not actually depend on Minetest and could probably run in
-- standalone Lua.
--
-- The MIT License (MIT)
--
-- Copyright © 2019-2022 by luk3yx.
--
-- Permission is hereby granted, free of charge, to any person obtaining a copy
-- of this software and associated documentation files (the "Software"), to
-- deal in the Software without restriction, including without limitation the
-- rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-- sell copies of the Software, and to permit persons to whom the Software is
-- furnished to do so, subject to the following conditions:
--
-- The above copyright notice and this permission notice shall be included in
-- all copies or substantial portions of the Software.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-- IN THE SOFTWARE.
--
formspec_ast = {}
local modpath
if minetest then
-- Running inside Minetest.
formspec_ast.minetest = minetest
modpath = minetest.get_modpath('formspec_ast')
assert(minetest.get_current_modname() == 'formspec_ast',
'This mod must be called formspec_ast!')
else
-- Probably running outside Minetest.
modpath = rawget(_G, 'FORMSPEC_AST_PATH') or '.'
local minetest = {}
function minetest.is_yes(str)
str = str:lower()
return str == 'true' or str == 'yes'
end
function minetest.formspec_escape(text)
if text then
for _, n in ipairs({'\\', ']', '[', ';', ','}) do
text = text:gsub('%' .. n, '\\' .. n)
end
end
return text
end
minetest.log = print
function string.trim(str)
return str:gsub("^%s*(.-)%s*$", "%1")
end
-- Mostly copied from https://stackoverflow.com/a/26367080
function table.copy(obj, s)
if type(obj) ~= 'table' then return obj end
if s and s[obj] ~= nil then return s[obj] end
s = s or {}
local res = {}
s[obj] = res
for k, v in pairs(obj) do res[table.copy(k, s)] = table.copy(v, s) end
return res
end
formspec_ast.minetest = minetest
end
formspec_ast.modpath = modpath
dofile(modpath .. '/core.lua')
dofile(modpath .. '/helpers.lua')
formspec_ast.modpath, formspec_ast.minetest = nil, nil
-- Lazy load safety.lua because I don't think anything actually uses it
function formspec_ast.safe_parse(...)
dofile(modpath .. '/safety.lua')
return formspec_ast.safe_parse(...)
end
function formspec_ast.safe_interpret(tree)
return formspec_ast.unparse(formspec_ast.safe_parse(tree))
end