SMW教程第二章:MediaWiki的基本使用与解析器函数
本文介绍了MediaWiki平台的基本操作方法,并给出MediaWiki解析器函数这一高级功能的基本使用方法

SMW教程第二章:MediaWiki的基本使用与解析器函数

从本章开始,我们将系统地学习 MediaWiki 的一系列概念、技巧和使用方法。

在学习之前,这里先简单介绍一些概念,这些概念在本章中偶有出现,在日后的章节会详细介绍,这里为了不影响教程学习,给出简单的说明:

  • 模板:MediaWiki 中的一种 “元页面”,可以定义编辑并应用在大量页面中
  • 模块:MediaWiki 中,可以在页面编辑并使用的一种 Lua 代码块,可以通过定义编辑多个模块,应用在大量页面中以控制页面逻辑等。
  • 命名空间 (NS、namespace):MediaWiki 中,对不同功能的页面划分了不同区域,比如 “特殊页面” 中的所有链接,都属于 “特殊” 这一区域,命名空间即为当前页面标题的 “前缀” (“<命名空间>:<页面名称>”,如”特殊:版本“)。主空间默认无前缀,我们所编辑的页面主要在主空间中。除了特殊和主空间之外,还有” 帮助 “、” 讨论 “、” 分类 “、” 模块 “、” 模板 “等等空间。
  • Lua:一种脚本语言,一般用于游戏开发或网页脚本编程。在 MediaWiki 中它充当了一种胶水语言的功能,可以为用户提供一种较为方便的开发方式,将 MediaWiki 的前端控制、页面编辑、API 调用、页面逻辑等粘合在一起。在本课程中不对该语言的使用和开发进行要求,但建议各位自学 MediaWiki 的模块 (Module) 和简单的 Lua 编程,以在后续项目实践中更好地完成自己的任务。

一、MediaWiki 基本使用

1、MediaWiki 基本编辑

编辑方法 别名 推荐 文字编辑 模板编辑 模板设计/开发 支持NS 加载 移动端支持 内容自动保存 浏览器兼容性 表格支持
源代码编辑 源码 推荐资深用户 一般 适合 所有 极快 好,但不方便(代码高亮除外,需手动关闭) 一般
表单编辑器 表单,Form Edit 推荐开发者 不适合 不适合 适合开发者 需手动指派 一般 一般

在 MediaWiki 中,我们可以对一个页面进行编辑,以呈现我们所想要表达的内容。在某个页面点击 ‘Edit’ 按钮,即可进入编辑页。

img

1.1 源代码编辑器

源代码编辑器是 MediaWiki 的经典编辑工具,具有直观、直接、泛用性强等特点,源代码编辑器中使用的是 Mark up 标记语言,同时支持 Html+CSS 语法。但是注意,由于安全性考虑,MediaWiki 的编辑器不支持某些 HTML 标签语法,如 img,iframe,a 标签等等,如果想使用该系列标签,请学习 Widget 插件或 Gadget 插件

  • 优点
    • 直接、底层,没有黑箱,方便开发者进行设计
    • 支持正则
    • 带有语法高亮 (需安装插件)
  • 缺点
    • 对新手不够友好
    • 表格编辑较为困难,需要使用特定的表格语法来创建

在编辑源代码时,编辑者需手动输入代码以控制文本样式,这部分代码是由 wiki 标记语言所指定的,常见的有:

pSFqicT.png

pSFqP3V.png

1.2 表单编辑器

表单编辑器来自第三方扩展 Page Forms,即上一章节安装的页面表单插件,它提供了一种预设模板的编辑方式,需要编辑者和开发者预先进行复杂的设计和准备工作。该部分的使用会在下一章节给出说明。

1.3 wiki 标记语言

wiki 标记语言是在 MediaWiki 中进行页面编辑的基本语法,在源代码编辑器中我们已经介绍了一部分语法,对于更多的编辑方法,需参考官方文档。该部分为作业内容,具体使用方法请参见文档:

  • huiji 编辑文档 (简单易学):https://www.huijiwiki.com/wiki/%E5%B8%AE%E5%8A%A9:%E7%BC%96%E8%BE%91%E9%A1%B5%E9%9D%A2#%E6%A0%87%E8%AE%B0%E8%AF%AD%E8%A8%80%EF%BC%88Wikitext%EF%BC%89
  • Wikipedia 官方文档 (最及时最全面,内容为英文):https://en.wikipedia.org/wiki/Help:Wikitext
  • 中文维基官方文档 (较为全面,有翻译错误):https://zh.wikipedia.org/zh-cn/Help:Wiki%E6%A8%99%E8%A8%98%E5%BC%8F%E8%AA%9E%E8%A8%80

