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:
25
src/main.rs
25
src/main.rs
@@ -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(())
|
||||
|
@@ -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()
|
||||
}
|
||||
|
Reference in New Issue
Block a user