38 个版本
0.27.2 | 2023年10月19日 |
---|---|
0.26.4 |
|
0.23.4 | 2022年7月30日 |
0.23.3 | 2021年9月26日 |
0.11.0 | 2020年11月30日 |
在 解析器实现 中排名 #134
每月下载量 15,064
在 14 个 仓库中(直接使用 11 个)
250KB
4.5K SLoC
解析超链接
Parse-hyperlinks,一个使用 Nom 编写的解析库,用于识别 Markdown、reStructuredText、Asciidoc 和 HTML 格式文本输入中的超链接和链接引用定义。
该库实现了 CommonMark 规范 0.30、reStructuredText 标记规范(修订 8571,日期 2020-10-28)、Asciidoctor 用户手册,第 26 章(日期 2020-12-03)和 HTML 5.2:第 4.5 节 的规范。
为了说明库的使用和 API,Parse-hyperlinks 附带了一个简单的命令行应用程序:Atext2html
Parse-Hyperlinks 输入合同
-
所有输入均为 UTF-8 编码。
-
输入文本格式符合上述标记语言规范之一。由于 Parse-Hyperlinks 忽略了大部分标记,它完全依赖于各自标记语言的超链接规范。
通用 HTML 要求
-
HTML 文档中绝对 URL 的字符
&<>"
必须进行 HTML 转义编码:这些字符被替换为其实体名称,例如&
、<
、>
和"e
。 -
UTF-8 编码的 HTML 文档中的相对 URL(本地链接)不需要进行 HTML 转义编码。建议不要这样做。
-
相对 URL(本地链接)不得以方案开头,例如
html:
。 -
除了HTML转义编码外,URL还可以进行百分编码,例如
%20
或%26
。当这两种编码在HTML文档中同时出现时,首先应用HTML转义解码,然后是百分编码。例如,编码后的字符串Ü ber%26amp;Über &
被解码为Ü ber&Über &
。通常情况下,UTF-8 HTML文档中的URL可以不进行百分编码,这是推荐的。
Parse-Hyperlinks 输出保证
以下部分解释了Parse-Hyperlinks如何满足上述通用HTML要求。它引用了上述列表中的项目。
-
只有
renderer
模块中的函数,在HTML文档中对绝对URL进行HTML转义编码:字符&<>"
被替换为它们的HTML转义实体名称,例如:&
,<
,>
和"e
。所有其他解析器和迭代器不对绝对URL应用HTML转义编码。 -
Parse-Hyperlinks中的任何函数、解析器或迭代器都不对相对URL应用转义编码。
-
此属性不由Parse-Hyperlinks强制执行。合规性取决于解析器的输入。
-
Parse-Hyperlinks中的百分编码
-
在Parse-Hyperlinks中不执行任何百分编码。
-
百分解码:在某些情况下,当标记语言规范要求输入URL进行百分编码时,相关的消耗解析器会自动解码百分编码。在消耗时隐式执行URL的百分解码。
- 当通过
md_text2dest()
解析Markdown自动链接时, - 当通过
adoc_label2dest()
,adoc_text2dest
解析Asciidoc URL时, - 当通过
wikitext_text2dest()
解析WikiText URL时,
- 当通过
-
渲染自动链接标记
-
相同的Markdown输入可能根据渲染器产生不同的HTML。例如:
pulldown-cmark
将Markdown自动链接<http://getreu.net/Ü%20&>
渲染为<a href="http://getreu.net/%C3%9C%20&">http://getreu.net/Ü%20&</a>
。- 观察1:渲染包含百分和HTML转义代码。
- 观察2:链接目标(
http://getreu.net/%C3%9C%20&
)和链接文本(http://getreu.net/Ü%20&
)略有不同,这在基于HTML渲染检测自动链接时必须考虑。
-
Parse-Hyperlinks Markdown渲染器对于相同的输入
<http://getreu.net/Ü%20&>
给出了略微不同的结果:<a href="http://getreu.net/Ü%20&">http://getreu.net/Ü &</a>
。解释:首先解析器md_text2dest()
(百分号)将URL解码为http://getreu.net/Ü &
,模块中的渲染函数renderer
(HTML转义)将结果编码为http://getreu.net/Ü%20&
-
-
依赖项
~1.3–2MB
~41K SLoC