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

用戶:東東君/從零開始的模板教程

萌娘百科,萬物皆可萌的百科全書!轉載請標註來源頁面的網頁連結,並聲明引自萌娘百科。內容不可商用。
跳至導覽 跳至搜尋
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的編輯者可以更好地入門並理解模板的編寫。

如果你想繼續學習關於模板的其他知識,或在實現一些功能時無從下手時,可以查看下面的一些資料,完整的文檔總是比一篇教程更加有用。

其他參考資料