archive-http: use minijinja instead of tera

newstuff
Manos Pitsidianakis 2023-03-31 22:53:30 +03:00
parent 3a402e5112
commit 5409c9de71
Signed by: Manos Pitsidianakis
GPG Key ID: 7729C7707F7E09D0
6 changed files with 113 additions and 382 deletions

342
Cargo.lock generated
View File

@ -13,15 +13,6 @@ dependencies = [
"version_check",
]
[[package]]
name = "aho-corasick"
version = "0.7.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
dependencies = [
"memchr",
]
[[package]]
name = "android_system_properties"
version = "0.1.5"
@ -243,16 +234,6 @@ dependencies = [
"futures-lite",
]
[[package]]
name = "bstr"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09"
dependencies = [
"memchr",
"serde",
]
[[package]]
name = "buf_redux"
version = "0.8.4"
@ -321,28 +302,6 @@ dependencies = [
"winapi 0.3.9",
]
[[package]]
name = "chrono-tz"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "29c39203181991a7dd4343b8005bd804e7a9a37afb8ac070e43771e8c820bbde"
dependencies = [
"chrono",
"chrono-tz-build",
"phf",
]
[[package]]
name = "chrono-tz-build"
version = "0.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f509c3a87b33437b05e2458750a0700e5bdd6956176773e6c7d6dd15a283a0c"
dependencies = [
"parse-zoneinfo",
"phf",
"phf_codegen",
]
[[package]]
name = "clap"
version = "2.34.0"
@ -471,12 +430,6 @@ version = "2.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb"
[[package]]
name = "deunicode"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "850878694b7933ca4c9569d30a34b55031b9b139ee1fc7b94a527c4ef960d690"
[[package]]
name = "digest"
version = "0.10.6"
@ -845,30 +798,6 @@ dependencies = [
"wasi 0.11.0+wasi-snapshot-preview1",
]
[[package]]
name = "globset"
version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc"
dependencies = [
"aho-corasick",
"bstr",
"fnv",
"log",
"regex",
]
[[package]]
name = "globwalk"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc"
dependencies = [
"bitflags",
"ignore",
"walkdir",
]
[[package]]
name = "h2"
version = "0.3.16"
@ -995,12 +924,6 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
[[package]]
name = "humansize"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02296996cb8796d7c6e3bc2d9211b7802812d36999a51bb754123ead7d37d026"
[[package]]
name = "hyper"
version = "0.14.25"
@ -1059,23 +982,6 @@ dependencies = [
"unicode-normalization",
]
[[package]]
name = "ignore"
version = "0.4.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492"
dependencies = [
"globset",
"lazy_static",
"log",
"memchr",
"regex",
"same-file",
"thread_local",
"walkdir",
"winapi-util",
]
[[package]]
name = "indexmap"
version = "1.9.3"
@ -1342,6 +1248,12 @@ version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]]
name = "memo-map"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aec276c09560ce4447087aaefc19eb0c18d97e31bd05ebac38881c4723400c40"
[[package]]
name = "memoffset"
version = "0.6.5"
@ -1367,6 +1279,17 @@ dependencies = [
"unicase",
]
[[package]]
name = "minijinja"
version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "673d1ece89f7e166f43270800d78f9b1a9d21fda92dbcfa3b98b21213cdccbbc"
dependencies = [
"memo-map",
"self_cell",
"serde",
]
[[package]]
name = "minimal-lexical"
version = "0.2.1"
@ -1434,8 +1357,9 @@ version = "0.1.0"
dependencies = [
"lazy_static",
"mailpot",
"minijinja",
"percent-encoding",
"tera",
"serde_json",
"tokio",
"warp",
]
@ -1636,104 +1560,12 @@ dependencies = [
"windows-sys 0.45.0",
]
[[package]]
name = "parse-zoneinfo"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41"
dependencies = [
"regex",
]
[[package]]
name = "percent-encoding"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
[[package]]
name = "pest"
version = "2.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b1403e8401ad5dedea73c626b99758535b342502f8d1e361f4a2dd952749122"
dependencies = [
"thiserror",
"ucd-trie",
]
[[package]]
name = "pest_derive"
version = "2.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be99c4c1d2fc2769b1d00239431d711d08f6efedcecb8b6e30707160aee99c15"
dependencies = [
"pest",
"pest_generator",
]
[[package]]
name = "pest_generator"
version = "2.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e56094789873daa36164de2e822b3888c6ae4b4f9da555a1103587658c805b1e"
dependencies = [
"pest",
"pest_meta",
"proc-macro2",
"quote",
"syn 2.0.12",
]
[[package]]
name = "pest_meta"
version = "2.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6733073c7cff3d8459fda0e42f13a047870242aed8b509fe98000928975f359e"
dependencies = [
"once_cell",
"pest",
"sha2",
]
[[package]]
name = "phf"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c"
dependencies = [
"phf_shared",
]
[[package]]
name = "phf_codegen"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a56ac890c5e3ca598bbdeaa99964edb5b0258a583a9eb6ef4e89fc85d9224770"
dependencies = [
"phf_generator",
"phf_shared",
]
[[package]]
name = "phf_generator"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1181c94580fa345f50f19d738aaa39c0ed30a600d95cb2d3e23f94266f14fbf"
dependencies = [
"phf_shared",
"rand",
]
[[package]]
name = "phf_shared"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1fb5f6f826b772a8d4c0394209441e7d37cbbb967ae9c7e0e8134365c9ee676"
dependencies = [
"siphasher",
"uncased",
]
[[package]]
name = "pin-project"
version = "1.0.12"
@ -1901,23 +1733,6 @@ dependencies = [
"thiserror",
]
[[package]]
name = "regex"
version = "1.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.6.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]]
name = "reqwest"
version = "0.11.16"
@ -2112,6 +1927,12 @@ dependencies = [
"libc",
]
[[package]]
name = "self_cell"
version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ef965a420fe14fdac7dd018862966a4c14094f900e1650bbc71ddd7d580c8af"
[[package]]
name = "serde"
version = "1.0.159"
@ -2183,17 +2004,6 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012"
[[package]]
name = "sha2"
version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
dependencies = [
"cfg-if 1.0.0",
"cpufeatures",
"digest",
]
[[package]]
name = "signal-hook"
version = "0.3.15"
@ -2213,12 +2023,6 @@ dependencies = [
"libc",
]
[[package]]
name = "siphasher"
version = "0.3.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de"
[[package]]
name = "slab"
version = "0.4.8"
@ -2228,15 +2032,6 @@ dependencies = [
"autocfg",
]
[[package]]
name = "slug"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3bc762e6a4b6c6fcaade73e77f9ebc6991b676f88bb2358bddb56560f073373"
dependencies = [
"deunicode",
]
[[package]]
name = "smallvec"
version = "1.10.0"
@ -2356,28 +2151,6 @@ dependencies = [
"windows-sys 0.45.0",
]
[[package]]
name = "tera"
version = "1.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3df578c295f9ec044ff1c829daf31bb7581d5b3c2a7a3d87419afe1f2531438c"
dependencies = [
"chrono",
"chrono-tz",
"globwalk",
"humansize",
"lazy_static",
"percent-encoding",
"pest",
"pest_derive",
"rand",
"regex",
"serde",
"serde_json",
"slug",
"unic-segment",
]
[[package]]
name = "termcolor"
version = "1.1.3"
@ -2601,71 +2374,6 @@ version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
[[package]]
name = "ucd-trie"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81"
[[package]]
name = "uncased"
version = "0.9.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09b01702b0fd0b3fadcf98e098780badda8742d4f4a7676615cad90e8ac73622"
dependencies = [
"version_check",
]
[[package]]
name = "unic-char-property"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221"
dependencies = [
"unic-char-range",
]
[[package]]
name = "unic-char-range"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc"
[[package]]
name = "unic-common"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc"
[[package]]
name = "unic-segment"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23"
dependencies = [
"unic-ucd-segment",
]
[[package]]
name = "unic-ucd-segment"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700"
dependencies = [
"unic-char-property",
"unic-char-range",
"unic-ucd-version",
]
[[package]]
name = "unic-ucd-version"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4"
dependencies = [
"unic-common",
]
[[package]]
name = "unicase"
version = "2.6.0"

