跳至內容

說明:解析器函數

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

解析器函數是MediaWiki擴充,由mw:Extension:ParserFunctions提供,包含多個解析函式直譯器。本擴充的典型語法是:

{{#函式名:參數1|參數2|參數3|...}}

目前有預定義的函式exprififeqifexprswitchrand暫時不用)。

各函式名都不分大小寫。

忽略語句的空格、換行等空白字元。

函式

[編輯]

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(如果、那麼、否則)結構,和Excelif函式類似。語法是:

{{#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 月份全稱,通常需要國際化 10月
m 數字表示的月份,不足兩位補0 01-12
M 月份縮寫,通常需要國際化 10月
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」。

其他字元都不處理直接輸出。你也可以用引號來輸出未處理字串。

  • 引號中的字元直接輸出(但不輸出引號),沒有配對的引號也直接輸出,如
    • {{#time:"現在是"F}}→現在是10月
    • {{#time:i's"}}→04'31"
    • {{#time:Y-m-d"T"H:i:s"Z"}}→2024-10-31T15:04:31Z(ISO 8601
  • 像PHP的date()函式一樣的反斜槓跳脫也是支持的。\H直接輸出H\"直接輸出"

未來可能會增加更多格式代碼,可能是完善PHP現有功能,也可能是增加新功能。

時間參數格式參照PHP的strtotime()函式。它同時支持相對時間,如「+10 hours」,用來表示時區轉換。更多資訊參見the GNU tar manual[失效連結]

下表以國際協調時2024年10月31日(星期四)15時04分31秒(東八區時間2024年10月31日(星期四)23時04分32秒)為例說明各格式參數的作用。

格式參數 說明 顯示結果
A 顯示AM或PM PM
a 顯示am或pm pm
c 顯示長日期 2024-10-31T15:04:31+00:00
D 星期數,以一漢字顯示
d 日期日數,有0補齊 31
FM 月份 10月
Gg 當前UTC時間小時數,1位或2位數 15
H 小時數,2位數(24小時制) 15
h 小時數,2位數 (12小時制) 03
i 分鐘數,2位數 04
j 日數,2位數 31
L 日期星期數,1位數,星期日為1,星期六為7 1
l 日期星期數,3位漢字 星期四
m 月份數,2位數 10
N 星期數,星期一為1,星期日為7 4
n 月份數,1位或2位數 10
r 英文長日期格式 Thu, 31 Oct 2024 15:04:31 +0000
s 秒數 31
T UTC UTC
t 該月天數 31
U 時間序號,1970-1-1 0:0:1為1,參見UNIX時間 1730387071
W 日期周數,顯示日期為當年第幾周 44
w 星期數,星期日為0,星期六為6 4
Y 日期年份,4位元數 2024
y 日期年份,2位數 24
z 顯示日期為當年第幾日 304

系統預設的時間參數為當前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年10月31日 (四) 15:04 (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得到指定語言代碼的語言名(以當地語言表示)。

加入第二參數時,顯示該語言在第二參數語言中的名稱。

babel

[編輯]
  • {{#babel:babelcode1|babelcode2|...}}

替換為{{babel}}模板,見Extension:Babel

invoke

[編輯]
  • {{#invoke:module|function|arg1|arg2|...}}

呼叫Scribunto中的模組,見維基百科:Lua

subst

[編輯]

應用subst:到解析器函數,subst:和#之間沒有空格才可以正常工作。

表格

[編輯]

解析器函數用管道符|分隔參數,不能包括表格所需要的|符。要輸出表格,可以:

  1. 用巢狀模板隱藏|,比如{{!}}
  2. 使用HTML語法。

參見

[編輯]