generate a blogroll
This commit is contained in:
parent
477a94a374
commit
d777694118
@ -13,6 +13,8 @@ use ureq::http::Response;
|
|||||||
use ureq::Body;
|
use ureq::Body;
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
|
const ENTRIES_LEN: usize = 10;
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Default)]
|
#[derive(Deserialize, Serialize, Default)]
|
||||||
pub struct FetchData {
|
pub struct FetchData {
|
||||||
pub etag: String,
|
pub etag: String,
|
||||||
@ -132,8 +134,9 @@ impl FeedStore {
|
|||||||
Ok(Some(parser.parse(BufReader::new(file))?))
|
Ok(Some(parser.parse(BufReader::new(file))?))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn collect(&self, feed_configs: &Vec<super::FeedConfig>) -> Vec<Entry> {
|
pub fn collect(&self, feed_configs: &Vec<super::FeedConfig>) -> (Vec<Feed>, Vec<Entry>) {
|
||||||
let mut entries = vec![];
|
let mut feeds = Vec::new();
|
||||||
|
let mut entries = Vec::new();
|
||||||
|
|
||||||
for feed_config in feed_configs {
|
for feed_config in feed_configs {
|
||||||
let mut feed = match (|| {
|
let mut feed = match (|| {
|
||||||
@ -151,16 +154,20 @@ impl FeedStore {
|
|||||||
Ok(Some(f)) => f,
|
Ok(Some(f)) => f,
|
||||||
};
|
};
|
||||||
|
|
||||||
entries.append(&mut feed.entries);
|
entries.append(&mut std::mem::take(&mut feed.entries));
|
||||||
// todo also trim mid-way when length > something, trading cpu for memory
|
feeds.push(feed);
|
||||||
|
// optimization to reduce memory usage
|
||||||
|
if entries.len() > 4 * ENTRIES_LEN {
|
||||||
|
entries = trim_entries(entries);
|
||||||
}
|
}
|
||||||
trim_entries(entries)
|
}
|
||||||
|
(feeds, trim_entries(entries))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn trim_entries(mut entries: Vec<Entry>) -> Vec<Entry> {
|
fn trim_entries(mut entries: Vec<Entry>) -> Vec<Entry> {
|
||||||
entries.sort_by_key(|e| std::cmp::Reverse(e.updated.or(e.published).unwrap_or_default()));
|
entries.sort_by_key(|e| std::cmp::Reverse(e.updated.or(e.published).unwrap_or_default()));
|
||||||
entries.truncate(10);
|
entries.truncate(ENTRIES_LEN);
|
||||||
entries
|
entries
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,6 @@ use crate::feed_store::FeedStore;
|
|||||||
use crate::to_checked_pathbuf;
|
use crate::to_checked_pathbuf;
|
||||||
use crate::Config;
|
use crate::Config;
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use feed_rs::model::Entry;
|
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use tera::Tera;
|
use tera::Tera;
|
||||||
|
|
||||||
@ -11,8 +10,9 @@ pub fn build(config: &Config, feed_store: &FeedStore) -> Result<()> {
|
|||||||
let out_dir = to_checked_pathbuf(&config.out_dir);
|
let out_dir = to_checked_pathbuf(&config.out_dir);
|
||||||
|
|
||||||
let mut context = tera::Context::new();
|
let mut context = tera::Context::new();
|
||||||
let feed_entries: Vec<Entry> = feed_store.collect(&config.feeds);
|
let (feeds, entries) = feed_store.collect(&config.feeds);
|
||||||
context.insert("entries", &feed_entries);
|
context.insert("feeds", &feeds);
|
||||||
|
context.insert("entries", &entries);
|
||||||
context.insert("PKG_AUTHORS", env!("CARGO_PKG_AUTHORS"));
|
context.insert("PKG_AUTHORS", env!("CARGO_PKG_AUTHORS"));
|
||||||
context.insert("PKG_HOMEPAGE", env!("CARGO_PKG_HOMEPAGE"));
|
context.insert("PKG_HOMEPAGE", env!("CARGO_PKG_HOMEPAGE"));
|
||||||
context.insert("PKG_NAME", env!("CARGO_PKG_NAME"));
|
context.insert("PKG_NAME", env!("CARGO_PKG_NAME"));
|
||||||
|
@ -63,7 +63,20 @@
|
|||||||
|
|
||||||
<aside>
|
<aside>
|
||||||
<img src="logo.svg">
|
<img src="logo.svg">
|
||||||
<p>Last updated: {{now()|date(format="%Y-%m-%d %H:%M")}}
|
<p>Last updated: {{now()|date(format="%Y-%m-%d %H:%M")}}</p>
|
||||||
|
<ul>
|
||||||
|
{% for feed in feeds %}
|
||||||
|
<li>
|
||||||
|
<a {% if feed.links.0 %}href="{{feed.links.0.href}}"{% endif -%}>
|
||||||
|
{% if feed.title -%}
|
||||||
|
{{feed.title.content|striptags}}
|
||||||
|
{% elif feed.authors.0 and feed.authors.0.name %}
|
||||||
|
{{ feed.authors.0.name }}
|
||||||
|
{% endif -%}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
</aside>
|
</aside>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user