aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuben Beltran del Rio <git@r.bdr.sh>2025-01-13 18:35:46 +0100
committerRuben Beltran del Rio <git@r.bdr.sh>2025-01-13 18:35:46 +0100
commit5f7e1e310aafc765684463d3ae00359c652cd751 (patch)
treedcdd4367d440572207103568f53306ebf240a8f9
parent26ab94e7d00cfb920d14b9a6e64dfe16dc120a95 (diff)
Fix regression where .gmi wasn't being replaced to .html
-rw-r--r--Cargo.lock2
-rw-r--r--Cargo.toml2
-rw-r--r--README.md3
-rw-r--r--src/html_renderer.rs18
4 files changed, 19 insertions, 6 deletions
diff --git a/Cargo.lock b/Cargo.lock
index daf6010..16c047d 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4,4 +4,4 @@ version = 4
[[package]]
name = "gema_texto"
-version = "1.0.0"
+version = "1.0.1"
diff --git a/Cargo.toml b/Cargo.toml
index 04e4283..f1c8751 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "gema_texto"
-version = "1.0.0"
+version = "1.0.1"
edition = "2021"
license = "AGPL-3.0-or-later"
description = "Library to parse gemtext and render HTML"
diff --git a/README.md b/README.md
index 7497cf1..272070e 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,8 @@ for those projects. Here's how each line is handled:
- Headings and the content under them is wrapped in a `<section>` tag.
- All text lines are `<p>`, even empty ones.
-- URLs are wrapped in a `<p>`
+- URLs are wrapped in a `<p>` and .gmi files are changed to .html unless the
+ URL starts with gemini:
- Alt Text is supported for preformatted-toggles, and is written as
the aria-label of the `<pre>` tag.
- Consecutive list items are wrapped in a `<ul>` and rendered as `<li>` tags.
diff --git a/src/html_renderer.rs b/src/html_renderer.rs
index e513533..503337b 100644
--- a/src/html_renderer.rs
+++ b/src/html_renderer.rs
@@ -99,8 +99,14 @@ fn line_content(line: &GeminiLine) -> String {
match line {
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=\"{url}\">{display}</a></p>")
+ let processed_url;
+ if !url.starts_with("gemini:") && url.ends_with(".gmi") {
+ processed_url = url.replace(".gmi", ".html");
+ } else {
+ processed_url = url.to_string();
+ }
+ let display = if text.is_empty() { &processed_url } else { text };
+ format!("<p class=\"a\"><a href=\"{processed_url}\">{display}</a></p>")
}
GeminiLine::Heading(level, content) => format!("<h{level}>{content}</h{level}>"),
GeminiLine::ListItem(content) => format!("<li>{content}</li>"),
@@ -223,12 +229,18 @@ mod tests {
#[test]
fn test_links() {
let input = vec![
+ GeminiLine::Link("gemini://hi.gmi".to_string(), "Example".to_string()),
+ GeminiLine::Link("/hi.gmi/kidding".to_string(), "Example".to_string()),
+ GeminiLine::Link("/hi.gmi".to_string(), "Example".to_string()),
GeminiLine::Link("https://example.com".to_string(), "Example".to_string()),
GeminiLine::Link("https://rust-lang.org".to_string(), String::new()),
];
assert_eq!(
render_html(&input),
- "<p class=\"a\"><a href=\"https://example.com\">Example</a></p>\n\
+ "<p class=\"a\"><a href=\"gemini://hi.gmi\">Example</a></p>\n\
+ <p class=\"a\"><a href=\"/hi.gmi/kidding\">Example</a></p>\n\
+ <p class=\"a\"><a href=\"/hi.html\">Example</a></p>\n\
+ <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"
);
}