master
luk3yx 2020-02-01 20:29:06 +13:00
parent 23f008e0e4
commit b2fdcf91b8
5 changed files with 55 additions and 30 deletions

BIN
grid.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 B

View File

@ -180,7 +180,7 @@ local function show_properties(elem, node)
elem:setAttribute('data-formspec_ast', json.dumps(node))
properties_elem.innerHTML = ''
local base = elem.parentNode.parentNode
assert(base.className == 'formspec_ast-base')
assert(base.classList:contains('formspec_ast-base'))
renderer.redraw_formspec(base)
end
@ -196,7 +196,8 @@ local function show_properties(elem, node)
parent:appendChild(elem)
end
local n = assert(renderer.render_formspec(formspec, callbacks, false))
local n = assert(renderer.render_formspec(formspec, callbacks,
{store_json = false}))
properties_elem:appendChild(n)
end
renderer.default_callback = show_properties
@ -251,8 +252,8 @@ end
local element_dialog_base
do
local replace_formspec = renderer.replace_formspec
function renderer.replace_formspec(elem, tree)
local new_elem, err = replace_formspec(elem, tree)
function renderer.replace_formspec(elem, ...)
local new_elem, err = replace_formspec(elem, ...)
if new_elem and element_dialog_base == elem then
element_dialog_base = new_elem
end
@ -263,7 +264,7 @@ end
local function render_into(base, formspec, callbacks)
base.innerHTML = ''
base:appendChild(assert(renderer.render_formspec(formspec, callbacks,
false)))
{store_json = false})))
end
local element_dialog
@ -380,18 +381,28 @@ function renderer.show_element_dialog(base)
end
end
y = y + 0.5
fs = fs .. 'button[0.25,' .. y .. ';5.5,0.75;load;Load / save formspec]'
fs = fs .. 'button[0.25,' .. y .. ';5.5,0.75;grid;Toggle grid]'
fs = fs .. 'button[0.25,' .. y + 1 .. ';5.5,0.75;load;Load / save formspec]'
function callbacks.grid()
local raw = element_dialog_base:getAttribute('data-render-options')
if raw == js.null then raw = '{}' end
local options = json.loads(raw)
options.grid = not options.grid
raw = assert(json.dumps(options))
element_dialog_base:setAttribute('data-render-options', raw)
renderer.redraw_formspec(element_dialog_base)
end
callbacks.load = show_load_save_dialog
y = y + 1
y = y + 2
fs = 'formspec_version[2]size[6,' .. y .. ']' .. fs
element_dialog:appendChild(assert(renderer.render_formspec(fs, callbacks,
false)))
{store_json = false})))
end
-- A JS API for testing
function window:render_formspec(fs, callbacks)
function window:render_formspec(fs, callbacks, options)
local tree = assert(formspec_ast.parse(fs))
local elem = assert(renderer.render_ast(tree, callbacks))
local elem = assert(renderer.render_ast(tree, callbacks, options))
local e = document:getElementById('formspec_output')
if not e or e == js.null then
window:addEventListener('load', function()

View File

@ -233,13 +233,20 @@ function renderer.make_image(name, allow_empty)
return img
end
function renderer.render_ast(tree, callbacks, store_json, scale)
scale = 50 * (scale or 1)
local default_options = {}
function renderer.render_ast(tree, callbacks, options)
options = options or default_options
local scale = 50 * (options.scale or 1)
local store_json = options.store_json or options.store_json == nil
local base = document:createElement('div')
base.className = 'formspec_ast-base'
base:setAttribute('data-render-options', json.dumps(options))
base.style.fontSize = scale .. 'px'
local container = document:createElement('div')
base:appendChild(container)
if options.grid then
base.firstChild.className = 'grid'
end
for _, node in ipairs(formspec_ast.flatten(tree)) do
if not elems[node.type] then
@ -320,15 +327,22 @@ function renderer.elem_to_ast(elem)
return res
end
function renderer.replace_formspec(elem, tree)
local new_elem, err = renderer.render_ast(tree)
function renderer.replace_formspec(elem, ...)
local new_elem, err = renderer.render_ast(...)
if not new_elem then return nil, err end
elem:replaceWith(new_elem)
return new_elem, nil
end
function renderer.redraw_formspec(elem)
renderer.replace_formspec(elem, renderer.elem_to_ast(elem))
local tree = renderer.elem_to_ast(elem)
local options = elem:getAttribute('data-render-options')
if type(options) == 'string' then
options = json.loads(options)
else
options = nil
end
renderer.replace_formspec(elem, tree, nil, options)
end
function renderer.unrender_formspec(elem)

View File

@ -5,7 +5,13 @@
background-color: #343434;
border: 1px solid #0D0D0D;
border-radius: 3px;
overflow: hidden; }
overflow: hidden;
image-rendering: optimizeSpeed;
image-rendering: -moz-crisp-edges;
image-rendering: crisp-edges;
image-rendering: pixelated; }
.formspec_ast-base > div.grid {
background: url("grid.png"); }
.formspec_ast-base > div, .formspec_ast-base > div input, .formspec_ast-base > div textarea {
font-family: Arimo, sans-serif;
color: #FFFFFF; }
@ -62,12 +68,6 @@
top: 50%;
left: 50%;
transform: translate(-50%, -50%); }
.formspec_ast-base .formspec_ast-image, .formspec_ast-base .formspec_ast-image_button img,
.formspec_ast-base .formspec_ast-image_button_exit img {
image-rendering: optimizeSpeed;
image-rendering: -moz-crisp-edges;
image-rendering: crisp-edges;
image-rendering: pixelated; }
.formspec_ast-base .formspec_ast-field span, .formspec_ast-base .formspec_ast-pwdfield span, .formspec_ast-base .formspec_ast-textarea span {
position: absolute;
transform: translateY(-100%); }

View File

@ -24,6 +24,14 @@
border: 1px solid #0D0D0D;
border-radius: 3px;
overflow: hidden;
image-rendering: optimizeSpeed;
image-rendering: -moz-crisp-edges;
image-rendering: crisp-edges;
image-rendering: pixelated;
&.grid {
background: url("grid.png");
}
&, input, textarea {
font-family: Arimo, sans-serif;
@ -107,14 +115,6 @@ img {
}
}
.formspec_ast-image, .formspec_ast-image_button img,
.formspec_ast-image_button_exit img {
image-rendering: optimizeSpeed;
image-rendering: -moz-crisp-edges;
image-rendering: crisp-edges;
image-rendering: pixelated;
}
.formspec_ast-field, .formspec_ast-pwdfield, .formspec_ast-textarea {
span {
position: absolute;