#parse-url #url #parser #input #formatter #js #port

mdurl

优雅处理无效输入的 URL 解析器和格式化工具

5 个不稳定版本

0.3.1 2022年9月17日
0.3.0 2022年9月16日
0.2.0 2022年9月13日
0.1.1 2022年9月10日
0.1.0 2022年9月10日

#2521解析器实现

Download history 351/week @ 2024-03-13 410/week @ 2024-03-20 369/week @ 2024-03-27 439/week @ 2024-04-03 392/week @ 2024-04-10 388/week @ 2024-04-17 326/week @ 2024-04-24 380/week @ 2024-05-01 307/week @ 2024-05-08 222/week @ 2024-05-15 538/week @ 2024-05-22 438/week @ 2024-05-29 467/week @ 2024-06-05 366/week @ 2024-06-12 279/week @ 2024-06-19 280/week @ 2024-06-26

1,451 每月下载量
21 个 crate 中使用 (通过 markdown-it)

MIT 许可证

55KB
894 代码行

mdurl

web demo github docs.rs crates.io coverage

优雅处理无效输入的 URL 解析器和格式化工具。

它是 mdurl.js 库的 Rust 版本,专门为 markdown-it 解析器中的 URL 渲染而创建。

URL 格式化器

此函数接收 URL,对其进行解码,并将其适应为 N 个字符,剩余部分用 "…" 符号替换(这被称为 "url elision")。

这类似于当您将鼠标悬停在链接上时,Chromium 在状态栏中向您显示的内容。

use mdurl::format_url_for_humans as format;
let url = "https://www.reddit.com/r/programming/comments/vxttiq/\
comment/ifyqsqt/?utm_source=reddit&utm_medium=web2x&context=3";

assert_eq!(format(url, 20), "reddit.com/…/ifyqsq…");
assert_eq!(format(url, 30), "www.reddit.com/r/…/ifyqsqt/?u…");
assert_eq!(format(url, 50), "www.reddit.com/r/programming/comments/…/ifyqsqt/?…");

请查看 此演示,以尝试不同的 URL 和长度。

humanize-url crate 尝试实现类似的目标,如果还有其他库,请告诉我。

URL 解析器

为了实现上述任务,必须创建一个新的 URL 解析器,所以这就是它

let url = "https://www.reddit.com/r/programming/comments/vxttiq/\
comment/ifyqsqt/?utm_source=reddit&utm_medium=web2x&context=3";
let u = mdurl::parse_url(url);

assert_eq!(u.hostname, Some("www.reddit.com".into()));
assert_eq!(u.pathname, Some("/r/programming/comments/vxttiq/comment/ifyqsqt/".into()));
assert_eq!(u.search, Some("?utm_source=reddit&utm_medium=web2x&context=3".into()));

此函数使用从 node.js 祖先 URL 解析器派生出来的非标准解析算法。

您可能应该使用 rust-url crate,但遗憾的是,它不适用于格式化 URL 的任务,因为您不能自定义由该库返回的 URL 的部分(例如,rust-url 将始终使用 punycode 编码非 ascii 主机名,此实现则不会)。

依赖项

~3–4.5MB
~98K SLoC