2023年政策修订增补工作正在进行中,欢迎参与!
  • Moegirl.ICU:萌娘百科流亡社群 581077156(QQ),欢迎对萌娘百科运营感到失望的编辑者加入
  • Moegirl.ICU:账号认领正在试运行,有意者请参照账号认领流程

User:東東君/从零开始的模板教程

萌娘百科,万物皆可萌的百科全书!转载请标注来源页面的网页链接,并声明引自萌娘百科。内容不可商用。
跳转到导航 跳转到搜索
Icon-info.png
该教程不涉及HTML、CSS、Lua的知识,如需要请自行查找学习。
Icon-info.png
这里并不是手册或文档,只是介绍了一些常用的语法或函数等。



简介

使用wikitext制作模板非常简单。在编辑时经常会和许多模板打交道,当你找不到合适的模板来实现某个功能,或是当前的写法重复繁琐时,制作一个模板将是个非常棒的主意,良好且适用性高的模板将为你以及以后和你遇到相同问题的人提供极大的便利。

准备

注意:只需要输入沙盒名即可,将自动在你的用户页下创建。
  • 打开这个页面,在“编辑工具”中找到“Syntax highlighte”代码高亮工具并开启,保存。

复制一份如下代码到沙盒作为测试使用:

代码示例
<includeonly> 模板代码写在这里 </includeonly><noinclude> 调用模板写在这里 </noinclude>


注意:在测试时请点击编辑栏下方保存更改右边的“显示预览”按钮进行预览,因为模板测试在页面不刷新的情况下无法正常显示。

开始

撒,東東酱的模板教程,哈吉吗路哟~

第一个模板

当你把复制的代码粘贴到沙盒中时,预览可以看到如下文字:“调用模板写在这里”,在这里<includeonly>标签包裹的内容相当于模板的内容,如果你不去调用(正确的说法应该叫“包括”或“嵌入”),其中的内容就不会显示,这里你可以将你的沙盒页面名复制下来,粘贴到<noinclude>标签中,并且使用两对花括号{{ 你的沙盒页面名 }}包裹,进行调用,这时<includeonly>标签中的内容就会出现在页面中。

接下来为了便于讲解,对于<includeonly>标签内将统称为模板,<noinclude>标签内将统称为外部。

参数

提供参数是模板最重要的功能,参数保证了模板的适用性、可重用性。

匿名参数

代码示例
<includeonly> 你输入了数字:{{{1|}}} </includeonly><noinclude> {{你的沙盒名|6}} </noinclude>


代码示例
你输入了数字:6



在模板中输入:你输入了数字:{{{1|}}},在外部调用{{你的沙盒名|6}},此时预览,页面中将显示文字“你输入了数字:6”,这构成了一个基础的传参格式。

以此类推,{{{2|}}}代表第2个参数、{{{3|}}}代表第3个参数......


代码示例
<includeonly> 你输入了数字:{{{1|0}}} {{{2}}} <!-- 没有设置默认值,调用时也没有传值,将原封不动地输出 --> </includeonly><noinclude> {{你的沙盒名}} <!-- 没有传入任何值 --> </noinclude>


代码示例
{{{2}}}


其中数字后的管道符|表示提供一个默认值:如果参数1为空,则使用管道符后的值,若没有值,则为空。例如想要在参数1未提供值时使用9,则写成{{{1|9}}},若要在参数3未提供值时使用参数2的值,则写成{{{3|{{{2|}}}}}},以此类推,在需要时进行嵌套,同时要注意若在没有提供默认值,并且该参数也没有传入的情况下,则会将该参数的代码本身解析为普通字符串,所以建议始终给参数设置一个默认值,无论这个默认值是否为空值。

同时请注意:{{temp|}},这种写法并不是将参数空了出来,而是传入了一个空字符串,这会被当做一个值来处理。

具名参数