View File

@ -18,7 +18,8 @@ path = "src/main.rs"
[dependencies]
lazy_static = "*"
mailpot = { version = "0.1.0", path = "../core" }
minijinja = { version = "0.31.0", features = ["source", ] }
percent-encoding = "^2.1"
tera = "1"
serde_json = "^1"
tokio = { version = "1", features = ["full"] }
warp = "^0.3"

View File

@ -27,24 +27,16 @@ pub use mailpot::*;
use std::sync::Arc;
use minijinja::{Environment, Source};
use percent_encoding::percent_decode_str;
use tera::{Context, Tera};
use warp::Filter;
lazy_static::lazy_static! {
pub static ref TEMPLATES: Tera = {
let mut tera = match Tera::new("src/templates/*") {
Ok(t) => t,
Err(e) => {
println!("Parsing error(s): {}", e);
::std::process::exit(1);
}
};
let names: Vec<_> = tera.get_template_names().collect();
println!("names: {:?}", names);
assert!(!names.is_empty());
tera.autoescape_on(vec![".html", ".sql"]);
tera
pub static ref TEMPLATES: Environment<'static> = {
let mut env = Environment::new();
env.set_source(Source::from_path("src/templates/"));
env
};
}
@ -110,15 +102,38 @@ async fn main() {
let db = Database::open_db(&conf1).unwrap();
let list = db.get_list(list_pk).unwrap().unwrap();
let months = db.months(list_pk).unwrap();
let posts = db.list_posts(list_pk, None).unwrap();
let mut context = Context::new();
context.insert("title", &list.name);
context.insert("list", &list);
context.insert("months", &months);
context.insert("posts", &posts);
context.insert("body", &list.description.clone().unwrap_or_default());
let posts = db
.list_posts(list_pk, None)
.unwrap()
.into_iter()
.map(|post| {
let envelope = melib::Envelope::from_bytes(post.message.as_slice(), None)
.expect("Could not parse mail");
minijinja::context! {
pk => post.pk,
list => post.list,
subject => envelope.subject(),
address=> post.address,
message_id => post.message_id,
message => post.message,
timestamp => post.timestamp,
datetime => post.datetime,
}
})
.collect::<Vec<_>>();
let context = minijinja::context! {
title=> &list.name,
list=> &list,
months=> &months,
posts=> posts,
body=>&list.description.clone().unwrap_or_default(),
};
Ok(warp::reply::html(
TEMPLATES.render("list.html", &context).unwrap(),
TEMPLATES
.get_template("list.html")
.unwrap()
.render(context)
.unwrap_or_else(|err| err.to_string()),
))
});
let conf2 = conf.clone();
@ -136,30 +151,25 @@ async fn main() {
.expect("Could not parse mail");
let body = envelope.body_bytes(post.message.as_slice());
let body_text = body.text();
let mut context = Context::new();
context.insert("title", &list.name);
context.insert("list", &list);
context.insert("post", &post);
context.insert("posts", &posts);
context.insert("body", &body_text);
context.insert("from", &envelope.field_from_to_string());
context.insert("date", &envelope.date_as_str());
context.insert("to", &envelope.field_to_to_string());
context.insert("subject", &envelope.subject());
context.insert(
"in_reply_to",
&envelope.in_reply_to_display().map(|r| r.to_string()),
);
context.insert(
"references",
&envelope
.references()
.into_iter()
.map(|m| m.to_string())
.collect::<Vec<String>>(),
);
let context = minijinja::context !{
title => &list.name,
list => &list,
post => &post,
posts => &posts,
body => &body_text,
from => &envelope.field_from_to_string(),
date => &envelope.date_as_str(),
to => &envelope.field_to_to_string(),
subject => &envelope.subject(),
in_reply_to => &envelope.in_reply_to_display().map(|r| r.to_string()),
references => &envelope .references() .into_iter() .map(|m| m.to_string()) .collect::<Vec<String>>(),
};
Ok(warp::reply::html(
TEMPLATES.render("post.html", &context).unwrap(),
TEMPLATES
.get_template("post.html")
.unwrap()
.render(context)
.unwrap_or_else(|err| err.to_string()),
))
});
let conf3 = conf.clone();
@ -170,23 +180,28 @@ async fn main() {
let lists = lists_values
.iter()
.map(|list| {
let mut context = Context::new();
let months = db.months(list.pk).unwrap();
let posts = db.list_posts(list.pk, None).unwrap();
context.insert("title", &list.name);
context.insert("list", &list);
context.insert("posts", &posts);
context.insert("months", &months);
context.insert("body", &list.description.as_deref().unwrap_or_default());
context.into_json()
minijinja::context! {
title => &list.name,
list => &list,
posts => &posts,
months => &months,
body => &list.description.as_deref().unwrap_or_default(),
}
})
.collect::<Vec<_>>();
let mut context = Context::new();
context.insert("title", "mailing list archive");
context.insert("description", "");
context.insert("lists", &lists);
let context = minijinja::context! {
title => "mailing list archive",
description => "",
lists => &lists,
};
Ok(warp::reply::html(
TEMPLATES.render("lists.html", &context).unwrap(),
TEMPLATES
.get_template("lists.html")
.unwrap()
.render(context)
.unwrap_or_else(|err| err.to_string()),
))
});
let routes = warp::get()