注意,该部分内容不需要记忆或背诵,能够根据需求查找并使用即可

1.4 wiki 表格

理论上来说,在 wiki 页面中创建并编辑表格,属于 wiki 标记语言的一部分,但由于 wiki 中表格的使用比较复杂,这里单独说明:

  • 对于某个页面来说,想要在该页面单独插入一个表格,可以使用 MediaWiki 表格转换工具:https://www.tablesgenerator.com/mediawiki_tables#

  • 如果安装了可视化编辑器插件,可以在编辑器中打开可视化编辑,选择 “高级”—“插入”—“表格”

  • 对于批量修改、模板定义、自定义表格样式等需求,需要单独理解 MediaWiki 的表格机制,参考 MediaWiki 官方文档:https://www.mediawiki.org/wiki/Help:Tables/zh#Wiki%E8%A1%A8%E6%A0%BC%E6%A0%87%E7%A4%BA%E6%91%98%E8%A6%81,或 huiji 文档:https://www.huijiwiki.com/wiki/%E5%B8%AE%E5%8A%A9:%E8%A1%A8%E6%A0%BC#%E8%A1%A8%E6%A0%BC%E4%BB%8B%E7%BB%8D

1.5 wiki 图片

理论上来说,在 wiki 页面中创建并编辑图片,属于 wiki 标记语言的一部分,但由于 wiki 中图片的使用比较复杂,这里单独说明:

  • 在页面中插入图片,该图片必须上传到本地 wiki 平台中,可以在 “特殊页面” 中找到 “上传文件”,然后进行文件上传。

  • 对于某个页面来说,想在该页面单独插入一个表格,可以在编辑器中点击图片图标进行上传插入

    pSFb00J.png

  • 对于比较复杂的插入图片样式控制,需要参考 MediaWiki 官方文档:https://www.mediawiki.org/wiki/Help:Images/zh

2、MediaWiki 页面操作

2.1 创建

在地址栏中直接输入,在我们的教程中,MediaWiki 的页面地址是严格遵照

<子站前缀或localhost>/mediawiki/index.php/<页面名称>

的方式组成的,因此只需要将当前页面的名称替换成想要寻找的页面名称即可。如想要创建一个名为 “天津大学” 的页面,只需访问

localhost/mediawiki/index.php/天津大学

并选择 “创建本页面” 即可。

如果是模板、模块等带有前缀的页面,则需要加上 模板:模块:帮助:Widget:……等 namespace 前缀,如 “分类:人物”、“模板:infobox” 等页面,缺少前缀则会生成默认文章页。

  • 模板、模块、帮助、分类、特殊等 namespace 前缀可以用 “Template”、“Module”、“Help”、“Category”、“Special” 来替代;
  • 无论是使用中文还是英文的 namespace 前缀,冒号必须是英文的半角冒号

2.2 移动

MediaWiki 页面的标题并没有 “改名” 的功能,类似的操作,被称为移动。当您发现您所创建的页面名称有误 (例如输入错字,或没有遵守帮助:命名常规等),那么您就可以重新命名 (移动) 该页面。

image-20241103211635473

image-20241103211704083

“移动” 功能最大的优点是能够同时移动相关页面的修订历史。如果只是将旧页面手动复制到新页面,那么该条目的修订历史将被分散在两个地方,往往会对之后的编辑带来不便。

在移动页面中,有数个选项:

  • “保留重定向” (仅向管理员机器人提供、预设选择):移动页面时,同时在旧有页面创建重定向。如果不选此项,移动后旧有页面将会成为红色链接,移动日志也会显示 “不留重定向”。
  • “监视来源页面和目标页面”:移动页面后,将重定向页面及新页面加到您的监视清单中 (连同讨论页一并加入)。可以在参数设置=>监视列表=>进阶选项=>“将我移动的页面和文件添加到我的监视列表” 一项选择是否预设。
  • “是,删除该页面” (仅在目标页面存在时向管理员提供):移动页面时如果目标页面存在,MediaWiki:Delete and move text 中的内容会展示,并会向管理员提供此选择。用户必须选择此项,并点选 ⧼Delete and move⧽,页面才会被移动,目标页面即时删除,并展示理由:“删除以便移动”。如果不是管理员,且移动页面时目标页面存在,会显示错误信息。

2.3 重定向

重定向用于多个名称表示同一个实体的时候,例如:

阿拉贡Aragorn 的中文译名。我们只需要一个页面来介绍阿拉贡,但为了让搜索 Aragorn 的用户也能找到页面,我们需要建立 Aragorn 页面,并将其重定向至阿拉贡页。

