#标记语言 #HTML #解析器 #Markdown解析器 #kami

bin+lib kami-parser

Kami试图成为以机器优先,同时以人为本的标记语言

22个版本 (7个破坏性版本)

0.8.1 2022年8月5日
0.7.0 2022年8月2日
0.6.4 2022年7月26日

2274解析实现

Download history 93/week @ 2024-04-01

每月57次下载

自定义许可证

50KB
1K SLoC

KAMI

Kami Logo

Kami是一种以机器优先,同时以人为本的标记语言,旨在设计时并非为了人类的可读性,而是为了在人类的设计愿望和机器逻辑之间的可用性。Kami从Pandoc的Markdown风味和Textile中汲取灵感,后者是我最喜欢的标记语言。其名称代表Katie Ampersand的标记工具。我选择“工具”而不是“语言”,因为KAMI是一个非常可爱的缩写。

Kami文件应使用.km扩展名,例如file.km

使用(在Rust包中)

唯一的公共方法是syntax::parse(),它接受一个字符串并输出一个HTML字符串。

use kami_parser::syntax;

fn main() {
	println!("{}", syntax::parse("*bold text*")); // <b >bold text</b>
}

哲学

看到Markdown和Kami之间的相似之处,你可能想知道我为什么还要费心制作这个。原因很简单:Markdown过于以人为中心。当然,没有一种Markdown风味,但我看到的大多都过于关注于可以被猜测和阅读的东西,而不是可以被使用的东西。这并不一定是一个坏目标,但它并不是一个能够很好地与我喜欢的功能方式相匹配的目标,我发现它过于限制了。

Kami的设计理念是,标记语言与编程语言在实现目标的方式上并不相同。编程语言是为人类设计的,如果它更侧重于机器,那么你会得到汇编语言,或者更接近它。标记语言应该位于中间。HTML因为过于侧重于机器而难以使用,而Markdown或Textile可能因为过于关注人类可读性和用例而有限制。在这个极端的世界中,Kami试图站在中间。

(这也让我想了解一下在编程语言和汇编代码之间的更中间的东西会是什么样子)

人类可读性仍然是目标,但它永远不应该限制可以完成的事情。Kami严格是思想和HTML之间的中间件,并不打算被任何人阅读,对我来说,这才是标记语言应该努力追求的。

Kami 的最终目的是满足我的需求,这正是我对标记语言所期望的。虽然它试图通用,但它并不总是关心这一点。它可能对你的特定目标来说更差,但这没关系。这就是为什么有这么多标记语言的原因——我只是不是第一个对现有的东西感到不满意的人。

规范

粗体斜体和强烈的同理心(粗体、斜体、强和强调)

Kami 区分了粗体和强,以及斜体和强调。这是因为屏幕阅读器关心这种区别。粗体被星号包围(*),斜体被下划线包围(_)。强和强调相同,只是双重(**__)。我过去经常忘记这一点(Textile就是这样做的),所以我想到了这个部分标题中看到的助记符。我只是记住了这个序列 * _ ** __。希望这也能帮助你。

下标和上标

下标被 ~ 包围,上标被 ^ 包围。它们 可以 包含空格。

下划线和删除线

删除线文本被破折号(-)包围,下划线文本被双破折号(-)包围。这种语法可能会改变,因为我认为它很糟糕。

超链接使用 Markdown 格式:[可见文本](目标)。可见文本部分可以包含任何其他内联标记(如粗体或图片)

图片

图片被感叹号包围,如下所示:!example.png

要为它们添加超链接,只需像这样将它们放入 Kami 超链接中:[!img.png!](example.net)

要添加 alt 文本,只需添加一个属性:!img.png!{alt="A monkey eating a burrito as the sun illuminates them, making them look angelic"}

跨度

跨度应该用感叹号(@)包围。

内联代码

内联代码应该用反引号包围,就像 Markdown 中那样。

标题

标题的创建方式与 Markdown 相同,使用一系列的井号(#)。

列表

无序列表在段落开头用 * 标记。星号后面的空格是标记的一部分。有序列表在段落开头用 #. 标记。点后面的空格是标记的一部分。

要嵌套列表,只需添加更多的星号或井号,例如

* Main list element
** Sublist element

列表可以是任意嵌套的,这意味着你可以在无序列表中嵌套有序列表,反之亦然,按照你想要的任何配置,次数不限。

属性

这里提到的所有内容都可以有id、class以及你可能关心的任何HTML属性。只需在受影响的部分之后简单这样做 {#id .class1 .class2 属性="value"},中间不加空格。注意,以空格作为最后一个字符的标记(如列表的情况)不会移除该空格。它们保留该空格。

例如,**text**{#hey}会被解析为<strong id="hey">text</strong>,并且[link](ampersandia.net){rel="me"}会被解析为<a href="ampersandia.net" rel="me">link</a>

要给段落添加属性,只需在段落开头添加属性序列。

要给格式块(如列表的<ul> <ol>部分)添加属性,只需在块中的任何元素之前放置一个属性序列,如下所示

{#id .class)
* list element

行内HTML

行内HTML通过在文件中写入HTML来实现。如果一行以HTML标签开头,该行不会被视为段落(它不会被HTML <p>标签包围)。如果你希望它被包围,只需在行的开头添加一个空的属性序列。

为了使一行不被视为段落(即使它不会有HTML标签),只需使其以<>开头。

<title></title>
{} <iframe>
<> text

将被解析为

<title></title>
<p><iframe></p>
text

转义

每个标记都可以使用反斜杠进行转义。反斜杠也可以进行转义。转义将使解析器将字符解释为普通字符,而不是标记。你还可以通过将其包围起来转义整个行内部分,如下所示\=like this=

表格

KAMI表格在大多数情况下都非常简单。

| Data         | More data  | Some other data |
| Lots of data | You get it |                 |

(nvim强制我使用空格进行缩进,我只是有点允许它,但你应该用制表符美化你的表格。最终输出中将使用空格)

你可以通过以|*开始一个单元格使其成为标题。任何单元格都可以成为标题,而不仅仅是顶部的单元格。这允许创建垂直表格。

你可以使用|cXrY设置单元格的colspan和rowspan,其中X是colspan,Y是rowspan。如果你想只设置rowspan,只做|rY,如果你想只设置colspan,做|cXcXrYrXcY一样有效。

您可以通过以下方式设置单元格的属性:|{attr}

属性、跨行、跨列和标题标记可以以任何顺序放置。例如,|r5*{#id}c1 是一个有效的单元格起始符。只需确保对您来说是可读的。我个人使用 |rXcY*{attrs}

要在一行上放置属性,请在行的最后一个单元格后放置一个属性序列。

要在表格上放置属性,请在表格开始之前放置一个属性序列,就像处理列表一样。

依赖关系

~0.6–1.1MB
~27K SLoC