mirror of
https://github.com/bjc/prosody.git
synced 2025-04-01 20:27:39 +03:00
52 lines
1.5 KiB
Lua
52 lines
1.5 KiB
Lua
-- Read an XML dataform and spit out a serialized Lua table of it
|
|
if not pcall(require, "prosody.loader") then
|
|
pcall(require, "loader");
|
|
end
|
|
|
|
local function from_stanza(stanza)
|
|
local layout = {
|
|
title = stanza:get_child_text("title");
|
|
instructions = stanza:get_child_text("instructions");
|
|
};
|
|
for tag in stanza:childtags("field") do
|
|
local field = {
|
|
name = tag.attr.var;
|
|
type = tag.attr.type;
|
|
label = tag.attr.label;
|
|
desc = tag:get_child_text("desc");
|
|
required = tag:get_child("required") and true or nil;
|
|
value = tag:get_child_text("value");
|
|
options = nil;
|
|
};
|
|
|
|
if field.type == "list-single" or field.type == "list-multi" then
|
|
local options = {};
|
|
for option in tag:childtags("option") do
|
|
options[#options+1] = { label = option.attr.label, value = option:get_child_text("value") };
|
|
end
|
|
field.options = options;
|
|
end
|
|
|
|
if field.type == "jid-multi" or field.type == "list-multi" or field.type == "text-multi" then
|
|
local values = {};
|
|
for value in tag:childtags("value") do
|
|
values[#values+1] = value:get_text();
|
|
end
|
|
if field.type == "text-multi" then
|
|
values = table.concat(values, "\n");
|
|
end
|
|
field.value = values;
|
|
end
|
|
|
|
if field.type == "boolean" then
|
|
field.value = field.value == "true" or field.value == "1";
|
|
end
|
|
|
|
layout[#layout+1] = field;
|
|
|
|
end
|
|
return layout;
|
|
end
|
|
|
|
print("dataforms.new " .. require"prosody.util.serialization".serialize(from_stanza(require"prosody.util.xml".parse(io.read("*a"))),
|
|
{ unquoted = true }))
|