Wiki模板编辑教学
如果需要在多个页面上放置类似的内容(如表格),使用模板将会很有帮助,尤其当这些内容较复杂时。
模板实际上就是 Wiki 页面,用来嵌入包含[1]在其他页面中的。
模板用法[编辑 | 编辑源代码]
因为模板实际上是 Wiki 页面,所以使用「链入页面」语法即可。
具体的,如果源页面在模板命名空间[2]下,如「Template:示例模板」,则仅填写模板名称本身即可:{{示例模板}}
;
如果源页面在主命名空间下,如「铃兰花田」,必须在前面加上一个英文引号: {{:铃兰花田}}
;如果源页面在其它任何命名空间下,如「User:-
」,必须使用全名,包括命名空间的名称: {{User:-}}
[3]。
既然模板就是 Wiki 页面,使用模板的实质就是链入页面,所以不放到 Template 命名空间里并不妨碍模板的使用。
模板的参数(后文会提到)需要使用管道符(竖线,「|
」)进行连接:{{ 示例模板 | 参数1 | 参数2 }}
。
当然,在可视化编辑模式下有一个对用户极为友善的插入模板界面,输入两个左大括号「{{
」弹出。
模板创建[编辑 | 编辑源代码]
由于模板实际上就是 Wiki 页面,如果你有权限创建普通页面就可以创建模板。按照惯例,为了方便分类和搜素,模板一般被放置在 Template 命名空间中,而实际上并不需要放进去模板也能生效,上面讲了。
由于在教程编写的时候 Wiki 貌似没有模板沙盒,故建议在个人沙盒页面进行模板测试。
现在你可以在你的用户沙盒添加以下内容来写你的第一个(存疑)模板:
<includeonly>问天地好在。 </includeonly><noinclude> {{:{{FULLPAGENAME}}}} </noinclude>
此处讲解各处的功能:
<includeonly>......</includeonly>
此内容直译为「仅包含」,意思是在直接访问时并不会显示,但是会在被其他页面链入包含时显示的部分。<noinclude>......</noinclude>
此内容直译为「不包含」,意思是在直接访问时正常会显示,但是被其他页面链入包含时不显示的部分。问天地好在。
此内容是你模板的核心内容。{{:{{FULLPAGENAME}}}}
此内容是在页面内预览该模板的效果,其中魔术字{{FULLPAGENAME}}
是你页面的全名,参考上方的万能链入方法。
结合这四个部分,该内容的意义为:
- 以「问天地好在。」文本作为模板,在此页面内不显示,而被其他页面链入时显示;
- 在此页面内展示模板预览效果,并不在其他页面中展示预览效果。
这样你的第一个模板就写好了(即使因为没有模板沙盒,这个模板是在你的用户沙盒里的)。
若无特殊说明,用代码框框起来的内容默认为模板本体,用大括号双层嵌套的内容默认为模板使用,模板名(
:{{FULLPAGENAME}} )会替代为「模板名 」。若无特殊情况,<includeonly> 和 <noinclude> 标签在下文不会再写出来。
|
模板参数[编辑 | 编辑源代码]
现在,我们假定有一个模板:
子曰:「道不同,不相为谋。」
当孔子说出来其他的话的时候,这个模板就不合适了,因为这里说的话是固定的「道不同,不相为谋」。
这就是为什么我们有模板参数来丰富嵌入包含的机制——通过填入参数,我们可以更改模板在页面中展示的效果。
对于这个例子,虽然各种人说话的语句格式看起来都差不多,但其特定内容(「说话的人」和「人说的话」)有所不同。基于这个理由,这些内容应该设置为参数。
在模板内,每一个参数都是被三组花括号包围,如 {{{1}}}
。所以现在我们有:
{{{1}}}曰:「{{{2}}}。」
请注意参数的使用。这就是使用模板时在模板内识别传入的参数的方法。
通过 {{模板名|子|道听而涂说,德之弃也}}
,可以生成:
子曰:「道听而涂说,德之弃也。」
通过 {{模板名|曾子|吾日三省吾身}}
,可以渲染成:
曾子曰:「吾日三省吾身。」
在使用模板时,需要为参数赋值,不同参数间用一个管道符(竖线,|
)分隔。MediaWiki 允许三种为参数赋值的方式:匿名(Anonymously)、编号(Numbered)、命名(Named)。
匿名参数[编辑 | 编辑源代码]
要传递匿名参数,需要按照顺序列举出所需参数:{{模板名|子|道不同,不相为谋}}
。
在这个例子中,该模板接受参数「{{{1}}}
」和「{{{2}}}
」,值分别为「子」和「道不同,不相为谋」,于是输出:
子曰:「道不同,不相为谋。」
传递匿名参数时,参数的顺序极为重要。如果调用模板时颠倒了参数的顺序,如 {{模板名|道不同,不相为谋|子}}
,输出会变成:
道不同,不相为谋曰:「子。」
按顺序识别参数仅对匿名参数有效,使用名称标识的参数无法以此方式访问。
|
若匿名参数内存在一个等号,该参数会被错误的解读成一个命名参数。例如说
{{模板名|子|1+1=2}} ,第二个参数位置会被错误解读为:参数「{{{1+1}}} 」的值为「2」。为避免该问题,建议使用命名参数或编号参数来代替。具体见下文。
|
编号参数[编辑 | 编辑源代码]
对于上面的模板,我们还有一种方式来传递参数:{{模板名|1=子|2=道不同,不相为谋}}
,或者 {{模板名|2=道不同,不相为谋|1=子}}
。
这两者虽然说传参顺序颠倒了,参数「{{{1}}}
」和「{{{2}}}
」的值仍会分别解读为「子」和「道不同,不相为谋」,所以依旧会输出为:
子曰:「道不同,不相为谋。」
若参数内存在一个等号,这个办法会很有用。
|
举个例子,{{模板名|1=子|2=1+1=2}}
会生成:
子曰:「1+1=2。」
若这么做,将其他的以纯数字为名称的参数以匿名方式传入可能会出现问题:
警告:(页面名称)中调用的(末班名称)对“1”参数提供了多个值。将只使用最后提供的值。 |
命名参数[编辑 | 编辑源代码]
与编号参数类似,第三种赋值方法只是把编号换成了名称。我们更改一下模板内容:
{{{说话的人}}}曰:「{{{人说的话}}}。」
在这个模板中,识别参数使用了 {{{说话的人}}}
和 {{{人说的话}}}
。若要按照名称传递参数,需要标注好每个名字:{{模板名|说话的人=子|人说的话=我没说过}}
。
使用命名参数不仅可以使参数顺序灵活,还可以使模板和引用更可读、助于理解。
默认值[编辑 | 编辑源代码]
对于「命名参数」里的模板,若尝试这样使用:{{模板名}}
,则会直接输出:
{{{说话的人}}}曰:「{{{人说的话}}}。」
请注意三个大括号会直接输出出来。因为在使用模板时并未给参数赋值,则会直接输出变量本身。
这个时候可以通过 {{{参数名|默认值}}}
来设置默认值。如果参数 {{{参数名}}}
并未被赋值,则输出「默认值」。
如果更改模板,设置默认值:
{{{说话的人|子}}}曰:「{{{人说的话|我没说过}}}。」
在如此调用之后会输出:
子曰:「我没说过。」
默认值可以为空字符串,如
{{{参数名|}}} 。这样会在未给 {{{参数名}}} 赋值时返回一个空字符串。
|
参数的值也可以为空字符串,若参数
{{{参数名}}} 被声明为 {{{参数名|这里没有填写参数哦}}} ,在使用 {{{模板名|参数名=}}} 时,模板会认为参数是一个空字符串,并且会直接输出空字符串,而不是「未定义(没有填写)」状态然后输出「这里没有填写参数哦」一句话。如果要把空字符串也作为未填处理,请使用解析器函数(详见进阶教程)。 |
默认值可以给参数添加替代名称。如模板中使用了
{{{ 参数名 | {{{ 替代名 | {{{ 最终替代 | 你还真就啥也没填 }}} }}} }}} ,模板会先查找名为 {{{参数名}}} 的参数,若不存在则查找 {{{替代名}}} ,若还不存在则查找 {{{最终替代}}} ,若都不存在就输出「你还真就啥也没填」。
|
模板说明[编辑 | 编辑源代码]
套用模板或微件[编辑 | 编辑源代码]
进阶教程[编辑 | 编辑源代码]
变量[编辑 | 编辑源代码]
声明 / 赋值(#vardefine)[编辑 | 编辑源代码]
使用(#var)[编辑 | 编辑源代码]
检查是否存在(#varexists)[编辑 | 编辑源代码]
表达式[编辑 | 编辑源代码]
字符串处理[编辑 | 编辑源代码]
顺序结构[编辑 | 编辑源代码]
选择结构[编辑 | 编辑源代码]
如果…那么…否则…(if-else)[编辑 | 编辑源代码]
如果为空(#if)[编辑 | 编辑源代码]
如果相同(#ifeq)[编辑 | 编辑源代码]
如果出错(#iferror)[编辑 | 编辑源代码]
如果数值满足(#ifexpr)[编辑 | 编辑源代码]
如果页面存在(#ifexist)[编辑 | 编辑源代码]
如果是…则…不然…(switch)[编辑 | 编辑源代码]
循环结构[编辑 | 编辑源代码]
当…时重复执行…(#while)[编辑 | 编辑源代码]
重复执行…直到…(#dowhile)[编辑 | 编辑源代码]
从某处开始执行数次(#loop)[编辑 | 编辑源代码]
模板嵌套表格:魔术字[编辑 | 编辑源代码]
可能不常用的东西[编辑 | 编辑源代码]
替代[编辑 | 编辑源代码]
用法:{{ subst: 模板名称 | 参数 ...... }}
功能:把模板的内容静态加入到页面中,并断开与模板的连接,使得页面可以被单独修改。
具体的,我们假定存在一个模板「Template:问天地」,内容为 <includeonly>问天地好在。</includeonly><noinclude>{{问天地}}</noinclude>
。
在页面中使用「{{ subst: 问天地 }}
」会把该文本完全替换成「问天地好在。
」。
若页面内容为「吾有一言,曰「{{ subst: 问天地 }}」。呜呼!嫦娥,汝可有所目睹乎?
」,在保存页面之后会被替换成「吾有一言,曰「问天地好在。」。呜呼!嫦娥,汝可有所目睹乎?
」
由于替代功能不适用于循环,且模板大量使用循环,结构较为复杂,可读性差,此功能并不适用于目前存在的一部分模板。
递归替代[编辑 | 编辑源代码]
用法:{{ safesubst: 模板名称 | 参数 ...... }}
功能:用于模板在包含有对其他模板或解析器函数的调用时,允许其递归替换。
由于递归替代功能不适用于循环,且模板大量使用循环,结构较为复杂,可读性差,此功能并不适用于目前存在的一部分模板。
显示模板源码[编辑 | 编辑源代码]
用法:{{ msgnw: 模板名称 }}
具体的,我们假定存在一个模板「Template:问天地」,内容为 <includeonly>问天地好在。</includeonly><noinclude>{{问天地}}</noinclude>
。
在页面中使用「{{ msgnw: 问天地 }}
」会把该文本完全替换成「<includeonly>问天地好在。</includeonly><noinclude>{{问天地}}</noinclude>」。