aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-08-29 15:43:02 +0200
committermetamuffin <metamuffin@disroot.org>2022-08-29 15:43:02 +0200
commit9ca6cc8c0acdd68d2c79f1f990c9dd81dd9fef4b (patch)
tree28fc79f6bd65ba53456d846fcb0462dc65892e17
parentca1c303ae20370fff555c0b8fca1b66f946eee3e (diff)
downloadmetamuffin-blog-9ca6cc8c0acdd68d2c79f1f990c9dd81dd9fef4b.tar
metamuffin-blog-9ca6cc8c0acdd68d2c79f1f990c9dd81dd9fef4b.tar.bz2
metamuffin-blog-9ca6cc8c0acdd68d2c79f1f990c9dd81dd9fef4b.tar.zst
a
-rw-r--r--tools/Cargo.lock63
-rw-r--r--tools/Cargo.toml2
-rw-r--r--tools/src/main.rs45
-rw-r--r--tools/src/markdown.rs54
4 files changed, 158 insertions, 6 deletions
diff --git a/tools/Cargo.lock b/tools/Cargo.lock
index 4867c09..b9776eb 100644
--- a/tools/Cargo.lock
+++ b/tools/Cargo.lock
@@ -3,6 +3,21 @@
version = 3
[[package]]
+name = "aho-corasick"
+version = "0.7.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.62"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1485d4d2cc45e7b201ee3767015c96faa5904387c9d87c6efdd0fb511f12d305"
+
+[[package]]
name = "atty"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -29,8 +44,10 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
name = "blog-tool"
version = "0.1.0"
dependencies = [
+ "anyhow",
"clap",
"laby",
+ "markdown",
]
[[package]]
@@ -143,12 +160,35 @@ dependencies = [
]
[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
name = "libc"
version = "0.2.132"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5"
[[package]]
+name = "markdown"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef3aab6a1d529b112695f72beec5ee80e729cb45af58663ec902c8fac764ecdd"
+dependencies = [
+ "lazy_static",
+ "pipeline",
+ "regex",
+]
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
name = "once_cell"
version = "1.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -161,6 +201,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff"
[[package]]
+name = "pipeline"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d15b6607fa632996eb8a17c9041cb6071cb75ac057abd45dece578723ea8c7c0"
+
+[[package]]
name = "proc-macro-error"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -212,6 +258,23 @@ dependencies = [
]
[[package]]
+name = "regex"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244"
+
+[[package]]
name = "ryu"
version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/tools/Cargo.toml b/tools/Cargo.toml
index 55d550f..62fbb09 100644
--- a/tools/Cargo.toml
+++ b/tools/Cargo.toml
@@ -6,3 +6,5 @@ edition = "2021"
[dependencies]
laby = "0.2.4"
clap = { version = "3.2.17", features = ["derive"] }
+anyhow = "1.0.62"
+markdown = "0.3.0" \ No newline at end of file
diff --git a/tools/src/main.rs b/tools/src/main.rs
index 0167e3c..396d148 100644
--- a/tools/src/main.rs
+++ b/tools/src/main.rs
@@ -1,17 +1,50 @@
-use clap::Parser;
-use laby::{html, Render};
+
+use std::{
+ fs::{read_to_string, File},
+ io::Write,
+};
+
+use clap::{Parser, Subcommand};
+use laby::{html, internal::Buffer, Render};
#[derive(Parser)]
struct Args {
- input: String,
- output: String,
+ #[clap(short, long)]
+ output: Option<String>,
+ #[clap(subcommand)]
+ action: ArgAction,
+}
+
+#[derive(Subcommand)]
+enum ArgAction {
+ RenderArticle { input: String },
}
fn main() {
let args = Args::parse();
-
+ match args.action {
+ ArgAction::RenderArticle { input } => {
+ let md_source = read_to_string(input).unwrap();
+ let mut out = Buffer::new();
+ article(md_source).render(&mut out);
+ write_output(&args.output, out.into_string());
+ }
+ }
+}
+
+fn write_output(t: &Option<String>, o: String) {
+ if let Some(f) = t {
+ let mut f = File::create(f).unwrap();
+ f.write_fmt(format_args!("{o}")).unwrap()
+ } else {
+ println!("{o}")
+ }
}
fn scaffold(title: String, body: impl Render) -> impl Render {
- html!(head!(title!(title)), body!())
+ html!(head!(title!(title)), body!(body))
+}
+
+fn article(md_source: String) {
+
}
diff --git a/tools/src/markdown.rs b/tools/src/markdown.rs
new file mode 100644
index 0000000..af3798e
--- /dev/null
+++ b/tools/src/markdown.rs
@@ -0,0 +1,54 @@
+pub struct Markdown(Vec<MdElement>);
+
+pub enum MdElement {
+ Heading(u8, Vec<RichText>),
+ Paragraph(Vec<RichText>),
+ Code { syntax: String, content: String },
+}
+
+pub enum RichText {
+ Text(String),
+ Bold(Box<RichText>),
+ Strike(Box<RichText>),
+ Italic(Box<RichText>),
+ Code(Box<RichText>),
+ Link(String, Vec<RichText>),
+}
+
+impl Markdown {
+ pub fn parse(s: &str) -> anyhow::Result<Self> {
+ let mut c = vec![];
+ let mut lines = s.lines();
+ while let Some(line) = lines.next() {
+ if line.starts_with("#") {
+ let (hashes, h) = line.split_once(' ').unwrap();
+ c.push(MdElement::Heading(hashes.len() as u8, RichText::parse(h)?));
+ } else if line.starts_with("```") {
+ todo!()
+ } else {
+ let mut block = line.to_string();
+ while let Some(line) = lines.next() {
+ if line == "" {
+ break;
+ }
+ block += line;
+ }
+ c.push(MdElement::Paragraph(RichText::parse(&block)?))
+ }
+ }
+ Ok(Markdown(c))
+ }
+}
+impl RichText {
+ pub fn parse(s: &str) -> anyhow::Result<Vec<Self>> {
+ let mut before = String::new();
+ let mut after = String::new();
+ let mut after_el = false;
+ for c in s.chars() {
+ match c {
+ _ => {}
+ }
+ }
+ Ok(segs)
+ }
+}