×
Create a new article
Write your page title here:
We currently have 3,053 articles on YumeWiki. Type your article name above or click on one of the titles below and start writing!



YumeWiki
3,053Articles

Module:SoundtrackTable: Difference between revisions

No edit summary
No edit summary
Line 73: Line 73:
local kSplit = split(k, '/')
local kSplit = split(k, '/')
local key, override = kSplit[1], kSplit[2]
local key, override = kSplit[1], kSplit[2]
if not t[key] then
if key then
t[key] = {}
if not t[key] then
end
t[key] = {}
if override then
t[key][idIndexes[override]] = trim(value)
elseif value:find(",") then
t[key] = split(value, ",")
for i = 1, #ids do
t[key][i] = trim(t[key][i])
end
end
else
if override then
for i = 1, #ids do
t[key][idIndexes[override]] = trim(value)
if not t[key][i] then
elseif value:find(",") then
t[key][i] = trim(value)
t[key] = split(value, ",")
for i = 1, #ids do
t[key][i] = trim(t[key][i])
end
else
for i = 1, #ids do
if not t[key][i] then
t[key][i] = trim(value)
end
end
end
end
end
Line 101: Line 103:
subobject = subobject .. "\n|BGM/" .. key .. "="
subobject = subobject .. "\n|BGM/" .. key .. "="
if key == "location" then
if key == "location" then
local locationRegex = '%[%[*.-%|*.-%]%]'
local lines = split(value:gsub('<br />', '\n\n'), '\n\n')
if value:find(locationRegex) then
local locations = {}
local locations = {}
for _, line in pairs(lines) do
for locMatch in value:gmatch(locationRegex) do
if line:find('%[%[') then
table.insert(locations, split(split(split(locMatch, '|')[1], ':')[2], '#')[1])
local pageName = split(split(split(line, ':')[2], '|')[1], '#')[1]
local displayName = split(split(line, '|')[2], ']')[1]
local label = split(split(line, ']')[3], ':')[2]
local record = pageName .. ";"
if pageName == displayName then
record = record .. trim(label or "")
else
if not label then
record = record .. displayName
else
record = record .. displayName .. ": " .. trim(label)
end
end
mw.log(record)
table.insert(locations, record)
else
table.insert(locations, line .. ";")
end
end
mw.logObject(locations)
subobject = subobject .. table.concat(locations, ",") .. "|+sep=,"
else
subobject = subobject .. value
end
end
subobject = subobject .. table.concat(locations, ",") .. "|+sep=,"
else
else
subobject = subobject .. value
subobject = subobject .. value
Line 137: Line 153:
rowspan = rowspan + 1
rowspan = rowspan + 1
end
end
local value = value(entries, var, column, args)
local val = value(entries, var, column, args)
if value ~= '' and frame.args['display/' .. column] then
if val ~= '' and frame.args['display/' .. column] then
value = frame.args['display/' .. column]:gsub('value', value)
val = frame.args['display/' .. column]:gsub('value', val)
end
end
result = result .. '|rowspan="' .. tostring(rowspan) .. '"|' .. value .. "\n"
result = result .. '|rowspan="' .. tostring(rowspan) .. '"|' .. val .. "\n"
end
end
end
end

Revision as of 08:26, 16 July 2024

Documentation for this module may be created at Module:SoundtrackTable/doc

local p = {}

function split(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 trim(s)
   return s:match( "^%s*(.-)%s*$" )
end

function toMap(entries)
	local fields = split(entries, '$$')
	local map = {}
	for var=1,#fields-1 do
		local tmp = {}
		local current = fields[var]
		for k, s in pairs(split(current, '$')) do
			local tmp2 = split(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 idsUntrimmed = split(parent.args["id"], ",")
	local ids = {}
	for i = 1, #idsUntrimmed do
		ids[i] = trim(idsUntrimmed[i])
	end
	local idIndexes = {}
	for k, v in pairs(ids) do
		idIndexes[v] = k
	end
	
	local t = {}
	for k, value in pairs(parent.args) do
		local kSplit = split(k, '/')
		local key, override = kSplit[1], kSplit[2]
		if key then
			if not t[key] then
				t[key] = {}
			end
			if override then
				t[key][idIndexes[override]] = trim(value)
			elseif value:find(",") then
				t[key] = split(value, ",")
				for i = 1, #ids do
					t[key][i] = trim(t[key][i])
				end
			else
				for i = 1, #ids do
					if not t[key][i] then
						t[key][i] = trim(value)
					end
				end
			end
		end
	end
	
	local result = ""
	for i = 1, #ids do
		local id = t["id"][i]
		local subobject = "{{#subobject:BGM/" .. id
		for key, tvalue in pairs(t) do
			local value = tvalue[i] or ""
			result = result .. "$" .. key .. "=" .. value
			subobject = subobject .. "\n|BGM/" .. key .. "="
			if key == "location" then
				local lines = split(value:gsub('<br />', '\n\n'), '\n\n')
				local locations = {}
				for _, line in pairs(lines) do
					if line:find('%[%[') then
						local pageName = split(split(split(line, ':')[2], '|')[1], '#')[1]
						local displayName = split(split(line, '|')[2], ']')[1]
						local label = split(split(line, ']')[3], ':')[2]
						
						local record = pageName .. ";"
						if pageName == displayName then
							record = record .. trim(label or "")
						else
							if not label then
								record = record .. displayName
							else
								record = record .. displayName .. ": " .. trim(label)
							end
						end
						mw.log(record)
						table.insert(locations, record)
					else
						table.insert(locations, line .. ";")
					end
				end
				subobject = subobject .. table.concat(locations, ",") .. "|+sep=,"
			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 = split(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 val = value(entries, var, column, args)
				if val ~= '' and frame.args['display/' .. column] then
					val = frame.args['display/' .. column]:gsub('value', val)
				end
				result = result .. '|rowspan="' .. tostring(rowspan) .. '"|' .. val .. "\n"
			end
		end
		if (var ~= #entries) then
			result = result .. "|-\n"
		end
	end
	return result
end

return p