diff --git a/src/markdown.rs b/src/markdown.rs index 3bc93d5..aba7642 100644 --- a/src/markdown.rs +++ b/src/markdown.rs @@ -3,9 +3,9 @@ use std::collections::HashSet; pub fn render_markdown(input: &str) -> String { let html = tetratto_shared::markdown::render_markdown_dirty(&parse_page(&parse_details( &parse_text_color(&parse_highlight(&parse_link(&parse_image( - &parse_image_size(&parse_toc(&parse_underline(&parse_comment( + &parse_image_size(&parse_underline(&parse_comment( &input.replace("[/]", "
"), - )))), + ))), )))), ))) .replace("$per", "%"); @@ -811,7 +811,7 @@ pub fn parse_page(input: &str) -> String { /// Parse the markdown syntax for the expandable `
` element. /// /// Similar to the [`parse_page`] page definitions, details elements are denoted -/// with two ampersand symbols. The opening line should look like `&& [summary]`. +/// with two ampersand symbols. The opening line should look like `&& [summary]; [open?]`. /// /// The block is closed with a line of exactly two ampersand symbols. /// @@ -883,88 +883,3 @@ pub fn parse_details(input: &str) -> String { output } - -/// Get the list of headers needed for [`parse_toc`]. -pub fn get_toc_list(input: &str) -> (String, String) { - let mut output = String::new(); - let mut toc = String::new(); - let mut in_pre = false; - - for line in input.split("\n") { - if line.starts_with("```") { - in_pre = !in_pre; - output.push_str(&format!("{line}\n")); - continue; - } - - if in_pre { - output.push_str(&format!("{line}\n")); - continue; - } - - // not in pre - if line.starts_with("#") { - // get heading count - let mut hc = 0; - - for x in line.chars() { - if x != '#' { - break; - } - - hc += 1; - } - - // add heading with id - let x = line.replacen(&"#".repeat(hc), "", 1); - let htext = x.trim(); - - let id = htext.to_lowercase().replace(" ", "_"); - output.push_str(&format!("{htext}\n")); - - // add heading to toc - toc += &format!("{}- [{htext}](#{id})\n", " ".repeat(hc)); - - // ... - continue; - } - - // otherwise - output.push_str(&format!("{line}\n")); - } - - (toc, output) -} - -/// Parse the `[toc]` table-of-contents syntax. -pub fn parse_toc(input: &str) -> String { - let (toc_list, new_input) = get_toc_list(input); - - let mut output = String::new(); - let mut in_pre = false; - - for line in new_input.split("\n") { - if line.starts_with("```") { - in_pre = !in_pre; - output.push_str(&format!("{line}\n")); - continue; - } - - if in_pre { - output.push_str(&format!("{line}\n")); - continue; - } - - // not in pre - if line.len() == 5 && line.to_lowercase() == "[toc]" { - // add toc - output.push_str(&toc_list); - continue; - } - - // otherwise - output.push_str(&format!("{line}\n")); - } - - output -}