本模板基于enwp:Template:Wikitable的思路重写,理论上在语法无误的前提下效果一致。
本模板主要用于简化嵌套在其它模板内的表格。例如,如果想在{{tabs}}中显示表格,需要对表格中的管道符和等于号(即“|”和“=”)使用{{!}}和{{=}}转义,否则表格将无法正常显示。这一额外步骤会使表格变得难以阅读和编写。为了解决这个问题,可以使用本模板,例如:
{{table | class="wikitable"
|-
! 标题1 !! 标题2
|-
| 内容1 || 内容2
|-
| 内容1 || 内容2
}}
最终显示效果与使用表格相同。
| 标题1 | 标题2 |
|---|---|
| 内容1 | 内容2 |
| 内容1 | 内容2 |
注意:除了表格第一行可以直接使用=以外,其他地方的等于号请使用{{=}}代替。
前后对比如下:
|
使用传统MediaWiki写法: {{tabs
|bt1=分页名称
|tab1=
{{{!}} class="wikitable"
{{!}}+表格标题
{{!}}-
! 标题1 !! 标题2
{{!}}-
{{!}} 内容1 {{!!}} 内容2
{{!}}-
{{!}} 内容1 {{!!}} 内容2
{{!}}-
{{!}} colspan="2" {{!}} 跨列内容
{{!}}}
}}
|
使用本模板: {{tabs
|bt1=分页名称
|tab1=
{{table | class="wikitable"
|+表格标题
|-
! 标题1 !! 标题2
|-
| 内容1 || 内容2
|-
| 内容1 || 内容2
|-
| colspan{{=}}"2" | 跨列内容
}}
}}
|
使用HTML写法: {{tabs
|bt1=分页名称
|tab1=
<table class="wikitable">
<caption>表格标题</caption>
<tr><th>标题1</th><th>标题2</th></tr>
<tr><td>内容1</td><td>内容2</td></tr>
<tr><td>内容1</td><td>内容2</td></tr>
<tr><td colspan="2">跨列内容</td></tr>
</table>
}}
|
||||||||||||||||||||||||
|
效果如下: 分页名称
|
效果如下: 分页名称
|
效果如下: 分页名称
|
||||||||||||||||||||||||
上述三种写法所呈现的最终效果相同,但使用本模板既能像MediaWiki语言一样简化代码,又能媲美HTML写法的抗代码干涉性能。
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
local getArgs = require('Module:Arguments').getArgs
local p = {}
function p.main(frame)
local args = getArgs(frame, {
removeBlanks = false,
trim = false
}) -- 保留空格和换行
return p._main(args)
end
function p._main(args)
local buffer = {'{|'} -- 表格开头的{|
for k, v in pairs(args) do
-- 没记错的话Lua输入命名参数后是没法按照顺序呈现的,因此需要通过遍历查找命名参数,即表格第一行<table>中的class等内容
if type(k) ~= 'number' then
--[=[
表格第一行,此时直接读入的参数不包括等号前面的内容,
例如class="wikitable"只会读入一个键为class、值为"wikitable"的参数,需要手动将前面的class=加上去。
]=]
table.insert(buffer, string.format(' %s=%s', k, v))
end
end
table.insert(buffer, '\n')
for _, v in ipairs(args) do
table.insert(buffer, '|')
table.insert(buffer, v)
end
-- 补上结尾的|},然后将表串起来并返回
table.insert(buffer, '\n|}')
return table.concat(buffer)
end
return p;