1
0
mirror of https://gitlab.com/Anson-Projects/zine.git synced 2025-07-27 00:31:23 +00:00

Add RSS feed

This commit is contained in:
2024-04-12 06:21:56 +00:00
parent 0924e73b95
commit e5ff6551e3
6 changed files with 195 additions and 13 deletions

View File

@@ -50,17 +50,28 @@ fn main() -> Result<(), Box<dyn Error>> {
entries.retain(|entry| entry.score.is_positive());
entries.sort();
let index = site_generator::generate_index(entries);
let output_path = Path::new("output/index.html");
let index = site_generator::generate_index(entries.clone());
let index_path = Path::new("output/index.html");
DirBuilder::new()
.recursive(true)
.create(output_path.parent().unwrap())
.create(index_path.parent().unwrap())
.unwrap();
match write(output_path, index.into_string()) {
Ok(_) => log::info!("Successfully wrote to {}", output_path.display()),
Err(e) => log::error!("Failed to write to {}: {}", output_path.display(), e),
match write(index_path, index.into_string()) {
Ok(_) => log::info!("Successfully wrote to {}", index_path.display()),
Err(e) => log::error!("Failed to write to {}: {}", index_path.display(), e),
}
let feed = site_generator::generate_rss(entries.clone());
let feed_path = Path::new("output/feed.xml");
DirBuilder::new()
.recursive(true)
.create(feed_path.parent().unwrap())
.unwrap();
match write(feed_path, feed) {
Ok(_) => log::info!("Successfully wrote to {}", feed_path.display()),
Err(e) => log::error!("Failed to write to {}: {}", feed_path.display(), e),
}
Ok(())

View File

@@ -7,6 +7,7 @@ use chrono::DateTime;
use chrono::Utc;
use maud::{html, Markup};
use rss::{ChannelBuilder, Item, ItemBuilder};
use crate::utilities;
@@ -69,14 +70,17 @@ fn generate_footer() -> Markup {
p {
a href="https://ansonbiggs.com" { "Anson Biggs" }
" - "
a href=("/feed.xml") target="_blank" rel="noopener noreferrer" { "RSS Feed" }
" - "
a href="https://gitlab.com/MisterBiggs/zine" { "Source Code" }
" - "
"Page generated at: " em data-tooltip="Usually daily 8AM Mountain Time" { (formatted_utc) " UTC" }
"Page generated at: " em data-tooltip="Automatic builds daily 8AM Mountain Time" { (formatted_utc) " UTC" }
}
}
}
}
}
fn generate_header() -> Markup {
html! {
header {
@@ -86,6 +90,9 @@ fn generate_header() -> Markup {
}
ul {
li { button data-target="about" onclick="toggleModal(event)" { "About" } }
li {
}
li {
details class="dropdown" {
summary role="button" class="outline secondary" { "Theme" }
@@ -191,3 +198,26 @@ pub fn generate_index(mut entries: Vec<utilities::Post>) -> Markup {
}
}
}
pub fn generate_rss(posts: Vec<utilities::Post>) -> String {
let items: Vec<Item> = posts
.iter()
.map(|post| {
ItemBuilder::default()
.title(post.title.clone())
.link(post.link.clone())
.pub_date(post.date.to_rfc2822())
.description(post.truncated_description.clone())
.build()
})
.collect();
let channel = ChannelBuilder::default()
.title("Anson's Aggregate RSS Feed")
.link("https://zine.ansonbiggs.com/feed")
.description("All the feeds I like, aggregated into one place.")
.items(items)
.build();
channel.to_string()
}