61 lines
1.6 KiB
Rust
61 lines
1.6 KiB
Rust
use std::path::{Path, PathBuf};
|
|
use std::process::Command;
|
|
use std::str::FromStr;
|
|
|
|
use anyhow::Context;
|
|
use html::Renderer;
|
|
use template::TemplateRenderer;
|
|
|
|
mod html;
|
|
mod template;
|
|
mod tex;
|
|
|
|
fn copy_recursively(from: &Path, to: &Path) -> anyhow::Result<()> {
|
|
Command::new("cp").arg("-r").arg(from).arg(to).output()?;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn main() -> anyhow::Result<()> {
|
|
let dist_path = PathBuf::from_str("dist")?;
|
|
let public_path = PathBuf::from_str("public")?;
|
|
|
|
if dist_path.exists() {
|
|
std::fs::remove_dir_all(&dist_path).with_context(|| "Cannot delete `dist` directory")?;
|
|
}
|
|
|
|
std::fs::create_dir(&dist_path).with_context(|| "Cannot create `dist` directory")?;
|
|
|
|
for p in std::fs::read_dir(public_path)? {
|
|
copy_recursively(&p?.path(), &dist_path)
|
|
.with_context(|| "Cannot copy `public` -> `dist`")?;
|
|
}
|
|
|
|
// {{{ Generate contents
|
|
let djot_input = std::fs::read_to_string("content/arcaea.dj").unwrap();
|
|
let mut out = String::new();
|
|
let page_template = template!("templates/page.html")?;
|
|
let mut page_renderer = TemplateRenderer::new(&page_template);
|
|
|
|
while let Some(label) = page_renderer.next(&mut out)? {
|
|
if label == "content" {
|
|
let events = jotdown::Parser::new(&djot_input);
|
|
let html = Renderer::new()?;
|
|
html.push(events, &mut out)?;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
page_renderer.finish(&mut out)?;
|
|
// }}}
|
|
|
|
let posts_dir = dist_path.join("posts");
|
|
std::fs::create_dir(&posts_dir).with_context(|| "Cannot create `dist/posts` directory")?;
|
|
|
|
std::fs::write(posts_dir.join("arcaea.html"), out)
|
|
.with_context(|| "Failed to write `arcaea.html` post")?;
|
|
|
|
Ok(())
|
|
}
|