From 4d49eea7ea51d96f79e1da376684fdd3295b1373 Mon Sep 17 00:00:00 2001 From: Araozu Date: Thu, 30 Mar 2023 15:37:22 -0500 Subject: [PATCH] [Web] Add simple anchors and ids to h1, h2, h3 --- doc-generator/src/generator/heading.rs | 27 +++++++++++++++++++++----- doc-generator/src/generator/mod.rs | 15 ++++++++++++-- doc-generator/src/generator/root.rs | 11 ++++++++++- doc-generator/src/generator/text.rs | 13 +++++++++++++ doc-generator/src/main.rs | 14 ++++++------- doc-generator/src/utils.rs | 3 +++ 6 files changed, 68 insertions(+), 15 deletions(-) create mode 100644 doc-generator/src/generator/text.rs create mode 100644 doc-generator/src/utils.rs diff --git a/doc-generator/src/generator/heading.rs b/doc-generator/src/generator/heading.rs index 98b9626..81c62f1 100644 --- a/doc-generator/src/generator/heading.rs +++ b/doc-generator/src/generator/heading.rs @@ -1,9 +1,8 @@ -use std::fmt::format; - use markdown::mdast::Heading; -use super::Printable; +use crate::utils; +use super::Printable; impl Printable for Heading { fn to_html(&self) -> String { @@ -15,7 +14,25 @@ impl Printable for Heading { let text: String = result.into_iter().collect(); - format!("{}", self.depth, text, self.depth) + if self.depth < 4 { + let html_fragment_text = utils::to_html_fragment(&self.get_text()); + + format!( + "{}", + self.depth, html_fragment_text, html_fragment_text, text, self.depth + ) + } else { + format!("{}", self.depth, text, self.depth) + } + } + + fn get_text(&self) -> String { + let mut result = Vec::::new(); + + for node in &self.children { + result.push(node.get_text()) + } + + result.join("-") } } - diff --git a/doc-generator/src/generator/mod.rs b/doc-generator/src/generator/mod.rs index 56b61de..16f9c52 100644 --- a/doc-generator/src/generator/mod.rs +++ b/doc-generator/src/generator/mod.rs @@ -1,10 +1,12 @@ use markdown::mdast::Node; -mod root; mod heading; +mod root; +mod text; pub trait Printable { fn to_html(&self) -> String; + fn get_text(&self) -> String; } impl Printable for Node { @@ -12,8 +14,17 @@ impl Printable for Node { match self { Node::Root(root) => root.to_html(), Node::Heading(heading) => heading.to_html(), + Node::Text(text) => text.to_html(), _ => format!("Not implemented
{:?}", self), } } -} + fn get_text(&self) -> String { + match self { + Node::Root(root) => root.get_text(), + Node::Heading(heading) => heading.get_text(), + Node::Text(text) => text.get_text(), + _ => String::from(""), + } + } +} diff --git a/doc-generator/src/generator/root.rs b/doc-generator/src/generator/root.rs index 7f10778..e378b2a 100644 --- a/doc-generator/src/generator/root.rs +++ b/doc-generator/src/generator/root.rs @@ -2,7 +2,6 @@ use markdown::mdast; use super::Printable; - impl Printable for mdast::Root { fn to_html(&self) -> String { let mut result = Vec::::new(); @@ -13,4 +12,14 @@ impl Printable for mdast::Root { result.into_iter().collect() } + + fn get_text(&self) -> String { + let mut result = Vec::::new(); + + for node in &self.children { + result.push(node.get_text()) + } + + result.join("-") + } } diff --git a/doc-generator/src/generator/text.rs b/doc-generator/src/generator/text.rs new file mode 100644 index 0000000..424a499 --- /dev/null +++ b/doc-generator/src/generator/text.rs @@ -0,0 +1,13 @@ +use markdown::mdast::Text; + +use super::Printable; + +impl Printable for Text { + fn to_html(&self) -> String { + self.value.clone() + } + + fn get_text(&self) -> String { + self.value.clone() + } +} diff --git a/doc-generator/src/main.rs b/doc-generator/src/main.rs index 344f28d..f9b24f2 100644 --- a/doc-generator/src/main.rs +++ b/doc-generator/src/main.rs @@ -1,14 +1,11 @@ use clap::Parser; use generator::Printable; -use markdown::to_html; use std::fs::File; use std::io::Write; -use std::{ - fs, - path::Path, -}; +use std::{fs, path::Path}; mod generator; +mod utils; #[derive(Parser, Debug)] #[command(author, version, about, long_about = None)] @@ -55,7 +52,11 @@ fn process_folder(path: &Path, input_folder: &Path, output_folder: &Path) { } } -fn ensure_folder_exists(folder: &Path, input_folder: &Path, output_folder: &Path) -> Result<(), String> { +fn ensure_folder_exists( + folder: &Path, + input_folder: &Path, + output_folder: &Path, +) -> Result<(), String> { // /home/fernando/misti/docs/markdown let input_folder = input_folder.canonicalize().unwrap(); @@ -115,7 +116,6 @@ fn process_markdown(file: &Path, input_folder: &Path, output_folder: &Path) -> R let md_ast = markdown::to_mdast(&markdown_text, &markdown::ParseOptions::gfm()).unwrap(); let html_text = md_ast.to_html(); - // Read template.html let mut template_path = output_folder.clone(); template_path.push("template.html"); diff --git a/doc-generator/src/utils.rs b/doc-generator/src/utils.rs new file mode 100644 index 0000000..4897e2e --- /dev/null +++ b/doc-generator/src/utils.rs @@ -0,0 +1,3 @@ +pub fn to_html_fragment(text: &String) -> String { + text.clone().to_lowercase().replace(" ", "-") +}