Rollup merge of #148171 - GuillaumeGomez:line-number-highlight, r=yotamofek,lolbinarycat

Simplify code to generate line numbers in highlight

Follow-up of https://github.com/rust-lang/rust/pull/146992.

cc `````@yotamofek`````
r? `````@lolbinarycat`````
This commit is contained in:
Matthias Krüger
2025-11-01 08:25:45 +01:00
committed by GitHub
+35 -23
View File
@@ -343,7 +343,7 @@ struct TokenHandler<'a, 'tcx, F: Write> {
/// We need to keep the `Class` for each element because it could contain a `Span` which is
/// used to generate links.
href_context: Option<HrefContext<'a, 'tcx>>,
write_line_number: fn(u32) -> String,
line_number_kind: LineNumberKind,
line: u32,
max_lines: u32,
}
@@ -355,10 +355,10 @@ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
}
impl<'a, F: Write> TokenHandler<'a, '_, F> {
fn handle_backline(&mut self) -> Option<String> {
fn handle_backline(&mut self) -> Option<impl Display + use<F>> {
self.line += 1;
if self.line < self.max_lines {
return Some((self.write_line_number)(self.line));
return Some(self.line_number_kind.render(self.line));
}
None
}
@@ -376,8 +376,7 @@ fn push_token(&mut self, class: Option<Class>, text: Cow<'a, str>) {
if text == "\n"
&& let Some(backline) = self.handle_backline()
{
self.out.write_str(&text).unwrap();
self.out.write_str(&backline).unwrap();
write!(self.out, "{text}{backline}").unwrap();
} else {
self.push_token_without_backline_check(class, text, true);
}
@@ -437,20 +436,29 @@ fn drop(&mut self) {
}
}
fn scraped_line_number(line: u32) -> String {
// https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag#data-nosnippet-attr
// Do not show "1 2 3 4 5 ..." in web search results.
format!("<span data-nosnippet>{line}</span>")
/// Represents the type of line number to be generated as HTML.
#[derive(Clone, Copy)]
enum LineNumberKind {
/// Used for scraped code examples.
Scraped,
/// Used for source code pages.
Normal,
/// Code examples in documentation don't have line number generated by rustdoc.
Empty,
}
fn line_number(line: u32) -> String {
// https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag#data-nosnippet-attr
// Do not show "1 2 3 4 5 ..." in web search results.
format!("<a href=#{line} id={line} data-nosnippet>{line}</a>")
}
fn empty_line_number(_: u32) -> String {
String::new()
impl LineNumberKind {
fn render(self, line: u32) -> impl Display {
fmt::from_fn(move |f| {
match self {
// https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag#data-nosnippet-attr
// Do not show "1 2 3 4 5 ..." in web search results.
Self::Scraped => write!(f, "<span data-nosnippet>{line}</span>"),
Self::Normal => write!(f, "<a href=#{line} id={line} data-nosnippet>{line}</a>"),
Self::Empty => Ok(()),
}
})
}
}
fn get_next_expansion(
@@ -534,15 +542,15 @@ pub(super) fn write_code(
let mut token_handler = TokenHandler {
out,
href_context,
write_line_number: match line_info {
line_number_kind: match line_info {
Some(line_info) => {
if line_info.is_scraped_example {
scraped_line_number
LineNumberKind::Scraped
} else {
line_number
LineNumberKind::Normal
}
}
None => empty_line_number,
None => LineNumberKind::Empty,
},
line: 0,
max_lines: u32::MAX,
@@ -552,8 +560,12 @@ pub(super) fn write_code(
if let Some(line_info) = line_info {
token_handler.line = line_info.start_line - 1;
token_handler.max_lines = line_info.max_lines;
if let Some(text) = token_handler.handle_backline() {
token_handler.push_token_without_backline_check(None, Cow::Owned(text), false);
if let Some(backline) = token_handler.handle_backline() {
token_handler.push_token_without_backline_check(
None,
Cow::Owned(backline.to_string()),
false,
);
}
}