幫助:替換引用
替換引用是頁面保存時維基文本的自動轉換,以使維基文本引用一個或多個模板、變量或解析器函數。
將subst:
或者safesubst:
放在兩個開大括號之後,不加空格,就像例子{{subst:FULLPAGENAME}}
和{{safesubst:FULLPAGENAME}}
一樣,這樣就是替換引用。 在多級替換中,safesubst:
很有用,參見下方。
修飾符「subst:」(「substitute」,「替代」)位於模板、變量、解析函數的「{{」之後。但subst對參數的「{{{」不起作用。
它能在引用頁面保存時(而非查看時),將維基代碼自動替換,分別為:
- 模板的維基代碼,而不是引用模板的維基代碼(例如{{template1}}),參數被替換成參數的值;
- 變量的值;
- 解析函數(包括Lua模塊)的值。
對模板的替換引用不會顯示在頁面歷史和模板的鏈入頁面等中。
模板
假設在A頁面有以下模板,當前時間為12:00:00
Time:{{#time|H:i:s}}
如果在B頁面嵌入:{{subst:A}}
,則保存的內容為該模板的原始碼(Time:{{#time|H:i:s}}
)。
如果將A頁面改為下列形式:
Time:{{subst:#time|H:i:s}}
則在B頁面嵌入{{subst:A}}
時,保存的內容為Time:12:00:00
,這就是一個最基本的替換引用的例子。
請注意這種對模板的替換不會自動重複進行:如果被替換引用的模板又引用了其他模板,那個模板不會被替換引用。你可以隨後加上subst,做手動轉換。這種逐步的替換引用對於分析模板調用原理很有用。但是,複雜的是:
- 如果參數名取決於另一個參數的默認值,那麼替換引用時這不會被計算。
如果你想修改替換引用生成的目標代碼,你必須先保存,因為預覽時替換引用還沒發生,替換引用只在保存時發生。
另一種方式就是手動替換,複製模板的原始碼再編輯。另一種方式是使用「msgnw:」修飾符(參見:Help:魔術字/解析器函數)。
對「~~~~
」進行替換引用沒有效果。
必須被替換引用的模板可以使用{{Substituted}}在模板文檔里作提醒,該模板會被顯示在Category:必須被替換引用的模板里。
變量
對變量替換引用與對模板的類似。比如時間戳:
{{subst:CURRENTYEAR}}年{{subst:CURRENTMONTHNAME}}{{subst:CURRENTDAY}}日, {{subst:CURRENTTIME}} (UTC)
得到:
2024年12月19日, 11:14 (UTC)
解析函數
對解析函數的替換引用與模板一樣,但是「subst:」與「#」之間不能有分隔。例如:
{{subst:#time:c}}
得到 2012-02-08T08:08:32+00:00
nowiki與pre
如果某模板包含位於nowiki或pre標記之內的簽名或替換引用,他們將被解釋並展開,但nowiki或pre標記仍保留。
條件替換技術
是否進行替換可由特定參數決定,由此還可進行多重替換。原理如下:
- 頁面A包含{{subst:B|subst=subst:|參數...}}
- template:B包含{{{{{subst|}}}C|subst={{{subst|}}}|參數...}}
- template:C包含{{{{{subst|}}}D|subst={{{subst|}}}|參數...}}
- 以此類推
當頁面A對template:B的引用包含「subst=subst:」時,template:B對template:C的引用也是替換引用,template:C對template:D也是。若頁面A不含「subst=subst:」時,便不會替換,且不會出現錯誤。由此,條件替換和多重替換可以實現。
基於引用的替換
在被替換的模板中使用「僅包含」和「不包含」標籤,可以在引用時實現魔術般的技巧。
代碼~<includeonly>~</includeonly>~~
顯示為~~~,當被引用時顯示為~~~~,當被替換引用時展開為用戶簽名。而當一包含了{{<includeonly>subst:</includeonly>CURRENTTIME}}的模板被替換引用並保存時,不變的時間就被保存在維基文字中,替換了隨時間變化的時間變量。變量也是如此。樣例:
- 在Template:Demo中保存{{CURRENTTIME}},源文件為{{CURRENTTIME}}
- 在頁面中保存{{Demo}},源文件為{{Demo}},頁面顯示出變化的當前時間11:14;
- 在頁面中保存{{subst:Demo}},源文件為{{CURRENTTIME}},頁面顯示出變化的當前時間11:14;
- 在Template:Demo中保存{{subst:CURRENTTIME}},源文件為07:37
- 在頁面中保存{{Demo}},源文件為{{Demo}},頁面顯示出不變的模板保存時間07:37;
- 在頁面中保存{{subst:Demo}},源文件為{{subst:CURRENTTIME}},頁面顯示出不變的模板保存時間07:37;
- 在Template:Demo中保存{{<includeonly>subst:</includeonly>CURRENTTIME}},源文件為{{<includeonly>subst:</includeonly>CURRENTTIME}}
- 在頁面中保存{{Demo}},源文件為{{Demo}},頁面顯示出{{subst:CURRENTTIME}};
- 在頁面中保存{{subst:Demo}},源文件為07:37,頁面顯示出不變的頁面保存時間07:37;
簡單的說:僅包含標籤可被用於專門被替換引用的模板、變量,即在subst:前後加上僅包含標籤。
使用限制
模板內部如果嵌入了引用替換方式的其它模板或者有引用替換效果的簽名~~~、~~~~、~~~~~時,模板自身也只能以引用替換的方式使用,即以{{subst:模板名|相關參數}}的方式來使用模板。比如模板A裏包含了
這是一個關於{{<includeonly>subst:</includeonly>B}}的例子
那麼,只能這樣使用模板A:
{{subst:A}}
這種情況下可以對模板B使用safesubst,safesubst允許該模板既可以被嵌入又可以被替換引用。
變量使用
若要替換引用一個變量,則在聲明和使用時均要在#
號前加上subst:
或safesubst:
。
對於產生變量的模板,被替換引用後這些變量均無法在被嵌入頁面使用。
其他修飾符
msgnw
自動產生模板的原始碼。
注意:由該修飾符輸出的原始碼不能作為字符串處理的對象。
safesubst
用於既需要被替換引用也需要被嵌套的模板。
|