很喜欢 Markdown,但实际使用时却不得不用看起来不太优雅的 MediaWiki 的语法,因为 Markdown 对较多涉及图表、公式这些接近学术文档的支持并不是很好。因此就想着自己也可以设计一种轻量级标记语言,构思了一段时间,基本想好了,但还没有全部写出来,先发要点发出来看看大家的反馈:
**着重强调**
这样的方式,而是使用一个标记符号加一系列用方括号对界定的被标记内容,如 *[着重强调]
、^[上标]
。方括号对也可以有多对,如链接 @[V2EX][]
就是两对按特定顺序接连出现的方括号对。""""[[ 我们要坚持人民至上、生命至上,统筹资源,团结合作,尽最大努力保护人民生命安全和身体健康,最大限度降低疫情负面影响。 我们要坚定不移携手抗击疫情;我们要坚定不移推进中非合作;我们要坚定不移践行多边主义;我们要坚定不移推进中非友好。 ]]
多级无符号列表:
*[[列表项 1]] *[[列表项 2]] **[[列表项 21]] **[[列表项 22]]
单个或多个标记符号 + 单个或多个水平空白 + 不带方括号的内容
。如块级引用: " 我们要坚持人民至上、生命至上,统筹资源,团结合作,尽最大努力保护人民生命安全和身体健康,最大限度降低疫情负面影响。
多级无符号列表:
* 列表项 1 * 列表项 2 ** 列表项 21 ** 列表项 22
插入代码可能不像 Markdown 那么优雅,单行代码的插入方式只能是:
` package main
.
,只不过大部分时间省略了而已。但有时用句点放在其他块级标记符号后面,表示在该块级标记符号内部强制使用嵌套的段落标记,如:*. 列表项 1 *. 列表项 2
其中各个列表项将被渲染为 <li><p>......</p></li>
的形式。
#[.编号类型#编号 ID][编号内容]
(如果不再引用该编号,其编号 ID 可以省略),如图的题注可以使用 #[.图#具体的图像 ID][具体的图像标题]
这样的形式,其显示的文本形如 图 1 具体的图像标题
。可以通过链接的形式引用该图像编号,如 @[.图#具体的图像 ID][具体的图像标题]
。如果没有显式指定 ID,则默认的 ID 是“编号类型-编号内容”(需要将编号内容里面的水平空白转换为下划线)。"[我们要坚定不移携手抗击疫情][.领导讲话#xi]
。@[V2EX][][title="创意工作者们的社区"]
。[*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 标记功能的文本。当然,解析器实现也不容易,需要许多依据上下文判断的智能化功能。
你或者仍然称其为轻量级标记语言,但其实很重的轻量级标记语言。
虽然想了几个月了,但我不确定大家是否能接受这样的标记语言,以及该怎么改进。欢迎鼓励或拍砖!
![]() | 1 cmdOptionKana 2020-06-18 14:51:01 +08:00 已经有了,reStructuredText |
![]() | 2 chingli OP @cmdOptionKana 你仔细比较一下我介绍的和 reStructuredText 的区别,我觉得差别很大很大的。 |
![]() | 3 chingli OP 主要特点是: 1. 元素的标记方法和以往常见方法又很多不同(不一定不原来更好,但只有这种标记方法才能满足一些特殊需求,如添加类、ID 以及其他属性)。 2. 具有几乎与 HTML5 相匹配的文档描述能力。 3. 更适用于科学技术报告、学术论文、书籍的书写,具有图、表、公式等的自动编号、交叉引用和索引功能。 4. 具有灵活的文档组织能力。 5. 尽可能保持语法的一致性和对称性。 6. 当使用相对高级的功能时,所生成 HTML 文本的正确显示需要依赖特定的层叠样式表(CSS)甚至 Javascript 代码。 |
![]() | 4 flyhelan 2020-06-18 18:04:05 +08:00 能不能用数字序号介绍功能,而不是圆点?不然不知道你设计了多少功能,对读者心智是一种负担。以及 这些功能里哪些是需要优先解决的和同一类型的功能? |
![]() | 5 Roung 2020-06-18 18:19:51 +08:00 via Android 标记语言现在是 md 一家独大,其他的可以看 scribble 和 asciidoc |
![]() | 6 Mohanson 2020-06-18 18:27:16 +08:00 支持自己动手玩一下, 学一学 parser 和 compiler 也是好的. |
![]() | 7 JackalZhao 2020-06-18 23:12:15 +08:00 via Android 喜欢 md,但也不爽 md 。我觉得大势难逆。 因为推广 md 的人都是程序员,学术界的哪些公式编号、论文引用,程序员都用不到。 |
![]() | 8 chingli OP @flyhelan 我用 Markdown 写的这个帖子。你说用数字序号介绍功能,这正是 Markdown 不容易做到的。因为许多项的功能需要多个段落介绍,而 Markdown 很难做到一个列表项中有多个段落,且保持列表项编号连续,所以将就着就用无符号列表了。反而,用我设计这个格式,就容易做到了,如: #[[ 列表项 1 的段落 1 段落 2 ]] # 列表项 2 (上面井号表示有序列表项,没有用 Markdown 中的数字法,因为需要用两个井号 ## 表示次级列表) 这里只是很简略随意写了部分功能,至于解决了哪些痛点,如何解决,我正在用一个长长的文档在详细讨论这个东西写起来很折磨人。这里简要说一下解决了哪些痛点吧: 1. 常见的轻量级标记语言难以写作学术文档的问题。学术文档有大量的图、表、公式、参考文献,需要对他们进行自动编号、引用、生成索引等,常见的轻量级标记语言很难做到,另外 Markdown 甚至都没有上下标标记,更没有针对变量元素 var 的标记。 2. 大型文档的写作与组织问题。这个格式要尽量做到让用户无心智负担地写大型文档,即将大型文档分割成多个单元,每个单元就像写一篇博客一样,在写作时除了交叉引用,不用考虑该单元在整体文档中的位置,可以很容易地将他们组织在一起形成大型文档。这些主要是通过规定如何更具上下文灵活判定各个标题的大纲级别来实现的。以及设计在文本中包含参考文献等编号项,而不是在文末给定编号项列表。 3. 语法的一致性问题。其他各种标记语言对不同的元素有多种语法,而本格式的语法基本上可归纳为“标记符号 + 以方括号界定的内容或属性序列”。由于大多数情况下都遵循相同的标记规则,因此学习起来负担相对较小。 4. 重新设计**本人认为**最合理的标记元素。如在行内元素中,分别用 +、-、*、/ 表示插入、删除、着重强调和强调,这些都非常便于联想记忆。用 ^、_ 表示上下标,这是为了和 LaTeX 保持一致。用 = 表示各级标题,这是我觉得等号比较容易输入,而井号要用来表示编号列表、ID 等。 5. 功能扩展问题。Markdown 支持的元素类型有限,而该格式则更多,该格式还能较容易地为元素添加类、ID,以及其他自定义属性,甚至该格式还能添加与 HTML 各种语义化标记对应的 figure 、figcaption 、abbr 、address 、kbd 、time 等(有时候是很有必要使用这些标记的)。在某种程度上,该格式与 HTML5 的常用语义化排版标记是等价的。 6. 块级元素的嵌套问题。Markdown 中很难做到各种块级元素正确嵌套,如前面提到的列表项中很难嵌套多个段落,以及单个表格单元中有多个段落,甚至表格单元中嵌套表格。本格式由于使用了方括号对作为内容或属性的定界符,因此很容于做到块级元素嵌套。另外针对各种块级元素嵌套段落元素,还做出了各种特殊的简化规定。 7. 中文支持问题。该格式默认段落内换行符就是 <br>。为了解决在中文输入法下输入标记符号麻烦的问题,规定了可以使用英文标点符号,而在解析时可将其转换为中文标点符号。如用 ... 表示半个省略号 …,用 --- 表示半个破折号 ,这里比较麻烦的是英文中没有顿号,所以目前暂时用两个逗号 ,, 表示顿号。 |
![]() | 9 chingli OP @JackalZhao 说实在的,这个格式主要不是面向程序员设计的。我是一个不愿意学也不愿意用 LaTeX 的人。 |
![]() | 10 krjt 2020-06-19 12:59:32 +08:00 其实你想实现的大部分功能都可以用 Pollen [1] 或者 Scribble [2] 实现( Pollen 是基于 Scribble 的)。表格可能会稍微麻烦点,但是由于在 Pollen 里每一个指令都是函数,这个可以自己写一个 string -> txexpr 的 parser 实现。 [1]: https://docs.racket-lang.org/pollen/third-tutorial.html [2]: https://docs.racket-lang.org/scribble/getting-started.html |
![]() | 11 chingli OP @krjt 粗看了一下 Pollen,感觉在标记语法上跟我设计的稍微有点像,即都是用标记加括号对界定的内容。 不过它所有的标记都用英文单词,还用一个奇怪的 符号开头,这点我不喜欢。我觉得轻量级标记语言就应该有点折中,常用的标记用标点符号来标记会更好点。其他自定义的 class 、id 、甚至和 HTML 对应的标记名称允许使用多种语言会更好(如中文用户不用“abbr”,而直接用“缩写”)。 另外看介绍它用的标记似乎要超越 HTML,我觉得不必要,对标 HTML 有利于内容的发布。 我没有仔细看,或许我评价的不对。 |
![]() | 13 chingli OP @flyhelan 谢谢,我自己的精力就只能把规范写出来,编程实现我没功夫做,到时候就在 Github 上把规范公开发布出来。不过感觉大家都不太在意这个,或许这种设计不太吸引人,收到的反馈太少了。 |
![]() | 14 gilgameshcc 2020-06-22 17:04:19 +08:00 哈哈,最近也在构思这方面的东西,md 加一些其他要素,构成一门新的标记语言。可能主要会从 roam research 和 obsidian 中入手一些灵感。也可能基于注释做一些文章,说不定会很有用。不过一门大众的标记语言用户群推广还是很重要的,毕竟需要能更易用(这也得基于有更多人用),要不断迭代才能做好 |
![]() | 15 chingli OP @gilgameshcc 你说的这两个似乎都有共同的卖点类似于 MediaWiki 内部链接的功能。有时间我也多了解一下他们。 另外我原来也是想针对 Markdown 修修补补,但后来发现无法满足我的主要要求,干脆就来个系统性更改。 |
![]() | 16 gilgameshcc 2020-06-23 12:53:02 +08:00 @chingli 是这样的,不过我更倾向于完全的做出来,并且让它成为一门非常大众化的语言,因此要处理的东西比较多。其实如果能从 md 直接加一些模块改出(有基础,改动小)来或者独立开一个存粹的标记语言(轻量级,插入标记到其他文件里的)也是可能满足需求的。 主要目标在于双向连接和对象关系网络化这里。完全独立构建会带来比较大的推广压力,同时也可能会有更高的用户学习成本,不过也不是不行,需要进一步考虑 |
![]() | 17 no1xsyzy 2020-06-24 13:56:20 +08:00 pandoc-flavoured markdown |