89 lines
3.0 KiB
Lua
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
|