重定向步骤:

  1. 创建重定向页,并使用源代码编辑器编辑。

  2. 输入

    #重定向 [[主页面名称]]
    

    或者

    #REDIRECT [[主页面名称]]
    

    即可。

例如将 Aragorn 重定向至阿拉贡页,只需:

  1. 建立 Aragorn 页,

  2. 使用源代码编辑器,输入

    #重定向 [[阿拉贡]]
    

    即可。

2.4 消歧义

消歧义用于有多个实体具有同一名称的时候,例如:

对于 “天花” 这个名称,可能指代多个实体,如烈性传染病天花玉米的雄蕊中国传统建筑中的构件等。对于这种问题,参见维基百科与 huijiwiki 的消歧义文档

  • 维基百科:https://zh.wikipedia.org/zh-hans/Wikipedia:%E6%B6%88%E6%AD%A7%E4%B9%89
  • huijiwiki:https://www.huijiwiki.com/wiki/%E5%B8%AE%E5%8A%A9:%E6%B6%88%E6%AD%A7%E4%B9%89

建议搭建安装使用消歧义插件,并使用 {{Disambig}} 来标记消歧义页。

2.5 历史与回退

“编辑历史” 与 “回退” 是 MediaWiki 特有的功能,在日常编辑和维护过程中非常重要。

编辑历史的查看

img

历史版本的对比

维基的每一次编辑都会生成一个独有的历史版本,在页面的 “查看历史” 入口中能够看到本页面从创建起的所有历史版本和对应信息。

  • 对比历史版本

您可以选择两个不同的版本进行对比,编辑器会清晰的表示出改动的内容。

历史版本的回退

img

历史的回退

  • 方法一,选取某个版本,点击 “撤销” 进行操作
  • 方法二,点击某个历史版本的链接,进入其页面,然后点击 “保存编辑”,这个历史版本将覆盖现有版本。

2.6 删除

删除页面有两种方式:

  • 一是对某个页面进行单独删除操作,如在某个页面中点击删除按钮:

image-20241103154136380

  • 二是对最近页面进行批量删除,需要在 特殊页面 中找到 大量删除 按钮,

    image-20241103154151360

    然后列举页面,批量选择页面即可。

3、MediaWiki 魔术字

