add: basic obsidian mode
This commit is contained in:
+22
-5
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user