一种对mediawiki中模板系统的改造方案
前言
为了降低门槛,维基媒体基金会一直在推进『所见即所得』编辑器的发展;然而时至今日,MediaWiki 的可视化编辑器依旧功能孱弱,许多老编者依旧更青睐于源代码编辑。
造成这一局面除了是由于路径依赖以外,各种模板不方便进行可视化操作也是成因之一。各种丰富的模板缔造了繁荣的 wiki 生态,但它们形式上极其自由,为将模板引入可视化系统造成不便。
为此,我们亟需对模板的编写添加更多的限制,以便在可视化系统中查找、选择与引用模板,以及在为模板添加参数时生成对人类友好的表单。
我的设想对模板系统的改变无异于重构,对旧体系下的模板不兼容,很难实现,所以放在博客的“虚构”分类中,希望能博君一笑罢。
模板编辑模式
除了“前言”中提到的问题外,MediaWiki 模板中似乎已经图灵完备的解析器函数也需要改进。
MediaWiki是一套历史悠久的系统,当初为了在模板中实现一些简单逻辑的解析器函数愈发臃肿。所以我们新的模板是基于某个现代的编程语言的,鉴于MediaWiki本身依靠网页呈现,以及 JavaScript ES6 中“模板字符串”的新特性,我们决定基于JavaScript 来构建我们的模板系统。
创建新模板后,页面上将出现两个编辑区域,其中左边用来编辑模板的主体部分,右边用来编辑模板的逻辑部分。当使用模板时,网页将会把这两部分拼合成一个函数,并在页面对应位置引用这个函数。模板函数将会类似这个样子:
1 | function <模板名> () { |
我们来举一个简单的例子来说明模板的编辑方式:
模板:提示(旧版)
1 | <div style=" |
模板:提示(新版-主体部分)
1 | <div style=" |
模板:提示(新版-逻辑部分)
1 | // 模板的配置 |
模板的使用
在编辑模板的逻辑部分时,可以使用 template.<模板名>() 或 模板.<模板名>() 引用模板。
在其他地方,MediaWiki的语法已经足够完善了,但我也设计了一种函数风格的模板引用方式。具体地说,类似这样:
1 | (<模板名>( |
其中传入命名参数的那个对象必须置于最后一位。以上写法和下面等价:
1 | {{<模板名> |
模板的配置项
在编辑模板的逻辑部分时,需要定义模板的配置项(也就是 config 变量)。目前 config 中仅有 config.input 和 config.doc 两部分。
config.doc 定义了模板页的展示内容。当 config.doc 不存在时,模板页将展示一个默认状态下的模板,用户可以点击它,然后在弹出的表单中配置模板的各项传参(但不会保存),就像在可视化编辑中使用模板那样。用户可以通过这样的方式学习模板的用法。
config.input 定义了可向模板传入的参数,其中“$ + 数字”组成的参数代表数字参数。必须指定所有参数的类型,以便于在可视化编辑器中生成用于配置模板的表单。
为了便于记忆,参数的类型和其他属性的命名大部分来自 html 中的<input>标签,详情如下:
| 变量类型 | 备注 |
|---|---|
| text | 输入框 |
| textarea | 多行输入框 |
| radio | 单选按钮 |
| checkbox | 复选框,选中的内容将合并成一个数组 |
| color | 拾色器 |
| date | 日期,将会把时间戳赋值给参数 |
| datetime | 日期和时间 |
| time | 时间 |
| number | 数字,将提供“+1”和“-1”两个按钮 |
| url | 链接 |
| image | 图像,此处特指图像链接 |
| length | 长度,数字和单位拼接成的参数 |
| range | 滑块,将返回一个不精确的数字 |
以下是参数可选的其他属性:
| 参数属性 | 类型 | 备注 |
|---|---|---|
| name | 字符串、对象 | 规定了变量的别称,其中键为语言代码,会根据用户选择的语言命名对应的配置项。 |
| type | 字符串 | 规定了变量类型 |
| option | 数组 | 规定了可选择的项;当数组中的某一项是变量类型之一时,代表用户选择此项时可以自定义选项内容。 |
| checked | 基本类型、数组 | 规定了默认选定的值。 |
| max | 数字 | 规定了参数的上限 |
| min | 数字 | 规定了参数的下限 |
| maxlength | 数字 | 规定了参数的最大长度 |
| placeholder | 字符串 | 当参数类型为输入框时,规定了提示文本 |
| rows | 数字 | 当参数类型为多行输入框时,规定了输入框可见的行数 |
| required | 布尔值 | 规定是否为必填项 |