Make formspec_ast.flatten ignore scroll containers

This commit is contained in:
luk3yx 2021-04-06 08:29:18 +12:00
parent b56162912d
commit 8b18059cdf
2 changed files with 28 additions and 5 deletions

View File

@ -42,9 +42,7 @@ function formspec_ast.interpret(spec, custom_handlers)
return formspec_ast.unparse(ast)
end
-- Returns an iterator over all nodes in a formspec AST, including ones in
-- containers.
function formspec_ast.walk(tree)
local function walk_inner(tree, container_elems)
local parents = {}
local i = 1
return function()
@ -59,7 +57,7 @@ function formspec_ast.walk(tree)
end
i = i + 1
if res.type == 'container' or res.type == 'scroll_container' then
if container_elems[res.type] then
table.insert(parents, {tree, i})
tree = res
i = 1
@ -68,6 +66,13 @@ function formspec_ast.walk(tree)
end
end
-- Returns an iterator over all nodes in a formspec AST, including ones in
-- containers.
local container_elems = {container = true, scroll_container = true}
function formspec_ast.walk(tree)
return walk_inner(tree, container_elems)
end
-- Similar to formspec_ast.walk(), however only returns nodes which have a type
-- of `node_type`.
function formspec_ast.find(tree, node_type)
@ -114,9 +119,10 @@ function formspec_ast.apply_offset(elems, x, y)
end
-- Removes container elements and fixes nodes inside containers.
local flatten_containers = {container = true}
function formspec_ast.flatten(tree)
local res = {formspec_version=tree.formspec_version}
for elem in formspec_ast.walk(table.copy(tree)) do
for elem in walk_inner(table.copy(tree), flatten_containers) do
if elem.type == 'container' then
formspec_ast.apply_offset(elem, elem.x, elem.y)
else

View File

@ -345,4 +345,21 @@ assert_equal(
}))
)
-- Ensure flatten works correctly
assert_equal(
'label[0,0;abc]label[2,2;def]scroll_container[1,1;2,2;test;vertical]' ..
'image[1,1;1,1;def]scroll_container_end[]',
formspec_ast.unparse(formspec_ast.flatten(assert(formspec_ast.parse([[
label[0,0;abc]
container[3,2]
container[-1,0]
label[0,0;def]
container_end[]
container_end[]
scroll_container[1,1;2,2;test;vertical]
image[1,1;1,1;def]
scroll_container_end[]
]]))))
)
print('Tests pass')