帮助:解析器函数
阅读:1577
更新日期:2022-03-15
最新编辑:Admin
前言
解析器函数(ParserFunction)是MediaWiki
系统中的重要组成部分,会使用输入的变量来得出特定结果。其调用的语法为:{{#函数名: 参数1 | 参数2 | 参数3 …}}
- 解析器函数名对大小写不敏感。
- 语句中的空格、换行等空白字符将被省略。
- 在【特殊:版本】页面可以查看该WIKI站点的所有解析器函数
使用方法
- 选择并确认可以帮助达成目的的解析器函数,这里以if函数为例进行介绍;
- 确认调用该函数的正确的语法。
{{#if:}}
函数的调用语法为:{{#if: ''<判断字符串>'' | ''<then字符串>'' | ''<else字符串>'' }}
{{#if: ''<判断字符串>'' | ''<then字符串>'' |}}
- 按照正确语法为变量赋值。假设此时我们需要根据3是否比1大来决定输出的内容,若成立,则输出yes,否则输出no,则该逻辑对应的语法如下:
{{#if: 3>1| yes | no }}
- 点击保存并在页面中检验结果是否达成目的:
{{#if: 3>1| yes | no }}
-->yes
基础函数
expr
expr
函数,计算数学表达式。语法为:
{{ #expr: 表达式 }}
表达式支持的运算符有:
运算符 | 名称 | 优先级 | 元数 | 结合性 | 样例 |
---|---|---|---|---|---|
+ | 正 | 9 | 1 | 右 | {{#expr: + 7}} = 7 |
- | 负 | 9 | 1 | 右 | {{#expr: - 7}} = -7 |
not | 逻辑非 | 9 | 1 | 右 | {{#expr: not 7}} = 0 |
* | 乘 | 8 | 2 | 左 | {{#expr: 30 * 7}} = 210 |
/ 或 div | 除 | 8 | 2 | 左 | {{#expr: 30 / 7}} 或 {{#expr: 30 div 7}} = 4.2857142857143 |
mod | 模 | 8 | 2 | 左 | {{#expr: 30 mod 7}} = 2 |
+ | 加 | 6 | 2 | 左 | {{#expr: 30 + 7}} = 37 |
- | 减 | 6 | 2 | 左 | {{#expr: 30 - 7}} = 23 |
= | 等于 | 4 | 2 | 左 | {{#expr: 30 = 7}} = 0 |
< | 小于 | 4 | 2 | 左 | {{#expr: 30 < 7}} = 0 |
> | 大于 | 4 | 2 | 左 | {{#expr: 30 > 7}} = 1 |
<= | 小于等于 | 4 | 2 | 左 | {{#expr: 30 <= 7}} = 0 |
>= | 大于等于 | 4 | 2 | 左 | {{#expr: 30 >= 7}} = 1 |
<> 或 != | 不等于 | 4 | 2 | 左 | {{#expr: 30 <> 7}} 或 {{#expr: 30 != 7}} = 1 |
and | 逻辑与 | 3 | 2 | 左 | {{#expr: 30 and 7}} = 1 |
or | 逻辑或 | 2 | 2 | 左 | {{#expr: 30 or 7}} = 1 |
取舍数位
round | 4舍5入(最大9) | {{#expr: 30 / 7 round 7}} = 4.2857143 |
ceil | 向上取整 | {{#expr: ceil(1/3) }} = 1 |
floor | 向下取整 | {{#expr: floor(1/3) }} =0 |
- round运算对运算数正负,位数正负都有不同的表现
- 同一表达式中先计算高优先级运算。括号优先级高于一切。
if
if
<函数是一个if-then-else结构。语法是:
{{#if: <判断字符串> | <then字符串> | <else字符串> }} {{#if: <判断字符串> | <then字符串> |}}
若判断字符串为非空字符串(忽略前导或后缀空格),则函数返回then字符串,否则函数返回else字符串。else字符可被省略而不会造成错误,但函数在判断字符串为空时返回空字符串。
ifeq
ifeq
比较两个字符串,返回比较结果。语法为:
{{#ifeq: <字符串1> | <字符串2> | <相等时返回的字符串> | <不相等时返回的字符串> }}
ifexist
ifexist
会判断指定的页面是否存在,然后返回对应的文字:
{{#ifexist: <待测页面标题> | <存在文字> | <不存在文字> }}
ifexpr
ifexpr
计算数学表达式,并根据计算结果返回字符串。
{{ #ifexpr: <表达式> | <表达式不为0的结果> | <表达式为0的结果> }}
表达式语法与expr相同。
iferror
{{#iferror: 测试表达式 | 出错时显示结果 | 正确运算时显示结果 }}
{{#iferror: {{#expr: 1 + 2 }} | error | correct }}
→ correct{{#iferror: {{#expr: 1 + 2 }} | error }}
→ 3{{#iferror: {{#expr: 1 + 2 }} }}
→ 3{{#iferror: {{#expr: 1 + X }} }}
→ {{#iferror: {{#expr: . }} | error | correct }}
→ correct{{#iferror: <strong class="error">a</strong> | error | correct }}
→ error
#rel2abs
rel2abs
函数将页面的相对路径转化为绝对路径
{{#rel2abs: 路径 }}
{{#rel2abs: 路径 | Base路径 }}
输入合法的路径
后,具体的语法为:
.
→ 本层..
→ 上一层/foo
→ 指定到名为“foo”的那一层
如果 Base路径
未指定,默认使用完整的页面路径{{FULLPAGENAME}}
{{#rel2abs: /quok | 帮助:Foo/bar/baz }}
→ 帮助:Foo/bar/baz/quok{{#rel2abs: ./quok | 帮助:Foo/bar/baz }}
→ 帮助:Foo/bar/baz/quok{{#rel2abs: ../quok | 帮助:Foo/bar/baz }}
→ 帮助:Foo/bar/quok{{#rel2abs: ../. | 帮助:Foo/bar/baz }}
→ 帮助:Foo/bar
转义与特例
/.
or /./
,等非法字符会被忽略,其他情况参考下列实例
{{#rel2abs: ../quok/. | 帮助:Foo/bar/baz }}
→ 帮助:Foo/bar/quok{{#rel2abs: ../../quok | 帮助:Foo/bar/baz }}
→ 帮助:Foo/quok{{#rel2abs: ../../../quok | 帮助:Foo/bar/baz }}
→ quok{{#rel2abs: ../../../../quok | 帮助:Foo/bar/baz }}
→ 错误:无效路径深度:“帮助:Foo/bar/baz/../../../../quok”(尝试访问根节点以上节点)
switch
switch
将一个值与多个预设值比较,若有匹配时则返回指定字符串,即双射。语法是:
{{ #switch: <比较值> | <预设值1> [= <结果1>] | <预设值2> [= <结果2>] | ... | <预设值n> [= <结果n>] | [#default = ]<缺省结果> }}
switch
将从左往右逐一尝试,直到出现匹配。函数将返回第一个匹配值对应的结果,而忽略后面的匹配值。如果没有匹配,函数将返回缺省结果。如果缺省结果没有设置,函数将返回空串。
注意:“缺省结果”是最后一个没有等号的预设值或“#default”预设值对应的结果;如果期望把一个包含“=”号的字符串作为缺省结果,则必须采用“#default”预设值形式。例如:
#default = <span style="color:red;">red</span>
switch
也可用作满射(多对一,避免重复设置结果)。即某预设值后未设置结果,这样如果该预设值与比较值匹配,则函数返回第一个有结果的预设值的结果。例如:
{{ #switch: <比较值> | <预设值1> | <预设值2> | <预设值3> = <结果3> | <缺省结果> }}
如果比较值与预设值1、预设值2或预设值3匹配,都将返回结果3。注意:“#default”后必须有“=”,但其他预设值可以使用“#default”的结果。
time
time
是一个时间日期格式化函数,它的语法为:
{{ #time: 格式参数 }}
或者
{{ #time: 格式参数 | 时间参数 }}
如果时间参数未指定,则使用该条目被转换为HTML的时间(值)。注意到由于缓存的缘故,这与条目被浏览的时间可能会有高达1星期的偏差。因此可能需要手工更新,方法是加上action=purge参数访问页面。
下列格式代码与在PHP中的意义一样。所不同的是...
如果時間未被指定,则显示文章最后一次被转换成HTML的时间。由于缓存的关系,此时间和你浏览文章的时间可能有最长一个星期的差别。所以有时可能需要人工更新数据,方法是编辑文章但不做任何修改即保存。
以下格式代码和PHP中date()函数意义相同。除了国际化(主要是语言)造成的差别以外,所有和PHP的不同点都应当作为软件的错误进行报告。其中所有的数字输出都会被替换成当地语言的时间格式,可以使用xn(见下文)恢复成显示原来的数字。
代码 | 描述 | 输出(示例) |
---|---|---|
d | 一个月中的第 n 天,不足两位补充0 | 04 |
D | 星期的缩写,通常不国际化 | 四 |
j | 一个月中的第 n 天,不足两位不补0 | 3 |
l | 星期的全称,通常不国际化 | 星期四 |
F | 月份的的全称,通常需要国际化 | 6月 |
m | 数字表示的月份,不足两位补充0 | 01-12 |
M | 月份的的缩写,通常需要国际化 | 6月 |
n | 数字表示的月份,不足两位不补0 | 1-12 |
Y | 四位年份 | 2006 |
y | 二位年份 | 06 |
H | 小时,不足两位补充0 | 00-23 |
i | 分钟,不足两位补充0 | 00-59 |
s | 秒,不足两位补充0 | 00-59 |
以下代码是对PHP作出的扩展:
代码 | 描述 |
---|---|
xn | 将接下来的数字代码恢复成ASCII中的阿拉伯数字例如,在印地语中,{{ #time:H, xnH}}输出०६, 06。 |
xr | 将接下来的数字代码显示成罗马数字 |
xg | 输出月份名字的属格,只针对那些区分主格和属格的语言。 |
xx | 输出"x" |
任何其他字符都将不做处理直接输出。你也可以用引号来输出未经处理的字符串。
- 引号中的字符直接输出(但不输出引号),没有配对的引号也直接输出。例如:
- {{; #time: "现在是" F}} → 现在是 6月
- {{ #time:i's"}} → 20'11"
- 像PHP的date()函数一样的反斜杠转义也是支持的。 \H 直接输出 H , \" 直接输出 " 。
未来可能会增加更多格式代码,可能是完善PHP中已有功能,也可能是增加新功能。
参数time的格式参照PHP的strtotime()函数。它同时支持相对时间,如"+10 hours",用来表示时区转换。
下表以国际协调时间(UTC)2023年6月1日(星期四)21時26分07秒(北京時間2023年6月2日(星期五)05時26分07秒)为例说明各格式参数的作用。
格式参数 | 说明 | 显示结果 |
---|---|---|
A | 显示AM或PM | PM |
a | 显示am或pm | pm |
c | 显示长日期 | 2023-06-01T21:26:07+00:00 |
D | 星期数,以一个汉字显示 | 四 |
d | 日期日数,有0补齐, | 01 |
F或M | 月份 | 6月 |
G或g | 当前UTC时间小时数,1位或2位数字 | 21 |
H或h | 小时数,2位数字 | 21 |
i | 分钟数,2位数字 | 26 |
j | 日数,2位数字 | 1 |
L | 日期星期数,1位数字,星期日为1,星期六为7 | 0 |
l | 日期星期数,3位汉字 | 星期四 |
m | 月份数,2位数字 | 06 |
N | 星期数,星期一为1,星期日为7 | 4 |
n | 月份数,1位或2位数字 | 6 |
r | 英文长日期格式 | Thu, 01 Jun 2023 21:26:07 +0000 |
s | 秒数 | 07 |
t | 该月天数 | 30 |
U | 时间序号,1970-1-1 0:0:1为1 | 1685654767 |
W | 日期周数,显示日期为当年第几周 | 22 |
w | 星期数,星期日为0,星期六为6 | 4 |
Y | 日期年份,4位数字 | 2023 |
y | 日期年份,2位数字 | 23 |
z | 显示日期为当年第几日 | 151 |
系统默认的时间参数为当前UTC+0时间,可以使用{{#time:参数|+8 hours}}
得到当前北京时间(UTC+8时间)。
时间参数可以使用绝对时间,如“2008-12-31 23:59:59
”,也可以使用相对时间,如“+7 days
”或者“-5 hours
”得到默认时间7日之后或默认时间5小时之前的时间。也可以二者混合使用,比如{{#time:Y-m-d H:i:s|2001-2-3 04:05:06 +1 year +2 months +3 days +4 hours +5 minutes +6 seconds}}
返回
2002-04-06 08:10:12
使用xr
可以在其后显示罗马数字,如{{#time:xrY年xrm月xrd日|2008-12-31}}
显示为MMVIII年XII月XXXI日
language
#language
得到指定語言代碼的該語言名稱。
{{#language:de}}
得到 Deutsch{{#language:en}}
得到 English{{#language:ja}}
得到 日本語{{#language:nl}}
得到 Nederlands{{#language:zh}}
得到 中文{{#language:zh-cn}}
得到 中文(中国大陆){{#language:zh-tw}}
得到 中文(台灣){{#language:zh-hk}}
得到 中文(香港){{#language:zh-sg}}
得到 中文(新加坡)
invoke
标题
invoke
函数会调用位于Module命名空间下的Lua模块,书写方法如下:
{{#invoke: module | function | arg1 | arg2 | ... }}
tag
tag
函数即标签函数,用来替代解析器函数实现标签(<>)功能,在某些因解析时机造成的标签无法生效的情况下,需要用tag函数来改写解析器标签。
{{#tag:"标签名"| 内容 | 参数= | ... }}
例如{{#tag:rec| 内容 | ... }}
等于<rec>内容</rec>
这一方法主要用以解决时机不同造成的模板内部无法使用“<>”标签的问题。
var系列函数
“变量(Variables)”扩展允许你在当前维基页面上声明、创建和调用变量,非常类似程序语言中的对应概念,是数据结构化和复杂模板常用的函数之一。
vardefine
声明变量(定义)
{{#vardefine:变量名称|变量值}}
- 例如:
{{#vardefine:iconwidth|25}}
使得变量iconwidth = 25
vardefineecho
{{#vardefineecho:变量名称|变量值}}
作用与#vardefine
相同, 区别是会在定义后将这一数值打印出来。
- 例子:{{#vardefineecho:iconwidth|25}}除了会使得变量iconwidth的值为25外,还会留下“25”在页面上
var
调用变量的数值:
{{#var:变量名称}}
- 如果变量没有定义,则返回一个空值而不会提示任何错误信息
- 可以给数值为空或者没有定义的变量赋值,写法如下:
{{#var:变量名称|默认值}}
- 等同于
{{#if: {{#var:变量名称}} |{{#var:变量名称}} |默认值}}
#var的数值可以应用于parser和函数中
varexists
{{#varexists:变量名称}}
类似ifexist函数,如果变量存在则返回1(定义为空值时也会视为已存在),如果变量尚未被定义,则返回空值。
var_final
在Variables 2.0版本中新加入的函数功能,这个函数类似#var,只不过返回的是变量在本页面的最终值(因为一个变量可能会被多次赋值)。
- 注意,#var_final的工作机制决定了这个函数的数值只能在整个页面的markup被执行完毕后才能返回,因此他的数值无法在parser和函数中被调用。
{{#var_final:变量名称|默认值}}
默认值可以作为页面变量的“兜底”,即确保了即使没有任何赋值的情况下也能使得该变量有一个默认值。
SMW系列函数
SMW系列函数主要有以下几种机制:
- 语义注释函数:通过语义注释,给页面定义属性,给属性赋值。例如:#set等(其他略)
- 行内查询函数:主要用途为检索所需的页面,并显示所需的属性值。例如:#ask,#show
- 其他功能性函数:提供一些便利功能的,例如:#info等(其他略)
- 主要使用逻辑:使用语义注释函数(#set)在页面上储存数据,然后使用行内查询函数(#ask、#show)按照一定的定义和分类进行行内查询,最后输出结果。分页面储存便于多人协作,但同时也增加了维护的总量。
set
为当前页面赋值
{{#set:<属性名称>=<属性数值>}}
这种写法取代了SMW的早期语法[[<属性名称>::<属性数值>]]
(后者会在页面留下属性值)
- 当然第二种写法现在依然可以使用
我们亦可以用set来同时为多个属性赋值
{{#set: |<属性名称1>=<属性数值1> |<属性名称2>=<属性数值2> |<属性名称3>=<属性数值3> |<属性名称4>=<属性数值4> …… }}
使用“|+sep=
”set多个值
{{#set: |<属性名称1>=<属性字符串>|+sep=<分隔符> …… }}
例如
{{#set: |头衔=临冬城公爵,北境守护|+sep=, …… }}
被分隔符“,”隔开的“临冬城公爵”、“北境守护”都会作为该页面属性“头衔”的值,查询的时候可以平等的被结果索引到。在没有这个功能之前,我们常使用固定字符分割的字符串作为一个伪数组型的属性来存储,需要在请求出结果后再进行拆分,此功能省去了这一步。
ask
通常在页面上这样使用:
{{#ask:[[分类:游戏WIKI]][[列表显示::显示]] |?游戏名 |?WIKI域名 |?创建时间 |?创建人UID |?创建人昵称 |link=none |sort=创建时间 |template=游戏WIKI申请列表 |headers=hide |order=desc |format=template |limit=1000 }}
- 简单归纳下
{{#ask:[[>>查询条件<<]] |?>>展示信息<< |>>输出结果式<< }}
- 分类条件可以为:分类、属性或组合查询。例如:
[[分类:角色]]
,[[角色名::小乔]]
,[[分类:角色]][[角色名::小乔]]
。 - ?对应的为需要展示的信息。
- 输出结果受多种参数控制,如下表:
参数 | 值 | 说明 |
---|---|---|
format | 输出格式 | 选择结果展示出来的格式,可不填。常用的值为template,以模板进行输出结果。如果不配置,会默认以表格输出查询结果。 |
limit | 1~1000的整数 | 输出的结果的最大数量 (在table下是行数) |
offset | 数值 | limit=10 表示从总查询的结果的第2个开始输出10个结果 |
sort | 属性名 | 指定一个查询页面中存在的属性(可以不展示),所有结果会按照这个属性值来排序 |
order | 升序:asc 降序: desc 随机: random |
查询结果的输出排序规则,默认为升序。如果未指定sort,则不会生效。 |
headers | show , plain , hide |
控制输出结果表头第一行的样式,show是默认值。hide隐藏,plain是不带链接的纯文本 |
mainlabel | 纯文本 | 定义表格第一行第一个单元格的文字内容,如果配置为“-”,则会隐藏第一列标题 |
link | none , subject , all |
控制结果中的值是否带链接, all 为全部带链接,subject只有第一列带链接,none则是全部不带链接。 |
default | 纯文本 | 当查询的返回结果为空值时所显示的文字 |
searchlabel | 纯文本 | 当查询的结果超过了limit的限制后,会出现一个点击查看更多的链接,可以通过searchlabel来定义链接的文字。配置为空时,则不会显示点击查看更多的链接 |
show
展示一个属性的数值
{{#show:<页面名称>|?<属性名称>}}
- 可选参数:link=none
- 例如:
{{#show:<页面名称>|?<属性名称>|link=none}}
输出的结果不会带有链接
- 注意的是,当数值类型为text、string时,无需书写link=none,默认的结果就不带链接。SMW的数值默认属性为page,如果不加link=none,返回的是一个维基内链
subobject
使用#subobject函数为当前页面添加一个子对象
- 语法:
{{#subobject:mysubobject
|property1=value1
|property1=value2
|property2=value1
|property2=value2
...
}}
- 注意,尽管没有额外声明,通过#subobject函数添加的子对象都是位于当前页面之上的。在查询(ask)和展示(show)子对象时都必须注明所在页面
concept
concept
函数用来为SMW定义对应的concept(概念),需要在对应的concept页面书写
{{#concept: [[Category:Event]] [[Start date::> Jan 1 2008]] [[Start date::< Dec 31 2008]] |Events in the year 2008 that have been announced on semanticweb.org. To add more events, go to the page "Events" on semanticweb.org. }}
Page Forms函数
arraymap
arraymap是一个灵活的函数,用以展开一段内容中的每一个元素,具体方法:
{{#arraymap:<要展开的内容>|<分隔符>|<变量>|<变量公式>|<展开后的分隔符>}}
如果要展开的内容是一个逗号隔开的字符串,例如:关羽,张飞,马超,赵云,黄忠
{{#arraymap:关羽,张飞,马超,赵云,黄忠|,|@@@|{{CharacterInfo|@@@}}|<br>}}
这段代码的意思就是将关羽、张飞、马超、赵云、黄忠视为要展开的5个元素(由指定的分隔符“,”从要展开的字符串里获得),每个元素都被放到公式“{{CharacterInfo|@@@}}”中去并用换行符隔开,代码展开为html之前等价于:
{{CharacterInfo|关羽}}<br>{{CharacterInfo|张飞}}<br>{{CharacterInfo|马超}}<br>{{CharacterInfo|赵云}}<br>{{CharacterInfo|黄忠}}
利用arraymap我们可以模拟打印表格,公式生成每一行,在整段代码前放上th和table标签,整段代码之后用table标签闭合即可
- 这一方法能够完美的替代SMW中的format=template功能,无需在其他页面书写逻辑,自定义程度也更高,更加自由。
default form
default form
函数用来为当前页面制定默认使用的表单,指定后页面就可以使用表单编辑。
- 写法:
{{#default_form:表单名称}}
,
替代了旧写法 [[Page has default form::表单名称]]
Array系列函数
arraydefine
语法:
{{#arraydefine:数组名|赋值来源|分隔符|选项参数}}
参数 | 描述 |
---|---|
使用正则表达式作为分隔符,例如/\s*[;,]\s*/ | {{#arraydefine:f|apple, pear; orange|/\s*[;,]\s*/}}
|
选项参数:unique ,将赋值自动去重
|
{{#arraydefine:b|orange,red ,yellow, yellow|,|unique}} 中,两个yellow只会被保留1个
|
选项参数:sort= ,可选值
|
{{#arraydefine:b|orange,red ,yellow, yellow|,|unique,sort=desc}}
|
选项参数:print= ,可选值,将内容打印出来
|
{{#arraydefine:b|orange,red ,yellow, yellow|,|unique,sort=desc,print=list}}
|
arrayprint
语法:
{{#arrayprint:数组名|分隔符|定义格式|表达式|选项参数}}
该函数功能类似arraymap,将制定数组按照所制定的分隔符分割,并将每一元素按照表达式展开。一般和arraydefine成对使用。
arrayindex
语法:
{{#arrayindex:数组名|元素序号|返回默认值}}
参数 | 描述 |
---|---|
元素序号,基数为0 (第一个元素),如果序号超出范围或者无效,arrayindex函数会返回空值。负数序号表示反序取值(从最后开始取),-1 表示数组的最后一个元素。
|
{{#arrayindex:a|0}} {{#arrayindex:b|-1}}
|
返回默认值,当查询不到对应元素时返回的默认结果 | {{#arrayindex:c |foo |数值不存在! }}
|
除此之外,arrays家族还包括arrayunique、arraymerge、arrayunion等函数,均为php数组函数的映射,可以对字符串进行查重、排序、合并等操作,这里不再一一介绍,可以在MediaWiki官网查阅相关语法。
subst
应用subst:到解析器函数,必须在subst:和#之间不能有空格,才可以正常工作。
表格
解析器函数中由于使用了“|”管道符做参数分隔符,所以不能包括表格所需要的“|”符。要想在输出中包含表格,可以通过以下两个办法达到:
- 通过嵌套模板来达到隐藏“|”的目的。比如:{{tl|!}}
- 使用HTML语法。