Модуль:GetField: различия между версиями

Нет описания правки
Нет описания правки
Строка 1049: Строка 1049:
end
end


local function append_param_tree(parts, prefix, value)
local function append_table_tree(parts, prefix, value)
if value == nil then
if type(value) ~= "table" or next(value) == nil then
return
return
end
end


local t = type(value)
local ok, json = pcall(mw.text.jsonEncode, value)
if ok and json then
parts[#parts + 1] = prefix .. "=" .. to_nowiki(json)
end


if t ~= "table" then
local keys = {}
parts[#parts + 1] = prefix .. "=" .. tostring(value)
for k in pairs(value) do
return
keys[#keys + 1] = k
end
end


if next(value) == nil then
table.sort(keys, function(a, b)
return
return tostring(a) < tostring(b)
end)
 
for _, k in ipairs(keys) do
local v = value[k]
local key = prefix .. "." .. tostring(k)
 
if type(v) == "table" then
if next(v) ~= nil then
append_table_tree(parts, key, v)
end
else
parts[#parts + 1] = key .. "=" .. tostring(v)
end
end
end
end


if is_array(value) then
local function choose_id_key(obj)
for i, v in ipairs(value) do
local keys = {}
append_param_tree(parts, prefix .. "." .. i, v)
for k in pairs(obj) do
if type(k) == "string" then
keys[#keys + 1] = k
end
end
return
end
end


local keys = {}
if #keys == 0 then
for k in pairs(value) do
return nil
keys[#keys + 1] = k
end
end


table.sort(keys, function(a, b)
table.sort(keys, function(a, b)
local av = obj[a]
local bv = obj[b]
local aPrimitive = type(av) ~= "table"
local bPrimitive = type(bv) ~= "table"
if aPrimitive ~= bPrimitive then
return aPrimitive
end
return tostring(a) < tostring(b)
return tostring(a) < tostring(b)
end)
end)


for _, k in ipairs(keys) do
return keys[1]
append_param_tree(parts, prefix .. "." .. tostring(k), value[k])
end
end
end


Строка 1108: Строка 1133:
end
end


local function makeCall(id, obj)
local function makeCall(obj)
if type(id) ~= "string" then
if type(obj) ~= "table" then
return
end
 
local idKey = choose_id_key(obj)
if not idKey then
return
return
end
end
Строка 1119: Строка 1149:
end
end


parts[#parts + 1] = id
parts[#parts + 1] = tostring(idKey)
 
local keys = {}
for k in pairs(obj) do
if type(k) == "string" then
keys[#keys + 1] = k
end
end
 
table.sort(keys, function(a, b)
return tostring(a) < tostring(b)
end)


if type(obj) == "table" then
for _, k in ipairs(keys) do
append_param_tree(parts, id, obj)
local v = obj[k]
elseif obj ~= nil then
 
parts[#parts + 1] = "value=" .. tostring(obj)
if k == idKey then
if type(v) == "table" then
if next(v) ~= nil then
append_table_tree(parts, k, v)
end
elseif v ~= nil then
parts[#parts + 1] = "value=" .. tostring(v)
end
else
if type(v) == "table" then
if next(v) ~= nil then
append_table_tree(parts, k, v)
end
elseif v ~= nil then
parts[#parts + 1] = k .. "=" .. tostring(v)
end
end
end
end


Строка 1133: Строка 1190:
if is_array(data) then
if is_array(data) then
for _, item in ipairs(data) do
for _, item in ipairs(data) do
if type(item) == "table" then
makeCall(item)
for k, v in pairs(item) do
makeCall(k, v)
end
end
end
end
else
else
for k, v in pairs(data) do
makeCall(data)
makeCall(k, v)
end
end
end


Строка 1149: Строка 1200:
end
end


local rendered = table.concat(calls, " ")
return frame:preprocess(table.concat(calls, " "))
return frame:preprocess(rendered)
end
end