Skip to content

Commit 577b8fa

Browse files
committed
chore: Factor out the hyperlink generation logic
1 parent 410ed62 commit 577b8fa

1 file changed

Lines changed: 31 additions & 11 deletions

File tree

src/renderer/render.rs

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -359,17 +359,14 @@ fn render_title(
359359
label_width += title.level().as_str().len();
360360
if let Some(Id { id: Some(id), url }) = &title.id() {
361361
buffer.append(buffer_msg_line_offset, "[", label_style);
362-
if let Some(url) = url.as_ref() {
363-
buffer.append(
364-
buffer_msg_line_offset,
365-
&format!("\x1B]8;;{url}\x1B\\"),
366-
label_style,
367-
);
368-
}
369-
buffer.append(buffer_msg_line_offset, id, label_style);
370-
if url.is_some() {
371-
buffer.append(buffer_msg_line_offset, "\x1B]8;;\x1B\\", label_style);
372-
}
362+
let link = Hyperlink {
363+
url: url.as_deref(),
364+
};
365+
buffer.append(
366+
buffer_msg_line_offset,
367+
&format!("{link}{id}{link:#}"),
368+
label_style,
369+
);
373370
buffer.append(buffer_msg_line_offset, "]", label_style);
374371
label_width += 2 + id.len();
375372
}
@@ -2759,6 +2756,29 @@ fn newline_count(body: &str) -> usize {
27592756
}
27602757
}
27612758

2759+
struct Hyperlink<D: fmt::Display> {
2760+
url: Option<D>,
2761+
}
2762+
2763+
impl<D: fmt::Display> Default for Hyperlink<D> {
2764+
fn default() -> Self {
2765+
Self { url: None }
2766+
}
2767+
}
2768+
2769+
impl<D: fmt::Display> fmt::Display for Hyperlink<D> {
2770+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2771+
let Some(url) = self.url.as_ref() else {
2772+
return Ok(());
2773+
};
2774+
if f.alternate() {
2775+
write!(f, "\x1B]8;;\x1B\\")
2776+
} else {
2777+
write!(f, "\x1B]8;;{url}\x1B\\")
2778+
}
2779+
}
2780+
}
2781+
27622782
#[cfg(test)]
27632783
mod test {
27642784
use super::{OUTPUT_REPLACEMENTS, newline_count};

0 commit comments

Comments
 (0)