@@ -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) ]
27632783mod test {
27642784 use super :: { OUTPUT_REPLACEMENTS , newline_count} ;
0 commit comments