跳转到内容

帮助:模板

This page is semi-protected.
来自维基教科书,开放世界中的开放书籍
(从 Wikibooks:SUBST 重定向)

一个模板仅仅是一个设计用于包含在其他页面上的页面。如果模板发生更改,这通常会反映在使用该模板的每个页面上。正如你可能开始想象的那样,模板是一个强大的工具,当用得好时,可以减少工作量并提高可维护性。在本页中,你将学习如何使用模板以及如何制作自己的模板。

模板 B 可以包含在页面 A、P 和 Q 上以显示其内容。更新模板将更改在使用它的页面上显示的内容。


概览

模板可能包含任何所需的维基文本,包括对其他模板的调用。它们具有有限的编程能力:可自定义的值(称为参数)、计算和分支(使用解析器函数)以及对特定于维基的变量的访问,例如日期、时间和页面名称。

要在页面中使用模板,请添加模板标记(形式为{{template name}},这是包含在双大括号中的模板名称),在你希望模板出现的位置。当读者想要查看页面时,服务器会获取模板页面的内容,处理与页面相关的任何变量,并将结果显示在模板标记的位置。

模板适用于任何需要在两个或多个页面中复制文本的情况,并且不需要独立编辑每个副本以使其适应所在的页面。由于可以使用参数,因此版本在一定程度上甚至可以不同,并且参数值可以针对每个独立编辑。模板不仅方便,而且还可以“强制”有用的统一性,例如,某种“样式”。

