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



    YumeWiki
    2,839Articles

    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