rustdoc: add new CLI flag to load static files from a different location
This PR adds a new CLI flag to rustdoc, `--static-root-path`, which controls how rustdoc links pages to the CSS/JS/font static files bundled with the output. By default, these files are linked with a series of `../` which is calculated per-page to link it to the documentation root - i.e. a relative link to the directory given by `-o`. This is causing problems for docs.rs, because even though docs.rs has saved one copy of these files and is dispatching them dynamically, browsers have no way of knowing that these are the same files and can cache them. This can allow it to link these files as, for example, `/rustdoc.css` instead of `../../rustdoc.css`, creating a single location that the files are loaded from.
I made sure to only change links for the *static* files, those that don't change between crates. Files like the search index, aliases, the source files listing, etc, are still linked with relative links.
r? @GuillaumeGomez
cc @onur
Rollup of 20 pull requests
Successful merges:
- #53506 (Documentation for impl From for AtomicBool and other Atomic types)
- #56343 (Remove not used mod)
- #56439 (Clearer error message for dead assign)
- #56640 (Add FreeBSD unsigned char platforms to std::os::raw)
- #56648 (Fix BTreeMap UB)
- #56672 (Document time of back operations of a Linked List)
- #56706 (Make `const unsafe fn` bodies `unsafe`)
- #56742 (infer: remove Box from a returned Iterator)
- #56761 (Suggest using `.display()` when trying to print a `Path`)
- #56781 (Update LLVM submodule)
- #56789 (rustc: Add an unstable `simd_select_bitmask` intrinsic)
- #56790 (Make RValue::Discriminant a normal Shallow read)
- #56793 (rustdoc: look for comments when scraping attributes/crates from doctests)
- #56826 (rustc: Add the `cmpxchg16b` target feature on x86/x86_64)
- #56832 (std: Use `rustc_demangle` from crates.io)
- #56844 (Improve CSS rule)
- #56850 (Fixed issue with using `Self` ctor in typedefs)
- #56855 (Remove u8 cttz hack)
- #56857 (Fix a small mistake regarding NaNs in a deprecation message)
- #56858 (Fix doc of `std::fs::canonicalize`)
Failed merges:
- #56741 (treat ref-to-raw cast like a reborrow: do a special kind of retag)
r? @ghost
Greatly improve rustdoc rendering speed issues
Fixes#55900.
So a few improvements here:
* we're switching to `DOMTokenList` API when available providing a replacement if it isn't (should only happen on safari and IE I think...)
* hide doc sections by default to allow the whole HTML generation to happen in the background to avoid triggering DOM redraw all the times (which killed the performances)
r? @QuietMisdreavus
Remove unneeded extra chars to reduce search-index size
Before:
```
2013782 Dec 11 10:16 build/x86_64-unknown-linux-gnu/doc/search-index.js
```
After:
```
1736597 Dec 11 10:50 build/x86_64-unknown-linux-gnu/doc/search-index.js
```
No changes in the output of the search.
r? @QuietMisdreavus
rustdoc: Fix local reexports of proc macros
Filter out `ProcMacroStub`s to avoid an ICE during cleaning.
Also add proc macros to `cache().paths` so it can generate links.
r? @QuietMisdreavus
This commit replaces many usages of `File::open` and reading or writing
with `fs::read_to_string`, `fs::read` and `fs::write`. This reduces code
complexity, and will improve performance for most reads, since the
functions allocate the buffer to be the size of the file.
I believe that this commit will not impact behavior in any way, so some
matches will check the error kind in case the file was not valid UTF-8.
Some of these cases may not actually care about the error.
Replace usages of `..i + 1` ranges with `..=i`.
Before this change we were using old computer code techniques. After this change we use the new and improved computer code techniques.
Added a bare-bones eslint config (removing jslint)
This change removes the small bit of jslint config, replacing it
with eslint. I've currently configured eslint to mostly only report
the more serious of lints, although there are still some style nits
turned on.
Eslint better supports modern js, and will be a good pre-TypeScript code
quality aid.
Install eslint with `npm install -g eslint`. Run with `eslint html/static/*.js`,
or let your IDE do it. This requires no build step.
Upcoming changes will start fixing identified bugs and other lints (mostly unused and var redef issues).
Fix invalid line number match
If a code line is longer than the width, it then gets to the next line making the line number not matching it anymore.
r? @QuietMisdreavus
emit error when doc generation fails
Fixes#41813.
The diagnostic looks something like this:
```
error: couldn't generate documentation: No space left on device (os error 28)
|
= note: failed to create or modify "/path/to/crate/target/doc/src/lazycell"
```
This change removes the small bit of jslint config, replacing it
with eslint. I've currently configured eslint to mostly only report
the more serious of lints, although there are still some style nits
turned on.
Upcoming changes will start fixing lints.