filled in tools
This commit is contained in:
parent
b5839f6077
commit
9fc315b475
|
@ -1,2 +1,80 @@
|
||||||
# Tools
|
# The Igloo - Tools
|
||||||
test 2
|
|
||||||
|
###### 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*
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
</p>
|
</p>
|
||||||
<div class="main">
|
<div class="main">
|
||||||
#CONTENT#
|
#CONTENT#
|
||||||
|
<p id="spacer"><br></p>
|
||||||
<hr>
|
<hr>
|
||||||
<p id="spacer"><br></p>
|
<p id="spacer"><br></p>
|
||||||
|
|
||||||
|
|
44
src/main.rs
44
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 actix_web::{web, App, HttpServer, HttpResponse, Responder};
|
||||||
use std::fs;
|
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 {
|
fn markdown_to_html(markdown_content: &str) -> String {
|
||||||
let mut html_output = String::new();
|
|
||||||
let parser = Parser::new(markdown_content);
|
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!("<p id=\"{}\"><br></p>", 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 {
|
async fn serve_markdown(file_path: &str) -> impl Responder {
|
||||||
|
|
Loading…
Reference in a new issue