No edit summary |
No edit summary |
||
Line 55: | Line 55: | ||
function p.entry(frame) | function p.entry(frame) | ||
local parent = frame:getParent() | local parent = frame:getParent() | ||
local | local amountOfEntries = 1 | ||
for key, value in pairs(parent.args) do | for key, value in pairs(parent.args) do | ||
if key ~= "notes" then | |||
amountOfEntries = math.max(amountOfEntries, select(2, string.gsub(value, ",", ""))) | |||
end | |||
end | |||
local t = {} | |||
for key, value in pairs(frame:getParent().args) do | |||
if key ~= "notes" and value:find(",") then | |||
t[key] = splitByPlainSeparator(value, ",") | |||
else | |||
t[key] = value | |||
end | |||
end | end | ||
result = | local result = "" | ||
local subobject = "{{#subobject:BGM/" .. parent.args["id"] | for i = 1, amountOfEntries do | ||
local subobject = "{{#subobject:BGM/" .. parent.args["id"] | |||
for key, tvalue in pairs(t) do | |||
local value = "" | |||
if type(tvalue) == "table" then | |||
value = tvalue[i] | |||
else | |||
value = tvalue | |||
end | |||
result = result .. "$" .. key .. "=" .. value | |||
subobject = subobject .. "\n|BGM/" .. key .. "=" | |||
if key == "location" then | |||
local locationRegex = '%[%[*.-%|*.-%]%]' | |||
if value:find(locationRegex) then | |||
subobject = subobject .. splitByPlainSeparator(splitByPlainSeparator(value:match(locationRegex), '|')[2], ']')[1] | |||
else | |||
subobject = subobject .. value | |||
end | |||
else | else | ||
subobject = subobject .. value | subobject = subobject .. value | ||
end | end | ||
end | end | ||
result = result .. "$$" | |||
subobject = subobject .. "\n}}" | |||
frame:preprocess(subobject) | |||
end | end | ||
return result | return result | ||
end | end |
Revision as of 19:35, 15 July 2024
Documentation for this module may be created at Module:SoundtrackTable/doc
local p = {} function splitByPlainSeparator(str, sep, max) local z = #sep; sep = '^.-'..sep:gsub('[$%%()*+%-.?%[%]^]', '%%%0') local t,n,p, q,r = {},1,1, str:find(sep) while q and n~=max do t[n],n,p = str:sub(q,r-z),n+1,r+1 q,r = str:find(sep,p) end t[n] = str:sub(p) return t end function toMap(entries) local fields = splitByPlainSeparator(entries, '$$') local map = {} for var=1,#fields-1 do local tmp = {} local current = fields[var] for k, s in pairs(splitByPlainSeparator(current, '$')) do local tmp2 = splitByPlainSeparator(s, '=') tmp[tmp2[1]] = tmp2[2] end map[var] = tmp end return map end function value(entries, i, j, args) if not entries[i] then return 'Out Of Range' else if not entries[i][j] or entries[i][j] == '' then return args['default/' .. j] or '' else return entries[i][j] end end end function uniq(entries, i, j, args, columns) if not entries[i] then return 'Out Of Range' end if not args['unique/' .. j] then return value(entries, i, j, args) end local ret = args['unique/' .. j] for k, column in pairs(columns) do ret = ret:gsub(column, value(entries, i, column, args)) end return ret end function p.entry(frame) local parent = frame:getParent() local amountOfEntries = 1 for key, value in pairs(parent.args) do if key ~= "notes" then amountOfEntries = math.max(amountOfEntries, select(2, string.gsub(value, ",", ""))) end end local t = {} for key, value in pairs(frame:getParent().args) do if key ~= "notes" and value:find(",") then t[key] = splitByPlainSeparator(value, ",") else t[key] = value end end local result = "" for i = 1, amountOfEntries do local subobject = "{{#subobject:BGM/" .. parent.args["id"] for key, tvalue in pairs(t) do local value = "" if type(tvalue) == "table" then value = tvalue[i] else value = tvalue end result = result .. "$" .. key .. "=" .. value subobject = subobject .. "\n|BGM/" .. key .. "=" if key == "location" then local locationRegex = '%[%[*.-%|*.-%]%]' if value:find(locationRegex) then subobject = subobject .. splitByPlainSeparator(splitByPlainSeparator(value:match(locationRegex), '|')[2], ']')[1] else subobject = subobject .. value end else subobject = subobject .. value end end result = result .. "$$" subobject = subobject .. "\n}}" frame:preprocess(subobject) end return result end function p.generate(frame) local args = frame.args local entries = toMap(frame.args['entries']) local columns = splitByPlainSeparator(frame.args['columns'], ',') local result = "" for var=1,#entries do for k, column in pairs(columns) do local id = uniq(entries, var, column, args, columns) if (id ~= uniq(entries, var - 1, column, args, columns)) then local rowspan = 1 while (id == uniq(entries, var + rowspan, column, args, columns)) do rowspan = rowspan + 1 end local value = value(entries, var, column, args) if value ~= '' and frame.args['display/' .. column] then value = frame.args['display/' .. column]:gsub('value', value) end result = result .. '|rowspan="' .. tostring(rowspan) .. '"|' .. value .. "\n" end end if (var ~= #entries) then result = result .. "|-\n" end end return result end return p