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<GeminiLine>) -> 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');
}
}
heading_stack.push(*level);
- html.push_str(&format!("<section class=\"h{}\">\n", level));
+ html.push_str(&format!("<section class=\"h{level}\">\n"));
}
GeminiLine::ListItem(_) => match last_line {
Some(GeminiLine::ListItem(_)) => {}
fn line_content(line: &GeminiLine) -> String {
match line {
- GeminiLine::Text(content, false) => format!("<p>{}</p>", content),
+ GeminiLine::Text(content, false) => format!("<p>{content}</p>"),
GeminiLine::Link(url, text) => {
let display = if text.is_empty() { url } else { text };
- format!("<p class=\"a\"><a href=\"{}\">{}</a></p>", url, display)
+ format!("<p class=\"a\"><a href=\"{url}\">{display}</a></p>")
}
- GeminiLine::Heading(level, content) => format!("<h{}>{}</h{}>", level, content, level),
- GeminiLine::ListItem(content) => format!("<li>{}</li>", content),
+ GeminiLine::Heading(level, content) => format!("<h{level}>{content}</h{level}>"),
+ GeminiLine::ListItem(content) => format!("<li>{content}</li>"),
GeminiLine::PreformattedToggle(true, alt_text) => {
- format!("<pre aria-label=\"{}\">", alt_text)
+ format!("<pre aria-label=\"{alt_text}\">")
}
GeminiLine::PreformattedToggle(false, _) => "</pre>".to_string(),
GeminiLine::Text(content, true) | GeminiLine::Quote(content) => content.to_string(),
#[test]
fn test_simple_text() {
let input = vec![GeminiLine::Text("Hello world".to_string(), false)];
- assert_eq!(render_html(input), "<p>Hello world</p>\n");
+ assert_eq!(render_html(&input), "<p>Hello world</p>\n");
}
#[test]
GeminiLine::Heading(2, "Another Sub".to_string()),
];
assert_eq!(
- render_html(input),
+ render_html(&input),
"<section class=\"h1\">\n\
<h1>Top</h1>\n\
<section class=\"h2\">\n\
GeminiLine::ListItem("New list".to_string()),
];
assert_eq!(
- render_html(input),
+ render_html(&input),
"<ul>\n\
<li>First</li>\n\
<li>Second</li>\n\
GeminiLine::Quote("New quote".to_string()),
];
assert_eq!(
- render_html(input),
+ render_html(&input),
"<blockquote>\n\
First quote\n\
Still quoting\n\
GeminiLine::PreformattedToggle(false, String::new()),
];
assert_eq!(
- render_html(input),
+ render_html(&input),
"<pre aria-label=\"code\">\n\
let x = 42;\n\
</pre>\n"
GeminiLine::Link("https://rust-lang.org".to_string(), "".to_string()),
];
assert_eq!(
- render_html(input),
+ render_html(&input),
"<p class=\"a\"><a href=\"https://example.com\">Example</a></p>\n\
<p class=\"a\"><a href=\"https://rust-lang.org\">https://rust-lang.org</a></p>\n"
);
GeminiLine::Heading(2, "Another Section".to_string()),
];
assert_eq!(
- render_html(input),
+ render_html(&input),
"<section class=\"h1\">\n\
<h1>Title</h1>\n\
<p>Intro</p>\n\
#[test]
fn test_empty_input() {
let input = Vec::new();
- assert_eq!(render_html(input), "");
+ assert_eq!(render_html(&input), "");
}
}