View File

@ -2,7 +2,11 @@
<div class="entry">
<h1>{{title}}</h1>
<div class="body">
{{body}}
<ul>
{% for l in lists %}
<li><a href="/lists/{{ l.list.pk }}/">{{l.title}}</a></li>
{% endfor %}
</ul>
</div>
</div>
{% include "footer.html" %}

View File

@ -1,18 +1,19 @@
{% include "header.html" %}
<div class="entry">
<h1>{{title}}</h1>
<div class="body">
{{body}}
<h2>Months</h2>
<ul>
{% for month in months %}
<li><a href="/list/{{list.pk}}/{{ month }}">{{ month }}</a></li>
{% endfor %}
{% endfor %}
</ul>
<h2>Posts</h2>
<ul>
{% for post in posts %}
<li><a href="/list/{{post.list}}/{{ post.message_id }}">{{ post.address }} {{ post.datetime }} {{ post.message_id }}</a></li>
<li><span>From: &lt;{{ post.address }}&gt;</span><br />
<span>Date: {{ post.datetime }}</span><br />
<span>Subject: <a href="/list/{{post.list}}/{{ post.message_id }}">{{ post.subject }}</a></span></br><span>Message-ID: {{ post.message_id }}</span>
</li>
{% endfor %}
</ul>
</div>

View File

@ -2,9 +2,11 @@
<div class="entry">
<p>{{lists|length}} lists</p>
<div class="body">
{% for list in lists %}
{{ list.title }}
<ul>
{% for l in lists %}
<li><a href="/lists/{{ l.list.pk }}/">{{l.title}}</a></li>
{% endfor %}
</ul>
</div>
</div>
{% include "footer.html" %}