V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
chingli
V2EX  ›  分享创造

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

  •  1
     
  •   chingli · 2020-06-18 14:45:10 +08:00 · 3299 次点击
    这是一个创建于 1401 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    17 条回复    2020-06-24 13:56:20 +08:00
    cmdOptionKana
        1
    cmdOptionKana  
       2020-06-18 14:51:01 +08:00
    已经有了,reStructuredText
    chingli
        2
    chingli  
    OP
       2020-06-18 14:55:31 +08:00
    @cmdOptionKana 你仔细比较一下我介绍的和 reStructuredText 的区别,我觉得差别很大很大的。
    chingli
        3
    chingli  
    OP
       2020-06-18 15:14:50 +08:00
    主要特点是:

    1. 元素的标记方法和以往常见方法又很多不同(不一定不原来更好,但只有这种标记方法才能满足一些特殊需求,如添加类、ID 以及其他属性)。
    2. 具有几乎与 HTML5 相匹配的文档描述能力。
    3. 更适用于科学技术报告、学术论文、书籍的书写,具有图、表、公式等的自动编号、交叉引用和索引功能。
    4. 具有灵活的文档组织能力。
    5. 尽可能保持语法的一致性和对称性。
    6. 当使用相对高级的功能时,所生成 HTML 文本的正确显示需要依赖特定的层叠样式表(CSS)甚至 JavaScript 代码。
    flyhelan
        4
    flyhelan  
       2020-06-18 18:04:05 +08:00
    能不能用数字序号介绍功能,而不是圆点?不然不知道你设计了多少功能,对读者心智是一种负担。以及 这些功能里哪些是需要优先解决的和同一类型的功能?
    Roung
        5
    Roung  
       2020-06-18 18:19:51 +08:00 via Android
    标记语言现在是 md 一家独大,其他的可以看 scribble 和 asciidoc
    Mohanson
        6
    Mohanson  
       2020-06-18 18:27:16 +08:00
    支持自己动手玩一下, 学一学 parser 和 compiler 也是好的.
    JackalZhao
        7
    JackalZhao  
       2020-06-18 23:12:15 +08:00 via Android
    喜欢 md,但也不爽 md 。我觉得大势难逆。
    因为推广 md 的人都是程序员,学术界的哪些公式编号、论文引用,程序员都用不到。
    chingli
        8
    chingli  
    OP
       2020-06-19 02:04:48 +08:00
    @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>。为了解决在中文输入法下输入标记符号麻烦的问题,规定了可以使用英文标点符号,而在解析时可将其转换为中文标点符号。如用 ... 表示半个省略号 …,用 --- 表示半个破折号 —,这里比较麻烦的是英文中没有顿号,所以目前暂时用两个逗号 ,, 表示顿号。
    chingli
        9
    chingli  
    OP
       2020-06-19 02:06:22 +08:00
    @JackalZhao 说实在的,这个格式主要不是面向程序员设计的。我是一个不愿意学也不愿意用 LaTeX 的人。
    krjt
        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
    chingli
        11
    chingli  
    OP
       2020-06-19 14:24:13 +08:00
    @krjt 粗看了一下 Pollen,感觉在标记语法上跟我设计的稍微有点像,即都是用标记加括号对界定的内容。

    不过它所有的标记都用英文单词,还用一个奇怪的 ◊ 符号开头,这点我不喜欢。我觉得轻量级标记语言就应该有点折中,常用的标记用标点符号来标记会更好点。其他自定义的 class 、id 、甚至和 HTML 对应的标记名称允许使用多种语言会更好(如中文用户不用“abbr”,而直接用“缩写”)。

    另外看介绍它用的标记似乎要超越 HTML,我觉得不必要,对标 HTML 有利于内容的发布。

    ——我没有仔细看,或许我评价的不对。
    flyhelan
        12
    flyhelan  
       2020-06-21 08:51:42 +08:00
    @chingli 还是会支持你一下。需要啥协助吗?比如一起撰写开发文档,或者成立一个 QQ 内测群。
    chingli
        13
    chingli  
    OP
       2020-06-21 22:04:22 +08:00
    @flyhelan 谢谢,我自己的精力就只能把规范写出来,编程实现我没功夫做,到时候就在 Github 上把规范公开发布出来。不过感觉大家都不太在意这个,或许这种设计不太吸引人,收到的反馈太少了。
    gilgameshcc
        14
    gilgameshcc  
       2020-06-22 17:04:19 +08:00
    哈哈,最近也在构思这方面的东西,md 加一些其他要素,构成一门新的标记语言。可能主要会从 roam research 和 obsidian 中入手一些灵感。也可能基于注释做一些文章,说不定会很有用。不过一门大众的标记语言用户群推广还是很重要的,毕竟需要能更易用(这也得基于有更多人用),要不断迭代才能做好
    chingli
        15
    chingli  
    OP
       2020-06-23 01:01:37 +08:00
    @gilgameshcc 你说的这两个似乎都有共同的卖点——类似于 MediaWiki 内部链接的功能。有时间我也多了解一下他们。

    另外我原来也是想针对 Markdown 修修补补,但后来发现无法满足我的主要要求,干脆就来个系统性更改。
    gilgameshcc
        16
    gilgameshcc  
       2020-06-23 12:53:02 +08:00
    @chingli 是这样的,不过我更倾向于完全的做出来,并且让它成为一门非常大众化的语言,因此要处理的东西比较多。其实如果能从 md 直接加一些模块改出(有基础,改动小)来或者独立开一个存粹的标记语言(轻量级,插入标记到其他文件里的)也是可能满足需求的。
    主要目标在于双向连接和对象关系网络化这里。完全独立构建会带来比较大的推广压力,同时也可能会有更高的用户学习成本,不过也不是不行,需要进一步考虑
    no1xsyzy
        17
    no1xsyzy  
       2020-06-24 13:56:20 +08:00
    pandoc-flavoured markdown
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2694 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:15 · PVG 13:15 · LAX 22:15 · JFK 01:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.