@@ -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