12
12
//!
13
13
//! let s = "My *markdown* _text_";
14
14
//! let mut id_map = IdMap::new();
15
- //! let md = Markdown(s, &[], &mut id_map, ErrorCodes::Yes, Edition::Edition2015, &None);
15
+ //! let md = Markdown(s, &[], &mut id_map, ErrorCodes::Yes, Edition::Edition2015, &None, 0 );
16
16
//! let html = md.into_string();
17
17
//! // ... something using html
18
18
//! ```
@@ -47,6 +47,8 @@ use pulldown_cmark::{
47
47
#[ cfg( test) ]
48
48
mod tests;
49
49
50
+ const MAX_HEADER_LEVEL : u32 = 6 ;
51
+
50
52
/// Options for rendering Markdown in the main body of documentation.
51
53
pub ( crate ) fn main_body_opts ( ) -> Options {
52
54
Options :: ENABLE_TABLES
@@ -78,6 +80,7 @@ pub struct Markdown<'a>(
78
80
/// Default edition to use when parsing doctests (to add a `fn main`).
79
81
pub Edition ,
80
82
pub & ' a Option < Playground > ,
83
+ pub u32 ,
81
84
) ;
82
85
/// A tuple struct like `Markdown` that renders the markdown with a table of contents.
83
86
crate struct MarkdownWithToc < ' a > (
@@ -489,11 +492,12 @@ struct HeadingLinks<'a, 'b, 'ids, I> {
489
492
toc : Option < & ' b mut TocBuilder > ,
490
493
buf : VecDeque < SpannedEvent < ' a > > ,
491
494
id_map : & ' ids mut IdMap ,
495
+ level : u32 ,
492
496
}
493
497
494
498
impl < ' a , ' b , ' ids , I > HeadingLinks < ' a , ' b , ' ids , I > {
495
- fn new ( iter : I , toc : Option < & ' b mut TocBuilder > , ids : & ' ids mut IdMap ) -> Self {
496
- HeadingLinks { inner : iter, toc, buf : VecDeque :: new ( ) , id_map : ids }
499
+ fn new ( iter : I , toc : Option < & ' b mut TocBuilder > , ids : & ' ids mut IdMap , level : u32 ) -> Self {
500
+ HeadingLinks { inner : iter, toc, buf : VecDeque :: new ( ) , id_map : ids, level }
497
501
}
498
502
}
499
503
@@ -530,6 +534,7 @@ impl<'a, 'b, 'ids, I: Iterator<Item = SpannedEvent<'a>>> Iterator
530
534
self . buf . push_front ( ( Event :: Html ( format ! ( "{} " , sec) . into ( ) ) , 0 ..0 ) ) ;
531
535
}
532
536
537
+ let level = std:: cmp:: min ( level + self . level + 1 , MAX_HEADER_LEVEL ) ;
533
538
self . buf . push_back ( ( Event :: Html ( format ! ( "</a></h{}>" , level) . into ( ) ) , 0 ..0 ) ) ;
534
539
535
540
let start_tags = format ! (
@@ -1005,7 +1010,7 @@ impl LangString {
1005
1010
1006
1011
impl Markdown < ' _ > {
1007
1012
pub fn into_string ( self ) -> String {
1008
- let Markdown ( md, links, mut ids, codes, edition, playground) = self ;
1013
+ let Markdown ( md, links, mut ids, codes, edition, playground, level ) = self ;
1009
1014
1010
1015
// This is actually common enough to special-case
1011
1016
if md. is_empty ( ) {
@@ -1026,7 +1031,7 @@ impl Markdown<'_> {
1026
1031
1027
1032
let mut s = String :: with_capacity ( md. len ( ) * 3 / 2 ) ;
1028
1033
1029
- let p = HeadingLinks :: new ( p, None , & mut ids) ;
1034
+ let p = HeadingLinks :: new ( p, None , & mut ids, level ) ;
1030
1035
let p = Footnotes :: new ( p) ;
1031
1036
let p = LinkReplacer :: new ( p. map ( |( ev, _) | ev) , links) ;
1032
1037
let p = TableWrapper :: new ( p) ;
@@ -1048,7 +1053,7 @@ impl MarkdownWithToc<'_> {
1048
1053
let mut toc = TocBuilder :: new ( ) ;
1049
1054
1050
1055
{
1051
- let p = HeadingLinks :: new ( p, Some ( & mut toc) , & mut ids) ;
1056
+ let p = HeadingLinks :: new ( p, Some ( & mut toc) , & mut ids, 0 ) ;
1052
1057
let p = Footnotes :: new ( p) ;
1053
1058
let p = TableWrapper :: new ( p. map ( |( ev, _) | ev) ) ;
1054
1059
let p = CodeBlocks :: new ( p, codes, edition, playground) ;
@@ -1077,7 +1082,7 @@ impl MarkdownHtml<'_> {
1077
1082
1078
1083
let mut s = String :: with_capacity ( md. len ( ) * 3 / 2 ) ;
1079
1084
1080
- let p = HeadingLinks :: new ( p, None , & mut ids) ;
1085
+ let p = HeadingLinks :: new ( p, None , & mut ids, 0 ) ;
1081
1086
let p = Footnotes :: new ( p) ;
1082
1087
let p = TableWrapper :: new ( p. map ( |( ev, _) | ev) ) ;
1083
1088
let p = CodeBlocks :: new ( p, codes, edition, playground) ;
@@ -1295,7 +1300,7 @@ crate fn markdown_links(md: &str) -> Vec<MarkdownLink> {
1295
1300
// There's no need to thread an IdMap through to here because
1296
1301
// the IDs generated aren't going to be emitted anywhere.
1297
1302
let mut ids = IdMap :: new ( ) ;
1298
- let iter = Footnotes :: new ( HeadingLinks :: new ( p, None , & mut ids) ) ;
1303
+ let iter = Footnotes :: new ( HeadingLinks :: new ( p, None , & mut ids, 0 ) ) ;
1299
1304
1300
1305
for ev in iter {
1301
1306
if let Event :: Start ( Tag :: Link ( kind, dest, _) ) = ev. 0 {
0 commit comments