From 2d5b40214c37bca75f57e5583f224d67fc452dcf Mon Sep 17 00:00:00 2001 From: Jan-Erik Rediger Date: Wed, 24 Jun 2020 11:33:46 +0200 Subject: [PATCH] Start normalizing the levels based on the first header's level --- src/lib.rs | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 22c4a0b..484a28d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -39,7 +39,13 @@ fn build_toc<'a>(toc: &[(u32, String)]) -> String { // Otherwise the markdown render will escape nested levels. // // This is a rough approximation only. - let mut last_lower = 0; + let mut toc_iter = toc.iter().peekable(); + + // Start from the level of the first header. + let mut last_lower = match toc_iter.peek() { + Some((lvl, _)) => *lvl, + None => 0 + }; let toc = toc.iter().map(|(lvl, name)| { let lvl = *lvl; let lvl = if last_lower + 1 == lvl { @@ -347,4 +353,41 @@ mod test { assert_eq!(expected, add_toc(content).unwrap()); } + + #[test] + fn multi_header_linear_regression_3() { + let content = r#"# Heading + + + +## Level 1.1 +### Level 1.1.1 +### Level 1.1.2 +## Level 1.2 +### Level 1.2.1 + +text"#; + + let expected = r#"# Heading + +* [Level 1.1](#level-11) + * [Level 1.1.1](#level-111) + * [Level 1.1.2](#level-112) +* [Level 1.2](#level-12) + * [Level 1.2.1](#level-121) + +## Level 1.1 + +### Level 1.1.1 + +### Level 1.1.2 + +## Level 1.2 + +### Level 1.2.1 + +text"#; + + assert_eq!(expected, add_toc(content).unwrap()); + } }