Skip to content

Commit e72952b

Browse files
committed
refactor: Unify render_title logic
1 parent 0adeff8 commit e72952b

File tree

1 file changed

+80
-173
lines changed

1 file changed

+80
-173
lines changed

src/renderer/mod.rs

Lines changed: 80 additions & 173 deletions
Original file line numberDiff line numberDiff line change
@@ -550,30 +550,59 @@ impl Renderer {
550550
is_cont: bool,
551551
buffer_msg_line_offset: usize,
552552
) {
553-
if title_style == TitleStyle::Secondary {
554-
// This is a secondary message with no span info
555-
for _ in 0..max_line_num_len {
556-
buffer.prepend(buffer_msg_line_offset, " ", ElementStyle::NoStyle);
557-
}
558-
559-
self.draw_note_separator(
560-
buffer,
561-
buffer_msg_line_offset,
562-
max_line_num_len + 1,
563-
is_cont,
564-
);
553+
let (label_style, title_element_style) = match title_style {
554+
TitleStyle::MainHeader => (
555+
ElementStyle::Level(title.level.level),
556+
if self.short_message {
557+
ElementStyle::NoStyle
558+
} else {
559+
ElementStyle::MainHeaderMsg
560+
},
561+
),
562+
TitleStyle::Header => (
563+
ElementStyle::Level(title.level.level),
564+
ElementStyle::HeaderMsg,
565+
),
566+
TitleStyle::Secondary => {
567+
for _ in 0..max_line_num_len {
568+
buffer.prepend(buffer_msg_line_offset, " ", ElementStyle::NoStyle);
569+
}
565570

566-
let label_width = if title.level.name != Some(None) {
567-
buffer.append(
571+
self.draw_note_separator(
572+
buffer,
568573
buffer_msg_line_offset,
569-
title.level.as_str(),
570-
ElementStyle::MainHeaderMsg,
574+
max_line_num_len + 1,
575+
is_cont,
571576
);
572-
buffer.append(buffer_msg_line_offset, ": ", ElementStyle::NoStyle);
573-
title.level.as_str().len() + 2
574-
} else {
575-
0
576-
};
577+
(ElementStyle::MainHeaderMsg, ElementStyle::NoStyle)
578+
}
579+
};
580+
let mut label_width = 0;
581+
582+
if title.level.name != Some(None) {
583+
buffer.append(buffer_msg_line_offset, title.level.as_str(), label_style);
584+
label_width += title.level.as_str().len();
585+
if let Some(Id { id: Some(id), url }) = id {
586+
buffer.append(buffer_msg_line_offset, "[", label_style);
587+
if let Some(url) = url.as_ref() {
588+
buffer.append(
589+
buffer_msg_line_offset,
590+
&format!("\x1B]8;;{url}\x1B\\"),
591+
label_style,
592+
);
593+
}
594+
buffer.append(buffer_msg_line_offset, id, label_style);
595+
if url.is_some() {
596+
buffer.append(buffer_msg_line_offset, "\x1B]8;;\x1B\\", label_style);
597+
}
598+
buffer.append(buffer_msg_line_offset, "]", label_style);
599+
label_width += 2 + id.len();
600+
}
601+
buffer.append(buffer_msg_line_offset, ": ", title_element_style);
602+
label_width += 2;
603+
}
604+
605+
let padding = " ".repeat(if title_style == TitleStyle::Secondary {
577606
// The extra 3 ` ` is padding that's always needed to align to the
578607
// label i.e. `note: `:
579608
//
@@ -591,165 +620,43 @@ impl Renderer {
591620
// | | width of label
592621
// | magic `3`
593622
// `max_line_num_len`
594-
let padding = max_line_num_len + 3 + label_width;
595-
596-
let printed_lines =
597-
self.msgs_to_buffer(buffer, title.title, padding, None, title.is_pre_styled);
598-
if is_cont && matches!(self.theme, OutputTheme::Unicode) {
599-
// There's another note after this one, associated to the subwindow above.
600-
// We write additional vertical lines to join them:
601-
// ╭▸ test.rs:3:3
602-
// │
603-
// 3 │ code
604-
// │ ━━━━
605-
// │
606-
// ├ note: foo
607-
// │ bar
608-
// ╰ note: foo
609-
// bar
610-
for i in buffer_msg_line_offset + 1..=printed_lines {
611-
self.draw_col_separator_no_space(buffer, i, max_line_num_len + 1);
612-
}
613-
}
623+
max_line_num_len + 3 + label_width
614624
} else {
615-
let mut label_width = 0;
616-
617-
if title.level.name != Some(None) {
618-
buffer.append(
619-
buffer_msg_line_offset,
620-
title.level.as_str(),
621-
ElementStyle::Level(title.level.level),
622-
);
623-
}
624-
label_width += title.level.as_str().len();
625-
if let Some(Id { id: Some(id), url }) = id {
626-
buffer.append(
627-
buffer_msg_line_offset,
628-
"[",
629-
ElementStyle::Level(title.level.level),
630-
);
631-
if let Some(url) = url.as_ref() {
632-
buffer.append(
633-
buffer_msg_line_offset,
634-
&format!("\x1B]8;;{url}\x1B\\"),
635-
ElementStyle::Level(title.level.level),
636-
);
637-
}
638-
buffer.append(
639-
buffer_msg_line_offset,
640-
id,
641-
ElementStyle::Level(title.level.level),
642-
);
643-
if url.is_some() {
644-
buffer.append(
645-
buffer_msg_line_offset,
646-
"\x1B]8;;\x1B\\",
647-
ElementStyle::Level(title.level.level),
648-
);
649-
}
650-
buffer.append(
651-
buffer_msg_line_offset,
652-
"]",
653-
ElementStyle::Level(title.level.level),
654-
);
655-
label_width += 2 + id.len();
656-
}
657-
let header_style = match title_style {
658-
TitleStyle::MainHeader => {
659-
if self.short_message {
660-
ElementStyle::NoStyle
661-
} else {
662-
ElementStyle::MainHeaderMsg
663-
}
664-
}
665-
TitleStyle::Header => ElementStyle::HeaderMsg,
666-
TitleStyle::Secondary => unreachable!(),
667-
};
668-
if title.level.name != Some(None) {
669-
buffer.append(buffer_msg_line_offset, ": ", header_style);
670-
label_width += 2;
671-
}
672-
if !title.title.is_empty() {
673-
let (title_str, style) = if title.is_pre_styled {
674-
(title.title.to_owned(), ElementStyle::NoStyle)
675-
} else {
676-
(normalize_whitespace(title.title), header_style)
677-
};
678-
for (line, text) in title_str.lines().enumerate() {
679-
buffer.append(
680-
buffer_msg_line_offset + line,
681-
&format!(
682-
"{}{}",
683-
if line == 0 {
684-
String::new()
685-
} else {
686-
" ".repeat(label_width)
687-
},
688-
text
689-
),
690-
style,
691-
);
692-
}
693-
}
694-
}
695-
}
696-
697-
/// Adds a left margin to every line but the first, given a padding length and the label being
698-
/// displayed, keeping the provided highlighting.
699-
fn msgs_to_buffer(
700-
&self,
701-
buffer: &mut StyledBuffer,
702-
title: &str,
703-
padding: usize,
704-
override_style: Option<ElementStyle>,
705-
is_pre_styled: bool,
706-
) -> usize {
707-
let padding = " ".repeat(padding);
708-
709-
let mut line_number = buffer.num_lines().saturating_sub(1);
625+
label_width
626+
});
710627

711-
// Provided the following diagnostic message:
712-
//
713-
// let msgs = vec![
714-
// ("
715-
// ("highlighted multiline\nstring to\nsee how it ", Style::NoStyle),
716-
// ("looks", Style::Highlight),
717-
// ("with\nvery ", Style::NoStyle),
718-
// ("weird", Style::Highlight),
719-
// (" formats\n", Style::NoStyle),
720-
// ("see?", Style::Highlight),
721-
// ];
722-
//
723-
// the expected output on a note is (* surround the highlighted text)
724-
//
725-
// = note: highlighted multiline
726-
// string to
727-
// see how it *looks* with
728-
// very *weird* formats
729-
// see?
730-
let style = if let Some(override_style) = override_style {
731-
override_style
732-
} else {
733-
ElementStyle::NoStyle
734-
};
735-
let title_str = if is_pre_styled {
736-
title.to_owned()
628+
let (title_str, style) = if title.is_pre_styled {
629+
(title.title.to_owned(), ElementStyle::NoStyle)
737630
} else {
738-
normalize_whitespace(title)
631+
(normalize_whitespace(title.title), title_element_style)
739632
};
740-
let lines = title_str.split('\n').collect::<Vec<_>>();
741-
if lines.len() > 1 {
742-
for (i, line) in lines.iter().enumerate() {
743-
if i != 0 {
744-
line_number += 1;
745-
buffer.append(line_number, &padding, ElementStyle::NoStyle);
633+
for (i, text) in title_str.lines().enumerate() {
634+
if i != 0 {
635+
buffer.append(buffer_msg_line_offset + i, &padding, ElementStyle::NoStyle);
636+
if title_style == TitleStyle::Secondary
637+
&& is_cont
638+
&& matches!(self.theme, OutputTheme::Unicode)
639+
{
640+
// There's another note after this one, associated to the subwindow above.
641+
// We write additional vertical lines to join them:
642+
// ╭▸ test.rs:3:3
643+
// │
644+
// 3 │ code
645+
// │ ━━━━
646+
// │
647+
// ├ note: foo
648+
// │ bar
649+
// ╰ note: foo
650+
// bar
651+
self.draw_col_separator_no_space(
652+
buffer,
653+
buffer_msg_line_offset + i,
654+
max_line_num_len + 1,
655+
);
746656
}
747-
buffer.append(line_number, line, style);
748657
}
749-
} else {
750-
buffer.append(line_number, &title_str, style);
658+
buffer.append(buffer_msg_line_offset + i, text, style);
751659
}
752-
line_number
753660
}
754661

755662
fn render_origin(

0 commit comments

Comments
 (0)