This path adds support for the new search index format introduced in
Rust 1.52.0. With this new format, the index items are no longer
serialized as an array of structs but as arrays of the struct fields.
This patch adds tests for Rust 1.52.0. With Rust 1.52.0, the format of
the search index changed so we have to disable the search index tests.
Otherwise we can copy the snapshots with only small modifications taking
into account the change from simple quotes and apostrophes ("') to
typographically correct ones (“”’).
This patch adds test cases for Rust 1.51.0. We have to disable the
struct_anyhow_error test case as the structure of the Deref method
sections has changed.
This patch adds tests for Rust 1.50.0 which we can mostly copy from
1.49.0. There is only a small change to the abbreviated descriptions in
the search index and to edition-specific code.
With Rust 1.48.0, support for link shorthands, i. e. `[Test]` instead of
`[Test][]`, was added. Therefore, some of the links are now rendered
correctly. Otherwise we can just copy the snapshots and don’t need any
code changes.
This patch adds the o command to the tui viewer that can be used to open
items. The command uses the same lookup logic as the rusty-man program:
First, it tries to find a direct match. If none is found, it uses the
search index to find partial matches.
This match adds the Sources struct that is a wrapper for a vector of
Source structs. It now contains the lookup logic that was previously
contained in functions in main.rs.
Previously, we would either use the pager set in the PAGER environment
variable or "less -cr" for the rich and plain viewer. This caused
problems if, for example, the PAGER environment variable was set to
"less", see ticket #22:
https://todo.sr.ht/~ireas/rusty-man/22
To fix this issue, we now use the LESS environment variable to set the
less options. This makes sure that setting PAGER does not override the
options.
This minor release introduces a new interactive viewer, tui. It also
adds syntax highlighting for code in the documentation and support for
Rust 1.47.0.
This lint tells us to use the std::matches! macro instead of a match or
if let expression that yields a bool. But the matches! macro was added
in Rust 1.42, and our MSRV is 1.40. I don’t want to bump the MSRV only
for this change, so we ignore the lint.
Rust 1.47.0 introduced the Notable Traits section that lists information
about types used in code block. As we only want to display the code
block itself without meta-information, this patch ignores the
notable-traits class when extracting the text from nodes.
This patch adds vim-like keybindings to the tui viewer: hjkl for
navigation, G and g (instead of gg) for End and Home, and Ctrl+F and
Ctrl+B for Page Down and Up.
In the last patch, we added the termion dependency for the tui viewer.
With this patch, we remove the ansi_term, atty and terminal_size
dependencies and use termion instead.
With this patch, we replace cursive’s default ncurses backend with the
termion backend. This has multiple reasons:
- The ncurses backend has safety issues, see [0].
- ncurses requires a pre-installed library and a C compiler, introducing
additional build dependencies. Termion is implemented in Rust only.
- ncurses does not work on Windows, while termion works in all terminals
that support ANSI escape codes.
Per default, the termion backend does not buffer the output which may
cause flickering [1]. Therefore, we also use the
cursive_buffered_backend that buffers the output and fixes the
flickering problem.
[0] https://github.com/gyscos/cursive/issues/488
[1] https://github.com/gyscos/cursive/issues/142
We’ve moved the HtmlView into a separate crate, so we can replace our
own HtmlView with cursive_markup::MarkupView. We only have to implement
a custom Renderer that applies the syntax highlighting to code snippets.
This patch adds links to the items in the module member list. This only
applies for the tui viewer, as the links wouldn’t provide any additional
information for the plain and rich viewers.
In the previous commit, we used the Option::zip method to make querying
the focus and the links in the HtmlView struct easier. But Option::zip
has only been added in Rust 1.46, so we replace it with a custom utility
function to keep compatibility with Rust 1.40.
This patch adds a new viewer, tui, that provides an interactive
interface using cursive. This viewer makes it possible to follow links
to other documentation items and to open external links in a web
browser.
Previously, we only used the underline effect to highlight links in the
rich viewer, but we did not provide any information about their target.
With this patch, we print a list of link at the end of a block, similar
to the plain text viewer.
We are currently always listing the links in the plain text viewer when
rendering HTML, so we no longer need the show_links field that could be
used to disable link listing.
When changing the viewer to use the text-style crate, we mistakenly
changed the format for links in the rich viewer from underline to bold.
This patch fixes that mistake.
This patch changes the rich viewer to use a custom rich text decorator.
As we use colors to highlight code, and as we print the string text with
a bold font, we don’t need a backtick or an asterix to indicate these
elements.
This patch moves the HTML processing (i. e. syntax highlighting for code
snippets) into the viewer::utils method. This allows us to use it for
other viewers too.
This patch adds syntax highlighting for code blocks in the doc comments.
Previously, we only highlighted the definition of the documented
elements. With this patch, we also highlight code blocks in the doc
blocks, like examples.
This patch updates the html2text dependency to v0.2.1. This release
fixed the handling of preformatted blocks, allowing us to add syntax
highlighting for code blocks in the next patch.
This patch introduces the viewer::utils::Highlighter struct that takes
care of syntax highlighting. This will make it easier to use syntax
highlighting from others viewers once we add them.
This patch replaces the direct text formatting with ansi_term with the
text-style crate. This also allows us to directly convert the syntect
annotations to styled strings.
This patch replaces the crossterm dependency with ansi_term, atty and
terminal_size. This allows us for an easier integration with the
text_style crate in an upcoming patch, and it reduces the total number
of dependencies from 166 to 160.
This means that we drop support for non-ANSI terminals, but as this only
affects old versions of cmd.exe/PowerShell, we don’t care about it.
This patch adds the merge dependency to automatically merge the
command-line arguments and the settings from the configuration file.
This means that we no longer have to manually maintain the Args::merge
function.
This patch introduces the ManRenderer trait that can be used by viewers
that render documentation in a man-like style. This is a more general
version of the previous Printer trait.
This patch adds the viewer::utils module with utility methods for viewer
implementations. It contains common functions for text rendering and
syntax highlighting.
We use the HTML ID of a member element to get its name. If there are
multiple members with the same type and name (e. g. from a Deref
implementation), the ID has a suffix to make it unique. Previosuly, we
just interpreted this suffix as part of the name. With this patch, we
strip the suffix and only use the actual name.
Up to rustdoc version 1.45.2, the code element containing the definition
of a member always had the ID "<name>.v". This ID has been dropped in
rustdoc 1.46.0. Therefore we now look for members by searching for the
heading which has the id "<ty>.<name>" (for all possible types).
This patch refactors the test suite:
- Instead of always generating the documentation with the available
rustdoc version, we now store generated documentation for all
supported rustdoc versions in the test/html directory.
- Instead of using one snapshot per test case, we now use one snapshot
per test case and rustdoc version.
Sometimes, there might be multiple items with the same name, for example
std::u8 is both a module and a primitive. Previously, we could not
determine which one Source::load_doc would return. With this patch, we
add the ty parameter that can be used to filter by the item type.
Previously, we only used the name and the description to represent index
items. Therefore we consider e. g. the std::u8 module and the std::u8
primitive to be the same. With this patch, we also take the item type
into account when comparing index items.
With this patch, we change the type of the Doc::groups field to
BTreeMap<ItemType, Vec<MemberGroup>>. This makes it clearer and easier
to read. We also reorder the ItemType module so that the output order
of the member groups is not changed by this patch.