代码示例
<includeonly> 想{{{act|看}}}这个美少女的{{{物品|胖次}}},你还早{{{1|1000}}}年呢! <!-- 这里的数字参数接收到了下面传入的500 --> </includeonly><noinclude> {{你的沙盒名|物品= 妹汁 <!-- 具名参数不受位置的影响,名称使用除管道符以外的任何字符均可 --> |act= 喝|1= 10000}} </noinclude>


代码示例
想喝这个美少女的妹汁,你还早10000年呢!


具名参数的名称和值一一对应,不受位置的影响,但若对相同参数重复传值,该参数只会接收最后一个传入的值。

实际上,匿名参数中按顺序的传值相当于:|1= 值一|2= 值二|3= ...,如果对数字进行赋值,模板中对应的数字参数也会接收到。

具名参数将自动删除参数名等号后以及值后面的多余空格及换行。

其他

代码示例
<includeonly><!-- -->完<!-- 这将输出一个连续的没有换行和空格的“完全胜利” -->全<!-- -->胜<!-- -->利<!-- --></includeonly><noinclude> {{你的沙盒名}} </noinclude>


代码示例
完全胜利


<!-- 内容 --> 这种写法为注释,其中的内容不会显示,也不会经过任何的解析。

如果在载入时发现多出了许多空白,是因为留白同样会被载入,换行将被转换成半角空格,空出一行将被转换为换行,解决方法为在留白的头和尾分别注上注释,如上例。

模版扩展语法

仅仅了解参数的传递是远远不够的,模板扩展语法是制作复杂模板的关键技术,使用HTML+CSS与模板扩展语法,可以实现许多神奇的功能。

反过来说如果HTML+CSS和模版扩展语法一个都不会,那就根本做不出有用的模板了

这里只列举出了常用的语法,如果要了解更多,你可以边学习边参考:User:宇文天启/模板扩展语法

为了便于测试,模板扩展语法直接写在外部即可,不需要再使用之前的<includeonly>模板代码。

模板扩展语法中使用的语法都被称为“解析器函数”,解析器函数名的前面带有“#”号,第一个参数前使用冒号而不是管道符。

解析器函数将忽略所有参数前后的空格和换行,若要传入空格与换行,请使用转义字符 (空格)和<br />(换行)标签。

变量

变量使模板中的数据(可以是任意值、HTML代码、解析器函数、模板等任何东西)得以在外部暂时保存,通过合理的使用,可以减少代码、实现各种不同的功能。

