rustdoc: add doc_link_canonical feature #143158
Open
+77
−7
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
proposing this as a t-rustdoc experiment (do we have a process for those?), implementation was surprisingly simple so it's basically a complete implementation of my design (although ideally it would be integrated into cargo in the future using
--crate-attr
), will likely need FCP then RFC for stabilization, may also need perf testing to make sure added allocations have a negligible impact, not sure.fixes #143139
r? @GuillaumeGomez
Problem Statement
There are two main usecases for this feature:
docs.rs
.docs.rs
be their canonical documentation site, but their crate docs are frequently included in doc bundles hosted by a third party.In both these cases, this can cause search engines to duplicate results or show the wrong (non-canonical) page in results.
Solution
A new crate-level doc attribute is added,
html_link_canonical
, which adds alink rel="canonical"
element to the head of every documentation page (pages such as help and settings are excluded due to not belonging to any crate in particular), leveraging the existing system search engines use for de-duplicating equivalent pages.Future Work
html_link_canonical
is used with no value, it will use the value ofhtml_root_url
, or--extern-html-root-url
, if present.cargo
flag that implies-Zrustdoc-map
and passes--crate-attr='doc(html_link_canonical)'
to each rustdoc invocation. This will cause all crates that do not manually specifyhtml_root_url
orhtml_link_canonical
to use thedocs.rs
page as the canonical page. Alternatively, instead of implying-Zrustdoc-map
, it could simply reuse its logic, passing the value that would be passed to--extern-html-root-url
to be passed via--crate-attr='doc(html_link_canonical="...")'
.