+
{{ content }}
diff --git a/site_test/layout/default.html b/site_test/layout/default.html
index ed0b8f9..b2e3088 100644
--- a/site_test/layout/default.html
+++ b/site_test/layout/default.html
@@ -49,11 +49,22 @@
diff --git a/src/generator/posts.rs b/src/generator/posts.rs
index d3522be..46fde7e 100644
--- a/src/generator/posts.rs
+++ b/src/generator/posts.rs
@@ -14,6 +14,8 @@ use compute_graph::{
};
use content::{AnyContent, HtmlContent, Post, PostContent};
use log::error;
+use once_cell::sync::Lazy;
+use regex::Regex;
use tera::Context;
use super::{
@@ -192,10 +194,22 @@ struct ConvertToHTML(Input
);
impl Rule for ConvertToHTML {
type Output = Option>;
fn evaluate(&mut self) -> Self::Output {
- self.input_0().clone().map(|post| post.to_html())
+ self.input_0().clone().map(|post| {
+ let html_post = post.to_html();
+ let excerpt = find_excerpt(&html_post);
+ html_post.with_excerpt(excerpt)
+ })
}
}
+static EXCERPT_REGEX: Lazy = Lazy::new(|| Regex::new("").unwrap());
+
+fn find_excerpt(post: &Post) -> Option {
+ EXCERPT_REGEX
+ .find(&post.content.html())
+ .map(|m| post.content.html()[0..m.start()].trim().to_owned())
+}
+
// #[derive(InputVisitable)]
// struct MakeExtractMetadatas {
// posts: DynamicInput,
diff --git a/src/generator/posts/content.rs b/src/generator/posts/content.rs
index 212868f..636517f 100644
--- a/src/generator/posts/content.rs
+++ b/src/generator/posts/content.rs
@@ -66,6 +66,10 @@ impl Post {
self.map_content(|c| c.to_html())
}
+ pub fn with_excerpt(self, excerpt: Option) -> Self {
+ Post { excerpt, ..self }
+ }
+
pub fn permalink(&self) -> String {
format!("/{}/{}/", self.metadata.date.year(), self.slug)
}
diff --git a/src/generator/templates.rs b/src/generator/templates.rs
index 820def3..6ca1348 100644
--- a/src/generator/templates.rs
+++ b/src/generator/templates.rs
@@ -28,6 +28,7 @@ pub fn make_graph(
empty_templates.register_filter("pretty_date", filters::pretty_date);
empty_templates.register_filter("pretty_datetime", filters::pretty_datetime);
empty_templates.register_filter("reading_time", filters::reading_time);
+ empty_templates.register_filter("zip", filters::zip);
let empty_templates = builder.add_value(empty_templates);
let default_path = content_path("layout/default.html");
@@ -214,21 +215,7 @@ pub mod filters {
use chrono::{DateTime, Datelike, Local};
use serde::Deserialize;
use std::collections::HashMap;
- use tera::{Number, Result, Value};
-
- // pub fn iso_date(date: &NaiveDate) -> String {
- // Utc::from_utc_datetime(&Utc, &date.and_hms_opt(12, 0, 0).unwrap())
- // .format("%+:0")
- // .to_string()
- // }
-
- // pub fn iso_datetime(datetime: &DateTime) -> String
- // where
- // Tz: TimeZone,
- // Tz::Offset: Display,
- // {
- // datetime.format("%+:0").to_string()
- // }
+ use tera::{Error, Number, Result, Value};
pub fn iso_datetime(value: &Value, _args: &HashMap) -> Result {
let date = DateTime::::deserialize(value)?;
@@ -256,9 +243,7 @@ pub mod filters {
}
pub fn pretty_datetime(value: &Value, _args: &HashMap) -> Result {
- dbg!(value);
let datetime = DateTime::::deserialize(value)?;
- dbg!(&datetime);
let s = format!(
"{} {}",
datetime.format("%-I:%M:%S %p"),
@@ -273,4 +258,22 @@ pub mod filters {
let minutes = (words as f64 / wpm).max(1.0).round();
Ok(Value::Number(Number::from_f64(minutes).unwrap()))
}
+
+ pub fn zip(value: &Value, _args: &HashMap) -> Result {
+ let values = value
+ .as_array()
+ .ok_or_else(|| Error::msg("zip filter requires an array"))?;
+ if values.len() % 2 == 1 {
+ return Err(Error::msg("zipped array must have even length"));
+ }
+ let len = values.len() / 2;
+ let zipped = (0..len)
+ .map(|i| {
+ let first = values[i * 2].clone();
+ let second = values[i * 2 + 1].clone();
+ Value::Array(vec![first, second])
+ })
+ .collect();
+ Ok(Value::Array(zipped))
+ }
}
diff --git a/src/generator/util/mod.rs b/src/generator/util/mod.rs
index 9178b95..348c821 100644
--- a/src/generator/util/mod.rs
+++ b/src/generator/util/mod.rs
@@ -2,7 +2,6 @@ pub mod file_watcher;
pub mod highlight;
pub mod one_more;
pub mod slugify;
-pub mod templates;
pub mod word_count;
use std::io::{BufWriter, Write};
diff --git a/src/generator/util/templates.rs b/src/generator/util/templates.rs
deleted file mode 100644
index 7f39222..0000000
--- a/src/generator/util/templates.rs
+++ /dev/null
@@ -1,25 +0,0 @@
-// static DOMAIN: Lazy =
-// Lazy::new(|| std::env::var("DOMAIN").unwrap_or("shadowfacts.net".to_owned()));
-
-// static CB: Lazy = Lazy::new(|| {
-// SystemTime::now()
-// .duration_since(SystemTime::UNIX_EPOCH)
-// .unwrap()
-// .as_secs()
-// });
-
-// static GENERATED_AT: Lazy> = Lazy::new(|| Local::now());
-
-// pub trait TemplateCommon {
-// fn domain() -> String {
-// DOMAIN.to_owned()
-// }
-
-// fn stylesheet_cache_buster() -> u64 {
-// *CB
-// }
-
-// fn generated_at() -> &'static DateTime {
-// &*GENERATED_AT
-// }
-// }