用戶:東東君/從零開始的模板教程
幫助導航 |
---|
關於萌娘百科 • 常見問題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的編輯者可以更好地入門並理解模板的編寫。
如果你想繼續學習關於模板的其他知識,或在實現一些功能時無從下手時,可以查看下面的一些資料,完整的文檔總是比一篇教程更加有用。