說明:解析器函數
此幫助頁面需要更新。 (2018年9月5日) |
本頁為操作指南,用於介紹中文維基百科社群的一些實作和操作方式。 本文只是論述,不屬於方針或指引。如果本指南與方針或指引起衝突或不一致,請以方針或指引的條文為準。 |
解析器函數是MediaWiki擴展,由mw:Extension:ParserFunctions提供,包含多個解析函數解釋器。本擴展的典型語法是:
{{#函數名:參數1|參數2|參數3|...}}
目前有預定義的函數expr
、if
、ifeq
、ifexpr
、switch
(rand
暫時不用)。
各函數名都不分大小寫。
忽略語句的空格、換行等空白字符。
函數
[編輯]expr
[編輯]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 |
四捨五入(最大9) | 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
運算對運算數正負,位數正負都有不同表現,參見下例。
邏輯運算符把假映射為0,把真映射為非0,且返回值只有0或1。
同一表達式中先計算高優先級運算。括號優先級高於一切。
if
[編輯]if
函數有if-then-else
(如果、那麼、否則)結構,和Excel的if
函數類似。語法是:
{{#if:判斷字符串|那麼字符串|否則字符串}} {{#if:判斷字符串|那麼字符串}}
若「判斷字符串」不是空字符串(忽略前導或後綴空格),則函數返回「那麼字符串」;若「判斷字符串」是空字符串,則返回「否則字符串」。「否則字符串」可省略而不會出錯,但函數在「判斷字符串」為空時便會返回空字符串。
if函數還可用在模板語法中檢查有否使用某參數。若滿足條件,可在調用此模板的頁面中顯示或不顯示特定內容。
{{#if:{{{1|}}}|匿名參數1不為空時輸出的結果|匿名參數1為空時輸出的結果}} {{#if:{{{xx|}}}{{{yy|}}}|xx或yy參數不為空時輸出的結果|xx和yy參數都為空時輸出的結果}}
ifeq
[編輯]ifeq
比較兩串字串,傳回比較結果。語法為:
{{#ifeq:字符串1|字符串2|相等時返回的字符串|不相等時返回的字符串}}
注意:兩串空字串相等。
示例:
假設模板{{Ifeq test}}
的內容是
{{#ifeq:{{{lang}}}|zh|我使用中文|I don't use Chinese}}
則{{Ifeq test|lang=zh}}
的結果是「我使用中文」;而{{Ifeq test|lang=en}}
的結果是「I don't use Chinese」。
ifexist
[編輯]ifexist
根據指定名稱的頁面是否存在,返回兩參數中的一數。用法:
{{#ifexist:待測頁面標題|存在文字|不存在文字}}
注意不能跨維基使用。
ifexist
是高開銷方法,如果超過調用次數限制,超出限制的部分默認為輸出不存在時的內容。
示例:
首先,我們已知test頁面不存在,User:用戶名不存在,維基百科頁面存在,英文維基百科有頁面en:Minecraft,維基詞典有wikt:hello。
{{#ifexist:test|有test頁面|無test頁面}}
→無test頁面{{#ifexist:User:用戶名|該用戶頁存在|該用戶頁不存在}}
→該用戶頁不存在{{#ifexist:維基百科|✓|✗}}
→✓{{#ifexist:en:Minecraft|1|0}}
→0{{#ifexist:wikt:hello|1|0}}
→0
ifexpr
[編輯]ifexpr
計算數學表達式,並根據計算結果返回字符串。
{{#ifexpr:表達式|表達式不為0的結果|表達式為0的結果}}
表達式語法與expr
相同。
switch
[編輯]switch
將一值與多項預設值比較,若有匹配時則返回指定字符串,即雙射。語法是:
{{#switch:比較值 |預設值一 = 結果一 |預設值二 = 結果二 |... |預設值某 = 結果某 |#default = 缺省結果 }}
switch
從左往右逐一嘗試,直到出現匹配。函數傳回第一個匹配值對應的結果,而忽略後面的匹配值。如果沒有匹配,函數傳回缺省結果。缺省結果是指#default=後面的內容。其中#default=在結果沒有等號時可以省略。如果缺省結果沒有設置,函數傳回空串。
注意:「缺省結果」是最後一個沒有等號的預設值或「#default」預設值對應的結果;如果期望把有「=」號的字串作為缺省結果,則必須採用「#default」預設值形式,如:
#default = <span style="color:red;">red</span>
switch
也可用作滿射(多對一,避免重複設置結果)。即某預設值後未設置結果,這樣如果該預設值與比較值匹配,則函數返回第一個有結果的預設值的結果,如:
{{#switch:比較值 |預設值1 |預設值2 |預設值3 = 結果3 |缺省結果 }}
如果比較值與預設值1、預設值2或預設值3匹配,都將返回結果3。注意:「#default」後必須有「=」,但其他預設值可以使用「#default」的結果。
switch
也可以與invoke
搭配,來完成隨機顯示的功能,詳見Help:隨機顯示。
time
[編輯]time
是時間日期格式函數,語法為
{{#time:格式參數}}
或者
{{#time:格式參數|時間參數}}
如果時間參數未指定,就用條目轉換為HTML的時間(值)。緩存問題,這與瀏覽條目的時間可能會高達1星期偏差,可能要人手更新,方法是加上action=purge參數訪問頁面。
格式參數是種格式字符,與在PHP的date中的用法相似。
下列格式代碼與在PHP中的意義一樣。所不同的是:如果時間未指定,則顯示文章最後一次轉換成HTML的時間。緩存問題,此時間和你瀏覽文章的時間可能有最長一星期的差別,有時可能要親自更新數據,方法是編輯文章但不修改任何內容即保存。
以下格式代碼和PHP函數date()
同義。除了國際化(主要是語言)差別以外,所有和PHP的不同點都應報告為軟件錯誤。其中所有的數字輸出都會替換成當地語言的時間格式,可以使用xn
(見下文)恢復成顯示原來的數字。
代碼 | 描述 | 輸出(示例) |
---|---|---|
d |
一個月第n天,不足兩位補0 | 04 |
D |
星期縮寫,通常不國際化 | 二 |
j |
一個月第n天,不足兩位不補0 | 3 |
l |
星期全稱,通常不國際化 | 星期二 |
F |
月份全稱,通常需要國際化 | 12月 |
m |
數字表示的月份,不足兩位補0 | 01-12 |
M |
月份縮寫,通常需要國際化 | 12月 |
n |
數字表示的月份,不足兩位不補0 | 1-12 |
Y |
四位年份 | 2024 |
y |
二位年份 | 24 |
H |
小時,不足兩位補0 | 00-23 |
i |
分鐘,不足兩位補0 | 00-59 |
s |
秒,不足兩位補0 | 00-59 |
以下代碼是對PHP的擴展:
代碼 | 描述 |
---|---|
xn |
將接下來的數字代碼恢復成ASCII中的阿拉伯數字,如印地語{{#time:H, xnH}} 輸出「०६, 06」。
|
xr |
將接下來的數字代碼顯示成羅馬數字。 |
xg |
輸出月份名字的屬格,只針對那些區分主格和屬格的語言。 |
xx |
輸出「x」。 |
其他字符都不處理直接輸出。你也可以用引號來輸出未處理字串。
- 引號中的字符直接輸出(但不輸出引號),沒有配對的引號也直接輸出,如
- 像PHP的
date()
函數一樣的反斜槓轉義也是支持的。\H
直接輸出H
,\"
直接輸出"
。
未來可能會增加更多格式代碼,可能是完善PHP現有功能,也可能是增加新功能。
時間參數格式參照PHP的strtotime()
函數。它同時支持相對時間,如「+10 hours」,用來表示時區轉換。更多信息參見the GNU tar manual[失效連結]。
下表以國際協調時2024年12月17日(星期二)12時14分46秒(東八區時間2024年12月17日(星期二)20時14分46秒)為例說明各格式參數的作用。
格式參數 | 說明 | 顯示結果 |
---|---|---|
A |
顯示AM或PM | PM |
a |
顯示am或pm | pm |
c |
顯示長日期 | 2024-12-17T12:14:46+00:00 |
D |
星期數,以一漢字顯示 | 二 |
d |
日期日數,有0補齊 | 17 |
F 或M |
月份 | 12月 |
G 或g |
當前UTC時間小時數,1位或2位數 | 12 |
H |
小時數,2位數(24小時制) | 12 |
h |
小時數,2位數 (12小時制) | 12 |
i |
分鐘數,2位數 | 14 |
j |
日數,2位數 | 17 |
L |
日期星期數,1位數,星期日為1,星期六為7 | 1 |
l |
日期星期數,3位漢字 | 星期二 |
m |
月份數,2位數 | 12 |
N |
星期數,星期一為1,星期日為7 | 2 |
n |
月份數,1位或2位數 | 12 |
r |
英文長日期格式 | Tue, 17 Dec 2024 12:14:46 +0000 |
s |
秒數 | 46 |
T |
UTC | UTC |
t |
該月天數 | 31 |
U |
時間序號,1970-1-1 0:0:1為1,參見UNIX時間 | 1734437686 |
W |
日期周數,顯示日期為當年第幾周 | 51 |
w |
星期數,星期日為0,星期六為6 | 2 |
Y |
日期年份,4位數 | 2024 |
y |
日期年份,2位數 | 24 |
z |
顯示日期為當年第幾日 | 351 |
系統默認的時間參數為當前UTC+0時間,可以用{{#time:參數|+8 hours}}
得到當前東八區時間。
時間參數可用絕對時間,如「2008-12-31 23:59:59
」,也可用相對時間,如「+7 days
」或者「-5 hours
」得到默認時間7日之後或默認時間5小時之前的時間。也可以二者混合用,比如{{#time:Y-m-d H:i:s|2001-2-3 04:05:06 +1 year +2 months +3 days +4 hours +5 minutes +6 seconds}}
傳回「2002-04-06 08:10:12」。
用xr
可以在其後顯示羅馬數字,如{{#time:xrY年xrm月xrd日|2008-12-31}}
顯示為「MMVIII年XII月XXXI日」。
生成與簽名格式相同的時間語法為{{#time:Y年n月j日 (D) H:i}} (UTC)
,顯示為「2024年12月17日 (二) 12:14 (UTC)」(亦可用參數T
:{{#time:Y年n月j日 (D) H:i (T)}}
)。
timef
[編輯]#timef
提供更便捷的指定語言化的日期時間格式化輸出。
例子:{{#timef: date/time object | format type | language code }}
date/time object
:對應{{#timef|输出格式|时间对象}}
的「時間對象」部分,如不指定,則為頁面渲染時的當時時間。format type
:格式類型,枚舉值,可選:- time:只輸出時間
- date:只輸出日期
- both:同時輸出日期和時間,不指定時的默認值
- pretty:以縮寫方式只輸出日期,不包括年份,部分語言沒有這個格式,如果這樣則等價於both
language code
:指定對應語言的輸出格式,不指定時默認為當前頁面內容語言。
language
[編輯]#language
得到指定語言代碼的語言名(以當地語言表示)。
{{#language:zh}}
→ 中文{{#language:zh-cn}}
→ 中文(中国大陆){{#language:zh-tw}}
→ 中文(臺灣){{#language:zh-hk}}
→ 中文(香港){{#language:zh-sg}}
→ 中文(新加坡){{#language:de}}
→Deutsch{{#language:en}}
→English{{#language:ja}}
→ 日本語{{#language:nl}}
→Nederlands
加入第二參數時,顯示該語言在第二參數語言中的名稱。
{{#language:de|en}}
→ German{{#language:en|ja}}
→ 英語{{#language:ja|nl}}
→ Japans{{#language:nl|zh}}
→ 荷兰语{{#language:zh|de}}
→ Chinesisch
babel
[編輯]{{#babel:babelcode1|babelcode2|...}}
替換為{{babel}}
模板,見Extension:Babel。
invoke
[編輯]{{#invoke:module|function|arg1|arg2|...}}
subst
[編輯]應用subst:到解析器函數,subst:和#之間沒有空格才可以正常工作。
表格
[編輯]解析器函數用管道符|
分隔參數,不能包括表格所需要的|
符。要輸出表格,可以:
- 用嵌套模板隱藏
|
,比如{{!}}
- 使用HTML語法。