本页不属于有兽档案馆的条例或规则;若本页内容与相关条例不一致的,以条例内容为准。
命名空间 |
---|
基本命名空间 |
讨论命名空间 |
虚拟命名空间 |
未启用命名空间 |
|
模板是MediaWiki软件自带的一项功能,用于在多个页面显示相同的内容。所有的模板页面都位于“模板”命名空间下。在条目页面,你往往会看到一些消息框,以及页面右上角关于条目基本信息(如对于人物,有出生地、国籍等)的信息框,底部还会有导航框,这些都是利用了模板的功能。
模板的优点在于易于维护。当模板的内容改变之后,嵌入了该模板的页面中的相应内容也将改变,不需要编辑这些页面。
在wikitext中,嵌入一个模板的基本语法是{{模板名称|参数}}
。参数可以有多个,也可以没有。模板名称就是模板页面的名称,通常不含命名空间。
你可以在此页面查看本站的所有模板。
概述
假设有个页面叫做“Template:欢迎”,其页面内容如下:
欢迎来到有兽档案馆!
那么,在其他页面,使用{{欢迎}}
就可以得到“欢迎来到有兽档案馆!”的文字。如果“Template:欢迎”的内容被改变,那么其他使用了该模板的页面的内容也将会相应改变。
{{欢迎}}
欢迎来到有兽档案馆!
一般地,在任何页面,使用{{名称}}
即可嵌入包含该名称的模板页面,该模板对应页面“Template:名称”。如果该模板页面内容被改变,那么嵌入包含了该模板的页面中相应的内容也将改变。
非模板命名空间的页面也可以被嵌入包含。在嵌入包含页面时,可以指定命名空间,主命名空间页面可以在名称前加上一个“:”。例如,{{:有兽杂谈}}
将会嵌入包含名为“有兽杂谈”而非“Template:有兽杂谈”的页面。
{{AABBCC:test}}
将会嵌入包含名为“Template:AABBCC:test”的页面,而{{:AABBCC:test}}
则会嵌入包含名为“AABBCC:test”的主命名空间页面。参数
参数是指每次调用模板时都需要指定的变量。参数一般是在模板中定义的,并在每次调用模板时赋值。
例如,假如页面“Template:欢迎”的内容改成如下内容,设定一个参数:
{{{1}}},您好,欢迎来到{{{2}}}!
那么,在其他页面,嵌入此模板时就需要提供参数。比如:
{{欢迎|Steve|Minecraft}}
Steve,您好,欢迎来到Minecraft!
{{欢迎|Administrator|Windows XP}}
Administrator,您好,欢迎来到Windows XP!
从上面的模板代码中不难看出,三层花括号中的数字表示第几个参数,例如{{{1}}}
就是第一个参数,{{{2}}}
则是代表第二个参数。
参数的名称除了可以是数字之外,也可以是固定的文本。此外,参数还可以指定默认值,这样当参数未被指定时,则取默认值。
编号参数
编号参数是指名称为正整数的参数,在嵌入模板时,这些参数通常都是依次提供,不需要指定参数名称,系统知道这是第几个参数,因此也称为匿名参数。
调用模板时,如果传入多个参数,则这多个参数用管道符|
分隔。例如,在{{模板名称|a|b|c}}
中,a
对应参数{{{1}}}
,b
对应参数{{{2}}}
,c
对应参数{{{3}}}
。
通常来说,编号参数是不指定名称的,因为系统很清楚每个参数是第几个参数。但是,你也可以为每个参数指定名称,即“名称=值
”的形式。例如,{{模板名称|a|b|c}}
实际上也就相当于{{模板名称|1=a|2=b|3=c}}
。当参数名称被明确指定时,参数的赋值顺序就不再重要。例如,{{模板名称|1=a|2=b|3=c}}
和{{模板名称|1=a|3=c|2=b}}
是同一个意思,尽管c排在了b的后面,但调用时很明确地指定了c是第3个参数,而b是第二个参数。以Template:参见为例:
并不建议在同一个模板调用中混合隐式命名和显式命名的形式,否则容易出错。比如,在{{模板名称|1=a|2=b|c|d}}
中,a和c实质上都是第一个参数,b和d都是第二个参数。当同一个参数被赋值多次的时候,软件会报出警告。
编号的参数隐式赋值时有一个限制,就是内容不能包含等号,否则会被识别为命名参数。例如,设想被欢迎的人的名字叫做“x+y=z”,嵌入{{欢迎|x+y=z|有兽档案馆}}
并不会得到“x+y=z,您好,欢迎来到有兽档案馆!”,因为这样的模板调用中,会将x+y=z
理解为:名称为“x+y”的参数值为“z”,而非第一个参数的值为“x+y=z”。这种情况下,可以通过指定参数名称或绕开等号的方式来解决:
{{欢迎|x+y=z|有兽档案馆}}
{{{1}}},您好,欢迎来到有兽档案馆!
{{欢迎|1=x+y=z|2=有兽档案馆}}
x+y=z,您好,欢迎来到有兽档案馆!
{{欢迎|x+y<nowiki>=</nowiki>z|有兽档案馆}}
x+y=z,您好,欢迎来到有兽档案馆!
{{欢迎|x+y{{=}}z|有兽档案馆}}
x+y=z,您好,欢迎来到有兽档案馆!
上面的第二种方法也适用于参数的值中含有管道符|
的情形,假如你需要将|
用作参数值的内容,而不是将其用来分隔参数,则可以用nowiki标签或魔术字{{!}}
。假如被欢迎的用户名字叫做“A|B”:
{{欢迎|A|B|有兽档案馆}}
A,您好,欢迎来到B!
{{欢迎|A<nowiki>|</nowiki>B|有兽档案馆}}
A|B,您好,欢迎来到有兽档案馆!
{{欢迎|A{{!}}B|有兽档案馆}}
A|B,您好,欢迎来到有兽档案馆!
此外,与明确指定参数名称相比,隐式的参数名称赋值还有一个特点就是,隐式的赋值保留首尾空格。当指定参数名称赋值时,如果参数值的两端有空格,这些空格就会被移除:
{{欢迎| User | 求 闻 百 科 }}
User ,您好,欢迎来到 有 兽 档 案 馆 !
{{欢迎|1= User |2= 有 兽 档 案 馆 }}
User,您好,欢迎来到有 兽 档 案 馆!
命名参数
如果模板有很多参数,大量使用编号参数则很容易让人弄晕,这时候可以为参数指定具体的名称。命名参数是指名称为其他任意字符的参数。在调用模板时,赋值参数时就必须明确指定参数名称。
例如,将上述提到的“欢迎”模板的代码改为:
{{{username}}},您好,欢迎来到{{{sitename}}}!
这样,嵌入模板时,就需要提供参数名称以及其值,例如:
{{欢迎|username=Example1|sitename=萌娘百科}}
Example1,您好,欢迎来到萌娘百科!
{{欢迎|username=ExampleX=Y|sitename=Media Wiki}}
ExampleX=Y,您好,欢迎来到Media Wiki!
由于命名参数在赋值时必须指定名称,因此不会存在参数值被等号打断的问题,参数值的首尾空格也将自动被截去。如果确实需要保留空格,可以使用nowiki标签进行转换,例如:
{{欢迎|username=Example1<nowiki> </nowiki>|sitename=<nowiki> </nowiki>萌娘百科}}
Example1 ,您好,欢迎来到 萌娘百科!
参数的默认值
在模板代码中,每次定义参数都可以为参数提供一个默认值或缺省值。
嵌入模板时,如果某个参数(无论是编号参数还是命名参数)被定义了但没有提供值,则解析模板时使用该参数的默认值,如果没有指定默认值,则不处理参数。
在上面的这个例子中,可以给sitename参数添加默认值“有兽档案馆”,即:
{{{username}}},您好,欢迎来到{{{sitename|有兽档案馆}}}!
这样,{{欢迎|username=User114514}}
将等价于{{欢迎|sitename=有兽档案馆|username=User114514}}
。
需要注意的是,不提供值与提供空值是不同的。例如,{{欢迎|sitename=|username=User114514}}
将直接产生“User114514,您好,欢迎来到!”。
另外,参数的默认值也可以设为空字符串,然后使用解析器函数进行处理。这里,将“欢迎”模板再进行一些增强:如果username没有指定,或者为空,则不显示username,“您好”一词之前也没有显示逗号;如果sitename没有指定,或者为空,则显示为“有兽档案馆”。代码如下:
{{#if:{{{username|}}}|{{{username}}},}}您好,欢迎来到{{#if:{{{sitename|}}}|{{{sitename}}}|有兽档案馆}}!
上面的模板调用效果如下:
{{欢迎|username=User114514}}
User114514,您好,欢迎来到有兽档案馆!
{{欢迎|sitename=|username=User114514}}
User114514,您好,欢迎来到有兽档案馆!
{{欢迎|sitename=萌娘百科!}}
您好,欢迎来到萌娘百科!
{{欢迎|sitename=萌娘百科|username=}}
您好,欢迎来到萌娘百科!
{{#ifeq:|{{{username|1}}}|{{{username|0}}}|提供了“username”参数|未提供参数“username”参数}}
模板默认值可以用来达到参数别称的效果。例如,{{{username|{{{用户名|{{{用戶名|{{{使用者名稱|}}}}}}}}}}}}
。但是,一般不建议使用参数别称。
替换引用
替换引用是指使用该模板的页面被保存时,相关代码就会被替换为模板的内容。替换引用有三种形式:
- subst:页面被保存时,调用模板的代码将被一次性替换为保存时的模板内容,这些内容将成为页面的一部分,可以像一般内容一样被编辑,与原来的内容分开。如果此后原模板页面被更改,被替换后的内容将不受影响。
- safesubst:允许替换而不打破嵌入包含。当模板遇到非替换的展开(嵌入包含)时,subst的替换会保持不被解析,而safesubst则会视为像没有safesubst修饰符存在一样,因此子模板会被嵌入包含,变量和解析器函数会被求值。
- msgnw:以作为原始wiki语法的形式显示包含模板。
嵌入包含
嵌入包含,简称嵌入,是指在页面中显示另一个页面(通常是模板)的内容。假如,A页面中有代码{{B}}
,则页面“A”嵌入包含了“Template:B”,页面A称为目标页,页面B称为来源页。
控制被嵌入包含的部分
被嵌入包含的页面中,<noinclude>
、<includeonly>
和<onlyinclude>
可以用来控制哪些内容需要被嵌入包含。
<noinclude>...</noinclude>
内的部分,在源页面自身会显示,但是在目标页面嵌入时不会显示。<includeonly>...</includeonly>
内的部分,在源页面自身不会显示,但是在目标页面嵌入时会显示。<onlyinclude>...</onlyinclude>
若存在,则该标签以外的部分在目标页面嵌入时都不会显示。
这里举个例子(假设模板名称为hw):
源页面 | 目标页面的模板调用 | 源页面效果 | 目标页面效果 |
---|---|---|---|
Hello<noinclude> world</noinclude>! |
{{hw}} |
Hello world! | Hello! |
Hello<includeonly> world</includeonly>! |
{{hw}} |
Hello! | Hello world! |
Hello <onlyinclude>world</onlyinclude>! |
{{hw}} |
Hello world! | world |
控制嵌入包含内容的最典型的例子就是模板文档。模板代码中,往往会出现<noinclude>{{doc}}</noinclude>
,这样在模板页面自身会出现模板文档,但是其他页面嵌入该模板时,不会将整个文档嵌入包含进去。类似的,文档中的模板分类链接也会被<includeonly>...</includeonly>
包含,这样文档自身不会加入分类,但当模板嵌入包含该文档时,则会将模板加入这些分类。