@@ -50,7 +50,7 @@ use crate::html::format::Buffer;
50
50
use crate :: html:: highlight;
51
51
use crate :: html:: length_limit:: HtmlWithLimit ;
52
52
use crate :: html:: render:: small_url_encode;
53
- use crate :: html:: toc:: TocBuilder ;
53
+ use crate :: html:: toc:: { Toc , TocBuilder } ;
54
54
55
55
use pulldown_cmark:: {
56
56
html, BrokenLink , CodeBlockKind , CowStr , Event , LinkType , OffsetIter , Options , Parser , Tag ,
@@ -102,6 +102,7 @@ pub struct Markdown<'a> {
102
102
/// A struct like `Markdown` that renders the markdown with a table of contents.
103
103
pub ( crate ) struct MarkdownWithToc < ' a > {
104
104
pub ( crate ) content : & ' a str ,
105
+ pub ( crate ) links : & ' a [ RenderedLink ] ,
105
106
pub ( crate ) ids : & ' a mut IdMap ,
106
107
pub ( crate ) error_codes : ErrorCodes ,
107
108
pub ( crate ) edition : Edition ,
@@ -540,9 +541,9 @@ impl<'a, 'b, 'ids, I: Iterator<Item = SpannedEvent<'a>>> Iterator
540
541
let id = self . id_map . derive ( id) ;
541
542
542
543
if let Some ( ref mut builder) = self . toc {
543
- let mut html_header = String :: new ( ) ;
544
- html :: push_html ( & mut html_header , self . buf . iter ( ) . map ( |( ev, _) | ev. clone ( ) ) ) ;
545
- let sec = builder. push ( level as u32 , html_header , id. clone ( ) ) ;
544
+ let mut text_header = String :: new ( ) ;
545
+ plain_text_from_events ( self . buf . iter ( ) . map ( |( ev, _) | ev. clone ( ) ) , & mut text_header ) ;
546
+ let sec = builder. push ( level as u32 , text_header , id. clone ( ) ) ;
546
547
self . buf . push_front ( ( Event :: Html ( format ! ( "{sec} " ) . into ( ) ) , 0 ..0 ) ) ;
547
548
}
548
549
@@ -1435,17 +1436,30 @@ impl Markdown<'_> {
1435
1436
}
1436
1437
1437
1438
impl MarkdownWithToc < ' _ > {
1438
- pub ( crate ) fn into_string ( self ) -> String {
1439
+ pub ( crate ) fn into_parts ( self ) -> ( Toc , String ) {
1439
1440
let MarkdownWithToc {
1440
1441
content : md,
1442
+ links,
1441
1443
ids,
1442
1444
error_codes : codes,
1443
1445
edition,
1444
1446
playground,
1445
1447
custom_code_classes_in_docs,
1446
1448
} = self ;
1447
1449
1448
- let p = Parser :: new_ext ( md, main_body_opts ( ) ) . into_offset_iter ( ) ;
1450
+ // This is actually common enough to special-case
1451
+ if md. is_empty ( ) {
1452
+ return ( Toc { entries : Vec :: new ( ) } , String :: new ( ) ) ;
1453
+ }
1454
+ let mut replacer = |broken_link : BrokenLink < ' _ > | {
1455
+ links
1456
+ . iter ( )
1457
+ . find ( |link| & * link. original_text == & * broken_link. reference )
1458
+ . map ( |link| ( link. href . as_str ( ) . into ( ) , link. tooltip . as_str ( ) . into ( ) ) )
1459
+ } ;
1460
+
1461
+ let p = Parser :: new_with_broken_link_callback ( md, main_body_opts ( ) , Some ( & mut replacer) ) ;
1462
+ let p = p. into_offset_iter ( ) ;
1449
1463
1450
1464
let mut s = String :: with_capacity ( md. len ( ) * 3 / 2 ) ;
1451
1465
@@ -1459,7 +1473,11 @@ impl MarkdownWithToc<'_> {
1459
1473
html:: push_html ( & mut s, p) ;
1460
1474
}
1461
1475
1462
- format ! ( "<nav id=\" TOC\" >{toc}</nav>{s}" , toc = toc. into_toc( ) . print( ) )
1476
+ ( toc. into_toc ( ) , s)
1477
+ }
1478
+ pub ( crate ) fn into_string ( self ) -> String {
1479
+ let ( toc, s) = self . into_parts ( ) ;
1480
+ format ! ( "<nav id=\" TOC\" >{toc}</nav>{s}" , toc = toc. print( ) )
1463
1481
}
1464
1482
}
1465
1483
@@ -1638,7 +1656,13 @@ pub(crate) fn plain_text_summary(md: &str, link_names: &[RenderedLink]) -> Strin
1638
1656
1639
1657
let p = Parser :: new_with_broken_link_callback ( md, summary_opts ( ) , Some ( & mut replacer) ) ;
1640
1658
1641
- for event in p {
1659
+ plain_text_from_events ( p, & mut s) ;
1660
+
1661
+ s
1662
+ }
1663
+
1664
+ pub ( crate ) fn plain_text_from_events < ' a > ( events : impl Iterator < Item =pulldown_cmark:: Event < ' a > > , s : & mut String ) {
1665
+ for event in events {
1642
1666
match & event {
1643
1667
Event :: Text ( text) => s. push_str ( text) ,
1644
1668
Event :: Code ( code) => {
@@ -1653,8 +1677,6 @@ pub(crate) fn plain_text_summary(md: &str, link_names: &[RenderedLink]) -> Strin
1653
1677
_ => ( ) ,
1654
1678
}
1655
1679
}
1656
-
1657
- s
1658
1680
}
1659
1681
1660
1682
#[ derive( Debug ) ]
0 commit comments