From 2198cbdff9e4a13da7db8e43f9ded1110b7cac92 Mon Sep 17 00:00:00 2001 From: Daniel Szabo Date: Tue, 1 Nov 2022 20:56:07 +0200 Subject: [PATCH] Getting ready for 1.2 & new site release - improved support for serving static resources from the binary, now supporting images - added new logo - changed save button - fixed footer attribution text, it is not true anymore that MicroBin is made by myself - replaced footer GitHub link with microbin.eu link --- Cargo.lock | 47 +++++++++++++++ Cargo.toml | 2 + README.MD | 2 +- src/endpoints/info.rs | 2 +- src/endpoints/static_resources.rs | 91 +++++++++++++++++++---------- templates/{ => assets}/favicon.svg | 0 templates/assets/logo.png | Bin 0 -> 4402 bytes templates/{ => assets}/water.css | 0 templates/footer.html | 8 +-- templates/header.html | 19 +++--- templates/index.html | 36 +++++++----- templates/info.html | 4 +- templates/pasta.html | 6 +- 13 files changed, 149 insertions(+), 68 deletions(-) rename templates/{ => assets}/favicon.svg (100%) create mode 100644 templates/assets/logo.png rename templates/{ => assets}/water.css (100%) diff --git a/Cargo.lock b/Cargo.lock index 21101c1..c4189be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1293,8 +1293,10 @@ dependencies = [ "lazy_static", "linkify", "log", + "mime_guess", "qrcode-generator", "rand", + "rust-embed", "sanitize-filename", "serde", "serde_json", @@ -1702,6 +1704,40 @@ version = "0.6.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" +[[package]] +name = "rust-embed" +version = "6.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "283ffe2f866869428c92e0d61c2f35dfb4355293cdfdc48f49e895c15f1333d1" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "6.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31ab23d42d71fb9be1b643fe6765d292c5e14d46912d13f3ae2815ca048ea04d" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "7.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1669d81dfabd1b5f8e2856b8bbe146c6192b0ba22162edc738ac0a5de18f054" +dependencies = [ + "sha2", + "walkdir", +] + [[package]] name = "rustc_version" version = "0.4.0" @@ -1820,6 +1856,17 @@ dependencies = [ "digest", ] +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "signal-hook-registry" version = "1.4.0" diff --git a/Cargo.toml b/Cargo.toml index 19a334a..8adc0ce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,6 +32,8 @@ actix-web-httpauth = "0.6.0" lazy_static = "1.4.0" syntect = "5.0" qrcode-generator = "4.1.6" +rust-embed = "6.4.2" +mime_guess = "2.0.4" [profile.release] lto = true diff --git a/README.MD b/README.MD index 610cad0..e9756d8 100644 --- a/README.MD +++ b/README.MD @@ -18,7 +18,7 @@ Or install from Cargo: And run with your custom configuration: -`microbin --port 8080 --highlightsyntax --editable` +`microbin --port 8080 --public-path https://myserver.net --highlightsyntax --editable` ### Features - Is very small diff --git a/src/endpoints/info.rs b/src/endpoints/info.rs index bbdc4fe..7b8bb27 100644 --- a/src/endpoints/info.rs +++ b/src/endpoints/info.rs @@ -33,7 +33,7 @@ pub async fn info(data: web::Data) -> HttpResponse { args: &ARGS, pastas: &pastas, status: &String::from(status), - version_string: &String::from("1.2.0-20221029"), + version_string: &String::from("1.2.0-20221101"), message: &String::from(message), } .render() diff --git a/src/endpoints/static_resources.rs b/src/endpoints/static_resources.rs index 728d617..d314416 100644 --- a/src/endpoints/static_resources.rs +++ b/src/endpoints/static_resources.rs @@ -1,36 +1,63 @@ -use actix_web::{get, web, HttpResponse}; -use askama::Template; -use std::marker::PhantomData; +use actix_web::{web, App, HttpResponse, HttpServer, Responder}; +use mime_guess::from_path; +use rust_embed::RustEmbed; -#[derive(Template)] -#[template(path = "water.css", escape = "none")] -struct WaterCSS<'a> { - _marker: PhantomData<&'a ()>, -} +#[derive(RustEmbed)] +#[folder = "templates/assets/"] +struct Asset; -#[derive(Template)] -#[template(path = "favicon.svg", escape = "none")] -struct Favicon<'a> { - _marker: PhantomData<&'a ()>, -} - -#[get("/static/{resource}")] -pub async fn static_resources(resource_id: web::Path) -> HttpResponse { - match resource_id.into_inner().as_str() { - "water.css" => HttpResponse::Ok().content_type("text/css").body( - WaterCSS { - _marker: Default::default(), - } - .render() - .unwrap(), - ), - "favicon.svg" => HttpResponse::Ok().content_type("image/svg+xml").body( - Favicon { - _marker: Default::default(), - } - .render() - .unwrap(), - ), - _ => HttpResponse::NotFound().content_type("text/html").finish(), +fn handle_embedded_file(path: &str) -> HttpResponse { + match Asset::get(path) { + Some(content) => HttpResponse::Ok() + .content_type(from_path(path).first_or_octet_stream().as_ref()) + .body(content.data.into_owned()), + None => HttpResponse::NotFound().body("404 Not Found"), } } + +#[actix_web::get("/static/{_:.*}")] +async fn static_resources(path: web::Path) -> impl Responder { + handle_embedded_file(path.as_str()) +} + +// #[derive(Template)] +// #[template(path = "water.css", escape = "none")] +// struct WaterCSS<'a> { +// _marker: PhantomData<&'a ()>, +// } + +// // #[derive(Template)] +// // #[template(path = "logo.png", escape = "none")] +// struct LogoPNG<'a> { +// _marker: PhantomData<&'a ()>, +// } + +// #[derive(Template)] +// #[template(path = "favicon.svg", escape = "none")] +// struct Favicon<'a> { +// _marker: PhantomData<&'a ()>, +// } + +// #[get("/static/{resource}")] +// pub async fn static_resources(resource_id: web::Path) -> HttpResponse { +// match resource_id.into_inner().as_str() { +// "water.css" => HttpResponse::Ok().content_type("text/css").body( +// WaterCSS { +// _marker: Default::default(), +// } +// .render() +// .unwrap(), +// ), +// "logo.png" => HttpResponse::Ok() +// .content_type("image/png") +// .body(Ok(EmbedFile::open("templates/logo.png")?)), +// "favicon.svg" => HttpResponse::Ok().content_type("image/svg+xml").body( +// Favicon { +// _marker: Default::default(), +// } +// .render() +// .unwrap(), +// ), +// _ => HttpResponse::NotFound().content_type("text/html").finish(), +// } +// } diff --git a/templates/favicon.svg b/templates/assets/favicon.svg similarity index 100% rename from templates/favicon.svg rename to templates/assets/favicon.svg diff --git a/templates/assets/logo.png b/templates/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e4e2a30e4675adf101d553c5ab29a06910c5b2f4 GIT binary patch literal 4402 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 xf|X9Xt0>7fWk0i

{% if args.footer_text.as_ref().is_none() %} - MicroBin by Dániel Szabó. Fork me on GitHub! - Let's keep the Web compact, accessible and humane! + MicroBin by Dániel Szabó and the FOSS Community. + Let's keep the Web compact, accessible and humane! {%- else %} - {{ args.footer_text.as_ref().unwrap() }} + {{ args.footer_text.as_ref().unwrap() }} {%- endif %}

{%- endif %} + \ No newline at end of file diff --git a/templates/header.html b/templates/header.html index d282c93..8bd4a5b 100644 --- a/templates/header.html +++ b/templates/header.html @@ -10,7 +10,7 @@ - + {% if !args.pure_html %} {% if args.custom_css.as_ref().is_none() %} @@ -48,20 +48,17 @@ {% if !args.hide_logo %} - μ - {%- endif %} - - {% if args.title.as_ref().is_none() %} - MicroBin - {%- else %} - {{ args.title.as_ref().unwrap() }} - {%- endif %} + + + {%- endif %} {% if args.title.as_ref().is_none() %} + MicroBin {%- else %} {{ args.title.as_ref().unwrap() }} {%- endif %} New - Pasta + - Pasta List + List Info diff --git a/templates/index.html b/templates/index.html index 3c92851..1730b86 100644 --- a/templates/index.html +++ b/templates/index.html @@ -164,23 +164,27 @@ -
- - {% if !args.no_file_upload %} -
- -
- + +
+ {% if !args.no_file_upload %} +
+ +
+ +
+ {% endif %} + {% if args.readonly %} + + + {%- else %} + + + + {%- endif %}
- {% endif %} - {% if args.readonly %} - - {%- else %} - - {%- endif %} - -