典型应用包括

  • 消息 用于显示信息({{split}})
  • 导航 用于在书籍的页面或章节之间进行导航,以便更容易地在线阅读({{chapter navigation}})
  • 用于显示视觉信息的占位符。如表格、图形、图表、插图等。
  • 由简单图像表格组成的复合体,用于显示更复杂的想法({{chess diagram}}

模板页面和命名空间

模板有自己的命名空间,它使用前缀“Template:”(类似于熟悉的“User:”、“Help:”和“Talk:”命名空间)。

大多数模板都存在于模板命名空间中,因此可以在标题为“Template:模板名称”的页面上找到。然而,有时用户会在其他命名空间中创建模板,例如 User: 命名空间。模板的正常使用(称为转入)可以从任何命名空间进行,但模板命名空间的优势在于转入时不需要“Template:”前缀。相反,为了从除主命名空间(书籍所在的地方)之外的任何其他命名空间转入内容,需要完整的名称,包括命名空间前缀。如果从主命名空间(很少这样做)转入,则必须在模板语法内添加一个冒号前缀,否则软件会将代码视为未创建的模板。因此

命名空间 编码示例 结果
模板 {{模板名称}} 转入模板内容
模板和主命名空间外部 {{Wikibooks talk:页面名称}} 转入页面内容
主命名空间 {{:书名}} 转入书籍内容
没有冒号的主命名空间 {{书名}} 红色链接 到未创建的模板

模板名称与其他页面名称完全相同:区分大小写,但第一个字母除外,空格与下划线不可区分。如果符号 #(通常用于链接到页面的部分)出现在花括号内,则它以及任何跟随它的字符将被忽略。

模板页面,像大多数其他页面一样,与它们关联着讨论页面,编辑人员可以在那里讨论与模板相关的任何问题。(因此,即使模板是为在讨论页面上使用而设计的,也不应将其放置在“Talk:”命名空间中;因为讨论页面本身没有讨论页面,所以将没有页面可以用来讨论模板。)

模板用法

要将模板转入另一个页面,请使用以下语法(称为模板标记

{{ 模板名称 | 参数 | 参数 | ... }}

这包括模板名称和传递给模板的各种参数,其中每个参数由一个竖线(或管道)分隔,并且整体被双大括号包围,{{...}}。模板标记应该放置在希望模板出现的页面上的任何位置。“Template:”前缀在转入时永远不需要,只需要在查找和编辑模板本身时才需要(尽管如果模板是在不同的命名空间中创建的,则需要该前缀)。并非所有模板都有参数,并非所有具有参数的模板都需要提供值,因此有时 {{模板名称}} 就足以使用模板。如果需要参数,但用户没有提供值,则模板可能会呈现类似于 {{{...}}} 的内容,其中 '...' 可能是一个数字或参数名称。这是为了通知用户缺少命名或未命名参数,可以通过使用参数默认值 来避免这种情况。

参数有两种基本形式

  • 未命名参数(有时称为“位置”参数):按其出现顺序放入模板中的值
    {{模板名称|参数1|参数2|... }}
  • 命名参数:与模板中特定命名键关联的值
    {{模板名称| 参数名称1 = 参数1 | 参数名称2 = 参数2 | ... }}

这些可以混合使用

{{模板名称|参数1|参数2| 参数名称1 = 参数3 | 参数名称2 = 参数4 | ... }}

按照惯例,命名参数列在最后,但这并不是一项要求。空格字符(空格、制表符、回车)从命名参数值的开头和结尾(未命名参数不受影响)剥离,但不会从中间剥离:因此 {{ ... | myparam = this is a test }} 将被视为用户输入了 {{ ... |myparam=this is a test}}。

模板页面本身可能包含不会与模板一起转入的材料(例如文档或模板本身所属的类别),或者在页面被转入时使用的材料(例如类别,这些类别适用于转入页面,但不适用于模板)。请参阅下文关于includeonlynoinclude 标签的讨论。

尝试转入不存在的模板会产生一个红色链接,就像链接到任何其他不存在的页面一样。点击链接可以创建该特定模板。

基本模板用法示例

如果你想尝试其中任何一个,请使用模板沙盒

无参数模板

要查看一个非常简单的模板的示例,请查看Template:Tc。该模板只做了一件事,就是将字母“in”转入其他页面。例如,将以下短语编辑到任何页面将产生相关的结果

使用模板 {{tc}}
描述 输入的文本 处理后的结果
{{Tc}} 本身 {{tc}} in
单次使用 {{tc}} {{tc}} 2009年,随着巴拉克·奥巴马入住白宫,我们发现……的开始 in 2009年,随着巴拉克·奥巴马入住白宫,我们发现……的开始
多次使用 {{tc}} {{tc}} 2009年,随着巴拉克·奥巴马入住白宫,我们发现……的开始 in 2009年,随着巴拉克·奥巴马入住白宫,我们发现……的开始

您会注意到,模板在被包含时只包含字母“in”,尽管模板页面的说明文本(“此模板用于...” 点击上面的模板链接查看)。如果您编辑模板页面(点击 此链接),您会看到除字母“in”之外的所有内容都被包含在 'noinclude' 标签中,将在后面讨论。

带有名稱参数的模板

使用参数进行包含只稍微复杂一些。举个简单的例子,著名的 死人手 可以通过以下模板使用无名参数来复制

制作死人手
描述 输入的文本 处理后的结果
使用三个模板(Template:ClubsTemplate:Diamonds,以及 Template:Spades {{clubs|A}} {{clubs|8}} {{spades|A}} {{spades|8}} {{diamonds|9}} A 8 A 8 9
使用(Template:BridgeHandInline);虽然不那么漂亮,但只有一个模板,有四个参数。 {{BridgeHandInline|A8||9|A8}} ♠A8 9 ♣A8
使用(Template:BridgeHandInline),但缺少管道分隔符 {{BridgeHandInline|A8|9|A8}} ♠A8 9 A8 ♣{{{4}}}

在第二个例子中,参数在模板标签中的位置决定了它属于哪种花色。因此,第一个 A8(第一个槽位)属于黑桃,空位置(第二个槽位)属于红桃,9(第三个槽位)属于方块,第二个 A8(第四个槽位)属于梅花。请注意,空参数位置是计算在内的;如果忘记了额外的管道,如第三个例子所示,结果是卡片会出现在错误的位置,并且会出现 {{{4}}},这意味着模板正在等待第四个位置参数的值,但没有提供。

带有名稱参数的模板

使用有名稱参数类似于使用无名参数。例如,Template:Payoff matrix(在一些关于 博弈论 的书籍中使用)给出了一个简单的 2x2 网格,具有可调整的值,使用 UL、UR、DL 和 DR 来表示左上、右上、左下和右下,以及一个 Name 参数来在矩阵底部添加一个名称。

描述 代码 结果
收益矩阵 {{payoff matrix | UL = 5 | UR = 7 | DL = 2 | DR = 9 | Name = Example usage }}
5 7
2 9
Example usage
显示缺失参数的默认值以及其他参数不同顺序的收益矩阵 {{payoff matrix | DR = 9 | Name = Example usage | DL = 2 | UR = 7 }}
0, 0 7
2 9
Example usage

在第二种情况下,参数的顺序已经改变,但结果没有改变——这是有名稱参数相对于无名参数的优势之一——并且一个值(UL)已经被完全删除,允许模板插入默认值“0, 0”。

参数名称区分大小写,即使在第一个字符也是如此。例如,使用“dr = 9”“Dr = 9”“dR = 9” 而不是 “DR = 9” 会导致右下单元格显示默认值“0, 0”。大小写不同的版本被视为不同的参数,会被模板忽略。

替换

通常,模板在用户浏览页面时被处理成可读文本。这是模板的正常目的:由于模板在每次使用时都会重新评估,因此对模板的更改可以快速轻松地传播到许多页面。但是,偶尔情况下,这并不合适。例如,用户可能想要一个模板,该模板返回一个固定日期或时间,而不是每次浏览页面时都改变。对于这些情况,有替换,这可以通过在模板标签中的模板名称前添加subst:来完成。替换完全符合它的名字:与其每次浏览页面时处理模板,替换在保存编辑时处理模板,并将模板标签替换为处理后的结果。

例如,模板 {{tc}}(如上所示)在任何地方放置它都会添加字母“in”。因此,维基文本bra{{tc}} 会生成单词brain。但是,维基文本将始终保持为bra{{tc}},因此,如果 {{tc}} 被更改,以便它添加字母“wn”,维基文本将生成brawn 而不是brain。像这样进行替换 - bra{{subst:tc}} - 将永久更改维基文本为brain,并且以后对模板 {{tc}} 的更改将不会影响替换的文本。

常见错误

URL 问题

URL 可能包含等号(=),例如 http://some.page.org?key=value&key2=value2。但是,模板参数列表中的第一个等号始终被视为设置了一个有名稱的模板参数。因此 {{some template|http://some.page.org?key=value&key2=value2}} 会被视为http://some.page.org?key 是一个参数名称,而不是一个 URL 的开头。有两种解决此问题的方法

  • 使用显式的位置参数引用:{{some template|1=http://some.page.org?key=value&key2=value2}}。'1=' 显式地引用第一个位置参数,并将避免后续的等号
  • 使用特殊模板 {{=}}:{{some template|http://some.page.org?key{{=}}value&key{{=}}value2}}。此模板返回一个不会被维基软件解析或解释的等号。

空格问题

有名稱 参数会自动删除参数中的空格 - 空格、制表符、回车符和换行符或其他不可见字符。无名 参数将保留所有空格。这会导致预期行为错误的奇怪格式问题。

垂直管道问题

垂直管道字符(|)用于模板(和解析器函数)中分隔参数。如果您需要向模板参数提供管道字符,请使用特殊模板 {{!}},它返回一个未解析的管道字符,或者使用 HTML 实体 | 用于管道字符。

创建和编辑模板

模板的创建和编辑方式与其他任何页面基本相同:选择一个合适的名称,导航到该页面,然后点击编辑选项卡或根据需要创建一个新页面。唯一的真正区别是,模板通常会放置在“Template:”命名空间中,而不是(无前缀的)主命名空间中。任何可以在普通页面上包含的内容都可以包含在模板中,包括其他模板。除此之外,模板还可以访问编程功能——参数解析器函数变量——这些功能允许上下文相关的使用,以及帮助控制哪些信息被包含以及哪些信息不被包含的特殊标签。

创建模板时,最好遵循一些简单的原则

  • 选择一个简短、描述性的名称。有些人建议通用模板名称完全用小写字母表示,而特定书籍的模板名称使用Template:Book Name/Template Name 的形式,但目前还没有硬性规定。
  • 快速 搜索 模板空间或 浏览模板,以确保您要创建的模板尚未存在。有时,增强现有模板比从头开始创建新模板更容易、更好。
  • 确保您的模板有适当的文档,并包含在正确的类别中。(见下文)
  • 尝试使您的模板模块化:即能够独立存在于各种不同的页面环境中,而不会出现故障、生成不良输出或弄乱页面的布局。一般来说,您希望您的模板对其他编辑者来说是透明的、有用的——他们需要投入多少精力来理解您的模板的使用方式,他们就越不愿意使用它。

模板文档

对您的模板进行分类并对其进行文档化将使其他编辑者更容易找到和使用它。

  • 要添加文档,请将 {{documentation}} 模板放在模板页面的 'noinclude' 标签中。这将创建一个文档子页面,您可以编辑它。
  • 适用于模板本身的类别应该添加到模板页面(在 'noinclude' 标签中,使用 {{documentation}} 模板)。要包含到包含页面的类别应该放在模板页面的 'includeonly' 标签中。

参数

参数是允许向模板提供维基文本的特殊代码;可以构建模板以根据它接收的参数的值产生不同的结果。参数可以有名稱,也可以通过在模板标签中提供的值的位置来引用(模板代码中参数的顺序无关紧要)。模板中的参数采用 {{{...}}} 的形式,其中三重的卷曲括号包围着一个有名稱的参数的名称或一个位置参数的编号。输入的参数值可以很长,如果需要,可以将整个页面的包含用作参数的值。

要查看参数是如何工作的,请考虑以下示例。假设有一个名为 'peoplepets' 的模板,它生成一些关于人和他们宠物的文本。此模板的模板标签可能如下所示

A. {{ peoplepets | John | Mary | age = 6 | Fido | small | kind = dog }}
B. {{ peoplepets | Bill | Susan | age = 7 | Queenie | fat | kind = cat }}

模板本身的内容,在页面 Template:Peoplepets 上,如下所示

{{{1}}}{{{2}}} 拥有一只 {{{4}}} {{{kind}}},名叫 {{{3}}},它 {{{age}}} 岁。

因此,上面的两个模板标签将分别转入以下文本

A. 约翰和玛丽养了一只名叫菲多的小狗,它 6 岁。
B. 比尔和苏珊养了一只名叫奎妮的胖猫,它 7 岁。

需要注意的事项

  • 位置参数的编号会跳过命名参数(如上面的“age”)
  • 模板标签中命名参数值的开头和结尾空格将被模板剥离。
    • 这对于未命名参数并不适用,它们会保留结尾和开头空格。但是,浏览器会将多个空格字符渲染为单个空格,因此“菲多”、“胖”和其他未命名参数值周围的额外空格并不明显。如果未命名参数用于显示以外的其他用途(如链接),这可能会造成混淆。
  • 命名参数值在模板中使用的顺序无关紧要。
  • 位置参数的编号被视为名称:{{ peoplepets | John | ... }} 可以写成 {{ peoplepets | 1 = John | ... }}。当位置参数需要按非顺序输入或位置参数值包含等号时,这很有用。
  • 值可以为空。这里,第二个位置参数和“age”参数的值为空
    模板标签:{{ peoplepets | John || age = | Fido | small | kind = dog }}
    产生(注意缺失的单词):约翰和 拥有一只名叫菲多的小狗,它 岁。
  • 值可以保持未提供。这里,“kind”参数被省略了
    模板标签:{{ peoplepets | John | Mary | age = 6 | Fido | small }}
    产生(这显示了缺失的参数):约翰和玛丽养了一只名叫菲多的小 {{{kind}}},它 6 岁。

参数默认值

可以使用竖线字符:| 为参数指定默认值。上面的示例模板可以改写如下(其中“friend”是位置参数 2 的默认值,第 4 个位置参数默认为空,宠物的“kind”默认为“dog” - 请参见 Template:Peoplepetsd

{{{1}}}{{{2|friend}}} 拥有一只 {{{4|}}} {{{kind|dog}}},名叫 {{{3}}},它 {{{age}}} 岁。

像以下这样的模板标签:{{ peoplepetsd | Bill | age = 7 | 3=Queenie }} 将会产生短语“比尔和朋友养了一只名叫奎妮的狗,它 7 岁”。

请注意,在狗的名字之前需要“3=”,因为没有指定第二个位置参数。

参数的空值将覆盖默认值,产生一个空空格。换句话说,{{ peoplepetsd | Bill || kind=| age = 7 | 3=Queenie }} 将会产生短语“比尔和 拥有一只 叫奎妮的狗,它 7 岁”。

虚拟参数和标签布局

如果模板标签提供了未使用模板中的参数,则会忽略这些参数。这样做的目的是为了防止在模板以移除参数的方式更改时,转入导致出错。无需访问转入模板的每个页面并更改标签。然而,这样做有一个额外的好处,即通过空格或添加注释,使一些模板标签更具可读性。使用 {{t3d}}

虚拟参数
描述 输入的文本 结果
使用模板 {{t3d}} 添加注释
{{t3d |a|b|c| row 1
      |d|e|f| row 2
      |g|h|i| row 3
}}
a b c

d e f
g h i

由于 {{t3d}} 不使用参数 {{{4}}}{{{8}}}{{{12}}},“行号”值对生成的维基文本没有影响。虚拟命名参数可以在任何模板标签中使用;只需选择一个未使用的参数名称并将其添加为“unusedname = value”。命名虚拟参数的一个特殊情况是使用空字符串作为参数名称。

对参数和参数值的限制

  • 未命名的参数不能被分配包含等号 (=) 的值;解析器会将等号视为命名参数的赋值。有多种间接方法可以解决此限制
    • 在模板中,将值写为未定义参数的默认值
      • {{{0}}},其中省略号可以是未使用的位置参数的编号,也可以是空字符串(空参数)。
    • 在页面中,使用以下方法之一将值分配给模板参数
      • {{templatename| 1= a=b }},其中“1=”表示法明确命名了第一个未命名参数。
      • 使用特殊模板 {{=}},例如,{{template name| a{{=}}b }}
      • 使用 HTML 实体 代表等号:=。这仅适用于文本表示;如果等号需要被处理为实际的等号(如在另一个模板中),这种方法将不起作用。
  • 参数值不能包含竖线 (|) 字符;解析器会将竖线字符视为分隔符,而不是文本。管道可以在维基链接(country=[[United States|USA]]) 或嵌套模板(例如,volume= {{convert|30|acre.ft|m3}})中使用。解决此限制的间接方法如下
    • 使用特殊模板 {{!}},它会返回一个有效的竖线字符。如果需要一个将被读取为实际的竖线字符的内容(例如,如果使用参数修改维基文本表格的结构),请使用此方法
    • 使用竖线的 HTML 实体:|。这仅适用于文本表示;如果管道需要被处理为实际的管道,这种方法将不起作用。
  • 参数值不能包含不匹配的连续花括号 - }} 或 {{。解析器会尝试将它们解析为模板标签或参数的开头或结尾,并在某个地方抛出错误。但是,参数可以包含其他参数、魔术字或模板标签。
    • 同样,可以使用“nowiki”标签或 HTML 实体来解决这个问题。

嵌套模板

模板可以包含其他模板 - 通常称为“嵌套”。在处理模板时,任何嵌套模板产生的维基文本都会被转入嵌套模板,因此最终的产品本质上是从最深层的嵌套模板开始处理的。虽然在应用中相当简单,但它涉及一些值得注意的怪癖和技巧。

要将参数值传递给嵌套模板,请将参数标签放在嵌套模板参数的值中。

  • 示例
    • 模板:A 包含“the quick brown {{B|{{{3}}} }} jumped over...”。这将传递给模板:A 的第三个位置参数的值作为模板:B 的第一个位置参数传递,然后将 B 生成的维基文本作为短语的一部分返回。
    • 模板:A 包含“the quick brown {{B|waldo={{{3}}} jumped over...”。与上面类似,除了将模板:A 的第三个位置参数传递给模板:B 的命名参数“waldo”。

模板可以调用自身,但会在一次迭代后停止,以防止无限循环。

Noinclude、includeonly 和 onlyinclude

有多个标签可用于控制从模板中转入和不转入的内容。这三个标签是 noinclude、includeonly 和 onlyinclude。

noinclude

“noinclude”标签用于阻止模板页面上的文本转入其他页面。这通常用于

  • 文档
  • 应用于模板本身的类别
  • 跨维基链接 到其他维基上的相关模板。

它的使用很简单

如果这段文本位于模板页面中,这部分将被转入
<noinclude>但这段文本不会被转入</noinclude>

includeonly

“includeonly”标签与“noinclude”标签相反。includeonly 块中的文本在页面被转入时包含,它不会出现在模板页面本身。这经常用于

  • 应用于转入页面的类别
  • 隐藏模板页面本身出现的混乱文本或错误消息(通常是因为需要值的参数未定义)

它的使用很简单

如果这段文本位于模板页面中,这部分将出现在模板页面和转入页面
<includeonly>但这段文本只会出现在转入页面</includeonly>

onlyinclude

“onlyinclude”标签实际上只包含标签之间的内容;页面上的任何其他内容 - 即使是“includeonly”标签中的文本 - 也会出现在模板页面,但不会被包含。这并不常用,但当需要转入一个大页面中一小段文本时,它可能很有用。

它使用方式如下

如果这段文本位于模板页面中,这部分将在此处可见,但不会被转入
<includeonly>这段文本将不会在模板页面上可见,也不会被转入</includeonly>
<onlyinclude>这部分文本将是唯一被转入的内容</onlyinclude>

变量

系统变量采用格式 {{...}},其中括号内的文本始终全部大写。它们直接提供来自系统本身的信息:本地日期和时间、当前页面信息,甚至维基百科本身的信息。

系统变量示例
描述 输入的文本 结果(对于此帮助页面)
页面名称 {{PAGENAME}}
{{FULLPAGENAME}}
模板
Help:Templates
当前命名空间的名称 {{NAMESPACE}} Help
注册用户数量 {{NUMBEROFUSERS}} 3,477,764
最后修订的时间戳 {{REVISIONTIMESTAMP}} 20211117190007

PAGENAME 和 NAMESPACE 变量特别有用,而且经常使用,用来根据上下文更改模板的行为。例如,如果模板包含一个 类别(例如清理模板,将页面归类为需要清理的页面),它通常会检查 NAMESPACE 变量,以确保对话页面、用户页面或其他可能偶然放置该标签的地方本身不会被归类为需要清理的页面。

解析器函数和模块

解析器函数是用于执行简单分支和文本操作的工具。它们接受一个或多个参数,并根据这些参数返回一个维基文本值。解析器函数有两种基本形式(区别在于开括号后面是否跟着一个井号)

  • 核心解析器函数,形式为 {{functionName: 参数 | 参数 | ... }}。
  • 来自软件扩展的解析器函数,形式为 {{#functionName: 参数 | 参数 | ... }}。

解析器函数主要用于评估 参数变量,以便在不同的上下文中产生不同的结果。

核心解析器函数通常处理文本操作和特定项目任务。

核心解析器函数示例
描述 输入的文本 结果
将文本转换为大写 {{uc: Heavens to BETSY! }} HEAVENS TO BETSY!
将文本转换为小写 {{lc: Heavens to BETSY! }} heavens to betsy!
获取命名空间名称 {{NS: 1 }} Talk
获取 Wikibooks URL {{fullurl: pagename }} //wikibooks.cn/wiki/Pagename

扩展功能提供更多面向编程的解析器函数。

扩展解析器函数示例
描述 输入的文本 结果
在选项之间进行测试 {{#ifeq: yes | yes | Hooray...! | Darn...! }}
{{#ifeq: yes | no | Hooray...! | Darn...! }}
Hooray...!
Darn...!
测试参数是否已设置 {{#if: {{{param|}}} | Hooray...! | Darn...! }} Darn...!
进行计算 {{#expr: ( 27 * 46 / pi ) round 2 }} 395.34

其他类型的计算和字符串操作函数,例如查找和替换,可以通过 Module:String其他模块 执行。这些模块也类似地接受一个或多个参数。

使用 Module:String 进行字符串替换的示例
描述 输入的文本 结果
字符串替换 {{#invoke:String|replace| 90 degrees | degrees | ° }} 90 °

其他编辑信息

  • 如果模板中包含的第一个字符是维基标记字符 :;*# 中的一个,那么它将被处理为好像它在行首一样(即使模板标签不在行首)。这允许在模板中创建各种类型的列表,其中模板可能并不总是在列表的正确位置。要避免这种效果,请使用<nowiki>#</nowiki>HTML 实体,例如&#58;表示冒号。这在结合使用定义 列表 时也很有用。
  • 当被要求转入的页面是一个重定向页面时,会转入重定向目标页面。

包含模板的页面的修订历史

存储在 页面历史 中的页面由维基文本组成,其中可能包含对模板和图像的引用。查看页面的旧版本时,这些引用将引用模板和图像的当前版本(如果它们仍然存在)。因此,不会重建以前的组合页面。

另请参阅


华夏公益教科书