Help:模板
| 注意:当您编辑本页面时,即同意以CC0协议授权您的贡献。您可以在公有领域帮助页面找到更多信息。 |
如果你有某個標準文本要放入到多个页面中,MediaWiki的模板就能發揮作用。 模板不像是扩展或媒体文件,它没有集中的存放庫。 模板可以是新编写的、也可以是某個已完成的工作,將它从wiki站点(如维基百科)导出,然后导入到目标wiki站点,以節省重复的工作。
基本用法
模板就是标准的wiki页面,其内容是設計用來嵌入包含(嵌入)到其他页面中的。模板名称遵循前置字元為“Template:”的慣例,将其指派给對應的命名空间;除此之外,您可以就像创建其他任何Wiki页面一样创建模板頁面。
为了嵌入一个模板,您应该使用双花括号包围模板名称,例如{{模板名称}}。
最简单的模板用法如下:创建一个名为Template:Welcome的页面,内容如下:
您好!欢迎来到本wiki。
這樣,你就已經創建了你的第一個模板!现在在一个新頁面中插入如下程式碼:
{{Welcome}}
在查看该新页面时,“你好!欢迎来到本wiki。”的文本将代替{{Welcome}}。模板内容被嵌入包含到另一个页面中,也就是,它被結合在页面中。
您可以在任何您想要欢迎某人的页面上的任何位置插入{{Welcome}}。假设它已被使用在100个页面中,若您随后将模板内容更改为:
你好呀!欢迎来到这个奇妙的Wiki。
然後你重新访问任何一个那100个使用该模板的页面,您将看到新文本而不是原始文本。在這種方式中,您不曾编辑100个页面的内容卻已经更改了它们,就是因为該模板已被嵌入包含到这些页面中。
这只是模板的一个最基本的应用。嵌入包含还有几个其它功能,丰富了这一机制,使模板变得非常有用。
调用模板的方法
模板可以以下列方式用於在其他页面中:
{{模板名稱}}—就像上面描述的那样,每当带有这串程式碼(一般我们称这串程式碼为“模板调用”)的页面被加载时(即读者开始浏览内容页面时),这串程式碼将会被某個命名為模板:模板名称的頁面的当前内容被(一個被称为“嵌入包含transclusion”的过程)“动态地”替换掉。 由于模板的调用会保留在源代码中,因此对模板:模板名称的任何后续的更改,都会在包含了此模板调用的页面上看到。 同时,这个页面也会被列入“链接到”这个模板的列表中。{{subst:模板名称}}— 在此类型的模板被使用的時候,從在包含此模板调用的页面被保存之时起,它會被模板:模板名称的“静态副本”所取代。 这就是说,模板:模板名称的内容会在调用之时,被它的副本所“替代”(SUBSTitute)。 页面與模板之间不再保持链接,所以每一个页面都可以另外被编辑而不會影响其餘的页面。 在效果上,使用此方式替代模板的内容,相比於只是单純地将內容“手动”输入到页面源代码中,還是有些微的不同。 参见Help:替换引用以获取更多信息。{{safesubst:模板名称}}——用於模板在包含有对其他模板或解析器函数的调用时,允許其递归替换。 更多信息,请参见Help:替换引用 。{{msgnw:Name}}——當檢視包含範本內容的頁面時,這會以原始wiki語法顯示範本內容 (如同<nowiki>所做的一樣)。 例如,{{msgnw:Template:Thankyou}}将显示:
<noinclude> <languages/> </noinclude> '''感谢你!''' 感谢{{{reason|{{{1}}}}}}。 祝好,{{{signature|{{{2}}}}}}敬上。 <noinclude> [[Category:Template examples{{#translation:}}|{{PAGENAME}}]] </noinclude>
事实上,一般的wiki页面也可以用作模板,只需指定其所在的命名空间即可,因此:
{{模板:页面名称}}:嵌入包含[[模板:页面名称]]的内容(等同于{{页面名称}})。{{讨论:页面名称}}:嵌入包含标题为“讨论:页面名称”的页面的内容。{{:页面名称}}:嵌入包含标题为“页面名称”的页面的内容(例如,在主命名空间)。{{subst::页面名称}}:替换为标题为“页面名称”的内容。
若指定的命名空间不存在,则完整的标题會被假定是一个模板:
{{Foo:Bar}}:嵌入包含Template:Foo:Bar。
無論使用何種語法,模板的名稱都可以是相對於目前頁面的名稱
例如,如果在頁面foo上调用{{/bar}},則會嵌入包含foo/bar頁面。
它也可以動態產生。
例如,{{ {{foo}} }}调用Template:foo,並將結果解釋為要调用的另一個模板的名稱。
参数
为丰富嵌入包含的机制,MediaWiki允许模板被嵌入时,对这个模板传递参数。由于参数的作用,模板可以產生出不同的内容或表現出不同的行为。
假设你想要在其他用户裏的讨论页之中插入一条感谢函,有如:
感谢你!
感谢你的努力。
祝好,张三敬上。
這個感谢函會包括感谢的原因(示例中的“你的努力”)和署名(“张三”)。您的目标是任何一個用户都可以感谢任何其他的用户,无论是任何原因。
这样,這個感谢函在任何地方使用时都会看起来相似,你可以定义一个,譬如說,命名为模板:Thankyou的模板。 虽然某個用户感谢其他用户的感谢函看起来都差不多,但其特定内容(即原因和署名)仍有所不同。 基於這個理由,你應該把这些内容设置为参数。 如果我们忽略其余用于格式化方框和放置图片的元素,模板的核心内容将是这样的:
'''感谢你!'''
感谢{{{1}}}。
祝好,{{{2}}}敬上。
注意{{{1}}}和{{{2}}}的使用。这就是使用模板时在模板內识别传入的参数的方法。請注意:在模板内,每一个参数都是被三组花括号包围:{{{ }}}。这与一般的模板名称的使用不同。
在使用模板时,需要为参数赋值,不同参数间用一个管道符(|)分隔。MediaWiki允许三种为参数赋值的方式:匿名(Anonymously)、编号(Numbered)、命名(Named)。
匿名参数
要匿名传递参数,需要按顺序列举出这些参数:
{{Thankyou/zh|你的努力|张三}}
在这个例子中,{{Thankyou}}模板接收参数{{{1}}}=你的努力和{{{2}}}=张三,于是输出:
感谢你!
感谢你的努力。
祝好,张三敬上。
匿名传递参数时,赋值的顺序十分重要。假如颠倒了赋值顺序:
{{Thankyou|张三|你的努力}}
输出结果为:
感谢你!
感谢张三。
祝好,你的努力敬上。
{{{1}}}等等)「僅」对匿名参数有效。 任何用名称标识的参数,如下图所示,将無法被使用序号的模板访问。=),它将會被错误地解讀为一个命名参数(在下面有解释),把等号之前的文本误认为参数名称、且把等号后面的文本误认为参数的值。 当您需要在属性中包含某個外部链接或某個HTML元素时,就会遇到这个常见的问题(参见T16235)。 避免这个问题的方法是使用命名参数来代替,或编号参数,见下文。
编号参数
按编号传递参数时,需要给出变量的编号:
{{Thankyou|2=张三|1=你的友誼}}
例中,虽然它们是按相反的顺序提供的,但模板{{Thankyou}}接收到的是{{{1}}}=你的友誼和{{{2}}}=张三,所以将会输出:
感谢你!
感谢你的友誼。
祝好,张三敬上。
- 範例:
{{Thankyou|1=你加了這個"="等號|2=张三}}
会生成:
感谢你!
感谢你加了這個"="等號。
祝好,张三敬上。
1=, 2=。
命名参数
与编号参数类似,第三种赋值方法只是把编号换成了名称。为了演示,需要将模板内容改为:
'''感谢你!'''
感谢{{{reason}}}。
祝好,{{{signatrue}}}敬上。
我們在模板中分辨参数是使用{{{reason}}}和{{{signature}}},而不是数字。若你要按名称传递这些参数,请在传递时标明每个参数::
{{Thankyou|signature=张三|reason=你的一切}}
例中{{Thankyou}}模板接收{{{reason}}}=你的一切和{{{signature}}}=张三并输出:
感谢你!
感谢你的一切。
祝好,张三敬上。
命名参数是区分大小写的,所以若是寫給李四:
{{Thankyou|signature=张三|Reason=你的一切|reason=讓我排在前面}}
会變成:
感谢你!
感谢讓我排在你的前面。
祝好,我敬上。
在你的模板中使用命名参数的优点是,除了参数顺序灵活之外,还可以在有许多参数时,使模板程式碼更容易理解。
會自動刪除已命名參數名稱和值的開頭和結尾的空格和換行符,但對於未命名參數則會保留。
已命名和未命名混合的參數
若是模板有支援此功能,這兩種參數都可以在同一次的调用中使用。 The template contents would be changed to:
'''A little thank you...'''
for {{{reason|{{{1}}}}}}.
Hugs, {{{signature|{{{2}}}}}}
然后,{{Thankyou|支援了兩種類型的參數|signature=张三}}的结果将会是:
感谢你!
感谢支援了兩種類型的參數。
祝好,张三敬上。
這樣做時要小心,因為這可能會導致直覺上的結果,因為未命名參數的計數只是基於未命名參數,而不包含已命名參數。
例如,{{Thankyou|张三|reason=支援了兩種類型的參數}}的結果是:
感谢你!
感谢支援了兩種類型的參數。
祝好,{{{2}}}敬上。
模板的編碼會偏好已命名的參數,而非未命名的參數,導致「张三」丟失,而沒有了簽名。
這會導致顯示{{{2}}}的默认值,說明如下。
同樣地,{{Thankyou|reason=支援了兩種類型的參數|张三}}的結果是:
感谢你!
感谢支援了兩種類型的參數。
祝好,{{{2}}}敬上。
儘管「张三」是第二個參數,但它是第一個「未命名」參數,因此被賦值給 {{{1}}},而 {{{2}}} 則保持未賦值的狀態。
默认值
当您嵌入了一个应该有参数的模板,但未提供它需要的参数的话,即:
{{Thankyou}}
在上面的编号参数的例子中,你会得到 :
感谢你!
感谢{{{1}}}。
祝好,{{{2}}}敬上。
因為没有傳值給参数,模板会直接输出参数本身。在這樣的情形下,设置参数的「默认值」就会用到,也就是,如果沒有傳入值,就會被採用的值。比如,如果更改模板内容为:
'''感谢你!'''
感谢{{{reason|你的一切}}}。
祝好,{{{signature|张三}}}敬上。
{{{reason|你的一切}}}表示如果{{{reason}}}参数的引数没有被赋值,则输出默认值你的一切。类似的,{{{signature|张三}}}中{{{signature}}}参数默认输出张三。修改后的模板输出如下结果:
感谢你!
感谢你的一切。
祝好,张三敬上。
{{foo|bar=}}或{{foo|bar=|baz=qux}}中,模板foo會认为参数bar的值是""。 这与完全省略参数是不同的,完全省略参数会使参数未定义,進而触发上述的默认值机制。{{#if:{{{1|}}}|{{{1|}}}|undefined}}會返回未定义,而只有在參數是未定义時{{{1|undefined}}}才返回未定义。默认值通常用来指定参数的替代名称。
例如,如果你有這道{{{a|{{{b|}}} }}},模板先查找名为「a」的参数。
如果这个参数不存在,则使用名为「b」的参数。
如果「a」和「b」都不存在,则什么都不输出。
傳輸參數給其他模板
如果原始參數語法是由上述的模板呼叫所產生,然後再傳遞到另一個模板,那它就不會被解釋為參數。 這表示呼叫沒有參數的{{Thankyou}}的{{Thankyou2}}是無法運作的: {{thankyou2|everything|me}} → 感谢你! 感谢{{{1}}}。 祝好,{{{2}}}敬上。
您反而需要明確地將參數傳給其他模板,例如,如果{{Thankyou3}}包含有
{{thankyou|{{{1}}}|{{{2}}}}}
然後便可正常運作: {{thankyou3|everything|me}} → 感谢你! 感谢everything。 祝好,me敬上。
這個範例沒有預留參數的值的空白與未定義--如果你想這麼做,你需要更複雜的語法。
參數的空白與未定義
具有雙管道的{{t2demo|| a }}(參考{{T2demo}}),將第一個參數設定為「空」字串,而不是讓它未定義。
這會產生start--middle- a -end這樣的輸出,類似於{{t2demo|1=|2= a }}產生出start--middle- a -end的結果。
在另一方面,明確地將參數「2」設定為「a」,會導致第一個未命名的參數處於未定義的狀態:
{{t2demo|2= a }}導致start{{1}}middle- a -end
如果第二個參數不應該被修剪掉的話,那它就必須是未命名的。
因此,您可以指定一個空字串給第一個參數,但你不能讓它未定義。
讓空白與未定義等效
好的模板編碼的实现造成的是傳送一個空字串給參數的效果與不指定任何值的效果是相同的。 這讓事情變得更簡單、更一致。
例如,使用p=可以顯示模板有一個參數「p」它還沒有值。
要讓空字串和未定義值等效,請使用下列方法:
- 僅能使用
{{{p|}}}而不能用{{{p}}}或q,此處「q」不是空值。 - 使用像是
{{#if:{{{p|}}}|..{{{p}}}..|..}}這樣的條件檢查,以確保{{{p}}}只會在有值時使用。
如果由於某些原因,您想將未定義的參數與空參數或任何其他可能的值作不同處理,您可以將相同的參數以不同的預設值比較兩次,即{{#ifeq:{{{foo|bar}}}|{{{foo|baz}}}|parameter is defined|parameter is undefined}}.
在未命名的參數中使用等號
未命名的參數可以包含等號,但必須間接完成。 以下是一些使用template:T1demo的方法:
- 未定義參數的預設值
為未定義的參數指定預設值:
{{T1demo|{{{1| a=b }}}}}
這詮釋為: start a=b end.
- 使用
{{=}}解析器函式
使用解析器函式,它可以穩當地包含一個等號:
{{T1demo| a{{=}}b }}
這詮釋為: start a=b end.
- HTML實體
將等號換成HTML實體來顯示:
{{T1demo| a=b }}
這詮釋為: start a=b end.
這可以正確地詮釋,不會影響到其他的參數。
處理不匹配的花括号和方括号
不匹配的花括号({{, }})或方括号([[, ]])必須在nowiki的標籤內、或是使用HTML實體:
- 詮釋花括号有兩個選項:
- 使用
<nowiki>{{</nowiki>或{來代表{ - 使用
<nowiki>}}</nowiki>或}來代表}
- 使用
- 使用
[來代表[、使用]來代表]
以下是一些範例:
- 不匹配的花括号
{{T1demo| <nowiki>{{</nowiki>content<nowiki>}}</nowiki> }}
這樣就可以正確地詮譯花括号,而不會破壞模板。
- 不匹配的方括号
{{T1demo| text [link] more text }}
這樣就可以正確地詮譯花括号,而不會破壞模板。
這詮釋為:
start text [link] more text end
沒有在nowiki標籤中的不匹配配對,會阻止模板擴張、或是會被視為模板呼叫的結尾花括号。
以下是一些範例:
{{T1demo|abc]]def[[ghi}}
它無法正確展開,原因是方括号不匹配。
正確的用法:
{{T1demo|abc<nowiki>]]</nowiki>def<nowiki>[[</nowiki>ghi}}
這詮釋為:
startabc]]def[[ghiend
模板產生的方括号
傳遞未配對方括号的參數的另一種技巧是將它們包裝在另一個模板中。 在這種情況下(這個wiki中的{{((}}和{{))}})就存在這種情況),未匹配的方括号會按字面解釋,而不會被詮釋為另一個模板的呼叫。 例如:
{{t1demo|{{((}}t1demo{{))}}}}
結果是: start{{t1demo}}end
在替换引用某個模板時,模板內含物會在subst命令出現時進行一次解析 (與上述說明的注意事項相同),然後在詮譯結果的wikitext時進行第二次解析。 例如:
{{subst:((}}t1demo|foo}}
將會在儲存時展開為:
{{t1demo|foo}}
其將會詮譯為:
startfooend
如果透過第一個subst命令本身產生的wikitext包含「subst:」語法,則不會在同一次儲存時處理,但可能會在下一次儲存時處理。 此技巧可被用於執行需要多次儲存才能得到值的遞迴式替換。
在参数的值中使用管道符
参数的值中不能包含管道符(|),因为它会被解释为该参数的结束和下一个参数的开始。
这可以通过使用解析器函数{{!}}或HTML的实体&124;来變通。
這兩種方法的運作方式略有不同,在某些邊際情況下可能會有所差別,例如當某個模板產生wiki表格語法的時機。
例如:
{{T1demo|abc|def}}
会生成:
startabcend
該"def"未顯示的原因在於,它被當作是另一個未命名的參數的一部份的方式對待,而該參數在模板中並未使用。
{{T1demo|abc{{!}}def}}
会生成:
startabc|defend
該"def"有正常顯示。
{{T1demo|abc|def}}
会生成:
startabc|defend
該"def"再次正常顯示。
使用額外參數格式化模板的呼叫
由於模板會忽略那些傳遞給它但未特別處理的參數,因此可將其用作在模板呼叫中添加額外的空白或添加未使用內容的方式。
例如:
{{template name|foo|bar|baz|mumble|quux}}
等同於,假設模板無法識別 SPACEN 作為參數名稱:
{{template name|SPACE1=
|foo|SPACE2=
|bar|SPACE3=Random stuff
|baz|SPACE4=
|mumble|SPACE5=
quux
}}
同樣地,也可以為每個間隔符(通常為空字串)使用相同名稱,但此舉會自動填入到Category:Pages using duplicate arguments in template calls裏面,而許多維基系統傾向讓它維持空的,以便偵測使用者操作錯誤的情況。
此功能可用於使模板以類似其輸出效果的方式呈現,例如將w:zh:Template:Chess_diagram的每row獨立顯示,使維基文本本身也呈現棋盤樣貌。
追蹤參數的使用情況
若某個參數或參數的組合被使用時,模板應在頁面中添加一個連結或分類,此舉或許是明智之舉。如此一來,便能輕鬆辨識哪些頁面使用了特定參數,進而評估在模板中修改該參數可能產生的影響。
求值流程
一般來說,在進行標記化(tokenization)處理後,模板參數會被直接套入模板中,不作任何修改。 这些参数直到使用时才会被运算。
这会有一些后果:
- 如果你有個包含
{{mytemplate的Template:Start、和包含|foo=bar}}的Template:End,然後將{{start}}{{end}}放置在页面上,那么mytemplate不会被嵌入包含,因为像“|”这些標記是不能被模板添加進去,而是在模板中維持其特殊的含义。 你依然可以使用模板控制某個参数或者模板的名称,但是你不能在多个模板之間切開某个模板的调用。 - 死碼刪除: 如果你调用一個像
{{foo|{{DISPLAYTITLE:Bar}} }}这样的模板,且Template:Foo裏並不包含{{{1}}},那么DISPLAYTITLE就不会被使用到,因为只会在有需要时进行運算且没有任何参数會被代入进去,所以它永遠不會被運算。 这通常在使用Extension:ParserFunctions(解析器函数)时就会開始起作用,特別是在和会随用户语言改变的魔术字int:一起使用之时。 這並非完美無缺,某些情況下即使模板展開結果未被使用(因為,舉例,它是if語句條件的一部份),其運算過程仍可能有副作用。 舉例來說,任何所產生的連結或其他使用的模板仍會被加入到Special:WhatLinksHere中,即使它們未顯示出來。
模板參數採用傳值呼叫機制,這意味著模板無法修改其各個參數. 各個參數們會被當作是關聯陣列的方式來對待,且參數名稱的求值早於參數值的求值。 若同個參數名稱出現多次(無論是否為命名參數),僅採用最後一次出現的參數,並頁面會被加入到Category:Pages using duplicate arguments in template calls之中。
以魔术字subst:或safesubst:开头的模板调用会在单独的第一次传递时(仅會发生在保存时)时求值,再加上~~~~以及使用管道技巧的链接也會一起求值。
如果在第一次传递时不能求值,那么subst:的呼叫會被忽略、而safesubst:会被當作是一個普通模板的方式來對待。
許多但不是全部的解析器函式、解析器標籤、被嵌入的特殊頁面不會像模板那樣直接被包含,而是被一個“strip marker”更換掉 这意味着,你不能使用像padleft:这样的解析器函数或者扩展中的类似函数处理这些结果,因为这些函数会将这些结果其视为strip marker而非解析器函数的结果。
模板內的递归
将模板包含到它本身并不会导致MediaWiki无限递归。
MediaWiki将停止递归调用,将模板名称加粗显示。
例如,如果Template:Aaaa的内容是a {{Aaaa}} z,它将显示为“a a Template loop detected: Template:Aaaa z z”。
这种保障措施排除了一种可能有用的模板习性,即模板自我规范化其调用参数。
在这个被禁止的例子中,template:d可以被称为{{d|20200311}}或¥3。
如果以第一种方式调用,它会使第二个参数结构(使用字符串解析器函数得到)递归到自身中,之后遵守统一的处理路径。
{{#if:{{{1|}}}|{{d|y={{#sub:{{{1}}}|0|4}}|m={{#sub:{{{1}}}|4|2}}|d={{#sub:{{{1}}}|6|2}}}}|<!-- processing path with arguments y,m,d regardless of original call pattern -->}}
如果将template:d修改为递归为template:d/2,而template:d/2是template:d的相同的手动创建的副本,则此语句可以正常工作,因为自递归保护措施是动态运行而非静态的。
让MediaWiki软件放宽自递归规则的一种可行方法是要求每个递归调用具有与所有先前活动调用不同的参数计数,最多一次递归,参数计数不减少。 这将为防止无限自递归提供有力保证,同时以灵活的方式启用有用的语句,例如此处描述的语句。
如果处理路径的复杂性较低,则有一个仅使用一个模板的简单解决方案,在单独的if/else分支上处理每个调用约定,在每种情况下复制处理路径的逻辑。 如果处理路径比较复杂,则每个调用结构案例都可以委托给具有统一调用结构的实现模板,该模板提供最终的模板行为。
参数中的表格
由于管道字符(|)和等号(=)在模板调用和wikitable中有不同的含义,为了在模板参数的值中使用表格标记,通常需要“转义”这个字符(例如,保护它们以防被理解为模板标记),可以使用以及的特殊序列:
- 内置的魔术字
{{!}}提供了自MediaWiki 1.24版以来|的“转义”版本 - 内置的魔术字
{{=}}提供了自MediaWiki 1.39版以来=的“转义”版本
在介绍这些魔术字之前,许多wiki使用模板来完成相同的事情。 在这样的wiki上,魔术字优先于同名模板。
示例
| A | B | C |
|---|---|---|
| A1 | B1 | C1 |
| A2 | B2 | C1 |
表格程式碼:
{| class=wikitable
!A!!B!!C
|-
|A1||B1||C1
|-
|A2||B2||C1
|}
转义后的表格程式碼:
{{{!}} class{{=}}wikitable
!A!!B!!C
{{!}}-
{{!}}A1{{!}}{{!}}B1{{!}}{{!}}C1
{{!}}-
{{!}}A2{{!}}{{!}}B2{{!}}{{!}}C2
{{!}}}
请注意,第一个左大括号({)被解释为字面左大括号字符,因为它紧跟{{!}}魔术字。
同样,最后一个右大括号(})被解释为字面右大括号字符,因为它前面紧跟着相同的魔术字。
但是在某些情况下,这些大括号字符确实会导致问题,因此一些wiki也提供了用于转义这些字符的模板:
- 模板调用
{{(}}可能提供{的“转义”版本 - 模板调用
{{)}}可能提供}的“转义”版本
一些wiki甚至更进一步,提供如{{(!}} ({|), {{!)}} (|}), {{!!}} (||)等更多便利的模板。
在这样的wiki上,程式碼可以简化为以下形式:
{{(!}} class{{=}}wikitable
!A!!B!!C
{{!}}-
{{!}}A1{{!!}}B1{{!!}}C1
{{!}}-
{{!}}A2{{!!}}B2{{!!}}C2
{{!)}}
控制模板嵌入
預設情況下,無論直接檢視或嵌入其他頁面時,模板的內容皆會完整顯示。 直接檢視模板的頁面時,其顯示效果完全等同於模板在未給定任何參數情況下的渲染結果。 若是模板需參數才能正常運作,則參數遺失將導致原始維基文本語法或錯誤產生。 例如:
- 若某個參數沒有預設值,則顯示為字面上的文字{{{1}}},表示此模板需要一個參數。
- 若某個參數有一個空的預設值(以 {{{1|}}} 表示),則不會顯示任何內容,此舉雖能達到預期效果,卻缺乏自我說明的清晰度。 使用一個非空的預設值(例如
{{{1|图片}}})能釐清參數的作用,尤其對於有涉及圖像的模板。 - 若將無預設值的參數傳遞至
#expr解析函式,將會導致錯誤訊息:「表達式錯誤:無法識別的標點符號字元'{'。」 - 若某個模板會建立表格,在模板頁面上顯示出表格結構而非其原始維基文本會更為實用。 要達成此目的,表格語法不需用標籤包覆,且每個表格元素皆包含必要的
<noinclude>...</noinclude>與<includeonly>...</includeonly>元件。
然而,您可以用<noinclude>、<includeonly>和<onlyinclude>来控制模板的哪些部分会被看見然後嵌入。
任何在<noinclude> 和 </noinclude>之间的标记,都只会在直接查看模板页面的时候显示出来,而不会被包含在页面中。当你不想让包括在模板中的文本或程式碼传播到任何包括它页面这各功能很有用,比如:
- 为模板归类请使用分类链接
- 跨语言链接 可连接到其他语言版本中的类似模板
- 关于如何使用该模板的解释文字 某些維基網站常採用類似 {{Documentation/zh}} 的模板,用以嵌入模板子頁面的說明文件。 舉例來說,Template:Void的功能是說明在Template:Void/doc之中。
与此相对的是<includeonly>。在<includeonly> 和 </includeonly>之间的文字只会在嵌入页面的时候才会被处理或显示,直接查看时不会显示。比如:
- 很明显的一个使用方式是将所有有某个模板的页面加入某个分类,而不将模板本身加入这个分类。
注意: 当你改变模板中的分类的时候,使用这个模板的分类可能不会立即改变;这会在工作排队中处理。 - 确认查看模板页面本身时模板程式碼没有执行。典型地,这是因为它需要参数,并且没有参数时执行会产生不想要的结果。
当模板页面被直接查看和被其他页面包含时,所有<noinclude>和<includeonly>之外的程式碼都会被处理和显示。
关键是这两个标记之间的内容。
一切在<onlyinclude>标记之外的所有東西在嵌入时會被弃置不用。
即使段落被标记为 includeonly,在嵌入时一样会被弃用,除非它们也被标记为 onlyinclude。
关键仅在于标记之内的东西。
例如,如果某個像Help:Templates/onlyinclude demo這樣的頁面有wikitext:
abc<onlyinclude>def</onlyinclude>ghi<includeonly>jkl</includeonly>
其嵌入的結果是def。
嵌套这些标签也是可行的。
这三個部份的嵌入标记使所有可能的處理與渲染的組合得以實現。
各個评论也能起作用。
使用{{subst:templatename}}時會保留住包含標籤,但使用{{msgnw:templatename}}時則「不會」保留住包含標籤,因為它是直接顯示原始維基文本而不會進行任何處理。
區段嵌入
要在不同頁面嵌入模板的不同區段,可將內容包裹在 onlyinclude 標籤中,並透過參數中的if陳述式來選擇要顯示的區段。
請細想以下維基文本的"Template:Example":
== Section 1 ==
{{#ifeq:{{{1|1}}}|1|
Content of section one.
}}
{{#ifeq:{{{1|2}}}|2|
== Section 2 ==
Content of section two.
}}
這將使example頁面本身同時渲染兩個區段,並可讓其他頁面透過{{example|1}}嵌入第一個區段、透過{{example|2}}嵌入第二個區段。
另一種方法是改用字面的參數的語法:
{{{section1|
== Section 1 ==
Content of section one.
}}}
{{{section2|
== Section 2 ==
Content of section two.
}}}
透過{{example|section2=}}嵌入第一個區段、透過{{example|section1=}}嵌入第二個區段。
若兩個參數皆未使用,則兩個區段皆會顯示。
第三種方法是使用 Labeled Section Transclusion。
整理模板
为了使模板起作用,用户需要找到并且了解如何使用模板。
找模板的方法:
- 点击
特殊页面>所有页面; - 在
命名空间:列表中,选择Template,然後点击提交。
要说明用法,请包含一个示例,就像下面的例子:
<noinclude>
== 用法 ==
欢迎用户:
{{Thankyou|reason=原因|signature=名字}}
</noinclude>
然后,编辑者就可以剪切粘贴来插入这个模板。
编辑页面时,编辑框的下方会有一个已使用的所有模板的列表,显示在一个可折叠的段落中,该段落标题为“此页面嵌入的页面:”(或者叫“此预览嵌入的页面:”或者“此章节嵌入的页面:”,取决于环境)。
这个列表提供了模板页面的便捷的链接,以及有关保护状态的信息。
被重定向的模板会以斜体显示,其重定向的目标会添加为单独的列表项。
链接到模板
模板页面可以像任何其他wiki页面一样链接。例如,使用wiki程式碼[[Template:Navbar]]生成链接Template:Navbar。
在许多维基上,Template:Tl 可用于提供指向模板的链接,该模板的格式为显示转换模板所需的“双花括号”wiki程式碼,而不实际进行转换。例如,程式碼{{tl|Navbar}}可用于创建链接{{Navbar}}。
这种结构通常用于模板文档、帮助页面和讨论页面中引用模板之處。
使用 {{[[Template:Navbar|Navbar]]}}可以实现相同的效果,但是 {{Tl}} 方法用字更少。
在任何给定的wiki上,Tl模板(如果存在)可能会也可能不会在“code”元素中呈现为等宽文本,如此处所示。
如果没有(就像在本wiki上),另一个类似命名的模板可能会这样做。
例如,请参阅英语维基百科的我們的Template:Tl文件中的「另請參閱」部份。
模板的命名
模板名稱區分大小寫,但首字母除外。
您可製作重定向作為替代大小寫的替代品。
例如,若某個模板名為"AdminAbbr",則可建立一個名為"Adminabbr"的重定向。
如此一來,模板即可透過{{AdminAbbr}}或{{adminabbr}}來呼叫。
若編輯者為求清晰而偏好大小寫混合的格式,他可使用諸如lc或uc等函式。
例如,他們可以使用{{ {{uc:CurrentInternetTime}} }},而不是{{CURRENTINTERNETTIME}}
由於模板名稱會與其他頁面的名稱以相同的方式解析,因此底線會被替換為空格、且任何位於井號後方的文字(如同標準連結中的錨點)皆會被忽略。
底線_可作為空格的替代品。
模板的可能用途
模板可用於任何有需要兩個以上的頁面包含相同或相似內容的情況,而這些內容是要同時被編輯而不是獨立被編輯。 它們可用於:
- 在許多頁面中提供結構化的元素,例如資訊框、維護模板、導航框等。
- 在各個頁面中執行計算,以作為一個程式設計的工具,例如w:Template:Sum。
- 建立複合頁面,其將多個現有頁面的內容整合在一起顯示,例如互助客栈便匯集了互助客棧的各區塊的內容。 這些頁面的內容可分別顯示或合併顯示,但修訂歷史、監視清單等功能僅會挑選那些被嵌入的頁面的變更、與那些複合頁面的原始維基文本的變更,卻不會挑選那些複合頁面本身的隱含變更。
- 將某些內容在一些相關頁面之間互相共享。 例如,說明:偏好設定#測試版功能中的清單被複制在測試版功能#當前的測試版功能之中。 雖然在MediaWiki.org之中,它是另外使用Extension:LabeledSectionTransclusion建構的,但原本也可以使用模板來達成。
- 將同一頁面中多次引用的內容儲存起來,使其僅需編寫和計算一次。 例如,w:Template:Cite Monumentenregister/URL被w:Template:Cite Monumentenregister在兩個不同位置調用了兩次,而使用另一個模板則意味著URL的樣式只需在基礎模板中編寫一次即可。
- 使用模板作為程式設計元素來生成一個迴圈:若模板A以不同的參數呼叫了模板B十次,則它就是粗暴地模擬了一個for迴圈。 若模板B又呼叫了模板C十次,那很不幸你得到了一個模板C被呼叫一百次的巢狀迴圈。 但請牢記,當將模板用作進階的程式設計結構時,很容易就觸及模板限制,而使用Scribunto通常會更清晰且更易於領會。
从一个wiki复制模板到另一个wiki
這是有可能的,若wiki的組態允許嵌入其他wiki的模板。 此組態的設定在維基媒體的各個wiki網站上是停用的。 另尋他法,您需要手動將模板及其依赖項目從來源wiki複製到目標wiki才能使用。
模板常需要有CSS或其他模板,所以用户們常在从一个wiki到另一个wiki复制模板时遇到问题。 下列步骤應該會對大多数的模板有效。
MediaWiki程式碼
如果你有新wiki的导入权限(特别是importupload):
- 前往原始wiki上的Special:Export,然後下载一个包含有所需的模板的完整历史的.xml文件,如下:
- 在大文本输入框中输入模板名字,比如“Template:Welcome”。请特别小心大小写字母和特殊字符。如果模板名字不是完全正确,导出仍可能會发生,但.xml文件中将不會有你预期的数据。
- 选择“
包含模板”框。 - 选择“
仅包含当前修订,而不是完整历史”框。 - 点击“
导出”。
- 前往新wiki的Special:导入,然後上传.xml文件。
如果没有新wiki的导入权限:
- 前往來源wiki上你想复制的模板页面,到编辑页面,然後复制全部的维基文本;
- 打开新wiki,到來源wiki上的模板同名的页面,点击创建/编辑,粘贴刚才拷贝的维基文本。在每個模板的编辑摘要中,链接到來源模板页面以注明出處。
- 回到來源wiki刚才复制程式碼的页面,在编辑区域下方,查看
此页面嵌入的页面:。 每个列出的模板都按上述步骤操作。 对于这些模板所使用到的任何模板也要这样做,依此类推。
这将复制全部需要的程式碼,并将满足一些模板的需要。
请注意,只有在詮譯页面时,被解析的那些页面元素才会被导出,因此文档的子页面不会作为这个过程的一部份而被导出。
如果不起效果,请检查编辑框下面此页面嵌入的页面:下方的红色链接。
如果有,则重复上面的步骤并复制模块中的程式碼。
成功导入其他维基上的模板和它链接的模板后,可以个性化编辑以适用于新wiki。例如更改Logo、删除冗余分类和红色链接等。
扩展
在模板中通常使用的扩展是解析器函数。 访问Extension:解析器函数页面,查看你拷贝的模板中是否包含其中列明的函数。 如果有,則你必需安装ParserFunctions(解析器函数) 扩展。 你需要你的MediaWiki所在的服务器的管理员权限才能安装。
另一個模板可能會使用到的附屬程式是Lua,尤其是在维基百科网站更是如此。在模板程式碼中使用{{#invoke: }}是一个好主意。
以防萬一它會使用到,你需要安装 Scribunto 扩展(也需要系统管理员权限)。
您可以参看其页面来了解如何安装和使用该扩展。
CSS 和 JavaScript 程式碼
在MediaWiki程式碼之外,许多模板要用到CSS,有些模板还以来JavaScript才能完全生效。如果复制来的模板不能很好的起效果,这也是可能的原因之一。要将需要的CSS和JavaScript复制到你的wiki,一般来说你需要有管理员权限,因为你将需要编辑"MediaWiki:"名字空间中的系统消息。
- 查看模板用到的CSS类(与
class="foobar"类似的文本)。 这些类中如果出现了源wiki上的MediaWiki:Common.css或MediaWiki:Vector.css,请将那些类复制到新wiki上的MediaWiki:Common.css页面,再去检查模板现在是不是工作。 - 如果复制来的模板仍然不能如預期般地運作,請检查在源wiki上
MediaWiki:Common.js或者MediaWiki:Vector.js中是否有程式碼? 如果有,你可以试着复制到MediaWiki:Common.js。 一般情况下,最好是只复制受信任的來源的程式碼,然後瀏覽該程式碼進行識別、然后选定有关的部份。 您可能會發現有些註解,這些註解可作為識別各部份功能的線索。
重定向
若頁面使用重定向作為模板,系統將在處理模板前先解析該重定向,然後改用目標頁面的內容。 若目標頁面不存在(失效的重定向)、或其本身即是重定向(雙重的重定向),此操作將無法生效。
僅將另一頁面作為模板包含的頁面,看似可能與重定向相似,但兩者之間存在若干差異:
- 結果頁面的標題欄位會顯示該結果所來源的頁面標題。
- 無「重定向自...」的訊息顯示。
- 編輯、追蹤、討論、歷史、「哪些頁面連結到此處」及「最後修改時間」等按鈕會指向引用的頁面。 要存取目標頁面,請使用區段編輯的連結並從該處導航前往。
- 除非使用 includeonly和/或noinclude tags,否則引用頁面將與目標頁面共享相同的分類。
- 當其中一個或兩個都是偽重定向這種型式時,「雙重的重定向」會生效。
解析器函式
MediaWiki亦支援解析器函式,其運作方式類似於模板,但採用略有不同的語法:
- 解析器函式運用的是":",而不是一開始的"|"。
- 編輯頁面不會顯示該頁面所使用的解析器函式。
- 解析器函式沒有「連結至此」這樣的功能,可以識別出其被運用的頁面。
- 解析器函式模板通常不接受命名參數,因此一般來說等號沒有特殊含義。 例如:
{{ #if: not blank | x=abc }}givesx=abc
參見
一般模板的使用
- Manual:Expr解析器函数的语法
- Help:Substitution
- w:Help:Template
- Manual:Advanced templates – 描述更多高级技术,比如动态模板调用和可變参数名称
- Help:Multiple-instance templates – 關於在一個頁面上使用同一模板的多個實例。
- Manual:Newlines and spaces#Automatic newline
使用在模板中的特殊构造
- Help:魔术字 – 在某些模板中可能會有些花俏的东西
- Help:Extension:解析器函数 – 額外的花俏控制功能,例如#if和#switch
- 幫助:模板中的解析器函数 – 使用模板裏的解析器函数的引導
- Help:TemplateData(模板数据)
- Help:Extension:解析器函数
- Extension:Scribunto
其他的有关信息
- Help:展開模板
- Help:外部搜索 – 某个模板特殊使用的案例
- Manual:Importing Wikipedia infoboxes tutorial
- Extension:PageTemplates
- 手册:创建包含预加载文本的页面 – 使用模板作為页面的起始文本
- Help:嵌入 – 不从
Template:嵌入页面,而是从命名空间 - Manual:Template limits
- Help:链入页面
- Special:Mostlinkedtemplates – 顯示使用最多的模板
- Special:Unusedtemplates – 顯示沒有使用的模板(即使它們可能被替代了)
- Manual:$wgEnableScaryTranscluding – 使用其他維基的模板
- w:Wikipedia:Template namespace
- w:WP:Anatomy of a template
- w:Wikipedia:Transclusion costs and benefits
- Manual:Parser.php
- Help:Extension:模板沙盒 – 用於預覽您對模板的修改在其他位置的渲染效果
- Manual:HTML模板
外部链接
- Miraheze模板库 – 旨在用于一般用途的MediaWiki模板。