diff --git a/Cargo.lock b/Cargo.lock index 9154e24..c847a66 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1034,6 +1034,18 @@ dependencies = [ "web-sys", ] +[[package]] +name = "gray_matter" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cf2fb99fac0b821a4e61c61abff076324bb0e5c3b4a83815bbc3518a38971ad" +dependencies = [ + "serde", + "serde_json", + "toml", + "yaml-rust", +] + [[package]] name = "h2" version = "0.3.22" @@ -1571,6 +1583,12 @@ dependencies = [ "serde_test", ] +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.4.11" @@ -1822,6 +1840,7 @@ dependencies = [ "futures", "glob", "gloo-net 0.4.0", + "gray_matter", "leptos", "leptos_actix", "leptos_icons", @@ -1829,6 +1848,7 @@ dependencies = [ "leptos_router", "log", "pulldown-cmark", + "serde", "simple_logger", "wasm-bindgen", ] @@ -3018,6 +3038,15 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9828b178da53440fa9c766a3d2f73f7cf5d0ac1fe3980c1e5018d899fd19e07b" +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + [[package]] name = "yansi" version = "1.0.0-rc.1" diff --git a/Cargo.toml b/Cargo.toml index f1c93af..8902ae4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,8 +36,10 @@ actix-files = { version = "0.6", optional = true } actix-web = { version = "4", features = ["macros"], optional = true } futures = { version = "0.3", optional = true } simple_logger = { version = "4.2", optional = true } -pulldown-cmark = { version = "0.9", optional = true } glob = { version = "0.3", optional = true } +serde = { version = "1.0", optional = true } +pulldown-cmark = { version = "0.9", optional = true } # markdown parser +gray_matter = { version = "0.2", optional = true } # frontmatter parser [features] default = ["csr"] @@ -66,8 +68,10 @@ ssr = [ "dep:actix-files", "dep:futures", "dep:simple_logger", - "dep:pulldown-cmark", "dep:glob", + "dep:serde", + "dep:pulldown-cmark", + "dep:gray_matter", ] [package.metadata.cargo-all-features] diff --git a/src/app/models/post.rs b/src/app/models/post.rs index f95905f..0c8da72 100644 --- a/src/app/models/post.rs +++ b/src/app/models/post.rs @@ -1,3 +1,6 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Debug, Clone)] pub struct PostMetadata { image_path: Option, title: String, @@ -6,6 +9,7 @@ pub struct PostMetadata { project_link: Option, } +#[derive(Serialize, Deserialize, Debug, Clone)] pub struct Post { metadata: PostMetadata, content: String, @@ -15,22 +19,23 @@ cfg_if::cfg_if! { if #[cfg(feature = "ssr")] { impl From for Post { fn from(content: String) -> Self { + use gray_matter::{Matter, engine::YAML}; + let matter = Matter::::new(); + + let post_data = matter + .parse_with_struct::(&content) + .expect("Unable to parse md frontmatter"); + + let metadata = post_data.data; + let content = post_data.content; + use pulldown_cmark::{Parser, Options, html}; - let parser = Parser::new_ext(&content, Options::all()); - let mut html_output = String::new(); html::push_html(&mut html_output, parser); - println!("\nHTML output:\n{}\n", &html_output); Self { - metadata: PostMetadata { - image_path: None, - title: String::from(""), - date: String::from(""), - description: String::from(""), - project_link: None, - }, + metadata, content: html_output, } } diff --git a/src/main.rs b/src/main.rs index fd3dd3a..b1bf88e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,7 +11,10 @@ cfg_if! { #[actix_web::main] async fn main() -> std::io::Result<()> { - let _ = app::models::Post::get_all(); + let posts = app::models::Post::get_all(); + for post in posts.unwrap() { + println!("{:?}", post); + } // Setting this to None means we'll be using cargo-leptos and its env vars. let conf = get_configuration(None).await.unwrap();