代码示例
{{#vardefine:a|100}} {{#var:a}} {{#var:b|200}} <!-- 将输出200,因为变量b的值为空(或未定义) -->


代码示例
100


200


在使用一个变量之前,必须先声明变量。

{{#var}}为使用一个变量,变量名写在第一个参数中。

{{#vardefine}}中可以声明变量,无论在哪里声明的变量,都是可以全局使用的。

{{#var_final}}同样可以对变量赋值,不同的是,要赋值的变量如果非空,则该赋值语句无效。

{{#vardefineecho}}将在声明变量的同时输出变量的值。

{{#var}}的第二个参数可以传入一个值,若变量的值为空,则使用第二个参数的值。

条件语句

if

代码示例
{{#if:123| then | else }} <!-- 这里会输出then -->


用例:

<includeonly>
{{#if:{{{1|}}}
  |{{#if:{{{2|}}}
    |参数1和参数2都非空!           <!-- 嵌套使用,判断传入的参数1和参数2是否都非空 -->
}}}}
</includeonly><noinclude>

{{沙盒名|1|2}}

</noinclude>
代码示例
参数1和参数2都非空!


if语句将对参数1进行判断,若非空,则输出参数2,否则,输出参数3,参数3可以省略。

使用if语句可以动态生成内容,如使用最广泛的{{人物信息}}模板中,其介绍栏各个项目就是由if语句判断是否有值,然后生成的。

ifeq

代码示例
{{#ifeq:123|123| then | else}}


用例:

<includeonly>
{{#ifeq: {{{link|}}} | no           <!-- 这里实现了一个简单的添加链接功能,当参数link为no时,直接输出参数1,当link非no时,输出带链接的参数1 -->
| {{{1|}}}
| [[{{{1|}}}]]
}}
</includeonly><noinclude>

{{沙盒名|link=香风智乃}}

</noinclude>

代码示例


ifeq语句将对参数1和参数2进行判断,若相同,则输出参数3,否则,输出参数4,参数4可以省略。

ifeq多是用于控制某些状态,起到一个开关的功能。

expr

代码示例
{{#expr:1 + 1}} <!-- 输出2 --> {{#expr: 5 = 5}} <!-- 逻辑判断,为真,输出1 --> {{#expr: 5 != 5}} <!-- 逻辑判断,为假,输出0 -->


expr将对其内部的成员进行逻辑或数学计算,它并不是流程控制语句。不能用于字符串的比较。以下为运算符参考表格:

运算符 名称 优先级 元数 结合性 样例
+ 9 1 {{#expr: + 7}} = 7
- 9 1 {{#expr: - 7}} = -7
not 逻辑非 9 1 {{#expr: not 7}} = 0
* 8 2 {{#expr: 30 * 7}} = 210
/ 8 2 {{#expr: 30 / 7}} = 4.2857142857143
div 8 2 {{#expr: 30 div 7}} = 4.2857142857143
mod 8 2 {{#expr: 30 mod 7}} = 2
+ 6 2 {{#expr: 30 + 7}} = 37
- 6 2 {{#expr: 30 - 7}} = 23
round 舍入 5 2 {{#expr: 30 / 7 round 7}} = 4.2857143
= 等于 4 2 {{#expr: 30 = 7}} = 0
< 小于 4 2 {{#expr: 30 < 7}} = 0
> 大于 4 2 {{#expr: 30 > 7}} = 1
<= 小于等于 4 2 {{#expr: 30 <= 7}} = 0
>= 大于等于 4 2 {{#expr: 30 >= 7}} = 1
<> 不等于 4 2 {{#expr: 30 <> 7}} = 1
!= 不等于 4 2 {{#expr: 30 != 7}} = 1
and 逻辑与 3 2 {{#expr: 30 and 7}} = 1
or 逻辑或 2 2 {{#expr: 30 or 7}} = 1
abs 绝对值 10 1 {{#expr: abs 2}} = 2
{{#expr: abs -2}} = 2
^ 乘方 10 1 {{#expr: 2^3}} = 8
sqrt 开方 10 1 {{#expr: sqrt9}} = 3
ln 对数 10 1 {{#expr: ln10}} = 2.302585092994
log28(换底):{{#expr: ln8 div ln2}} = 3
支持:
sin、cos、tan
不支持:
csc、sec、cot
三角函数 10 1 弧度制:{{#expr:sin45}} = 0.85090352453412
角度制:{{#expr:cos(45 * pi div 180)}} = 0.70710678118655
支持:
asin、acos、atan
不支持:
acsc、asec、acot
反三角函数 10 1 弧度制:{{#expr:sin45}} = 0.5235987755983
角度制:{{#expr:(asin 0.5)*180/pi}} = 30

ifexpr

代码示例
{{#ifexpr:1 - 1| then | else }} <!-- 输出else --> {{#ifexpr:| then | else }} <!-- 输出else -->


用例:

<includeonly>
{{{1|0}}}{{#ifexpr:{{{1|0}}} mod 10
|不能
|可以
}}被10整除
</includeonly><noinclude>

{{沙盒名|21}}

</noinclude>
代码示例
21不能不被10整除


ifexpr会先将参数1的内容进行计算,根据计算结果,非0或空时,输出参数2,否则,输出参数3,参数3可以省略。


switch

代码示例
{{#switch:3 |1= a |2= b |3= c |#default= null }} <!-- 输出c -->


用例:

<includeonly>
{{#switch:{{{lg|}}}
|default= 欢迎来到萌娘百科!
|en= Welcome to the English Version of Moegirlpedia!
|ja= 萌えっ娘百科事典へようこそ!
}}
</includeonly><noinclude>

{{沙盒名|ko}}

</noinclude>
代码示例
欢迎来到萌娘百科!


switch判断参数1,若和其后声明的任何参数名相同,则输出那个参数名的值,若都不相同,则输出#default的值。

循环语句

loop

代码示例
{{#loop:times|1|10 <!-- times这里自定义设置的,也可以设置其他的变量名 --> |现在是第{{#var:times}}轮循环!<br /> }} <!-- 这将会输出10句“现在是第X轮循环” -->


代码示例
现在是第1轮循环!
现在是第2轮循环!
现在是第3轮循环!
现在是第4轮循环!
现在是第5轮循环!
现在是第6轮循环!
现在是第7轮循环!
现在是第8轮循环!
现在是第9轮循环!
现在是第10轮循环!


loop循环中,参数1设置一个每轮循环不断自增+1的计数器,参数2为这个计数器的初始值,参数3为要循环的次数。

也就是说,循环次数以参数3为准,就算循环过程中改变了计数器的值,循环次数也不会改变。

支持循环的嵌套,但这将大大增加循环的次数。

注意:每个页面中循环次数都不能大于99次,否则将抛出错误,因此,必须控制循环次数合理使用,对于模版中使用循环更是应该小心,最好不要超过20次,如果是某些可能在同一页面重复调用的模板,就一定不要使用循环了,若流程大体可控可以手动写出循环,或者在Lua模块中进行循环的操作。

若只是单纯的想重复输出文字,可以使用字符串处理中的rep进行输出。

fornumargs

代码示例
{{#fornumargs:num | value | {{#var:num}} : {{#var:value}} }}


用例:

<includeonly>
{{#fornumargs:num | value
|
* '''{{#var:num}}'''. [[{{#var:value}}]]
}}
</includeonly><noinclude>

{{沙盒名|香风智乃|保登心爱|天天座理世}}

</noinclude>

代码示例


该循环的循环次数等于传入的匿名函数次数,其中参数1设置一个每轮循环不断自增的+1计数器,参数2设置的变量保存着等同于当前循环次数的传入参数。

也就是说,假设外部调用{{你的沙盒名|你好|世界}},则该模板会循环2轮,第1轮中{{#var:num}}为1,{{#var:num}}为“你好”,第二轮循环中{{#var:num}}为2,{{#var:num}}为“世界”。

这个循环没有循环次数的限制,不会占用页面的循环次数,是最常用的循环模板。

forargs

代码示例
<includeonly> {{#forargs:val- | key | value <!-- 前缀的设置是任意的,并不是必需要有“-”号--> | {{#var:key}} : {{#var:value}}<br /> }} </includeonly><noinclude> {{你的沙盒名 |val-智 = 香风智乃 |val-麻 = 条河麻耶 |val-惠 = 奈津惠 |小豆队 = 智麻惠队 <!-- 没有模板中指定的前缀,不进入循环 --> }} </noinclude>


代码示例
智 : 香风智乃

麻 : 条河麻耶

惠 : 奈津惠



这个循环的循环次数等于以参数1为前缀的参数数量,参数2设置的变量保存着以参数1为前缀的,去掉前缀后的,每次循环的参数名,参数3设置的变量保存着等同于当前循环次数的,以参数1为前缀的传入参数。

上面的例子中,将循环三轮,第一轮{{#var:key}}为“智”、{{#var:value}}为“香风智乃”,以此类推。

参数1可以留空,留空后会将所有参数都计入循环次数。

这个循环同样不占用循环次数。

其他

常用系统变量

  • {{PAGENAME}}:输出页面名称(不包含名字空间)
  • {{FULLPAGENAME}}:输出完整页面名称

总结

以上就是一些比较常用的模板书写规则以及拓展语法的使用。

该教程本身可能只是将文档的部分内容挑出来啰嗦了一遍,借此希望刚刚接触wikitext的编辑者可以更好地入门并理解模板的编写。

如果你想继续学习关于模板的其他知识,或在实现一些功能时无从下手时,可以查看下面的一些资料,完整的文档总是比一篇教程更加有用。

其他参考资料