diff --git a/pages/tools.md b/pages/tools.md index 1a46b3c..0be9912 100644 --- a/pages/tools.md +++ b/pages/tools.md @@ -1,2 +1,80 @@ -# Tools -test 2 +# The Igloo - Tools + +###### nginx + +## Nginx + +> > to document + +###### cloudflare + +## Cloudflare + +> > to document + +###### portainer + +## A dashboard ⌨ + +Being as new to docker container as I was (and still am), I wanted a pretty +dashboard to motinor and tinker with the containers I run on the server. +I chose [portainer](https://www.portainer.io/") for its beginner-friendliness, +and it never failed me (yet). + +*port.penwing.org* + +###### pihole + +## An adblocker 🛑 + +*local network only x)* + +###### searxng + +## A search engine 🔍 + +I am not a big corporate fan *(as a linux user, surprising)*, so I was +unhappy about relying on google for my searchs. Not because of its hunger for data +but merely because I want to search for informations and not accept whatever google +says the best result is. [SearXNG](https://github.com/searxng/searxng) +is a **self-hostable meta search engine** (a bit of a mouthful). What it means +in practice is that it will sort results according to *multiple sources* +instead of just one (and you can choose the sources !) + +*search.penwing.org* + +###### forgejo + +## Some git versioning 🗃 + +> > to document + +*git.penwing.org* + +###### jellyfin + +## Some movies 🎬 + +As a huge movie watcher, which I collect very legally, I had to make myself a +collection. But why not share it with my friends ? So I use my server to host a +[Jellyfin](https://jellyfin.org/) instance + +*movie.penwing.org* + +###### stirling + +## A pdf "edition" tool + +> > to document + +*pdf.penwing.org* + +###### seafile + +## A file manager 📁 + +While I use a lot scp (not the foundation, [the command](https://linux.die.net/man/1/scp)), +I like to have my own remote file drive. Following the move away from google as a +search engine, I want to be free of google drive as well. + +*file.penwing.org* diff --git a/src/common.html b/src/common.html index 38b27c1..719e7a1 100644 --- a/src/common.html +++ b/src/common.html @@ -31,6 +31,7 @@

#CONTENT# +




diff --git a/src/main.rs b/src/main.rs index e9f3e9e..c90753b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,48 @@ -use pulldown_cmark::{Parser, html}; +use pulldown_cmark::{Parser, html, Event, Tag, HeadingLevel}; use actix_web::{web, App, HttpServer, HttpResponse, Responder}; use std::fs; +fn slugify(text: &str) -> String { + text.to_lowercase() + .replace(" ", "-") + .replace(|c: char| !c.is_alphanumeric() && c != '-', "") +} + fn markdown_to_html(markdown_content: &str) -> String { - let mut html_output = String::new(); let parser = Parser::new(markdown_content); - html::push_html(&mut html_output, parser); - html_output + + let mut html_output = String::new(); + let mut events = Vec::new(); + let mut in_header = false; + let mut header_text = String::new(); + + for event in parser { + match &event { + Event::Start(Tag::Heading(HeadingLevel::H6, ..)) => { + in_header = true; + header_text.clear(); + } + Event::End(Tag::Heading(HeadingLevel::H6, ..)) => { + in_header = false; + let slug = slugify(&header_text); + events.push(Event::Html(format!("


", slug).into())); + } + Event::Text(text) => { + if in_header { + header_text.push_str(text); + } else { + events.push(event.clone()); + } + } + _ => { + events.push(event.clone()); + } + } + } + + let mut html_renderer = String::new(); + html::push_html(&mut html_renderer, events.into_iter()); + html_renderer } async fn serve_markdown(file_path: &str) -> impl Responder {