SMW教程第二章:MediaWiki的基本使用与解析器函数
从本章开始,我们将系统地学习 MediaWiki 的一系列概念、技巧和使用方法。
在学习之前,这里先简单介绍一些概念,这些概念在本章中偶有出现,在日后的章节会详细介绍,这里为了不影响教程学习,给出简单的说明:
- 模板:MediaWiki 中的一种 “元页面”,可以定义编辑并应用在大量页面中
- 模块:MediaWiki 中,可以在页面编辑并使用的一种 Lua 代码块,可以通过定义编辑多个模块,应用在大量页面中以控制页面逻辑等。
- 命名空间 (NS、namespace):MediaWiki 中,对不同功能的页面划分了不同区域,比如 “特殊页面” 中的所有链接,都属于 “特殊” 这一区域,命名空间即为当前页面标题的 “前缀” (“
<命名空间>:<页面名称>
”,如”特殊:版本
“)。主空间默认无前缀,我们所编辑的页面主要在主空间中。除了特殊和主空间之外,还有” 帮助 “、” 讨论 “、” 分类 “、” 模块 “、” 模板 “等等空间。 - Lua:一种脚本语言,一般用于游戏开发或网页脚本编程。在 MediaWiki 中它充当了一种胶水语言的功能,可以为用户提供一种较为方便的开发方式,将 MediaWiki 的前端控制、页面编辑、API 调用、页面逻辑等粘合在一起。在本课程中不对该语言的使用和开发进行要求,但建议各位自学 MediaWiki 的模块 (Module) 和简单的 Lua 编程,以在后续项目实践中更好地完成自己的任务。
一、MediaWiki 基本使用
1、MediaWiki 基本编辑
编辑方法 | 别名 | 推荐 | 文字编辑 | 模板编辑 | 模板设计/开发 | 支持NS | 加载 | 移动端支持 | 内容自动保存 | 浏览器兼容性 | 表格支持 |
---|---|---|---|---|---|---|---|---|---|---|---|
源代码编辑 | 源码 | 推荐资深用户 | 一般 | 高 | 适合 | 所有 | 极快 | 好,但不方便(代码高亮除外,需手动关闭) | 有 | 好 | 一般 |
表单编辑器 | 表单,Form Edit | 推荐开发者 | 不适合 | 不适合 | 适合开发者 | 需手动指派 | 一般 | 差 | 无 | 一般 | 无 |
在 MediaWiki 中,我们可以对一个页面进行编辑,以呈现我们所想要表达的内容。在某个页面点击 ‘Edit’ 按钮,即可进入编辑页。
1.1 源代码编辑器
源代码编辑器是 MediaWiki 的经典编辑工具,具有直观、直接、泛用性强等特点,源代码编辑器中使用的是 Mark up 标记语言,同时支持 Html+CSS 语法。但是注意,由于安全性考虑,MediaWiki 的编辑器不支持某些 HTML 标签语法,如 img,iframe,a 标签等等,如果想使用该系列标签,请学习 Widget 插件或 Gadget 插件。
- 优点
- 直接、底层,没有黑箱,方便开发者进行设计
- 支持正则
- 带有语法高亮 (需安装插件)
- 缺点
- 对新手不够友好
- 表格编辑较为困难,需要使用特定的表格语法来创建
在编辑源代码时,编辑者需手动输入代码以控制文本样式,这部分代码是由 wiki 标记语言所指定的,常见的有:
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 平台中,可以在 “
特殊页面
” 中找到 “上传文件
”,然后进行文件上传。 -
对于某个页面来说,想在该页面单独插入一个表格,可以在编辑器中点击图片图标进行上传插入
-
对于比较复杂的插入图片样式控制,需要参考 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 页面的标题并没有 “改名” 的功能,类似的操作,被称为移动。当您发现您所创建的页面名称有误 (例如输入错字,或没有遵守帮助:命名常规等),那么您就可以重新命名 (移动) 该页面。
“移动” 功能最大的优点是能够同时移动相关页面的修订历史。如果只是将旧页面手动复制到新页面,那么该条目的修订历史将被分散在两个地方,往往会对之后的编辑带来不便。
在移动页面中,有数个选项:
- “保留重定向” (仅向管理员、机器人提供、预设选择):移动页面时,同时在旧有页面创建重定向。如果不选此项,移动后旧有页面将会成为红色链接,移动日志也会显示 “不留重定向”。
- “监视来源页面和目标页面”:移动页面后,将重定向页面及新页面加到您的监视清单中 (连同讨论页一并加入)。可以在参数设置=>监视列表=>进阶选项=>“将我移动的页面和文件添加到我的监视列表” 一项选择是否预设。
- “是,删除该页面” (仅在目标页面存在时向管理员提供):移动页面时如果目标页面存在,MediaWiki:Delete and move text 中的内容会展示,并会向管理员提供此选择。用户必须选择此项,并点选 ⧼Delete and move⧽,页面才会被移动,目标页面即时删除,并展示理由:“删除以便移动”。如果不是管理员,且移动页面时目标页面存在,会显示错误信息。
2.3 重定向
重定向用于多个名称表示同一个实体的时候,例如:
阿拉贡是 Aragorn 的中文译名。我们只需要一个页面来介绍阿拉贡,但为了让搜索 Aragorn 的用户也能找到页面,我们需要建立 Aragorn 页面,并将其重定向至阿拉贡页。
重定向步骤:
-
创建重定向页,并使用源代码编辑器编辑。
-
输入
#重定向 [[主页面名称]]
或者
#REDIRECT [[主页面名称]]
即可。
例如将 Aragorn 重定向至阿拉贡页,只需:
-
建立 Aragorn 页,
-
使用源代码编辑器,输入
#重定向 [[阿拉贡]]
即可。
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 特有的功能,在日常编辑和维护过程中非常重要。
编辑历史的查看
历史版本的对比
维基的每一次编辑都会生成一个独有的历史版本,在页面的 “查看历史” 入口中能够看到本页面从创建起的所有历史版本和对应信息。
- 对比历史版本
您可以选择两个不同的版本进行对比,编辑器会清晰的表示出改动的内容。
历史版本的回退
历史的回退
- 方法一,选取某个版本,点击 “撤销” 进行操作
- 方法二,点击某个历史版本的链接,进入其页面,然后点击 “保存编辑”,这个历史版本将覆盖现有版本。
2.6 删除
删除页面有两种方式:
- 一是对某个页面进行单独删除操作,如在某个页面中点击删除按钮:
-
二是对最近页面进行批量删除,需要在
特殊页面
中找到大量删除
按钮,然后列举页面,批量选择页面即可。
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软件所识别的特定字符串,并且符合条件时会自动转换为链接。目前中文维基百科支持的此类魔术语法有ISBN、PMID以及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 的扩展插件功能提供了非常多非常丰富的解析器函数。我们可以在 特殊页面:版本
最下部,看到当前平台所支持的解析器函数:
一般在扩展插件的 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,无边框)
-
必须创建并插入 (至少) 一个表格,如天大两院院士列表:
-
必须在该页面使用 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)
-
任务 4:创建一个新页面,在该页面中实操 MediaWiki 的解析器函数。要求:
- 使用 5 个基础函数
- 使用 3 个 Var 系列函数
- 将基础函数与 Var 系列函数结合使用
进阶:
- 参考维基百科,填充 “北洋大学 (日本)” 页面的内容
- 安装 “消歧义” 插件并在消歧义页进行使用
- 安装并使用 Maps 插件的解析器函数
Last modified on 2023-11-03