Difference between revisions of "Module:Database"
From Cassette Beasts
Line 10: | Line 10: | ||
end | end | ||
return true | return true | ||
+ | end | ||
+ | |||
+ | function string.split(s, delim) | ||
+ | local result = {} | ||
+ | if s == "" then | ||
+ | return result | ||
+ | end | ||
+ | local current = "" | ||
+ | for i = 1, string.len(s) do | ||
+ | if string.sub(s, i, i + string.len(delim) - 1) == delim then | ||
+ | i = i + string.len(delim) - 1 | ||
+ | table.insert(result, current) | ||
+ | current = "" | ||
+ | else | ||
+ | current = current .. string.sub(s, i, i) | ||
+ | end | ||
+ | end | ||
+ | table.insert(result, current) | ||
+ | return result | ||
end | end | ||
Line 45: | Line 64: | ||
elseif type(value) == "table" and frame.args.if_empty ~= nil and table.empty(value) then | elseif type(value) == "table" and frame.args.if_empty ~= nil and table.empty(value) then | ||
return frame.args.if_empty | return frame.args.if_empty | ||
− | elseif type(value) == "table" and frame.args["foreach"] ~= nil then | + | elseif type(value) == "table" and frame.args.delim or frame.args["foreach"] ~= nil then |
local delim = frame.args.delim or "" | local delim = frame.args.delim or "" | ||
if delim == "," then delim = delim .. " " end | if delim == "," then delim = delim .. " " end | ||
Line 54: | Line 73: | ||
result = result .. delim | result = result .. delim | ||
end | end | ||
− | + | if frame.args.subscript then | |
− | if frame.args. | + | elem = subscript(elem, string.split(frame.args.subscript, "."), 1) |
− | |||
end | end | ||
− | + | if frame.args["foreach"] ~= nil then | |
+ | local args = { elem } | ||
+ | if frame.args.key_param ~= nil then | ||
+ | args[frame.args.key_param] = key | ||
+ | end | ||
+ | elem = frame:expandTemplate{title = frame.args["foreach"], args = args} | ||
+ | else | ||
+ | elem = textify(frame, elem) | ||
+ | end | ||
+ | result = result .. elem | ||
i = i + 1 | i = i + 1 | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
return result | return result |
Revision as of 20:26, 23 May 2022
Documentation for this module may be created at Module:Database/doc
local p = {}
local db = mw.loadData("Module:Database/data")
-- Private helpers
function table.empty(t)
for _,_ in pairs(t) do
return false
end
return true
end
function string.split(s, delim)
local result = {}
if s == "" then
return result
end
local current = ""
for i = 1, string.len(s) do
if string.sub(s, i, i + string.len(delim) - 1) == delim then
i = i + string.len(delim) - 1
table.insert(result, current)
current = ""
else
current = current .. string.sub(s, i, i)
end
end
table.insert(result, current)
return result
end
function get_species(id)
if tonumber(id) ~= nil then
id = tonumber(id)
end
if type(id) == "number" then
return db.species.by_index[id] or db.species.unknown
else
return db.species.by_name[id] or db.species.unknown
end
end
function subscript(value, path, path_start)
while value ~= nil and path[path_start] ~= nil do
local key = path[path_start]
if tonumber(key) ~= nil then
value = value[tonumber(key)]
else
value = value[key]
end
path_start = path_start + 1
end
return value
end
function textify(frame, value)
if value == true and frame.args.if_true ~= null then
return frame.args.if_true
elseif value == false and frame.args.if_false ~= nil then
return frame.args.if_false
elseif type(value) == "string" and frame.args["if_" .. value] ~= nil then
return frame.args["if_" .. value]
elseif type(value) == "table" and frame.args.if_empty ~= nil and table.empty(value) then
return frame.args.if_empty
elseif type(value) == "table" and frame.args.delim or frame.args["foreach"] ~= nil then
local delim = frame.args.delim or ""
if delim == "," then delim = delim .. " " end
local result = ""
local i = 1
for key,elem in ipairs(value) do
if i > 1 then
result = result .. delim
end
if frame.args.subscript then
elem = subscript(elem, string.split(frame.args.subscript, "."), 1)
end
if frame.args["foreach"] ~= nil then
local args = { elem }
if frame.args.key_param ~= nil then
args[frame.args.key_param] = key
end
elem = frame:expandTemplate{title = frame.args["foreach"], args = args}
else
elem = textify(frame, elem)
end
result = result .. elem
i = i + 1
end
return result
end
if type(frame.args.format) == "string" then
value = string.format(frame.args.format, value)
end
if type(value) == "table" and value.name ~= nil then
value = value.name
end
if value == nil or value == false then
return ""
elseif type(value) == "string" or type(value) == "number" or type(value) == "boolean" then
return tostring(value)
end
return "<" .. tostring(value) .. ">"
end
-- Public functions for use with #invoke
function p.get_species(frame)
local species = get_species(frame.args[1])
return textify(frame, subscript(species, frame.args, 2))
end
function p.get_prev_species(frame)
local species = get_species(frame.args[1])
if species.bestiary_index ~= nil then
species = get_species(species.bestiary_index - 1)
end
return textify(frame, subscript(species, frame.args, 2))
end
function p.get_next_species(frame)
local species = get_species(frame.args[1])
if species.bestiary_index ~= nil then
species = get_species(species.bestiary_index + 1)
end
return textify(frame, subscript(species, frame.args, 2))
end
function p.species_has_family(frame)
local species = get_species(frame.args[1])
local result = not table.empty(species.evolves_from) or not table.empty(species.evolves_to)
return textify(frame, result)
end
return p