来自qwiki

阅读:407

  

更新日期: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 月份的的全称,通常需要国际化 9月
m 数字表示的月份,不足两位补充0 01-12
M 月份的的缩写,通常需要国际化 9月
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}} → 现在是 9月
    • {{ #time:i's"}} → 20'11"
  • 像PHP的date()函数一样的反斜杠转义也是支持的。 \H 直接输出 H , \" 直接输出 " 。

未来可能会增加更多格式代码,可能是完善PHP中已有功能,也可能是增加新功能。

参数time的格式参照PHP的strtotime()函数。它同时支持相对时间,如"+10 hours",用来表示时区转换。

下表以国际协调时间(UTC)2022年9月30日(星期五)08時34分32秒(北京時間2022年9月30日(星期五)16時34分32秒)为例说明各格式参数的作用。

格式参数 说明 显示结果
A 显示AM或PM AM
a 显示am或pm am
c 显示长日期 2022-09-30T08:34:32+00:00
D 星期数,以一个汉字显示
d 日期日数,有0补齐, 30
F或M 月份 9月
G或g 当前UTC时间小时数,1位或2位数字 8
H或h 小时数,2位数字 08
i 分钟数,2位数字 34
j 日数,2位数字 30
L 日期星期数,1位数字,星期日为1,星期六为7 0
l 日期星期数,3位汉字 星期五
m 月份数,2位数字 09
N 星期数,星期一为1,星期日为7 5
n 月份数,1位或2位数字 9
r 英文长日期格式 Fri, 30 Sep 2022 08:34:32 +0000
s 秒数 32
t 该月天数 30
U 时间序号,1970-1-1 0:0:1为1 1664526872
W 日期周数,显示日期为当年第几周 39
w 星期数,星期日为0,星期六为6 5
Y 日期年份,4位数字 2022
y 日期年份,2位数字 22
z 显示日期为当年第几日 272

系统默认的时间参数为当前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

模板:Extension 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系列函数主要有以下几种机制:

  1. 语义注释函数:通过语义注释,给页面定义属性,给属性赋值。例如:#set等(其他略)
  2. 行内查询函数:主要用途为检索所需的页面,并显示所需的属性值。例如:#ask,#show
  3. 其他功能性函数:提供一些便利功能的,例如:#info等(其他略)
  4. 主要使用逻辑:使用语义注释函数(#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=,可选值
  • none (default) - 不予排序
  • desc - 降序
  • asce/asc - 升序
  • random - 随机,乱序
  • reverse - 反序
{{#arraydefine:b|orange,red ,yellow, yellow|,|unique,sort=desc}}
选项参数:print=,可选值,将内容打印出来
  • list - 不予排序
{{#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:和#之间不能有空格,才可以正常工作。

表格

解析器函数中由于使用了“|”管道符做参数分隔符,所以不能包括表格所需要的“|”符。要想在输出中包含表格,可以通过以下两个办法达到:

  1. 通过嵌套模板来达到隐藏“|”的目的。比如:{{tl|!}}
  2. 使用HTML语法。
举报