Changed usage to generate from dir
All checks were successful
run check / cargo check (push) Successful in 3m47s
All checks were successful
run check / cargo check (push) Successful in 3m47s
This commit is contained in:
parent
3720c7b1cc
commit
8d09cac271
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -1,3 +1,5 @@
|
||||||
/target
|
/target
|
||||||
/templates
|
/templates
|
||||||
test_md.md
|
/output
|
||||||
|
/md_src
|
||||||
|
mlem.toml
|
||||||
|
|
135
Cargo.lock
generated
135
Cargo.lock
generated
|
@ -83,7 +83,9 @@ checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"android-tzdata",
|
"android-tzdata",
|
||||||
"iana-time-zone",
|
"iana-time-zone",
|
||||||
|
"js-sys",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
|
"wasm-bindgen",
|
||||||
"windows-targets",
|
"windows-targets",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -109,6 +111,12 @@ dependencies = [
|
||||||
"phf_codegen",
|
"phf_codegen",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "convert_case"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "core-foundation-sys"
|
name = "core-foundation-sys"
|
||||||
version = "0.8.6"
|
version = "0.8.6"
|
||||||
|
@ -159,6 +167,19 @@ dependencies = [
|
||||||
"typenum",
|
"typenum",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "derive_more"
|
||||||
|
version = "0.99.17"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
|
||||||
|
dependencies = [
|
||||||
|
"convert_case",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"rustc_version",
|
||||||
|
"syn 1.0.109",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deunicode"
|
name = "deunicode"
|
||||||
version = "1.4.3"
|
version = "1.4.3"
|
||||||
|
@ -175,6 +196,12 @@ dependencies = [
|
||||||
"crypto-common",
|
"crypto-common",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "equivalent"
|
||||||
|
version = "1.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "generic-array"
|
name = "generic-array"
|
||||||
version = "0.14.7"
|
version = "0.14.7"
|
||||||
|
@ -220,6 +247,12 @@ dependencies = [
|
||||||
"walkdir",
|
"walkdir",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hashbrown"
|
||||||
|
version = "0.14.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "humansize"
|
name = "humansize"
|
||||||
version = "2.1.3"
|
version = "2.1.3"
|
||||||
|
@ -268,6 +301,16 @@ dependencies = [
|
||||||
"winapi-util",
|
"winapi-util",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "indexmap"
|
||||||
|
version = "2.2.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
|
||||||
|
dependencies = [
|
||||||
|
"equivalent",
|
||||||
|
"hashbrown",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itoa"
|
name = "itoa"
|
||||||
version = "1.0.11"
|
version = "1.0.11"
|
||||||
|
@ -326,9 +369,13 @@ checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
|
||||||
name = "mlem"
|
name = "mlem"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"chrono",
|
||||||
|
"derive_more",
|
||||||
"markdown",
|
"markdown",
|
||||||
"regex",
|
"regex",
|
||||||
|
"serde",
|
||||||
"tera",
|
"tera",
|
||||||
|
"toml",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -392,7 +439,7 @@ dependencies = [
|
||||||
"pest_meta",
|
"pest_meta",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 2.0.57",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -527,6 +574,15 @@ version = "0.8.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
|
checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustc_version"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
|
||||||
|
dependencies = [
|
||||||
|
"semver",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ryu"
|
name = "ryu"
|
||||||
version = "1.0.17"
|
version = "1.0.17"
|
||||||
|
@ -542,6 +598,12 @@ dependencies = [
|
||||||
"winapi-util",
|
"winapi-util",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "semver"
|
||||||
|
version = "1.0.22"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.197"
|
version = "1.0.197"
|
||||||
|
@ -559,7 +621,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 2.0.57",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -573,6 +635,15 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_spanned"
|
||||||
|
version = "0.6.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sha2"
|
name = "sha2"
|
||||||
version = "0.10.8"
|
version = "0.10.8"
|
||||||
|
@ -600,6 +671,17 @@ dependencies = [
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "1.0.109"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "2.0.57"
|
version = "2.0.57"
|
||||||
|
@ -650,7 +732,41 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 2.0.57",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml"
|
||||||
|
version = "0.8.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
"serde_spanned",
|
||||||
|
"toml_datetime",
|
||||||
|
"toml_edit",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_datetime"
|
||||||
|
version = "0.6.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_edit"
|
||||||
|
version = "0.22.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4"
|
||||||
|
dependencies = [
|
||||||
|
"indexmap",
|
||||||
|
"serde",
|
||||||
|
"serde_spanned",
|
||||||
|
"toml_datetime",
|
||||||
|
"winnow",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -770,7 +886,7 @@ dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 2.0.57",
|
||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -792,7 +908,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 2.0.57",
|
||||||
"wasm-bindgen-backend",
|
"wasm-bindgen-backend",
|
||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
|
@ -899,3 +1015,12 @@ name = "windows_x86_64_msvc"
|
||||||
version = "0.52.4"
|
version = "0.52.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8"
|
checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winnow"
|
||||||
|
version = "0.6.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
|
@ -9,3 +9,7 @@ edition = "2021"
|
||||||
markdown = "1.0.0-alpha.16"
|
markdown = "1.0.0-alpha.16"
|
||||||
tera = "1.0"
|
tera = "1.0"
|
||||||
regex = "1.0"
|
regex = "1.0"
|
||||||
|
toml = "0.8"
|
||||||
|
serde = { version = "1.0", features = ["derive"]}
|
||||||
|
chrono = "0.4"
|
||||||
|
derive_more = "0.99"
|
||||||
|
|
14
src/config.rs
Normal file
14
src/config.rs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
use serde::Deserialize;
|
||||||
|
use std::fs::read_to_string;
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
pub struct Config {
|
||||||
|
pub output_dir: String,
|
||||||
|
pub src_dir: String,
|
||||||
|
pub templates_dir: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn read_config() -> Config {
|
||||||
|
let config_string = read_to_string("mlem.toml").expect("mlem.toml config not found");
|
||||||
|
toml::from_str(&config_string).unwrap()
|
||||||
|
}
|
104
src/lib.rs
Normal file
104
src/lib.rs
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
use chrono::prelude::*;
|
||||||
|
use derive_more::Constructor;
|
||||||
|
use markdown::{to_html_with_options, CompileOptions, Options};
|
||||||
|
use regex::Regex;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::ffi::OsString;
|
||||||
|
use std::fs::{read_dir, read_to_string, self};
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use tera::{Context, Tera};
|
||||||
|
|
||||||
|
pub fn read_src_files(src_dir: &str) -> Vec<SrcMD> {
|
||||||
|
let mut files: Vec<SrcMD> = Vec::new();
|
||||||
|
for file in read_dir(src_dir).expect("Cant read src dir") {
|
||||||
|
let file = file.unwrap();
|
||||||
|
let kv = get_kv(read_to_string(file.path()).unwrap()).0;
|
||||||
|
let title = kv.get("title").unwrap();
|
||||||
|
let date = kv.get("date").unwrap();
|
||||||
|
files.push(SrcMD::new(
|
||||||
|
file.path(),
|
||||||
|
title.to_string(),
|
||||||
|
DateTime::parse_from_str(&format!("{date} 00:00:00 +00:00"), "%Y-%m-%d %H:%M:%S %z").unwrap(),
|
||||||
|
file.path().file_stem().unwrap().to_os_string(),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
files
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn write_to_fs(html: String,output_dir: &String,file_name: &String){
|
||||||
|
fs::write(format!("{output_dir}/{file_name}.html"), html).unwrap_or_else(|_| panic!("Error writing {file_name}"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Constructor)]
|
||||||
|
pub struct SrcMD {
|
||||||
|
pub path: PathBuf,
|
||||||
|
pub title: String,
|
||||||
|
pub date: DateTime<FixedOffset>,
|
||||||
|
pub file_name: OsString,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn generate_blog_entry(markdown: String,template_dir: &String) -> String {
|
||||||
|
let markdown = markdown.clone();
|
||||||
|
|
||||||
|
let mut tera = Tera::new(&format!("{template_dir}/*")).unwrap();
|
||||||
|
tera.autoescape_on(vec![]);
|
||||||
|
|
||||||
|
let (mut key_value, markdown) = get_kv(markdown);
|
||||||
|
|
||||||
|
let html_markdown = to_html_with_options(
|
||||||
|
&markdown,
|
||||||
|
&Options {
|
||||||
|
compile: CompileOptions {
|
||||||
|
allow_dangerous_html: true,
|
||||||
|
allow_dangerous_protocol: true,
|
||||||
|
..CompileOptions::default()
|
||||||
|
},
|
||||||
|
..Options::default()
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
key_value.insert("blog_content".to_string(), html_markdown);
|
||||||
|
|
||||||
|
let context = Context::from_serialize(&key_value).unwrap();
|
||||||
|
|
||||||
|
tera.render(key_value.get("template").unwrap(), &context)
|
||||||
|
.unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_kv(markdown: String) -> (HashMap<String, String>, String) {
|
||||||
|
let re_key_value = Regex::new(r"(?ms)---(.*)---(?:\n)").unwrap();
|
||||||
|
|
||||||
|
let key_value_string = re_key_value
|
||||||
|
.find(markdown.as_str())
|
||||||
|
.expect("Can't find key value map in markdown");
|
||||||
|
|
||||||
|
let content_markdown = re_key_value
|
||||||
|
.replace(markdown.clone().as_str(), "")
|
||||||
|
.to_string();
|
||||||
|
|
||||||
|
let mut key_value: HashMap<String, String> = HashMap::new();
|
||||||
|
|
||||||
|
for line in key_value_string.as_str().lines() {
|
||||||
|
if line == "---" {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
key_value.insert(
|
||||||
|
line.split(':')
|
||||||
|
.collect::<Vec<&str>>()
|
||||||
|
.first()
|
||||||
|
.unwrap()
|
||||||
|
.trim()
|
||||||
|
.to_string(),
|
||||||
|
line.split(':')
|
||||||
|
.collect::<Vec<&str>>()
|
||||||
|
.get(1)
|
||||||
|
.unwrap()
|
||||||
|
.trim()
|
||||||
|
.to_string(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
(key_value, content_markdown)
|
||||||
|
}
|
87
src/main.rs
87
src/main.rs
|
@ -1,79 +1,16 @@
|
||||||
use markdown::{to_html_with_options, CompileOptions, Options};
|
use std::fs::read_to_string;
|
||||||
use regex::Regex;
|
mod config;
|
||||||
use std::collections::HashMap;
|
// mod lib;
|
||||||
use std::{env, fs::read_to_string};
|
use mlem::*;
|
||||||
use tera::{Context, Tera};
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let args: Vec<String> = env::args().collect();
|
let config = config::read_config();
|
||||||
if args.len() < 2 {
|
|
||||||
panic!("Please provide md file");
|
let raw_files = read_src_files(&config.src_dir);
|
||||||
|
for file in raw_files {
|
||||||
|
let markdown = read_to_string(file.path).expect("File does not exist");
|
||||||
|
let html = generate_blog_entry(markdown,&config.templates_dir);
|
||||||
|
write_to_fs(html, &config.output_dir, &file.file_name.into_string().unwrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
let markdown = read_to_string(args.get(1).unwrap()).expect("File does not exist");
|
// println!("{}", generate_blog_entry(markdown));
|
||||||
|
|
||||||
println!("{}", generate_blog_entry(markdown));
|
|
||||||
}
|
|
||||||
|
|
||||||
fn generate_blog_entry(markdown: String) -> String {
|
|
||||||
let markdown = markdown.clone();
|
|
||||||
|
|
||||||
let mut tera = Tera::new("templates/*").unwrap();
|
|
||||||
tera.autoescape_on(vec![]);
|
|
||||||
|
|
||||||
let (mut key_value, markdown) = get_kv(markdown);
|
|
||||||
|
|
||||||
let html_markdown = to_html_with_options(
|
|
||||||
&markdown,
|
|
||||||
&Options {
|
|
||||||
compile: CompileOptions {
|
|
||||||
allow_dangerous_html: true,
|
|
||||||
allow_dangerous_protocol: true,
|
|
||||||
..CompileOptions::default()
|
|
||||||
},
|
|
||||||
..Options::default()
|
|
||||||
},
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
key_value.insert("blog_content".to_string(), html_markdown);
|
|
||||||
|
|
||||||
let context = Context::from_serialize(&key_value).unwrap();
|
|
||||||
|
|
||||||
tera.render(key_value.get("template").unwrap(), &context)
|
|
||||||
.unwrap()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_kv(markdown: String) -> (HashMap<String, String>, String) {
|
|
||||||
let re_key_value = Regex::new(r"(?ms)---(.*)---(?:\n)").unwrap();
|
|
||||||
|
|
||||||
let key_value_string = re_key_value
|
|
||||||
.find(markdown.as_str())
|
|
||||||
.expect("Can't find key value map in markdown");
|
|
||||||
|
|
||||||
let content_markdown = re_key_value
|
|
||||||
.replace(markdown.clone().as_str(), "")
|
|
||||||
.to_string();
|
|
||||||
|
|
||||||
let mut key_value: HashMap<String, String> = HashMap::new();
|
|
||||||
|
|
||||||
for line in key_value_string.as_str().lines() {
|
|
||||||
if line == "---" {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
key_value.insert(
|
|
||||||
line.split(':')
|
|
||||||
.collect::<Vec<&str>>().first()
|
|
||||||
.unwrap()
|
|
||||||
.trim()
|
|
||||||
.to_string(),
|
|
||||||
line.split(':')
|
|
||||||
.collect::<Vec<&str>>()
|
|
||||||
.get(1)
|
|
||||||
.unwrap()
|
|
||||||
.trim()
|
|
||||||
.to_string(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
(key_value, content_markdown)
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue