Template:虛擬模板
此Template被引用於約693,000個頁面,佔全部頁面的9%。 為了避免造成大規模的影響,所有對此Template的編輯應先於沙盒、測試樣例或您的沙盒上測試。 測試後無誤的版本可以一次性地加入此Template中,但是修改前請務必於討論頁發起討論。 模板引用數量會自動更新。 |
本模板不能替换引用嵌入。由於技術限制,在替換引用(subst)階段時nowiki的行為與非替換引用時不同,因此替換引用本模板將會導致其行為無法預期或者導致未定义行为。 |
此模板使用Lua语言: |
本模板透過解析器函數,可在不建立一個新的模板的情況下,動態生成一個「虛擬的」臨時模板,並傳入參數進去,類似於C++或java的匿名函数、Closure或者JavaScript中的立即调用函数表达式。
- 用途:在部分說明文檔示範模板語法,或解協助解析條目中無法順利被解析的模板語法。
- 用法:由於需要先迴避模板語法在生成一個「虛擬的」臨時模板前就被解析,因此
{{{}}}
與{{}}
皆要先由跳脫字元切割成如{\{\{}\}\}
與{\{}\}
的形式。
參數及使用方法
{{虛擬模板 | code= 填入模板語法 | ... | ... 傳入模板參數、當正常模板使用 }}
模板資料
透過解析器函數,可在不建立一個新的模板的情況下,動態生成一個「虛擬的」臨時模板,並傳入參數進去
参数 | 描述 | 类型 | 状态 | |
---|---|---|---|---|
1 | 1 | 傳入"code"參數的的第1個參數
| 字符串 | 可选 |
code | code | 模板語法
| 字符串 | 可选 |
code語法為nowiki | delnowiki | 解析code內容中位於nowiki標籤內的部分 | 布尔 | 可选 |
code語法為msgnw | delmsgnw | 解析code內容中位於msgnw內的部分 | 布尔 | 可选 |
範例
- 一般用法
- 輸入
{{虛擬模板|code=在{{{1}}}中,{{{2}}}是一門{{{3}}}。 | 數學 | 微積分 | 重要的議題 }}
- 顯示為「在數學中,微積分是一門重要的議題。」
- 輸入
- 強制注入參數
- 防止提前解析
- 方法一,使用跳脫字元
- 輸入
{{虛擬模板|code={\{#tag:math{{!}}\\frac{ {{{1}}} }{ {{{2}}} } }\} | 16 | 25 }}
- 顯示為「」
- 輸入
- 方法二,使用
<nowiki></nowiki>
- 輸入
{{虛擬模板|delnowiki=yes|code=<nowiki>{{#tag:math|\\frac{ {{{1}}} }{ {{{2}}} } }}</nowiki> | 16 | 25 }}
- 顯示為「」
- 輸入
- 方法一,使用跳脫字元
- 測試間接參數傳遞時,特定模板語法的行為
- 輸入
{{虛擬模板|delnowiki=yes|code=<nowiki>{{#invoke:ilh|main}}</nowiki> | lang=維基數據 | lang-code=d | Minecraft世界 | Q26945014 }}
- 顯示為「Minecraft世界」
- 說明:虛擬模板內的語法為「
{{#invoke:ilh|main}}
」,當這個內容是一個獨立的模板時,結果為輸入參數「| lang=維基數據 | lang-code=d | Minecraft世界 | Q26945014
」的行為。
- 輸入
- 作為空模板
- 還原跳脫字符
- 輸入
{{虛擬模板|code=\n**:#第甲項\tAA\b\n**:#第乙項\tBB\b}}
- 顯示為「
- 第甲項 AA�
- 第乙項 BB�」
- 顯示為「
- 輸入
- {{虛擬模板}}的傳遞與使用(僅在單次頁面渲染有效)
- 照順序擺放代碼將有以下效果:
{{變數|set|臨時模板1=虛擬模板{{!}}code=順利地執行了{\{\{1}\}\}的臨時模板{\{\{2}\}\}。}}
{{變數|call|臨時模板1| 1號 | 引用 }}
→「順利地執行了1號的臨時模板引用。」
- 照順序擺放代碼將有以下效果:
- 延伸用法(讓模板可以自己產生內容,又能讓外部調用)
- 模板內:
{{虛擬模板|code={\{#invoke:Fullurl|fullurl}\}|args=<noinclude>{{虛擬模板|參數|\1=Template:虛擬模板}}</noinclude>{{#invoke:參數|虛擬模板擴展參數}}}}
- 模板顯示:Template:虛擬模板
- 調用
{{模板名|Module:TemplateParameters2}}
- 模板內:
技術限制
由於MediaWiki禁止模板迭代調用,因此在虛擬模板的code中使用其他虛擬模板可能會出現問題,例如
- 輸入
{{虛擬模板|code=一次,{{虛擬模板{{!}}code=二次}} }}
- 顯示為「一次,检测到模板循环:Template:虛擬模板」
但若避免遞迴地傳入參數則沒有問題,如:
- 輸入
{{虛擬模板|code=一次,{{虛擬模板|code=二次}} }}
- 顯示為「一次,二次」
此顯示的效果與普通模板雷同,此處以{{模板1}}做示範:
- 輸入
{{模板1}}
- 顯示為「一次,检测到模板循环:Template:模板1」