Help:模板擴展語法
出自 MBA智库百科(https://wiki.mbalib.com/)
模板擴展語法是一個MediaWiki擴展,包含多個解析函數解釋器。本擴展的典型語法是:
- {{#函數名: 參數1 | 參數2 | 參數 3 …}}
目前有預定義的函數:expr,if,ifeq,ifexpr,switch(rand暫時被廢除)。
各函數名都對大小寫不敏感。
語句中的空格、換行等空白字元將被省略。
目錄[隱藏] |
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 |
round運算對運算數正負,位數正負都有不同的表現,參見下例。
- {{#expr: 300/7 round 1}} = 42.9
- {{#expr: 300/7 round -1}} = 40
- {{#expr: -300/7 round 1}} = -42.9
邏輯運算符把假映射為0,把真映射為非0,且返回值只有0或1。
同一表達式中先計算高優先順序運算。括弧優先順序高於一切。
if函數是一個if-then-else結構。語法是:
{{#if: <判斷字元串> | <then字元串> [| <else字元串> ]}}
若判斷字元串為非空字元串(忽略前導或尾碼空格),則函數返回then字元串,否則函數返回else字元串。else字元可被省略而不會造成錯誤,但函數在判斷字元串為空時便會返回空字元串。
ifeq比較兩個字元串,返回比較結果。語法為:
{{#ifeq: <字元串1> | <字元串2> [| <相等時返回的字元串> [| <不相等時返回的字元串> ]]}}
註意:兩個空字元串是相等的。
ifexist根據指定名稱的頁面是否存在,返回兩個參數中的一個。用法: <不存在文字>; 示例:
- {{#ifexist:test|有test頁面|無test頁面}} 得到 有test頁面
- {{#ifexist:user:sex|該用戶存在|該用戶不存在}} 得到 該用戶不存在
- {{#ifexist:Calculation|Yes|Oops}} 得到 Oops
ifexpr計算數學表達式,並根據計算結果返回字元串。
{{ #ifexpr: <表達式> | <then字元串> [| <else字元串>] }}
若表達式經計算不為0,則函數返回then字元串,否則函數返回else字元串。表達式語法與expr相同。
switch將一個值與多個預設值比較,若有匹配時則返回指定字元串,即雙射。語法是:
{{ #switch: <比較值> | <預設值1> [= <結果1>] | <預設值2> [= <結果2>] | ... | <預設值n> [= <結果n>] | [#default = ]<預設結果> }}
switch將從左往右逐一嘗試,直到出現匹配。函數將返回第一個匹配值對應的結果,而忽略後面的匹配值。如果沒有匹配,函數將返回預設結果。如果預設結果沒有設置,函數將返回空串。
註意:“預設結果”是最後一個沒有等號的預設值或“#default”預設值對應的結果;如果期望把一個包含“=”號的字元串作為預設結果,則必須採用“#default”預設值形式。例如: #default = <span style="color:red;">red</span>
switch也可用作滿射(多對一,避免重覆設置結果)。即某預設值後未設置結果,這樣如果該預設值與比較值匹配,則函數返回第一個有結果的預設值的結果。例如:
{{ #switch: <比較值> | <預設值1> | <預設值2> | <預設值3> = <結果3> | <預設結果> }}
如果比較值與預設值1或預設值2匹配,都將返回結果3。註意:“#default”後必須有“=”,但其他預設值可以使用“#default”的結果。
time是一個時間日期格式化函數,它的語法為:
{{ #time: format }}
或者
{{ #time: format | time }}
format參數是時間格式化設置,與php的date使用方法很相似。 PHP's date
- 以下格式碼在php中也具有相同的含義。重大差異在於PHP的國際化處理 (即語言和locale的不同處理) 在ParserFunctions中將視為錯誤並被報告出來。所有數字格式化碼按本地語言返加格式化後的數字,可以使用xn指定的編碼來覆蓋它。
編碼 | 描述 | 範例輸出 |
---|---|---|
d | 所在月份的第幾天,有前導零 | 04 |
D | 簡寫的星期。 | Mon |
j | 所在月份的第幾天,沒有前導零 | 3 |
l | 完整的星期。 | Monday |
F | 完整的月份 | January |
m | 數字表示的月份,有前導零 | 01 到 12 |
M | 簡寫的月份。 | Jan |
n | 數字表示的月份,沒有前導零 | 1 to 12 |
Y | 4位數的年份 | 2006 |
y | 2位數的年份 | 06 |
H | 小時,有前導零 | 00 to 23 |
i | 分鐘,有前導零 | 00 to 59 |
s | 秒,有前導零 | 00 to 59 |
所有非格式化編碼的字元將直接輸出。有兩個轉義字元可以輸出原始內容。
- 兩個引號中的字元將直接輸出(引號本身去掉),沒有對應的引號將直接輸出:
- {{ #time: "本月是" m}} → 本月是05
- {{ #time:i's"}} → 20'11"
- 支持PHP的date()中反斜杠。如 \H 輸出一個原始字元 H, \" 輸出一個原始字元 "。
time參數的格式與PHP的strtotime()函數的參數格式相同。支持相對時間的計算。如“+10 hours”。更多信息可以查看the GNU tar manual。
如果時間參數沒有指定,則預設為所在的文章轉化成HTML文檔時的時間。註意,由於緩存,文章上觀看到的時間和實際可能有近一周時間的出入。如果有必要可以手工更新,對文章不做任何更改進行保存就可以刷新緩存(“空編輯”)。
- {{#time:Y年M月j日 |-14 days}} 得到14天前的日期: 2025年3月15日
- {{#time:H:i|+8 hours}} 得到當前的UTC+8時間: 11:34
應用subst:到模板擴展,必須在subst:和#之間不能有空格,才可以正常工作。
模板擴展函數中由於使用了“|”管道符做參數分隔符,所以不能包括表格所需要的“|”符。要想在輸出中包含表格,可以通過以下兩個辦法達到:
- 通過嵌套模板來達到隱藏“|”的目的。
- 使用HTML語法。