From 75c5a47449c6aef3c8f8b0d48ab1db4619d404e8 Mon Sep 17 00:00:00 2001 From: Sebastian Hugentobler Date: Mon, 27 Nov 2023 10:49:50 +0100 Subject: [PATCH] use templates to create the feed entries --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/feeds/mod.rs | 35 +++++++++++++++-------------------- src/feeds/template.rs | 9 +++++++++ templates/feed_entry.html | 7 +++++++ 5 files changed, 33 insertions(+), 22 deletions(-) create mode 100644 templates/feed_entry.html diff --git a/Cargo.lock b/Cargo.lock index e192f66..578e573 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -516,7 +516,7 @@ dependencies = [ [[package]] name = "findpenguins-feed" -version = "0.2.0" +version = "0.3.0" dependencies = [ "askama", "axum", diff --git a/Cargo.toml b/Cargo.toml index e9b5885..e2b08a6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "findpenguins-feed" -version = "0.2.0" +version = "0.3.0" edition = "2021" authors = ["Sebastian Hugentobler "] license = "AGPL-3.0-or-later" diff --git a/src/feeds/mod.rs b/src/feeds/mod.rs index 0625139..bc30452 100644 --- a/src/feeds/mod.rs +++ b/src/feeds/mod.rs @@ -1,6 +1,7 @@ use std::collections::HashMap; use std::fmt; +use askama::Template; use futures::future::join_all; use rss::{GuidBuilder, Item, ItemBuilder}; use serde::Deserialize; @@ -11,6 +12,8 @@ use time::Date; use crate::scrapers::page_url; use crate::{hash, scrapers}; +use self::template::FeedEntryTemplate; + pub mod route; pub mod template; @@ -44,34 +47,26 @@ const ISO8601_DATE: u128 = iso8601::Config::DEFAULT impl Footprint { pub fn into_rss_item(self, root_url: &str) -> Item { let text = if String::is_empty(&self.text) { - "No description" + "No text" } else { &self.text }; - // injection, I know - let desc = format!( - "{}

---

from page {}", - text, - page_url(root_url, self.page), - self.page - ); - // injection again - let content = self - .images - .iter() - .map(|x| format!("
", x)) - .fold(String::new(), |mut a, b| { - a.reserve(b.len()); - a.push_str(&b); - a - }); + + let page_url = page_url(root_url, self.page); + + let template = FeedEntryTemplate { + text: text.to_string(), + page_url, + page: self.page, + images: self.images, + }; + let content = template.render().ok(); ItemBuilder::default() .title(Some(self.title)) .pub_date(self.date.format(&Iso8601::).ok()) .link(Some(self.url.clone())) - .description(Some(desc)) - .content(Some(content)) + .content(content) .guid(Some(GuidBuilder::default().value(self.url).build())) .build() } diff --git a/src/feeds/template.rs b/src/feeds/template.rs index 6fc8f50..8a61300 100644 --- a/src/feeds/template.rs +++ b/src/feeds/template.rs @@ -7,3 +7,12 @@ use super::Feed; pub struct FeedsTemplate { pub feeds: Vec, } + +#[derive(Template)] +#[template(path = "feed_entry.html")] +pub struct FeedEntryTemplate { + pub text: String, + pub page_url: String, + pub page: u8, + pub images: Vec, +} diff --git a/templates/feed_entry.html b/templates/feed_entry.html new file mode 100644 index 0000000..c9f8000 --- /dev/null +++ b/templates/feed_entry.html @@ -0,0 +1,7 @@ +{{ text }}

+---

+from page {{ page }} + +{% for img in images %} +
+{% endfor %}