Add TOML metadata parsing.
This commit is contained in:
76
Cargo.lock
generated
76
Cargo.lock
generated
@@ -266,9 +266,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "4.5.40"
|
||||
version = "4.5.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f"
|
||||
checksum = "2c5e4fcf9c21d2e544ca1ee9d8552de13019a42aa7dbf32747fa7aaf1df76e57"
|
||||
dependencies = [
|
||||
"clap_builder",
|
||||
"clap_derive",
|
||||
@@ -276,9 +276,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap_builder"
|
||||
version = "4.5.40"
|
||||
version = "4.5.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e"
|
||||
checksum = "fecb53a0e6fcfb055f686001bc2e2592fa527efaf38dbe81a6a9563562e57d41"
|
||||
dependencies = [
|
||||
"anstream",
|
||||
"anstyle",
|
||||
@@ -288,9 +288,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap_derive"
|
||||
version = "4.5.40"
|
||||
version = "4.5.45"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce"
|
||||
checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro2",
|
||||
@@ -495,7 +495,7 @@ dependencies = [
|
||||
"atomic 0.6.1",
|
||||
"pear",
|
||||
"serde",
|
||||
"toml",
|
||||
"toml 0.8.23",
|
||||
"uncased",
|
||||
"version_check",
|
||||
]
|
||||
@@ -814,7 +814,7 @@ dependencies = [
|
||||
"rocket",
|
||||
"serde",
|
||||
"tera",
|
||||
"toml",
|
||||
"toml 0.9.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1637,9 +1637,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.11.1"
|
||||
version = "1.11.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
|
||||
checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -1854,6 +1854,15 @@ dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_spanned"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sha2"
|
||||
version = "0.10.9"
|
||||
@@ -2160,11 +2169,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_spanned",
|
||||
"toml_datetime",
|
||||
"serde_spanned 0.6.9",
|
||||
"toml_datetime 0.6.11",
|
||||
"toml_edit",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml"
|
||||
version = "0.9.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "75129e1dc5000bfbaa9fee9d1b21f974f9fbad9daec557a521ee6e080825f6e8"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"serde",
|
||||
"serde_spanned 1.0.0",
|
||||
"toml_datetime 0.7.0",
|
||||
"toml_parser",
|
||||
"toml_writer",
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_datetime"
|
||||
version = "0.6.11"
|
||||
@@ -2174,6 +2198,15 @@ dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_datetime"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_edit"
|
||||
version = "0.22.27"
|
||||
@@ -2182,18 +2215,33 @@ checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"serde",
|
||||
"serde_spanned",
|
||||
"toml_datetime",
|
||||
"serde_spanned 0.6.9",
|
||||
"toml_datetime 0.6.11",
|
||||
"toml_write",
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_parser"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10"
|
||||
dependencies = [
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_write"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
|
||||
|
||||
[[package]]
|
||||
name = "toml_writer"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64"
|
||||
|
||||
[[package]]
|
||||
name = "tower-service"
|
||||
version = "0.3.3"
|
||||
|
||||
@@ -7,9 +7,9 @@ edition = "2021"
|
||||
[dependencies]
|
||||
pulldown-cmark = "0.13.0"
|
||||
tera = "1.20.0"
|
||||
toml = "0.8.23"
|
||||
toml = "0.9.5"
|
||||
grep = "0.3.2"
|
||||
regex = "1.11.1"
|
||||
regex = "1.11.2"
|
||||
pathdiff = "0.2.3"
|
||||
|
||||
[dependencies.chrono]
|
||||
@@ -21,7 +21,7 @@ version = "0.20.2"
|
||||
default-features = false
|
||||
|
||||
[dependencies.clap]
|
||||
version = "4.5.40"
|
||||
version = "4.5.45"
|
||||
features = ["derive"]
|
||||
|
||||
[dependencies.rocket]
|
||||
|
||||
49
src/lib.rs
49
src/lib.rs
@@ -31,6 +31,8 @@ use pathdiff::diff_paths;
|
||||
|
||||
use chrono::{DateTime, MappedLocalTime, TimeZone, Local};
|
||||
|
||||
use pulldown_cmark::{Event, Tag, TagEnd};
|
||||
|
||||
pub struct Historian {
|
||||
source_root: PathBuf,
|
||||
index_filename: String,
|
||||
@@ -368,11 +370,47 @@ pub struct PageRenderer {
|
||||
tera: Tera
|
||||
}
|
||||
|
||||
fn render_markdown (content: &tera::Value, args: &HashMap<String, tera::Value>) -> tera::Result<tera::Value> {
|
||||
let parser = pulldown_cmark::Parser::new(content.as_str().unwrap());
|
||||
fn parse_markdown (content: &str, metadata: &mut Table) -> String {
|
||||
let mut metadata_str = String::new();
|
||||
let mut in_metadata = false;
|
||||
let parser = pulldown_cmark::Parser::new_ext(content, pulldown_cmark::Options::ENABLE_YAML_STYLE_METADATA_BLOCKS).map(|event| {
|
||||
match &event {
|
||||
Event::Start(tag) => {
|
||||
if let Tag::MetadataBlock(_) = tag {
|
||||
in_metadata = true;
|
||||
}
|
||||
}
|
||||
Event::Text(text) => {
|
||||
if in_metadata {
|
||||
metadata_str.push_str(text);
|
||||
}
|
||||
}
|
||||
Event::End(tag) => {
|
||||
if let TagEnd::MetadataBlock(_) = tag {
|
||||
if in_metadata {
|
||||
if let Ok(parsed_metadata) = toml::de::from_str::<Table>(&metadata_str) {
|
||||
println!("{:?}", parsed_metadata);
|
||||
for (key, value) in parsed_metadata {
|
||||
metadata.insert(key, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
metadata_str.clear();
|
||||
in_metadata = false;
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
event
|
||||
});
|
||||
let mut html_output = String::new();
|
||||
pulldown_cmark::html::push_html(&mut html_output, parser);
|
||||
Ok(tera::Value::String(html_output))
|
||||
html_output
|
||||
}
|
||||
|
||||
fn render_markdown (content: &tera::Value, args: &HashMap<String, tera::Value>) -> tera::Result<tera::Value> {
|
||||
Ok(tera::Value::String(parse_markdown(content.as_str().unwrap(), &mut Table::new())))
|
||||
}
|
||||
|
||||
impl PageRenderer {
|
||||
@@ -506,6 +544,11 @@ impl<'a> Render<'a> {
|
||||
}
|
||||
self.context.insert("content", &content);
|
||||
|
||||
let mut metadata = Table::new();
|
||||
let html_content = parse_markdown(&content, &mut metadata);
|
||||
self.context.insert("html_content", &html_content);
|
||||
self.context.insert("metadata", &metadata);
|
||||
|
||||
let mut ancestors: VecDeque<&Page> = VecDeque::new();
|
||||
let mut ancestor = page.parent.as_ref();
|
||||
while ancestor.is_some() {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
{{ content | markdown | safe }}
|
||||
{{ html_content | safe }}
|
||||
{% endblock content %}
|
||||
|
||||
Reference in New Issue
Block a user