From 48c9004eaea72d18c18dd22be4c4f7d99be0eca5 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sat, 27 Jul 2024 06:11:37 +0000 Subject: feat(html): clear adjacent link indicators --- src/html.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/html.rs b/src/html.rs index e9d0b96..8efd7d9 100644 --- a/src/html.rs +++ b/src/html.rs @@ -28,6 +28,7 @@ pub fn from_gemini( let mut html = String::new(); let mut title = String::new(); let mut previous_link = false; + let mut previous_link_count = 0; let condense_links = { let links = var("CONDENSE_LINKS").map_or_else( |_| vec![], @@ -52,14 +53,51 @@ pub fn from_gemini( in_condense_links_flag_trap = true; } + let align_adjacent_links = |html: &str| { + if previous_link_count > 0 { + html + .chars() + .rev() + .collect::() + .replacen( + &r#"=> "# + .chars() + .rev() + .collect::(), + "", + 1, + ) + .chars() + .rev() + .collect::() + } else { + html.to_string() + } + }; + if previous_link && (!matches!(node, Node::Link { .. }) || (!condense_links && !in_condense_links_flag_trap)) { - html.push_str("\n

"); + if let Some(next) = ast.iter().skip_while(|n| n != &node).nth(1) { + if matches!(next, Node::Link { .. }) || previous_link { + html.push_str("
"); + } else { + html.push_str("

"); + } + } else { + html.push_str("

"); + } + previous_link = false; + html = align_adjacent_links(&html); + previous_link_count = 0; } else if previous_link { + html = align_adjacent_links(&html); + html.push_str(" | "); + + previous_link_count += 1; } else if !previous_link && matches!(node, Node::Link { .. }) { html.push_str("

"); } @@ -184,7 +222,12 @@ pub fn from_gemini( previous_link = true; html.push_str(&format!( - "{}", + r#"{}{}"#, + if condense_links { + "" + } else { + r#"=> "# + }, href, safe(text.as_ref().unwrap_or(to)), )); -- cgit v1.2.3