add: basic obsidian mode

This commit is contained in:
2025-12-17 23:36:41 -08:00
parent a01cda4566
commit 379ac5869d
4 changed files with 73 additions and 5 deletions
+22 -5
View File
@@ -1,6 +1,7 @@
use clap::Parser;
use git2::Repository;
use minijinja::Environment;
use regex::Regex;
use rouille::Response;
use serde::Serialize;
@@ -19,12 +20,21 @@ struct Args {
/// Address to listen on, in the form of 0.0.0.0:8080
#[arg(long, default_value = "0.0.0.0:8080")]
listen: String,
/// pre-processes markdown files to make them more standard compliant
#[arg(long)]
obsidian_mode: bool,
}
#[derive(Serialize)]
struct Context {}
fn render_page(repo_path: &PathBuf, path: &Path) -> Response {
fn preprocess_obsidian(md: &str) -> String {
let re = Regex::new(r"\[\[(.*?)\]\]").unwrap();
re.replace_all(md, "[$1]($1.md)").to_string()
}
fn render_page(repo_path: &PathBuf, path: &Path, obsidian_mode: bool) -> Response {
let md = match fs::read_to_string(path) {
Ok(md) => md,
Err(e) => {
@@ -33,6 +43,12 @@ fn render_page(repo_path: &PathBuf, path: &Path) -> Response {
}
};
let md = if obsidian_mode {
preprocess_obsidian(&md)
} else {
md
};
let body_html = markdown::to_html(&md);
let template_path = repo_path.join("template.html");
@@ -95,6 +111,7 @@ fn main() {
println!("Listening on: {}", args.listen);
let obsidian_mode = args.obsidian_mode;
rouille::start_server(args.listen, move |request| {
let url = request.url();
let requested_path = repo_path.join(url.trim_start_matches('/'));
@@ -103,18 +120,18 @@ fn main() {
if requested_path.is_dir() {
let index_path = requested_path.join("index.md");
if index_path.is_file() {
return render_page(&repo_path, &index_path);
return render_page(&repo_path, &index_path, obsidian_mode);
}
let readme_path = requested_path.join("README.md");
if readme_path.is_file() {
return render_page(&repo_path, &readme_path);
return render_page(&repo_path, &readme_path, obsidian_mode);
}
}
// Check if the path as-is is a file. e.g. /README.md
if requested_path.is_file() {
if requested_path.extension().and_then(std::ffi::OsStr::to_str) == Some("md") {
return render_page(&repo_path, &requested_path);
return render_page(&repo_path, &requested_path, obsidian_mode);
}
// For now, 404 on other file types. A real implementation might serve static files.
return Response::empty_404();
@@ -124,7 +141,7 @@ fn main() {
let mut md_path = requested_path;
md_path.set_extension("md");
if md_path.is_file() {
return render_page(&repo_path, &md_path);
return render_page(&repo_path, &md_path, obsidian_mode);
}
Response::empty_404()