用户:东东君/从零开始的模板教程
帮助导航 |
---|
关于萌娘百科 • 常见问题FAQ |
入门 |
Wiki使用指南 • 萌百入门教程 创建新条目 • 寻找原图 上传图片 • 使用图片 重定向建立&修正 • 消歧义 日语的处理 • 繁简处理 制作投票 • 测试用沙盒 |
编辑 |
编辑规范 • 条目命名 条目编写 • 模板规范 收录范围 • 魔术字 媒体帮助 • 帮助列表 |
简介
使用wikitext制作模板非常简单。在编辑时经常会和许多模板打交道,当你找不到合适的模板来实现某个功能,或是当前的写法重复繁琐时,制作一个模板将是个非常棒的主意,良好且适用性高的模板将为你以及以后和你遇到相同问题的人提供极大的便利。
准备
- 基础的wikitext知识
- 一个代码沙盒,你可以使用本页面下的沙盒:User:东东君/从零开始的模板教程/沙盒 或公共沙盒:Help:沙盒 来进行测试,或者也可以在下栏输入一个沙盒名,创建自己的沙盒。
- 注意:只需要输入沙盒名即可,将自动在你的用户页下创建。
- 打开这个页面,在“编辑工具”中找到“Syntax highlighte”代码高亮工具并开启,保存。
复制一份如下代码到沙盒作为测试使用:
- 注意:在测试时请点击编辑栏下方保存更改右边的“显示预览”按钮进行预览,因为模板测试在页面不刷新的情况下无法正常显示。
开始
撒,東東酱的模板教程,哈吉吗路哟~
第一个模板
当你把复制的代码粘贴到沙盒中时,预览可以看到如下文字:“调用模板写在这里”,在这里<includeonly>
标签包裹的内容相当于模板的内容,如果你不去调用(正确的说法应该叫“包括”或“嵌入”),其中的内容就不会显示,这里你可以将你的沙盒页面名复制下来,粘贴到<noinclude>
标签中,并且使用两对花括号{{ 你的沙盒页面名 }}
包裹,进行调用,这时<includeonly>
标签中的内容就会出现在页面中。
接下来为了便于讲解,对于<includeonly>
标签内将统称为模板,<noinclude>
标签内将统称为外部。
参数
提供参数是模板最重要的功能,参数保证了模板的适用性、可重用性。
匿名参数
在模板中输入:你输入了数字:{{{1|}}}
,在外部调用{{你的沙盒名|6}}
,此时预览,页面中将显示文字“你输入了数字:6”,这构成了一个基础的传参格式。
以此类推,{{{2|}}}
代表第2个参数、{{{3|}}}
代表第3个参数......
其中数字后的管道符|
表示提供一个默认值:如果参数1为空,则使用管道符后的值,若没有值,则为空。例如想要在参数1未提供值时使用9,则写成{{{1|9}}}
,若要在参数3未提供值时使用参数2的值,则写成{{{3|{{{2|}}}}}}
,以此类推,在需要时进行嵌套,同时要注意若在没有提供默认值,并且该参数也没有传入的情况下,则会将该参数的代码本身解析为普通字符串,所以建议始终给参数设置一个默认值,无论这个默认值是否为空值。
同时请注意:{{temp|}}
,这种写法并不是将参数空了出来,而是传入了一个空字符串,这会被当做一个值来处理。
具名参数
具名参数的名称和值一一对应,不受位置的影响,但若对相同参数重复传值,该参数只会接收最后一个传入的值。
实际上,匿名参数中按顺序的传值相当于:|1= 值一|2= 值二|3= ...
,如果对数字进行赋值,模板中对应的数字参数也会接收到。
具名参数将自动删除参数名等号后以及值后面的多余空格及换行。
其他
<!-- 内容 -->
这种写法为注释,其中的内容不会显示,也不会经过任何的解析。
如果在载入时发现多出了许多空白,是因为留白同样会被载入,换行将被转换成半角空格,空出一行将被转换为换行,解决方法为在留白的头和尾分别注上注释,如上例。
模版扩展语法
仅仅了解参数的传递是远远不够的,模板扩展语法是制作复杂模板的关键技术,使用HTML+CSS与模板扩展语法,可以实现许多神奇的功能。
反过来说如果HTML+CSS和模版扩展语法一个都不会,那就根本做不出有用的模板了
这里只列举出了常用的语法,如果要了解更多,你可以边学习边参考:User:宇文天启/模板扩展语法
为了便于测试,模板扩展语法直接写在外部即可,不需要再使用之前的<includeonly>
模板代码。
模板扩展语法中使用的语法都被称为“解析器函数”,解析器函数名的前面带有“#”号,第一个参数前使用冒号而不是管道符。
解析器函数将忽略所有参数前后的空格和换行,若要传入空格与换行,请使用转义字符
(空格)和<br />
(换行)标签。
变量
变量使模板中的数据(可以是任意值、HTML代码、解析器函数、模板等任何东西)得以在外部暂时保存,通过合理的使用,可以减少代码、实现各种不同的功能。
在使用一个变量之前,必须先声明变量。
{{#var}}
为使用一个变量,变量名写在第一个参数中。
{{#vardefine}}
中可以声明变量,无论在哪里声明的变量,都是可以全局使用的。
{{#var_final}}
同样可以对变量赋值,不同的是,要赋值的变量如果非空,则该赋值语句无效。
{{#vardefineecho}}
将在声明变量的同时输出变量的值。
{{#var}}
的第二个参数可以传入一个值,若变量的值为空,则使用第二个参数的值。
条件语句
if
用例:
<includeonly> {{#if:{{{1|}}} |{{#if:{{{2|}}} |参数1和参数2都非空! <!-- 嵌套使用,判断传入的参数1和参数2是否都非空 --> }}}} </includeonly><noinclude> {{沙盒名|1|2}} </noinclude>
if语句将对参数1进行判断,若非空,则输出参数2,否则,输出参数3,参数3可以省略。
使用if语句可以动态生成内容,如使用最广泛的{{人物信息}}模板中,其介绍栏各个项目就是由if语句判断是否有值,然后生成的。
ifeq
用例:
<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将对其内部的成员进行逻辑或数学计算,它并不是流程控制语句。不能用于字符串的比较。以下为运算符参考表格:
运算符 | 名称 | 优先级 | 元数 | 结合性 | 样例 |
---|---|---|---|---|---|
+ | 正 | 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
用例:
<includeonly> {{{1|0}}}{{#ifexpr:{{{1|0}}} mod 10 |不能 |可以 }}被10整除 </includeonly><noinclude> {{沙盒名|21}} </noinclude>
ifexpr会先将参数1的内容进行计算,根据计算结果,非0或空时,输出参数2,否则,输出参数3,参数3可以省略。
switch
用例:
<includeonly> {{#switch:{{{lg|}}} |default= 欢迎来到萌娘百科! |en= Welcome to the English Version of Moegirlpedia! |ja= 萌えっ娘百科事典へようこそ! }} </includeonly><noinclude> {{沙盒名|ko}} </noinclude>
switch判断参数1,若和其后声明的任何参数名相同,则输出那个参数名的值,若都不相同,则输出#default的值。
循环语句
loop
loop循环中,参数1设置一个每轮循环不断自增+1的计数器,参数2为这个计数器的初始值,参数3为要循环的次数。
也就是说,循环次数以参数3为准,就算循环过程中改变了计数器的值,循环次数也不会改变。
支持循环的嵌套,但这将大大增加循环的次数。
注意:每个页面中循环次数都不能大于99次,否则将抛出错误,因此,必须控制循环次数合理使用,对于模版中使用循环更是应该小心,最好不要超过20次,如果是某些可能在同一页面重复调用的模板,就一定不要使用循环了,若流程大体可控可以手动写出循环,或者在Lua模块中进行循环的操作。
若只是单纯的想重复输出文字,可以使用字符串处理中的rep进行输出。
fornumargs
用例:
<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
这个循环的循环次数等于以参数1为前缀的参数数量,参数2设置的变量保存着以参数1为前缀的,去掉前缀后的,每次循环的参数名,参数3设置的变量保存着等同于当前循环次数的,以参数1为前缀的传入参数。
上面的例子中,将循环三轮,第一轮{{#var:key}}
为“智”、{{#var:value}}
为“香风智乃”,以此类推。
参数1可以留空,留空后会将所有参数都计入循环次数。
这个循环同样不占用循环次数。
其他
常用系统变量
{{PAGENAME}}
:输出页面名称(不包含名字空间){{FULLPAGENAME}}
:输出完整页面名称
总结
以上就是一些比较常用的模板书写规则以及拓展语法的使用。
该教程本身可能只是将文档的部分内容挑出来啰嗦了一遍,借此希望刚刚接触wikitext的编辑者可以更好地入门并理解模板的编写。
如果你想继续学习关于模板的其他知识,或在实现一些功能时无从下手时,可以查看下面的一些资料,完整的文档总是比一篇教程更加有用。