我准备设计这样一种(重型的)轻量级标记语言,大家来看看!
chingli很喜欢 Markdown,但实际使用时却不得不用看起来不太优雅的 MediaWiki 的语法,因为 Markdown 对较多涉及图表、公式这些接近学术文档的支持并不是很好。因此就想着自己也可以设计一种轻量级标记语言,构思了一段时间,基本想好了,但还没有全部写出来,先发要点发出来看看大家的反馈:
- 对于行内元素的标注,不使用
**着重强调**
这样的方式,而是使用一个标记符号加一系列用方括号对界定的被标记内容,如*[着重强调]
、^[上标]
。方括号对也可以有多对,如链接@[V2EX][https://www.v2ex.com/]
就是两对按特定顺序接连出现的方括号对。 - 块级元素的标记方式和行内元素差不多,但第一个方括号对必须是双方括号,且标记符号经常可以重复书写以表示级别或仅仅是为了醒目,如块级引用:
""""[[
我们要坚持人民至上、生命至上,统筹资源,团结合作,尽最大努力保护人民生命安全和身体健康,最大限度降低疫情负面影响。
我们要坚定不移携手抗击疫情;我们要坚定不移推进中非合作;我们要坚定不移践行多边主义;我们要坚定不移推进中非友好。
]]
多级无符号列表:
*[[列表项 1]]
*[[列表项 2]]
**[[列表项 21]]
**[[列表项 22]]
- 当块级元素只有一行,且只需要一对方括号时,可以使用简化的标记方式,即使用
单个或多个标记符号 + 单个或多个水平空白 + 不带方括号的内容
。如块级引用:
" 我们要坚持人民至上、生命至上,统筹资源,团结合作,尽最大努力保护人民生命安全和身体健康,最大限度降低疫情负面影响。
多级无符号列表:
* 列表项 1
* 列表项 2
** 列表项 21
** 列表项 22
插入代码可能不像 Markdown 那么优雅,单行代码的插入方式只能是:
` package main
- 块级元素所有行首的水平空白将被忽略,因此可以在行首加水平空白以对齐文本,美化文档。
- 段落和 Markdown 一样,即用空行分割的各行文本就是段落。但实际上段落有标记符号,其标记符号是句点
.
,只不过大部分时间省略了而已。但有时用句点放在其他块级标记符号后面,表示在该块级标记符号内部强制使用嵌套的段落标记,如:
*. 列表项 1
*. 列表项 2
其中各个列表项将被渲染为 <li><p>......</p></li>
的形式。
- 具有自动编号功能,形如
#[.编号类型#编号 ID][编号内容]
(如果不再引用该编号,其编号 ID 可以省略),如图的题注可以使用#[.图#具体的图像 ID][具体的图像标题]
这样的形式,其显示的文本形如图 1 具体的图像标题
。可以通过链接的形式引用该图像编号,如@[.图#具体的图像 ID][具体的图像标题]
。如果没有显式指定 ID,则默认的 ID 是“编号类型-编号内容”(需要将编号内容里面的水平空白转换为下划线)。 - 支持自定义的类和 ID 。如为行内引用文本添加自定义的类和 ID:
"[我们要坚定不移携手抗击疫情][.领导讲话#xi]
。 - 支持更多 HTML 属性,如为链接添加标题:
@[V2EX][https://www.v2ex.com/][title="创意工作者们的社区"]
。 - 扩展支持更多的 HTML 元素。键盘上的标记符号毕竟有限,有时使用更多的 HTML 元素还是很有必要的,这时可以使用扩展的元素,如
[*addr][地址文本]
、[*地址][地址文本]
将都被渲染为<addr>地址文本</addr>
。 - 支持多个文档按树状结构组合成一个文档。在任何时候书写单个文档时,不论该文档在总文档中的位置如何,其标题总是一级标题,下面是多个二级标题,依次类推。各级标题用
=
标记。实际渲染时,在单个文档以==
标记的二级标题可能并不总是被渲染为二级标题,而是根据上下文的情况进行渲染。这种方式特别有利于各个文档独立书写,将来组成书或总报告。 - 支持表格,形如:
+++++[[
-| 第 1 行第 1 列 | 第 1 行第 2 列 | 第 1 行第 3 列
-| 第 2 行第 1 列 | 第 2 行第 2 列 | 第 2 行第 3 列
-| 第 3 行第 1 列 | 第 3 行第 2 列 | 第 3 行第 3 列
-| 表格尾注
]]
或
+++++[[
= #[.表格][表格标题]
-| 第 1 行第 1 列
| 第 1 行第 2 列
| 第 1 行第 3 列
-| 第 2 行第 1 列
| 第 2 行第 2 列
| 第 2 行第 3 列
-| 第 3 行第 1 列
| 第 3 行第 2 列
| 第 3 行第 3 列
]]
上面的 =
开头的一行表示表格带编号的标题。
如果某个单元格内有很多行,就使用标记块级元素的标准标记方式(加双方括号),如
|[[
单元格内的第一行文本。
单元格内的第二行文本。
]]
以上只是介绍了关键的几点,还有很多很多功能和细节。总的来说,这种标记方法可以用少量标记符号写出类似 Markdown 这样易读的文本,但当对文档标记的需求很高时,也能写出几乎相当于 HTML 标记功能的文本。当然,解析器实现也不容易,需要许多依据上下文判断的智能化功能。
你或者仍然称其为轻量级标记语言,但其实很重的轻量级标记语言。
虽然想了几个月了,但我不确定大家是否能接受这样的标记语言,以及该怎么改进。欢迎鼓励或拍砖!