From b511a1a64e9076a040baf3c02a1587c40d0ec172 Mon Sep 17 00:00:00 2001 From: Ben Bridle Date: Wed, 22 Jan 2025 12:47:06 +1300 Subject: Remove 'appendix' from the links of appendix headings If a heading is prefixed with 'Appendix #:', the link to that heading will not include that prefix. This is to make it possible to rearrange appendices in a document without breaking existing links. --- src/generate_html.rs | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'src/generate_html.rs') diff --git a/src/generate_html.rs b/src/generate_html.rs index e531854..0f520aa 100644 --- a/src/generate_html.rs +++ b/src/generate_html.rs @@ -111,10 +111,13 @@ pub fn document_to_html(document: &MarkdownDocument, page: &Page, website: &Webs let root = page.root(); for block in &document.blocks { match block { - Block::Heading { level, line } => match level { - Level::Heading1 => tag!("h1", line, format!("id='{}'", make_url_safe(&line_to_html!(line)))), - Level::Heading2 => tag!("h2", line, format!("id='{}'", make_url_safe(&line_to_html!(line)))), - Level::Heading3 => tag!("h3", line, format!("id='{}'", make_url_safe(&line_to_html!(line)))), + Block::Heading { level, line } => { + let id = make_url_safe(strip_appendix(&line_to_html!(line))); + match level { + Level::Heading1 => tag!("h1", line, format!("id='{id}'")), + Level::Heading2 => tag!("h2", line, format!("id='{id}'")), + Level::Heading3 => tag!("h3", line, format!("id='{id}'")), + } } Block::Paragraph(line) => tag!("p", line), Block::Math(content) => html!("
{}
", sanitize_text(content, false)), @@ -269,8 +272,8 @@ fn line_to_html(line: &Line, page: &Page, website: &Website) -> String { let text = &sanitize_text(text, false); html.push_str(&format!("{text}")) } Token::InternalLink(name) => { let (class, label, path) = match name.split_once('#') { - Some(("", heading)) => ("heading", heading, format!("#{heading}")), - Some((page, heading)) => ("page", heading, format!("{page}.html#{heading}")), + Some(("", heading)) => ("heading", heading, format!("#{}", strip_appendix(heading))), + Some((page, heading)) => ("page", heading, format!("{page}.html#{}", strip_appendix(heading))), _ => ("page", name.as_str(), format!("{name}.html")), }; let mut path = make_url_safe(&path); @@ -287,7 +290,7 @@ fn line_to_html(line: &Line, page: &Page, website: &Website) -> String { } // Check that the heading exists. if class == "heading" { - let heading = path.strip_prefix('#').unwrap().to_string(); + let heading = path.strip_prefix('#').unwrap(); if !page.headings.iter().any(|h| h.url == heading) { warn!("Page {from:?} contains link to nonexistent internal heading {heading:?}"); } @@ -371,3 +374,14 @@ fn sanitize_text(text: &str, fancy: bool) -> String { } return output; } + + +/// Remove a 'Appendix #: ' prefix from a string. +pub fn strip_appendix(text: &str) -> &str { + if let Some((prefix, name)) = text.split_once(": ") { + if prefix.starts_with("Appendix") { + return name; + } + } + return text; +} -- cgit v1.2.3-70-g09d2