Module:Table

来自滚动的天空Wiki
文档图示 模块文档[查看] [编辑] [查看历史] [清除缓存]

本模块用于创建html表。

参数

caption
表的标题。可以不填。
captionclass/style
表的标题的类或样式。
tclass/style
应用于整个表的类或样式。
n-m
n行第m列单元格的内容。nm可以用“*”表示,即表示所有行或者所有列,下同。若在前方加上叹号则该格会被认定为单元格。再加上反斜杠则转义为普通叹号。
celln-mtext/class/style
n行第m列单元格的文本内容、类或样式。其中celln-mtext可以简写为celln-m
rownclass/style
n行的类或样式。该属性应用于整个行,而非该行内的所有单元格。如需应用于该行内的所有单元格,应使用n-*class/style。
colmtext/class/style
m列的所有单元格的文本内容、类或样式。该属性应用于该列中的所有单元格。

单元格设置实例

{{#invoke:table|main|cell1-1=模块|cell1-1th=有值就对了|cell2-1text=table}}

效果:

模块
table

注意:这里没有设置wikitable类。

简略语法

{{#invoke:table|main|tclass=wikitable|1-1=!模块|2-1=table|caption=本模块}}

效果:

本模块
模块
table

可以看到,有叹号也能设置标题单元格。

转义

{{#invoke:table|main
|tclass=wikitable
|cell1-1=\!模块|cell1-2=\\!模块
|cell2-1=table|cell2-2=chart
}}

效果:

!模块\!模块
tablechart

可以看到,输出永远比输入少一个反斜杠。

列参数实例

使用col+列数+参数名可以为整列设置样式。代码如下:

{{#invoke:table
|main
|tclass=wikitable
|1-1=虹
|1-2=咲
|1-3=学
|1-4=园
|1-5=学
|1-6=园
|2-1=偶
|2-2=像
|2-3=同
|2-4=好
|2-5=会
|cell2-5colspan=2
|col1style=color:red;
|col2style=color:orange;
|col3style=color:yellow;
|col4style=color:green;
|col5style=color:blue;
|col6style=color:purple
}}

效果:

可以看到,以上只用6个参数就为11个格子的样式赋了值。

上述内容也可以写为:

{{#invoke:table
|main
|tclass=wikitable
|1-1=虹
|1-2=咲
|1-3=学
|1-4=园
|1-5=学
|1-6=园
|2-1=偶
|2-2=像
|2-3=同
|2-4=好
|2-5=会
|cell2-5colspan=2
|*-1style=color:red;
|*-2style=color:orange;
|*-3style=color:yellow;
|*-4style=color:green;
|*-5style=color:blue;
|*-6style=color:purple
}}

效果如下:

跳行

只要没有给一行中任何一个设定任何东西,这行不会显示。

{{#invoke:table|main
|tclass=wikitable
|1-1=这一行有内容
|3-1=这里也有
|style4-1=color:red;background:purple
|5-1=上面一行只有一格的样式
|style6=background:blue
|7-1=上面一行只有行样式}}
这一行有内容
这里也有
上面一行只有一格的样式
上面一行只有行样式

可以看到没有任何东西和只有样式的行都没有显示。

跳格

如果某一个单元格不设置任何参数,此单元格会自动被忽略。但是,colmstyle等参数会影响。你可以用这个实现一些有趣的东西。比如:

注释


上述文档内容嵌入自Module:Table/doc编辑 | 历史
编者可以在本模块的沙盒编辑和测试样例创建页面进行实验。
请将模块自身所属的分类添加在文档中。本模块的子页面
local zes = {} --请注意,函数表的名字取作这个的都是废柴模块

local function addNewline(s)
	s = tostring(s)
	if s:match '^[*;:#]' then
		return '\n'..s..'\n'
	end
	return s
end


--这个模块中,整个表的数据是一个表,行的数据是表表中的表,单个的数据是行表中的表。
--还可为列设置参数,会放在另一个表
function zes.process(args)
	local data = {}
	local function process(k,v)
		if k==1 and v=='using expr' then
			data.expr = true
		end
		if type(k)~='string' then return end
		
		-- 应用于特定行特定列的单元格
		local row,col,index = k:match "^cell(%d+%.?%d*)%-(%d+%.?%d*)(%l*)$"
		if not row then
			row,col,index = k:match("^(%d+%.?%d*)%-(%d+%.?%d*)(%l*)$")
		end
		row = tonumber(row)
		col = tonumber(col)
		
		if row and col and index then
			if index=='' then index='text' end
			data[row] = data[row] or {}
			data[row][col] = data[row][col] or {}
			
			-- 考虑定义表头的情况
			if index=='text' then
				if v:match("^!") then
					data[row][col].th = true
					v = v:match("^!(.+)")
				elseif v:match("^\\+!")then
					v = v:match("^\\(\\*!.+)") 
				end
			end
			
			data[row][col][index] = v
			return
		end
		
		--应用于特定列的每一个单元格
		local col,index = k:match("^col(%d+%.?%d*)(%l+)$")
		if not col then
			col,index = k:match "^%*%-(%d+%.?%d*)(%l*)$"
		end
		col = tonumber(col)
		if col and index then
			if index=='' then index='text' end
			data.all = data.all or {}
			data.all[col] = data.all[col] or {}
			data.all[col][index] = v
			return
		end
		
		--应用于特定行的每一个单元格
		local row,index = k:match("^row(%d+%.?%d*)(%l+)$")
		if not row then
			row,index = k:match "^(%d+%.?%d*)%-%*(%l+)$"
		end
		row = tonumber(col)
		if row and index then
			if index=='' then index='text' end
			data[col] = data[col] or {}
			data[col].all = data[col].all or {}
			data[col].all[index] = v
			return
		end
		
		-- 应用于整个表格的所有单元格
		local index = k:match "^all(%l+)$"
		if not index then
			index = k:match "^%*-%*(%l+)"
		end
		if index then
			data.all = data.all or {}
			data.all.all = data.all.all or {}
			data.all.all[index]=v
			return
		end
	
		-- @deprecated
		local index,row,col = k:match("^(%l+)(%d+%.?%d*)%-(%d+%.?%d*)$") --单个格的参数和内容
		if index and row and col then
			data[row] = data[row] or {}
			data[row][col] = data[row][col] or {}
			data[row][col][index] = v
			return
		end
		
		-- @deprecated
		local index,row = k:match("^(%l+)(%d+%.?%d*)$") --行参数
		if index and row then
			data[row] = data[row] or {}
			data[row].row = data[row].row or {}
			data[row].row[index] = v
			return
		end
		
		-- 应用于表格标题
		local index = k:match "^caption(%l+)$"
		if index then
			if index=='' then index='text' end
			data.caption = data.caption or {}
			data.caption[index] = v
			return
		end
		
		-- 应用于表格自身
		local index = k:match "^t(%l+)$" 
		if index then
			data.table = data.table or {}
			data.table[index] = v
			return
		end
		
		mw.addWarning("未被识别的参数:"..k)
	end
	
	for k,v in pairs(args) do
		k = tostring(k)
		process(k,v)
	end
	return data
end

function zes.render(data)
	local store = {}
	local root = mw.html.create "table"
	local noattr = {
		-- 不作为属性名称的字符串的集合
		text = true,
		th = true,
	}
	
	-- 针对表格本身的参数
	local keys1 = {}
	for k,v in pairs(data) do
		if type(k) == "number" then
			table.insert(keys1,k)
		elseif k == "caption" then
			-- 标签
			local caption = root:tag 'caption'
			for k2,v2 in pairs(v) do
				if k2=='text' then
					caption:wikitext(v2)
				elseif not noattr[k2] then
					caption:attr(k2,v2)
				end
			end
		elseif k == 'table' then
			-- 对于表自身
			for k2,v2 in pairs(v) do
				if noattr[k2] then
					mw.addWarning(string.format('未知的参数:%s,建议使用:%s','k2','*-*'..k2))
				else
					root:attr(k2,v2)
				end
			end
		elseif k ~= "all" then
			mw.addWarning "Unknown argument"
		end
	end
	table.sort(keys1)
	for i, k in ipairs(keys1) do
		local v = data[k]
		local tr = root:tag "tr"
		local keys2 = {}
		
		for k2,v2 in pairs(v) do
			if type(k2) == "number" then
				table.insert(keys2,k2)
			elseif k2=='tr' then --不是则为行加参数
				for k3,v3 in v2 do
					if noattr[k3] then
						mw.addWarning('未知的参数:'..tostring(v3))
					else
						tr:attr(k3,v3)
					end
				end
			end
		end
		table.sort(keys2)
		for i2, k2 in pairs(keys2) do
			local v2 = v[k2]
			
			-- k2是当前行中当前列的行号,或者"tr"表示整行
			 --如果是格表那么创建格标签
			-- 针对一个单元格
			local td = tr:tag(v2.th and 'th' or 'td')
			
			-- 应用适用于所有单元格的属性
			local all = (data.all or {}).all or {}
			local rowall = (data.all or {})[k2] or {}
			local colall = (data[k] or {}).all or {}
			
			-- 对于除text之外的参数都是互相叠加
			for k3,v3 in pairs(all) do
				if not noattr[k3] then
					td:attr(k3,v3)
				end
			end
			for k3,v3 in pairs(rowall) do
				if not noattr[k3] then
					td:attr(k3,v3)
				end
			end
			for k3,v3 in pairs(colall) do
				if not noattr[k3] then
					td:attr(k3,v3)
				end
			end
			for k3,v3 in pairs(v2) do
				if not noattr[k3] then
					td:attr(k3,v3)
				end
			end
			
			td:wikitext(addNewline(v2.text or colall.text or rowall.text))
			
		end
	end

	
	return tostring(root)
end

function zes.main(frame)
	local args = frame.args
	return zes.render(zes.process(args))
end

function zes.template(frame)
	local args = frame:getParent().args
	return zes.render(zes.process(args))
end

return zes