10个版本 (5个重大更改)

0.6.0 2023年10月2日
0.5.0 2022年9月23日
0.4.1 2021年1月4日
0.4.0 2020年12月2日
0.1.0 2018年6月1日

#516 in 算法

Download history 264/week @ 2024-04-08 176/week @ 2024-04-15 236/week @ 2024-04-22 409/week @ 2024-04-29 321/week @ 2024-05-06 123/week @ 2024-05-13 149/week @ 2024-05-20 160/week @ 2024-05-27 130/week @ 2024-06-03 179/week @ 2024-06-10 103/week @ 2024-06-17 130/week @ 2024-06-24 194/week @ 2024-07-01 234/week @ 2024-07-08 187/week @ 2024-07-15 127/week @ 2024-07-22

每月753次下载

GPL-3.0-or-later

66KB
1K SLoC

HTML2Pango

一个小的Rust库,用于解析简单的HTML标签并将其转换为pango。此库还将原始链接转换为HTTP链接,并清理消息以避免不希望出现的标签。

库的当前状态为Alpha,因为它是将HTML子集映射到pango标记的验证概念。

此代码最初在Fractal项目中,用于解析包含链接的matrix.org消息,并将其绘制在GtkLabel中。我们决定将其迁移到此仓库,以便能够扩展并在其他项目(如Hammond)中使用。


lib.rs:

用于清理和将HTML字符串转换为Pango可以渲染的库。

此库包含多个函数,用于(预)处理文本,以便转换为Pango标记。使用什么以及何时使用取决于输入类型和期望的结果。这可以是从简单的转义到转换和清理。请参阅以下示例,了解根据输入类型可用的功能。

以下函数将字符串转换为字符串。如果您的输入可以包含多个块元素,例如标题、列表、代码或引用块,请参阅block模块,以将输入字符串转换为这些块列表。

Markdown/body HTML

要处理更多的HTML,请使用markup_html函数。此函数支持HTML正文标记,例如由Markdown到HTML转换产生的HTML。它尝试将输入转换为Pango Markup,以便Pango的渲染与浏览器相似。这包括为段落和列表添加换行符、转换字体样式等。

let m = markup_html("<body>this is some <font color=\"#ff0000\">red text</font>!</body>").unwrap();
assert_eq!(m, "this is some <span foreground=\"#ff0000\">red text</span>!");

let m = markup_html("<body>a nice <a href=\"https://gnome.org\">link</a>").unwrap();
assert_eq!(m, "a nice <a href=\"https://gnome.org\">link</a>");

let m = markup_html("<body>some items: <ul><li>first</li><li>second</li></ul><body").unwrap();
assert_eq!(m, "some items: \n • first\n • second\n");

转义

要仅转义任何HTML保留字符,请使用html_escape

let s = html_escape("this is a <tag> & this is \"quoted text\"");
assert_eq!(s, "this is a &lt;tag&gt; &amp; this is &quot;quoted text&quot;");

矩阵自定义HTML

对于Matrix,其规范定义了一种自定义HTML格式,该格式指定了可以使用的标签和属性。使用matrix_html_to_markup来处理这种自定义HTML输入,以确保在转换之前输入已得到清理。

此函数仍在开发中!

简单HTML

简单HTML是指仅包含一些格式化标签的纯文本,例如<strong><i><code>等。有关支持的完整标签列表及其替换方式,请参阅markup_from_raw

经过清理

如果您使用markup,则支持的标签将被替换(如有必要),无效的标签将被删除,HTML保留字符将被转义。

let m = markup("<p><strong>this <i>is &sanitized<f;><unsupported/></i></strong></p>");
assert_eq!(m, "<b>this <i>is &amp;sanitized</i></b>");

其他不受支持但有效的标签将被转义。

let m = markup("this is <span>a tag</span>");
assert_eq!(m, "this is &lt;span&gt;a tag&lt;/span&gt;");

URI将被替换为链接。

let m = markup("go to: https://gnome.org");
assert_eq!(m, "go to: <a href=\"https://gnome.org\">https://gnome.org</a>");

未经过清理

如果您已经清理了输入,请使用markup_from_raw

let m = markup_from_raw("<p>this is <unsupported>already sanitized</unsupported></p>");
assert_eq!(m, "this is &lt;unsupported&gt;already sanitized&lt;/unsupported&gt;");

要仅将URI替换为链接,请使用markup_links

let m = markup_links("go to: https://gnome.org");
assert_eq!(m, "go to: <a href=\"https://gnome.org\">https://gnome.org</a>");

依赖项

~5–12MB
~146K SLoC