mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
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:
@@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user