我准备设计这样一种(重型的)轻量级标记语言,大家来看看!

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 标记功能的文本。当然,解析器实现也不容易,需要许多依据上下文判断的智能化功能。

你或者仍然称其为轻量级标记语言,但其实很重的轻量级标记语言。

虽然想了几个月了,但我不确定大家是否能接受这样的标记语言,以及该怎么改进。欢迎鼓励或拍砖!

6 条回复  •  2020-06-18 18:27:16 +08:00
cmdOptionKana
cmdOptionKana5 小时 26 分钟前
已经有了,reStructuredText
1
chingli
chingli5 小时 22 分钟前
@cmdOptionKana 你仔细比较一下我介绍的和 reStructuredText 的区别,我觉得差别很大很大的。
2
chingli
chingli5 小时 3 分钟前
主要特点是:

1. 元素的标记方法和以往常见方法又很多不同(不一定不原来更好,但只有这种标记方法才能满足一些特殊需求,如添加类、ID 以及其他属性)。
2. 具有几乎与 HTML5 相匹配的文档描述能力。
3. 更适用于科学技术报告、学术论文、书籍的书写,具有图、表、公式等的自动编号、交叉引用和索引功能。
4. 具有灵活的文档组织能力。
5. 尽可能保持语法的一致性和对称性。
6. 当使用相对高级的功能时,所生成 HTML 文本的正确显示需要依赖特定的层叠样式表(CSS)甚至 JavaScript 代码。
3
flyhelan
flyhelan2 小时 13 分钟前
能不能用数字序号介绍功能,而不是圆点?不然不知道你设计了多少功能,对读者心智是一种负担。以及 这些功能里哪些是需要优先解决的和同一类型的功能?
4
Roung
Roung1 小时 58 分钟前 via Android
标记语言现在是 md 一家独大,其他的可以看 scribble 和 asciidoc
5
Mohanson
Mohanson1 小时 50 分钟前
支持自己动手玩一下, 学一学 parser 和 compiler 也是好的.
6