#links #file-path #documentation #projects #markdown #transform #intra-doc-links

bin+lib cargo-intraconv

当合适时,将 Rust 项目的 Markdown 链接转换为文档内链接的简单辅助工具

6 个稳定版本

1.4.0 2020 年 12 月 2 日
1.3.0 2020 年 11 月 25 日
1.1.0 2020 年 10 月 29 日

Cargo 插件 中排名第 394

每月下载 24

MIT 许可证

235KB
6.5K SLoC

CI crates.io crates.io

Cargo intraconv

cargo-intraconv 是一个简单的辅助工具,它会在合适的场合将 Rust 项目的 Markdown 链接转换为 文档内链接

文档内链接已在 Rust 1.48.0 中稳定,有关更多信息,请参阅宣布它的博客文章

以前,要编写指向您自己的包(或其他包)其他元素的链接,只有以下方式,路径取决于当前文件和目标文件

/// [`make_ascii_uppercase`]: #method.make_ascii_uppercase

/// [`Path::ancestors`]: https://doc.rust-lang.net.cn/stable/std/path/struct.Path.html#method.ancestors

/// See [the `Rotation` type](../struct.Rotation.html)

现在,可以使用 Rust 路径来编写它们,取决于目标项的路径和作用域(这意味着位于预定义中的 String 这样的项只是 [String] 之遥)。这些链接对于最初编写它们的人以及随后的读者来说都更清晰。由于文件层次结构不影响它们,因此更容易进行推理。以下是对上述示例的文档内链接版本

/// [`make_ascii_uppercase`]: u8::make_ascii_uppercase()

/// [`Path::ancestors`]: std::path::Path::ancestors()

/// See [the `Rotation` type](super::Rotation)

当链接的两端相同,甚至可以更短

/// See [`Rotation`]
///
- /// [`Rotation`]: struct.Rotation.html

- /// See [`Rotation`](struct.Rotation.html)
+ /// See [`Rotation`]

为什么是这个包?

更改所有现有链接可能是繁琐的,也可以自动化。这个包旨在帮助您尽可能痛苦地更新文档以使用文档内链接。

用法

默认情况下,由该包产生的二进制文件不会修改给定的文件,只会显示会发生变化的内容

# Call `cargo-intraconv` for a whole crate or workspace. Crate names will be
# discovered from `Cargo.toml` files.
cargo intraconv

# Call `cargo-intraconv` for specific file. No automatic crate name discovery.
cargo intraconv path/to/std/file.rs

# Specifying the root crate.
cargo intraconv path/to/core/file.rs -c core

# Applying the changes.
cargo intraconv path/to/std/file.rs -a

# Disambiguate links by prefixing them with their rustdoc group ('type@', ...).
cargo intraconv path/to/my/file.rs -d

# Do not transform favored links to intra-doc links (see below for more).
cargo intravonc path/to/my/file.rs -f

# Do not display changes, only errors.
cargo intraconv path/to/my/file.rs -q

# Give a file containing links to ignore.
#
# Note: `intraconv.toml` is read by default when present.
cargo intraconv path/to/my/file.rs -i intraconv.toml

可以为文件或目录提供多个路径。在搜索精确路径时,cargo-intraconv将使用与-c一起提供的crate名称。对于目录,它将尝试在Cargo.toml中查找crate名称,如果无法将名称转换为有效的Rust标识符,则回退到默认的-c

注意:intraconv将接受任何文件,而不仅仅是.rs文件:例如,您可以在Rust文件中作为文档包含的Markdown文件上使用它。

默认情况下,crate会将首选的http(s)://链接转换为内部文档链接(如来自docs.rs的链接)。要禁用此行为,请使用---no-favored)标志。

cargo-intraconv并不完美,有时会错误地转换链接,例如在#31中提到的情况。要修复这个问题,您可以选择手动操作(如果您只运行一次),但如果您因为更改显著而多次运行它,这会很快变得重复且容易出错。对于一个旨在减少重复和容易出错的工作的工具,这真是一件令人遗憾的事情!

如果没有传递--ignore-file-),默认情况下cargo-intraconv将读取ìntraconv.toml(尽管如果它缺失,它不会产生错误或警告,因为它是一个默认检查)。

要修复此问题,您可以编写一个包含要忽略的链接的TOML格式的文件

# Global ignores, applied everywhere.
[ignore]
# Will be deleted by the second instance of `"name"`.
"name" = [ "link 1" ] # Must be an array, a single value will not work,
                      # this allows for multiples values easily.
"name" = [ "link 2" ]
# Will only keep one instance of 'link 3'.
"other name" = [ "link 3", "link 3", "link 1" ]

# Will match exactly the lib.rs file in tracing-core.
# NOTE: this path must either be absolute OR relative to the EXACT directory
# from which `cargo-intraconv` is called.
#
# Paths must be unique whether canonicalized (for paths with more than one
# component) or not (paths with a single component, as `lib.rs` below).
["tracing-core/src/lib.rs"]
# Will match both 'downcast_ref' and '`downcast_ref`' links.
"downcast_ref" = [ "#method.downcast_ref" ] # Must be an array.

# Will match EVERY lib.rs file found.
["lib.rs"]
"downcast_ref" = [ "#method.downcast_ref" ]

在链接名称周围使用反引号(`)是不受支持的:这将永远不会匹配任何链接

[ignore]
# NEVER matches.
"`downcast_ref`" = [ "#method.downcast_ref" ]

已知问题

内部文档链接和此crate都有几个已知问题,其中大部分应该在crate或Rust的未来的版本中得到解决。

有关内部文档链接的问题,您应该在rust-lang/rust查看问题。

关于此crate的问题,这里有一个

  • #method.method_name链接有时会被转换为指向错误的项目。这是因为intraconv使用正则表达式来查找链接及其相关类型,这不是完美的。

缺点

它不是一个官方的工具,它目前的工作方式是基于正则表达式的。这种方法意味着它很容易理解,但它有几个缺点。例如,cargo-intraconv不了解use,并且会欣然忽略它们,即使它们可以缩短或删除链接。

另请参阅

cargo-deadlinks是另一个用于文档和链接的工具。它与cargo-intraconv配合使用效果非常好!

贡献

任何形式的贡献都是受欢迎的!您可以打开问题或PR,我会尽力快速回答您!

许可

请参阅仓库根目录下的LICENSE

依赖项

~5–7MB
~128K SLoC