From 4fd9f73769a6787c2c73346ed5f589b885645755 Mon Sep 17 00:00:00 2001 From: Maciej Jur Date: Sun, 21 Apr 2024 23:47:36 +0200 Subject: [PATCH] render wiki tree links --- src/html/wiki.rs | 76 +++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 43 deletions(-) diff --git a/src/html/wiki.rs b/src/html/wiki.rs index 1511732..f193165 100644 --- a/src/html/wiki.rs +++ b/src/html/wiki.rs @@ -12,29 +12,31 @@ use super::Link; #[derive(Debug)] struct TreeNode { - pub name: String, - pub children: HashMap, + pub link: Option, + pub subs: HashMap, } impl TreeNode { - fn new(name: &str) -> Self { + fn new() -> Self { TreeNode { - name: name.to_string(), - children: HashMap::new(), + link: None, + subs: HashMap::new(), } } fn add_link(&mut self, link: &Link) { - let mut current_node = self; - for component in link.path.split('/').filter(|s| !s.is_empty()) { - current_node = current_node.children.entry(component.to_string()) - .or_insert(TreeNode::new(component)); + let mut ptr = self; + for part in link.path.split('/').filter(|s| !s.is_empty()) { + ptr = ptr.subs + .entry(part.to_string()) + .or_insert(TreeNode::new()); } + ptr.link = Some(link.clone()); } } fn tree(sack: &Sack) -> impl Renderable { - let mut tree = TreeNode::new("wiki"); + let mut tree = TreeNode::new(); for link in sack.get_links_2("wiki/**/*.html") { tree.add_link(&link); }; @@ -49,24 +51,35 @@ fn tree(sack: &Sack) -> impl Renderable { // )} } nav .link-tree__nav { - // {pages.map(pages => ).extract()} - (level(&tree)) + (list(&tree)) } ) } -fn level(tree: &TreeNode) -> impl Renderable + '_ { - for (key, next) in tree.children.iter() { - println!("{key}"); - level(next); +fn list(tree: &TreeNode) -> impl Renderable + '_ { + let subs = { + let mut subs: Vec<_> = tree.subs.iter().collect(); + subs.sort_by(|a, b| a.0.cmp(b.0)); + subs }; + maud_move!( ul .link-tree__nav-list { - @for (key, next) in tree.children.iter() { + @for (key, next) in subs { li .link-tree__nav-list-item { - span .link-tree__nav-list-text { (key) } - @if next.children.len() > 0 { - (level(next)) + span .link-tree__nav-list-text { + @if let Some(ref link) = next.link { + a .link-tree__nav-list-text.link href=(&link.path) { + (&link.name) + } + } @else { + span .link-tree__nav-list-text { + (key) + } + } + } + @if next.subs.len() > 0 { + (list(next)) } } } @@ -74,29 +87,6 @@ fn level(tree: &TreeNode) -> impl Renderable + '_ { ) } -// {tree.children -// .map(m => Object.values(m)) -// .filter(xs => xs.length > 0) -// .map(pages => -// -// ).extract()} - pub fn wiki<'data, 'html, 'sack, T>( fm: &'data Wiki,