說明:替換引用
這是元維基上幫助文檔副本的中文翻譯,請參看元維基上的幫助文檔後再修改本文。 本文在元維基的原文是:meta:Help:Substitution |
本頁為操作指南,用於介紹中文維基百科社群的一些實作和操作方式。 本文只是論述,不屬於方針或指引。如果本指南與方針或指引起衝突或不一致,請以方針或指引的條文為準。 |
修飾符「subst:」(「substitute」,「替代」)位於模板、變量、解析函數的「{{」之後。但subst對參數的「{{{」不起作用。
它能在引用頁面保存時,將維基代碼自動替換,分別為:
- 模板的維基代碼,而不是引用模板的維基代碼(例如{{template1}}),參數被替換成參數的值
- 變量的值
- 解析函數的值
對模板的替換引用不會顯示在頁面歷史和模板的鏈入頁面等中。
模板
編輯樣例:
Template:t2(討論 - 鏈入頁面 - 編輯),包含<noinclude>{{Sample}}[[Category:辅助模板]]</noinclude>start_{{{1}}}_middle_{{{2}}}_end
,以{{subst:t2|[[a]]|{{tc}}}}
方式引用,得到源代碼start_[[a]]_middle_{{tc}}_end
,顯示為start_a_middle_{{tlc|...}}
_end。
注意到這種對模板的替換不會自動重複進行:如果被替換引用的模板又引用了其他模板,那個模板不會被替換引用。你可以隨後加上subst,做手動轉換。這種逐步的替換引用對於分析模板調用原理很有用。但是,複雜的是:
- 如果參數名取決於另一個參數的默認值,那麼替換引用時這不會被計算。
如果你想修改替換引用生成的目標代碼,你必須先保存,因為預覽時替換引用還沒發生,替換引用只在保存時發生。但是你可以點擊顯示差異以顯示替換引用的結果。
另一種方式就是手動替換,複製模板的源代碼再編輯。另一種方式是使用「msgnw:」修飾符(參見:Wikipedia:MediaWiki命名空間#MSGNW)。
對「~~~~」進行替換引用沒有效果。
變量
編輯對變量替換引用與對模板的類似。比如時間戳:
{{subst:CURRENTYEAR}}年{{subst:CURRENTMONTHNAME}}{{subst:CURRENTDAY}}日, {{subst:CURRENTTIME}} (UTC)
得到:
2024年11月26日, 21:24 (UTC)
解析函數
編輯解析函數的替換引用與模板一樣。例如{{subst:#time:c}}
直接得到2024-11-26T21:24:12+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}} |
|
---|---|
在Template:Demo中保存{{subst:CURRENTTIME}},源文件為07:37 |
|
在Template:Demo中保存{{<includeonly>subst:</includeonly>CURRENTTIME}},源文件為{{<includeonly>subst:</includeonly>CURRENTTIME}} |
|
在Template:Demo中保存{{ {{{|safesubst:}}}CURRENTTIME}},源文件為{{ {{{|safesubst:}}}CURRENTTIME}}} |
|
簡單的說:僅包含標籤可被用於專門被替換引用的模板、變量,即在subst:前後加上僅包含標籤。
使用限制
編輯模板內部如果嵌入了引用替換方式的其它模板或者有引用替換效果的簽名~~~、~~~~、~~~~~時,模板自身也只能以引用替換的方式使用,即以{{subst:模板名|相關參數}}的方式來使用模板。比如模板A裡包含了
這是一個關於{{<includeonly>subst:</includeonly>B}}的例子
那麼,只能這樣使用模板A:
{{subst:A}}
其他修飾符
編輯msgnw
編輯自動產生模板的源代碼。此修飾詞能與subst或safesubst疊加使用。如{{subst:msgnw:foo}}
或{{safesubst:msgnw:foo}}
。
- subst:msgnw:
這是一種替換引用的變種,能將模板原封不動地替換到目標頁面。一般替換引用會同時替換模板參數的值、變數的值和解析函式的值,但{{subst:msgnw:模板名稱}}
的組合會導致模板內容連同包含<nowiki>
、<noinclude>
、<includeonly>
、<onlyinclude>
等代碼原封不動地替換引用到目標頁面,是一種WP:剪貼移動或拷貝條目的可能做法,不過目前中文維基不允許剪貼移動,但此用法也為沙盒模板的拷貝提供了一種替換引用方案。
safesubst
編輯修飾詞「subst:」有可能會因故導致失敗,而若失敗時,修飾詞「subst:」會保持未解析的狀態(形如{{subst:模板名稱}})而導致模板功能出現問題。若出現此種情況應該將修飾詞「subst:」改為「safesubst:」修飾詞,此時若替換引用發生錯誤則會取消替換引用變為普通的模板引用效果,來確保其他相關模板運作狀況正常。此功能通常用於模板編程時,將模板內部的替換引用使用「safesubst:」修飾詞,以令模板替換引用無論正常與否都能保持相同的輸出。