X-Git-Url: https://git.r.bdr.sh/rbdr/page/blobdiff_plain/260e8ec69b8e08b9fd105bf688e7a3a9fafecd61..4d946aebe3f70ad18e235d68474b6d489757c927:/src/html_renderer.rs diff --git a/src/html_renderer.rs b/src/html_renderer.rs index 47d36bb..6b9ce38 100644 --- a/src/html_renderer.rs +++ b/src/html_renderer.rs @@ -1,18 +1,18 @@ use crate::gemini_parser::GeminiLine; -/// Renders HTML from a vector of GeminiLine elements. -/// +/// Renders HTML from a vector of `GeminiLine` elements. +/// /// # Arguments -/// * `lines` - Vector of GeminiLine elements to render -/// +/// * `lines` - Vector of `GeminiLine` elements to render +/// /// # Returns /// A String containing the rendered HTML. -pub fn render_html(lines: Vec) -> String { +pub fn render_html(lines: &[GeminiLine]) -> String { let mut heading_stack = Vec::new(); let mut last_line: Option<&GeminiLine> = None; let mut result = String::new(); - for line in &lines { + for line in lines { result.push_str(&line_preamble(line, last_line, &mut heading_stack)); result.push_str(&line_content(line)); result.push('\n'); @@ -26,23 +26,19 @@ pub fn render_html(lines: Vec) -> String { fn line_preamble( line: &GeminiLine, last_line: Option<&GeminiLine>, - heading_stack: &mut Vec + heading_stack: &mut Vec, ) -> String { let mut html = String::new(); if let Some(last_line) = last_line { match last_line { - GeminiLine::ListItem(_) => { - match line { - GeminiLine::ListItem(_) => {}, - _ => html.push_str("\n"), - } + GeminiLine::ListItem(_) => match line { + GeminiLine::ListItem(_) => {} + _ => html.push_str("\n"), }, - GeminiLine::Quote(_) => { - match line { - GeminiLine::Quote(_) => {}, - _ => html.push_str("\n"), - } + GeminiLine::Quote(_) => match line { + GeminiLine::Quote(_) => {} + _ => html.push_str("\n"), }, _ => {} } @@ -65,19 +61,15 @@ fn line_preamble( } } heading_stack.push(*level); - html.push_str(&format!("
\n", level)); - }, - GeminiLine::ListItem(_) => { - match last_line { - Some(GeminiLine::ListItem(_)) => {}, - _ => html.push_str("
    \n"), - } + html.push_str(&format!("
    \n")); + } + GeminiLine::ListItem(_) => match last_line { + Some(GeminiLine::ListItem(_)) => {} + _ => html.push_str("
      \n"), }, - GeminiLine::Quote(_) => { - match last_line { - Some(GeminiLine::Quote(_)) => {}, - _ => html.push_str("
      \n"), - } + GeminiLine::Quote(_) => match last_line { + Some(GeminiLine::Quote(_)) => {} + _ => html.push_str("
      \n"), }, _ => {} } @@ -87,16 +79,18 @@ fn line_preamble( fn line_content(line: &GeminiLine) -> String { match line { - GeminiLine::Text(content, false) => format!("

      {}

      ", content), + GeminiLine::Text(content, false) => format!("

      {content}

      "), GeminiLine::Link(url, text) => { let display = if text.is_empty() { url } else { text }; - format!("

      {}

      ", url, display) - }, - GeminiLine::Heading(level, content) => format!("{}", level, content, level), - GeminiLine::ListItem(content) => format!("
    • {}
    • ", content), - GeminiLine::PreformattedToggle(true, alt_text) => { format!("
      ", alt_text) }
      -        GeminiLine::PreformattedToggle(false, _) => { "
      ".to_string() } - GeminiLine::Text(content, true) | GeminiLine::Quote(content) => format!("{}", content) + format!("

      {display}

      ") + } + GeminiLine::Heading(level, content) => format!("{content}"), + GeminiLine::ListItem(content) => format!("
    • {content}
    • "), + GeminiLine::PreformattedToggle(true, alt_text) => { + format!("
      ")
      +        }
      +        GeminiLine::PreformattedToggle(false, _) => "
      ".to_string(), + GeminiLine::Text(content, true) | GeminiLine::Quote(content) => content.to_string(), } } @@ -122,13 +116,8 @@ mod tests { #[test] fn test_simple_text() { - let input = vec![ - GeminiLine::Text("Hello world".to_string(), false), - ]; - assert_eq!( - render_html(input), - "

      Hello world

      \n" - ); + let input = vec![GeminiLine::Text("Hello world".to_string(), false)]; + assert_eq!(render_html(&input), "

      Hello world

      \n"); } #[test] @@ -140,7 +129,7 @@ mod tests { GeminiLine::Heading(2, "Another Sub".to_string()), ]; assert_eq!( - render_html(input), + render_html(&input), "
      \n\

      Top

      \n\
      \n\ @@ -165,7 +154,7 @@ mod tests { GeminiLine::ListItem("New list".to_string()), ]; assert_eq!( - render_html(input), + render_html(&input), "
        \n\
      • First
      • \n\
      • Second
      • \n\ @@ -186,7 +175,7 @@ mod tests { GeminiLine::Quote("New quote".to_string()), ]; assert_eq!( - render_html(input), + render_html(&input), "
        \n\ First quote\n\ Still quoting\n\ @@ -206,7 +195,7 @@ mod tests { GeminiLine::PreformattedToggle(false, String::new()), ]; assert_eq!( - render_html(input), + render_html(&input), "
        \n\
                      let x = 42;\n\
                      
        \n" @@ -217,10 +206,10 @@ mod tests { fn test_links() { let input = vec![ GeminiLine::Link("https://example.com".to_string(), "Example".to_string()), - GeminiLine::Link("https://rust-lang.org".to_string(), "".to_string()), + GeminiLine::Link("https://rust-lang.org".to_string(), String::new()), ]; assert_eq!( - render_html(input), + render_html(&input), "

        Example

        \n\

        https://rust-lang.org

        \n" ); @@ -238,7 +227,7 @@ mod tests { GeminiLine::Heading(2, "Another Section".to_string()), ]; assert_eq!( - render_html(input), + render_html(&input), "
        \n\

        Title

        \n\

        Intro

        \n\ @@ -262,6 +251,6 @@ mod tests { #[test] fn test_empty_input() { let input = Vec::new(); - assert_eq!(render_html(input), ""); + assert_eq!(render_html(&input), ""); } }