@@ -550,30 +550,59 @@ impl Renderer {
550
550
is_cont : bool ,
551
551
buffer_msg_line_offset : usize ,
552
552
) {
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
+ }
565
570
566
- let label_width = if title . level . name != Some ( None ) {
567
- buffer. append (
571
+ self . draw_note_separator (
572
+ buffer,
568
573
buffer_msg_line_offset,
569
- title . level . as_str ( ) ,
570
- ElementStyle :: MainHeaderMsg ,
574
+ max_line_num_len + 1 ,
575
+ is_cont ,
571
576
) ;
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 {
577
606
// The extra 3 ` ` is padding that's always needed to align to the
578
607
// label i.e. `note: `:
579
608
//
@@ -591,165 +620,43 @@ impl Renderer {
591
620
// | | width of label
592
621
// | magic `3`
593
622
// `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
614
624
} 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
+ } ) ;
710
627
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 )
737
630
} else {
738
- normalize_whitespace ( title)
631
+ ( normalize_whitespace ( title. title ) , title_element_style )
739
632
} ;
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
+ ) ;
746
656
}
747
- buffer. append ( line_number, line, style) ;
748
657
}
749
- } else {
750
- buffer. append ( line_number, & title_str, style) ;
658
+ buffer. append ( buffer_msg_line_offset + i, text, style) ;
751
659
}
752
- line_number
753
660
}
754
661
755
662
fn render_origin (
0 commit comments