模块:Table

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

本模块用于创建html表。

参数[编辑]

caption
表的标题。可以不填。
captionclass/style
表的标题的类或样式。
class/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|class=wikitable|1-1=!模块|2-1=table|caption=本模块}}

效果:

模块
table
本模块

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

转义[编辑]

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

效果:

!模块\!模块
tablechart

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

列参数实例[编辑]

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

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

可以看到,有格样式无内容的行显示了出来,没有任何东西和只有样式的行都没有显示。

跳格[编辑]

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

注释[编辑]


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

--这个模块中,整个表的数据是一个表,行的数据是表表中的表,单个的数据是行表中的表。
--还可为列设置参数,会放在另一个表
function zes.process(args)
	local data = {}
	
	local function process(k,v)
		-- 应用于特定行特定列的单元格
		local row,col,index = k:match "^cell(%d+)-(%d+)(%l*)$"
		if not row then
			row,col,index = k:match("^(%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+)(%l+)$")
		if not col then
			col,index = k:match "^%*%-(%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+)(%l+)$")
		if not row then
			row,index = k:match "^(%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+)$") --单个格的参数和内容
		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+)$") --行参数
		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 "^(%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,
	}
	
	-- 针对表格本身的参数
	for k,v in pairs(data) do
		if type(k) == "number" then --如果是行表那么创建tr标签
			local tr = root:tag "tr"
			for k2,v2 in pairs(v) do
				-- k2是当前行中当前列的行号,或者"tr"表示整行
				if type(k2) == "number" then --如果是格表那么创建格标签
					-- 针对一个单元格
					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(all.text or rowall.text or colall.text or v2.text)
				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
		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
		end
	end

	
	return 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