魔术字 (Magic words) 是 MediaWiki 软件所识别的特定字符串,它们可以返回特定的值触发特定功能。魔术字有如下三种:

  • 状态开关:以两个下划线 “” 为前后缀的大写单词。例如 FOO__;
  • 变量:同模版类似,以 “{{” 开头,“}}” 结尾,且所有字母大写,如 {{FOO}};
  • 解析器函数:这些形如 {{foo:…}} 或 {{#foo:…}} 的魔术字在使用时包含参数,且函数名称对大小写不敏感 (包括可大小写混用)。请同时参见 Help:解析器函数

**注意,所有魔术字,都可以以源代码方式直接编辑到页面中进行测试和使用!**建议大家在页面编辑中进行尝试和使用以加深理解

3.1 状态开关魔术字

状态开关可以控制页面的显示方式或其他行为。它往往用于排除或加入特定的页面内容。

魔术字 描述 版本 主题
__NOTOC__ 隐藏目录。 目录
__FORCETOC__ 强制于默认位置(第一个章节标题上方)显示目录。 目录
__TOC__ 在魔术字的位置插入目录(忽略NOTOC)。如果这个魔术字在一个页面内被多次使用,目录将会被放置在首个TOC出现的位置。 目录
__NOEDITSECTION__ 隐藏章节标题旁的编辑链接。 编辑
__NEWSECTIONLINK__ 在非讨论页顶端“编辑页面”标签右侧加入一个按钮,用于在页面结尾加入新的章节(参见MediaWiki上的说明)。 1.7+ 编辑
__NONEWSECTIONLINK__ 移除讨论页顶端“编辑页面”右侧的加入新章节链接。 1.15+ 编辑
__NOGALLERY__ 用于分类页面。不显示分类中所包含-{zh-hans:文件;zh-hant:档案}-的缩略图,而以普通链接代替。 1.7+ 分类
__HIDDENCAT__ 用于分类页面。加入后此分类成为隐藏分类,将不会显示在上级分类其及成员页面的分类列表中(可以通过参数设置中的选项强制显示),建议用{{hiddencat}}。 1.13+ 分类
__NOCONTENTCONVERT__ __NOCC__ 不对当前页面进行字词转换。 字词转换
__NOTITLECONVERT__ __NOTC__ 不进行标题转换,其他内容照常转换。 字词转换
__START__ 没有特殊效果。已被彻底废弃 其他
__INDEX__ 允许搜索引擎检索本页(忽略$wgArticleRobotPolicies的设置,但无法忽略robots.txt)。 1.14+ 其他
__NOINDEX__ 阻止搜索引擎检索本页。 1.14+ 其他
__STATICREDIRECT__ 用于重定向页。当有人移动页面并勾选“更新所有指向原标题的重定向”时,禁止MediaWiki更新本页的重定向。 1.13+ 其他
__NOTITLE__ 用于强制隐藏页面的标题(FirstHeading)。一同去掉的还有“登陆后就可以编辑…”的提示。 其他
__DISAMBIG__ 用于消歧义页,该页会被标记为消歧义页并显示于Special:消歧义页面,建议用{{Disambig}}。 使用消歧义插件

3.2 变量魔术字 (参考即可,仅供了解)

这里给出的魔术字仅供参考不需要刻意记忆!!在有需要时进行查询即可!!

变量魔术字可以返回某个特定的数据 (关于当前页面、wiki 站点或日期的),但是其具体数值可能会随着时间推移变化。变量的语法与模板 (模板相关内容会在后续章节进行介绍,这里仅作了解) 类似。其中标记为 “[高开销]” 的变量会被软件记录,且在一个页面中可使用的总数会被限制。

如果某一模板名与变量名重复,软件会自动将其解释为变量 (因此若要包含模板:PAGENAME,页面中需要写作 {{模板:PAGENAME}})。在某些情况下,加入参数会强制软件将变量视作一个模板,如 {{CURRENTDAYNAME|x}} 将会包含模板:CURRENTDAYNAME

这里仅给出一个页面标题魔术字的例子:

页面标题

变量 输出 描述 版本
{{FULLPAGENAME}} 命名空间及页面标题 1.6+
{{PAGENAME}} 页面标题
{{BASEPAGENAME}} 页面标题,不包括当前子页面标题及命名空间(页面“Wikipedia:页面/子页面/子页面的子页面”则返回“页面/子页面”) 1.7+
{{ROOTPAGENAME}} 获得当前页面的根页名,不包括所有子页面标题及命名空间(页面“Wikipedia:页面/子页面/子页面的子页面”则返回“页面”)
{{SUBPAGENAME}} 子页面标题(页面“Wikipedia:页面/子页面”则返回“子页面”) 1.6+
{{SUBJECTPAGENAME}} 当前页面对应的内容页标题(包含命名空间) 1.7+
{{TALKPAGENAME}} 当前页面对应的讨论页标题(包含命名空间) 1.7+

变量魔术字的具体文档请参考

  • 维基百科文档:https://zh.wikipedia.org/wiki/Help:%E9%AD%94%E6%9C%AF%E5%AD%97#%E5%8F%98%E9%87%8F
  • huiji 文档 1:https://www.huijiwiki.com/wiki/%E5%B8%AE%E5%8A%A9:%E9%AD%94%E6%9C%AF%E5%AD%97#%E5%8F%98%E9%87%8F%E9%AD%94%E6%9C%AF%E5%AD%97
  • huiji 文档 2:https://www.huijiwiki.com/wiki/%E5%B8%AE%E5%8A%A9:%E5%8F%98%E9%87%8F

3.3 解析器函数魔术字 (参考即可,仅供了解)

这里给出的魔术字仅供参考不需要刻意记忆!!在有需要时进行查询即可!!

解析器函数有一个或多个参数 (技术上来看,所有使用参数的魔术字均为解析器函数),且魔术字的名称前有时会有一个#号,以将它们与一般的模版区分开来。

解析器函数是 MediaWiki 中的重要工具,对于我们控制页面样式、进行开发等极其重要。**通过解析器函数、html/css/js、模板、Lua 等工具进行配合,我们可以实现非常丰富的前端展示效果。**我们会在后续章节介绍更为详细的解析器函数的用法。

URL 数据

魔术字 输出 描述 版本
{{localurl:页面标题}} `{{localurl:页面标题 字符串}}` /wiki/%E9%A1%B5%E9%9D%A2%E6%A0%87%E9%A2%98 /w/index.php?title=%E9%A1%B5%E9%9D%A2%E6%A0%87%E9%A2%98&字符串 指定标题的相对路径
{{fullurl:页面标题}} `{{fullurl:页面标题 字符串}} {{fullurl:跨维基链接:页面标题 字符串}}` //zh.wikipedia.org/wiki/Category:%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3 //zh.wikipedia.org/w/index.php?title=Category:%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3&action=edit https://en.wikipedia.org/wiki/Category:Help?action=edit
{{filepath:文件名}} `{{filepath:文件名 nowiki}}` //upload.wikimedia.org/wikipedia/zh/b/bc/Wiki.png //upload.wikimedia.org/wikipedia/zh/b/bc/Wiki.png 指定多媒体文件的绝对路径
{{urlencode:字 符 串}} {{urlencode:x y z 一二三}} %E5%AD%97+%E7%AC%A6+%E4%B8%B2 x+y+z+%E4%B8%80%E4%BA%8C%E4%B8%89 将字符串以百分号编码以供URL使用。 1.7+
{{anchorencode:字 符 串}} {{anchorencode:x y z 一二三}} 字_符_串x_y_z一二三 将字符串编码以供URL锚点(URL中#号后面的部分)使用。 1.8+

命名空间

{{ns:}} 返回指定索引编号所对应命名空间的本地名称。

内容页面命名空间 讨论页命名空间
用法 输出 用法 输出
{{ns:-2}}{{ns:media}} Media 不适用 不适用
{{ns:-1}}{{ns:Special}} Special 不支持 不支持
{{ns:0}} {{ns:1}}{{ns:Talk}} Talk
{{ns:2}}{{ns:User}} User {{ns:3}}{{ns:User talk}} User talk
{{ns:4}}{{ns:Project}} Wikipedia {{ns:5}}{{ns:Project talk}} Wikipedia talk
{{ns:6}}{{ns:File}}{{ns:Image}} File {{ns:7}}{{ns:File talk}}{{ns:Image talk}} File talk
{{ns:8}}{{ns:MediaWiki}} MediaWiki {{ns:9}}{{ns:MediaWiki talk}} MediaWiki talk
{{ns:10}}{{ns:Template}} Template {{ns:11}}{{ns:Template talk}} Template talk
{{ns:12}}{{ns:Help}} Help {{ns:13}}{{ns:Help talk}} Help talk
{{ns:14}}{{ns:Category}} Category {{ns:15}}{{ns:Category talk}} Category talk
{{ns:100}}{{ns:Portal}} Portal {{ns:101}}{{ns:Portal talk}} Portal talk
{{ns:102}}{{ns:WikiProject}} WikiProject {{ns:103}}{{ns:WikiProject talk}} WikiProject talk
{{ns:118}}{{ns:Draft}} Draft {{ns:119}}{{ns:Draft talk}} Draft talk
{{ns:828}}{{ns:Module}} Module {{ns:829}}{{ns:Module talk}} Module talk
不适用 不适用 {{ns:2600}}{{ns:Topic}} Topic

格式

用法 输入 → 输出 描述 版本
{{lc:字符串}} {{lc:DATA CENTER}} → data center 转换为小写字母输出 1.5+
{{lcfirst:字符串}} {{lcfirst:DATA CENTER}} → dATA CENTER 字符串的第一个字符转换为小写字母 1.5+
{{uc:字符串}} {{uc:text transform}} → TEXT TRANSFORM 转换为大写字母输出 1.5+
{{ucfirst:字符串}} {{ucfirst:text transform}} → Text transform 字符串的第一个字符转换为大写字母 1.5+
{{formatnum:无格式数字}} `{{formatnum:格式化的数字 R}}` {{formatnum:-987654321.654321}} → −987,654,321.654321 `{{formatnum:-987,654,321.654321 R}}` → -987654321.654321
{{#dateformat:日期}} {{#formatdate:日期}} `{{#dateformat:日期 格式}} {{#formatdate:日期 格式}}` `{{#dateformat:11 seP 2001
`{{padleft:xyz 字符串长度}} {{padleft:xyz 字符串长度 字符}}`
`{{padright:xyz 字符串长度}} {{padright:xyz:字符串长度 字符}}` `{{padright:xyz
`{{plural:计数 单数形式 复数形式}}` `{{plural:1

3.4 特殊符号

变量 输出 描述 版本
{{!}} | 在参数中代替 | 1.24+
{{=}} = 在参数中代替 = phab:T91154
#REDIRECT [[條目名稱]] #重定向 [[條目名稱]] 标记此条目为重定向页。此语法仅在条目第一行时有效。另见Help:重定向
ISBN 0-12-345678-9 ISBN 0-12-345678-9 同样是MediaWiki软件所识别的特定字符串,并且符合条件时会自动转换为链接。目前中文维基百科支持的此类魔术语法有ISBNPMID以及RFC。参见Help:魔术链接

二、MediaWiki 解析器函数

我们在上文中提到了 MediaWiki 的魔术字,其中有解析器函数魔术字,这里会详细介绍 MediaWiki 中解析器函数的概念。

解析器函数 (ParserFunction) 是 MediaWiki 系统中的重要组成部分,这是 MediaWiki 系统区别于其他维基类软件和 CMS 系统 (例如 WordPress) 的最大不同之一。解析器函数简单来说就是通过特定的语法来 ({{#}}) 调用 PHP 的底层函数,进行逻辑表达或是运算,实现一些复杂的功能和效果。典型语法是:

{{#函数名: 参数1 | 参数2 | 参数3 …}}

特点:

  • 各函数名都对大小写不敏感
  • 语句中的空格、换行等空白字符将被省略
  • 解析器函数实际上是 wiki 标记语言的一部分,同样需要由 MediaWiki 的解析器进行转译 (Parser),因此运行效率受到一定限制
  • 解析器函数可以由插件所提供,如 SMW 插件、PageForms 插件、Maps 插件都提供了更丰富的解析器函数以实现集成的复杂功能。
  • 由 Module 提供的 Lua 脚本可以更高效的执行函数逻辑,可以一定程度上取代解析器函数。但是,某些特定插件所提供的特殊解析器函数,如 SMW 插件、PageForms 插件等,是无法用 Lua 脚本替代的;另外在 MediaWiki 平台使用 Lua 脚本,涉及到 MediaWiki 平台的模块 (Module) 功能和 Lua 编程语言,该部分在同学们的自选主题中,有能力的小组自行选择并分享。

在下文中仅给出了一些简单的说明和示例,想了解更多细节,请参阅官方文档:

  • 基础解析器函数:https://www.mediawiki.org/wiki/Help:Extension:ParserFunctions#
  • Var 系列函数:https://www.mediawiki.org/wiki/Extension:Variables

1、基础函数

该系列函数由 ParseFunction 插件提供,给出了一系列逻辑数学运算的表达式操作。注意,在解析器函数中并没有 “循环” 这一功能,如果想实现 “循环”,需要使用其他方法,如 MediaWiki 模块 (Module),或使用 Widget/Gadget 来嵌入 JS 代码。

1.1 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
/ 8 2 {{#expr: 30 / 7}} = 4.2857142857143
div 8 2 {{#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}} = 1
!= 不等于 4 2 {{#expr: 30 != 7}} = 1
and 逻辑与 3 2 {{#expr: 30 and 7}} = 1
or 逻辑或 2 2 {{#expr: 30 or 7}} = 1

1.2 取舍数位

round 舍入(最大9) {{#expr: 30 / 7 round 7}} = 4.2857143
ceil 向上取整 {{#expr: ceil(1/3) }} = 1
floor 向下取整 {{#expr: floor(1/3) }} =0

round 运算对运算数正负,位数正负都有不同的表现,参见下例。

逻辑运算符把假映射为 0,把真映射为非 0,且返回值只有 0 或 1。

同一表达式中先计算高优先级运算。括号优先级高于一切。

1.3 if

if<函数是一个 if-then-else 结构。语法是:

{{#if: <判断字符串> | <then字符串> | <else字符串> }}
{{#if: <判断字符串> | <then字符串> |}}

若判断字符串为非空字符串 (忽略前导或后缀空格),则函数返回 then 字符串,否则函数返回 else 字符串。else 字符可被省略而不会造成错误,但函数在判断字符串为空时便会返回空字符串。

1.4 ifeq

ifeq 比较两个字符串,返回比较结果。语法为:

{{#ifeq: <字符串1> | <字符串2> | <相等时返回的字符串> | <不相等时返回的字符串> }}

注意:两个空字符串是相等的。

示例:

假设模板 Ifeq test 的内容是

{{#ifeq:{{{lang}}}|zh|我使用中文|I don't use Chinese}}

则 {{Ifeq test|lang=zh}} 的结果是我使用中文;而 {{Ifeq test|lang=en|I prefer English}} 的结果是 I don’t use Chinese

1.5 ifexist

ifexist 会判断指定的页面是否存在,然后返回对应的文字:

{{#ifexist: <待测页面标题> | <存在文字> | <不存在文字> }}

示例:

  • {{#ifexist:test|有 test 頁面|無 test 頁面}} 得到有 test 頁面
  • {{#ifexist:User:Sex|該用戶頁存在|該用戶頁不存在}} 得到該用戶頁不存在
  • {{#ifexist:维基百科||×}} 得到 ×

1.6 ifexpr

ifexpr 计算数学表达式,并根据计算结果返回字符串。

{{ #ifexpr: <表达式> | <表达式不为0的结果> | <表达式为0的结果> }}

表达式语法与 expr 相同。

1.7 iferror

{{#iferror: 测试表达式 | 出错时显示结果 | 正确运算时显示结果 }}

1.8 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” 的结果。

1.9 time

time 是一个时间日期格式化函数,它的语法为:

{{ #time: 格式参数 }}

或者

{{ #time: 格式参数 | 时间参数 }}

格式参数使用示例 (参考为主,了解即可)

参数 执行代码 输出(示例) 描述
A {{#time:A}} PM 显示AM或PM
a {{#time:a}} pm 显示am或pm
c {{#time:c}} 2023-01-03T14:15:21+00:00 显示长日期
D {{#time:D}} 星期数,以一个汉字显示
d {{#time:d}} 3 日期日数,有0补齐,
F或M {{#time:F或M}} 1月 月份
G或g {{#time:G或g}} 14 当前UTC时间小时数,1位或2位数字
H或h {{#time:H或h}} 14 小时数,2位数字
i {{#time:i}} 15 分钟数,2位数字
j {{#time:j}} 3 日数,2位数字
L {{#time:L}} 0 日期星期数,1位数字,星期日为1,星期六为7
l {{#time:l}} 星期二 日期星期数,3位汉字
m {{#time:m}} 1 月份数,2位数字
N {{#time:N}} 2 星期数,星期一为1,星期日为7
n {{#time:n}} 1 月份数,1位或2位数字
r {{#time:r}} Tue, 03 Jan 2023 14:15:21 +0000 英文长日期格式
s {{#time:s}} 21 秒数
t {{#time:t}} 31 该月天数
U {{#time:U}} 1672755321 unix时间序号
W {{#time:W}} 1 日期周数,显示日期为当年第几周
w {{#time:w}} 2 星期数,星期日为0,星期六为6
Y {{#time:Y}} 2023 日期年份,4位数字
y {{#time:y}} 23 日期年份,2位数字
z {{#time:z}} 2 显示日期为当年第几日

注意:

  • 系统默认的时间参数为当前 UTC+0时间 (格林威治时间),可以使用 {{#time:参数|+8 hours}} 得到当前北京时间 (UTC+8时间)。
  • 可以使用多个格式参数,来拼接获得不同的日期格式,如 {{#time: Y M j}} 得到 2023 1月 4
  • 可以在格式参数中自由输入字符,来对得到的日期时间结果进行控制,如 {{#time: Y年Mj日}} 得到 2023年1月4日,这里 “年” 这个字符被放在了 “2023” 和 “1月” 之间,“日” 这个字符,被放在了 “4” 之后
  • 可以使用格式参数与时间参数进行配合,得到复杂的时间输出效果:{{#time:Y-m-d H:i:s|+1 year +2 months +3 days +4 hours +5 minutes +6 seconds}} 返回 2024-03-07 11:21:03

1.10 replace

replace 函数用来替换内容中特定的元素。格式为:

{{#replace:"内容"|需要替换的元素|用来替换的元素}}

例:

{{#replace:个人wiki|wiki|维基}}

可以得到:个人维基

1.11 tag (了解即可)

tag 函数即标签函数,用来替代解析器函数实现标签 (<>) 功能,在某些因解析时机造成的标签无法生效的情况下,需要用 tag 函数来改写解析器标签。格式为:

{{#tag:"标签名"| 内容 | 参数= | ... }}

例:

{{#tag:rec| 内容 | ... }}

可以得到:<rec>内容</rec>

这一方法主要用以**解决时机不同造成的模板内部无法使用 “<>” 标签的问题。**这类问题在后续创建 MediaWiki 的复杂模板的时候会遇到。

2、Var 系列函数

Variables 插件允许你在一个页面上定义一个变量,以后在同一页面或包含的模板中使用它,改变它的值,可能是以旧值为条件的表达式给出的值,等等。

它很像一个模板 (MediaWiki 中的一种 “元页面”,可以定义编辑并应用在大量页面中),只是非常轻量级,而且只限于一个页面,所以你可以在一个页面上使用许多变量,而不会因为大量的模板而拖慢维基的速度。将这个扩展与 ParserFunctions 插件结合起来,可以获得最佳效果。

2.1 vardefine

声明变量 (定义)

  • {{#vardefine:*变量名称*|*变量值*}}
  • 例如:{{#vardefine:iconwidth|25}} 使得变量 iconwidth = 25

2.2 vardefineecho

  • {{#vardefineecho:*变量名称*|*变量值*}}

作用与 #vardefine 相同,区别是会在定义后将这一数值打印出来。

  • 例子:{{#vardefineecho:iconwidth|25}} 除了会使得变量 iconwidth 的值为 25 外,还会留下 “25” 在页面上

2.3 var

调用变量的数值:

  • {{#var:变量名称}}
    
    • 如果变量没有定义,则返回一个空值而不会提示任何错误信息
    • 可以给数值为空或者没有定义的变量赋值,写法如下:
      • {{#var:变量名称|默认值}}
      • 等同于 {{#if: {{#var:变量名称}} |{{#var:变量名称}} |默认值}}

#var 的数值可以应用于 parser 和函数中

2.4 varexists

  • {{#varexists: 变量名称}}

类似 ifexist 函数,如果变量存在则返回 1 (定义为空值时也会视为已存在),如果变量尚未被定义,则返回空值

2.5 var_final

在 Variables 2.0 版本中新加入的函数功能,这个函数类似#var,只不过返回的是变量在本页面的最终值 (因为一个变量可能会被多次赋值)。

  • 注意,#var_final 的工作机制决定了这个函数的数值只能在整个页面的 markup 被执行完毕后才能返回,因此他的数值无法在 parser 和函数中被调用。

  • {{#var_final: 变量名称 |默认值}}

默认值可以作为页面变量的 “兜底”,即确保了即使没有任何赋值的情况下也能使得该变量有一个默认值。

3、Maps 系列函数

自选分享主题,参见 Maps 文档:https://maps.extension.wiki/wiki/Leaflet_Maps_examples

4、PageForms 系列函数

在下一章节进行介绍

5、SMW 系列函数

在下一章节进行介绍

6、其他

除了上文介绍的一系列函数之外,MediaWiki 的扩展插件功能提供了非常多非常丰富的解析器函数。我们可以在 特殊页面:版本 最下部,看到当前平台所支持的解析器函数:

image-20241103151727523

一般在扩展插件的 MediaWiki 官方主页,都有关于该插件扩展的解析器函数的具体用法,大家需要在日后自行学习和使用。

三、作业安排

本周主要介绍了操作 MediaWiki 中的最重要的内容——页面,在我们后续的课程中,会将 MediaWiki 平台上的每一个页面都视作一个实体,作为我们知识图谱构建的基石。因此掌握如何操作页面,如何编辑页面,如何控制页面是非常重要的。本周的主要任务是阅读教程并进行实践,掌握 MediaWiki 中页面的基本概念、基本编辑和控制方法。需要注意的是,这里仅仅给出了一些基础的,对于单一页面进行操作的内容,在后续的章节,我们会进一步介绍如何批量编辑、控制、修改页面,如何用更现代化的方式 (HTML+CSS+JS) 来控制页面内容、样式与展示逻辑。

作业:

  • 任务 1:浏览、学习基本的 HTML 语法,并用纯 HTML 语言创建一个天津大学的百科介绍页面 (两周任务) https://www.runoob.com/html/html-tutorial.html

  • 任务 2:在 MediaWiki 平台,创建页面,页面名称为北洋大学,要求页面内容与任务 1 中百科介绍页面的内容相同。在编辑页面时,样式方面尽量还原你在任务 1 中实现的 HTML 效果 (不要求 1:1 复刻)。页面要求:

    • 必须要用到的编辑方法:加粗、下划线、内部链接、外部链接、插入图片 (控制图片宽度为 300px,无边框)

    • 必须创建并插入 (至少) 一个表格,如天大两院院士列表:

      image-20241103151802748

    • 必须在该页面使用 2 个状态开关魔术字,4 个变量魔术字,2 个解析器函数魔术字,要求必须使用一个显示当前平台页面总数的魔术字

  • 任务 3:安装消歧义插件

  • 任务 4:

    • 将”北洋大学 “页面移动至” 天津大学 “页面
    • 将原有 “北洋大学” 页面重定向至”天津大学 “页面
    • 创建 2 个页面”北洋大学 (日本) “、” 北洋大学 (消歧义) “
    • 将”北洋大学 (消歧义) “页面作为**” 消歧义页 “,编辑该页面**,将 “北洋大学” 这一名称,指向 “天津大学” 和 “北洋大学 (日本)” 两个页面。同时在该页面使用消歧义插件。
    • 消歧义页面示例:https://asoiaf.huijiwiki.com/wiki/%E4%B8%B9%E5%A6%AE%E8%8E%89%E4%B8%9D%C2%B7%E5%9D%A6%E6%A0%BC%E5%88%A9%E5%AE%89 (%E6%B6%88%E6%AD%A7%E4%B9%89)

    image-20241103154100058

  • 任务 4:创建一个新页面,在该页面中实操 MediaWiki 的解析器函数。要求:

    • 使用 5 个基础函数
    • 使用 3 个 Var 系列函数
    • 将基础函数与 Var 系列函数结合使用

进阶:

  • 参考维基百科,填充 “北洋大学 (日本)” 页面的内容
  • 安装 “消歧义” 插件并在消歧义页进行使用
  • 安装并使用 Maps 插件的解析器函数

Last modified on 2023-11-03