Dokumentaci tohoto modulu lze vytvořit na stránce Nápověda:Modul:wton
-- Wiki Template Object Notation, a wiki friendly adaptation of a subset of JSON
local module = {}
function module.parse(template_arguments)
local key
local last_key
local value
local result = {}
local stack = {}
for key, value in pairs(template_arguments) do
if type(key) ~= "number" then
error("Pojmenované parametry nejsou povoleny")
end
if mw.text.trim(value) == "}" then
result = table.remove(stack)
if result == nil then
error("Parametr '}' se používá na nesprávném místě")
end
last_key = table.remove(stack)
else
local index = string.find(value, "")
if index == nil then
error("Parametr '" .. value .. "' není rozpoznán")
end
local control_character = string.sub(value, index, index)
key = mw.text.trim(string.sub(value, 1, index - 1))
value = mw.text.trim(string.sub(value, index + 1))
if control_character == "{" then
if key == "+" then
if last_key == nil then
error("'+' nemůže být prvním parametrem")
end
local new_object = {}
local previous_value = result
if previous_value then
table.insert(result, new_object)
elseif previous_value == "" then
result = {new_object}
else
result = {previous_value, new_object}
end
table.insert(stack, last_key)
table.insert(stack, result)
result = new_object
else
if result ~= nil then
error("Klíč '" .. key .. "' je duplikátem")
end
local new_object = {}
result = new_object
table.insert(stack, key)
table.insert(stack, result)
result = new_object
end
if value ~= "" then
result = value
end
elseif key == "+" then
if last_key == nil then
error("'+' nemůže být prvním parametrem")
end
local previous_value = result
if previous_value then
table.insert(result, value)
elseif previous_value == "" then
result = {value}
else
result = {previous_value, value}
end
else
if result ~= nil then
error("Klíč '" .. key .. "' je duplikátem")
end
last_key = key
result = value
end
end
end
if stack then
error("Objekt nebyl uzavřen")
end
return result
end
function module.parse_validated(frame, schema)
return module.validate(module.parse(frame:getParent().args), schema)
end
function module.validate(value, schema, path)
if not path then
path = ""
end
local required_type = schema
if not required_type then
if type(value) == "string" then
if not schema then
error("Parametr '" .. path .. "' má špatný formát (Musí být objekt)")
end
value = { = value}
end
for key, field_value in pairs(value) do
if not schema then
error("Parametr '" .. path .. key .. "' je neznamý")
end
end
for key, schema in pairs(schema) do
value = module.validate(value, schema, path .. key .. ":")
end
elseif required_type == "list" then
if not value then
error("Parametr '" .. path .. "' chybí")
end
if type(value) == "string" then
value = {value}
elseif type(value) == "table" then
for key, field_value in pairs(value) do
if type(key) ~= "number" then
value = {value}
break
end
end
end
for key, field_value in pairs(value) do
value = module.validate(field_value, schema, path .. key .. ":")
end
elseif required_type == "option" then
if value then
return module.validate(value, schema, path)
end
elseif required_type == "text" then
if type(value) ~= "string" then
if value then
error("Parametr '" .. path .. "' má špatný formát (Musí být text)")
end
error("Parametr '" .. path .. "' chybí")
end
if value == "" then
error("Parametr '" .. path .. "' je prázdný")
end
else
error("Schéma má špatný formát")
end
return value
end
return module