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 在 解析器实现 中
1,451 每月下载量
在 21 个 crate 中使用 (通过 markdown-it)
55KB
894 代码行
mdurl
优雅处理无效输入的 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