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



YumeWiki
3,035Articles

Module:TestModule: Difference between revisions

No edit summary
No edit summary
 
Line 1: Line 1:
local p = {}
local p = {}


function lines(str)
function splitByPlainSeparator(str, sep, max)
  local t = {}
    local z = #sep; sep = '^.-'..sep:gsub('[$%%()*+%-.?%[%]^]', '%%%0')
  local function helper(line)
    local t,n,p, q,r = {},1,1, str:find(sep)
      table.insert(t, line)
    while q and n~=max do
      return ""
        t[n],n,p = str:sub(q,r-z),n+1,r+1
  end
        q,r = str:find(sep,p)
  helper((str:gsub("(.-)$$", helper)))
    end
  return t
    t[n] = str:sub(p)
    return t
end
end


function toMap(entries)
local fields = splitByPlainSeparator(entries, '$$')
mw.log(fields)
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.table(frame)
function p.table(frame)
local entries = frame.args['entries']:gsub('\n','')
local args = frame.args
local fields = lines(entries)
local entries = toMap(frame.args['entries'])
return table.concat(fields, ' ////////// ')
local columns = splitByPlainSeparator(frame.args['columns'], ',')
--[[local result = "0"
for var=1,tonumber(frame.args[1])-1 do
local result = ""
result = result .. "," .. tostring(var)
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
end
return result]]--
return result
end
end


return p
return p

Latest revision as of 13:43, 11 July 2024

Documentation for this module may be created at Module:TestModule/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, '$$')
	mw.log(fields)
	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.table(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