remade modular html generator
This commit is contained in:
parent
a500db6f45
commit
3587f20a39
9 changed files with 192 additions and 137 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -99,6 +99,7 @@ dependencies = [
|
||||||
name = "banii-cafe"
|
name = "banii-cafe"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"rand",
|
||||||
"rocket",
|
"rocket",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -4,4 +4,5 @@ version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rocket = "0.5.0"
|
rand = "0.8.5"
|
||||||
|
rocket = "0.5.0"
|
||||||
|
|
3
src/htmlgenerator.rs
Normal file
3
src/htmlgenerator.rs
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
pub mod blocks;
|
||||||
|
pub mod builder;
|
||||||
|
pub mod errors;
|
105
src/htmlgenerator/blocks.rs
Normal file
105
src/htmlgenerator/blocks.rs
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
use std::{ffi::OsString, fs};
|
||||||
|
pub fn gen_head(charset: &str, author: &str, title: &str, stylesheet: &str) -> String {
|
||||||
|
String::from(format!(r#"
|
||||||
|
<head>
|
||||||
|
<meta charset="{}" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="author" content="{}">
|
||||||
|
<title>{}</title>
|
||||||
|
<link rel="stylesheet" href="./styles/{}.css">
|
||||||
|
</head>
|
||||||
|
"#, charset, author, title, stylesheet))}
|
||||||
|
|
||||||
|
pub fn gen_header(site_name: &str, quote: String) -> String {
|
||||||
|
let blinkie_string = gen_imgs("blinkies");
|
||||||
|
String::from(format!(r#"
|
||||||
|
<header>
|
||||||
|
<div class="header-greet">welcome to...</div>
|
||||||
|
<h1>{}</h1>
|
||||||
|
<div id="header-quotebox" class="window">
|
||||||
|
<div class="billboard">{}</div>
|
||||||
|
</div>
|
||||||
|
<div id="blinkiebox">
|
||||||
|
<div class="marquee"><div class="blinkies">{}</div><div class="blinkies">{}</div></div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
"#, site_name, quote, blinkie_string, blinkie_string))}
|
||||||
|
|
||||||
|
pub fn gen_main(nav: String, content: String) -> String {
|
||||||
|
String::from(format!(r#"
|
||||||
|
<main>
|
||||||
|
{}
|
||||||
|
{}
|
||||||
|
</main>
|
||||||
|
"#, nav, content))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn gen_footer() -> String {
|
||||||
|
let banners_string = gen_imgs("banners");
|
||||||
|
String::from(format!(r#"
|
||||||
|
<footer>
|
||||||
|
<div id="bannerbox">
|
||||||
|
<div class="marquee"><div class="banners">{}</div><div class="banners">{}</div></div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
"#, banners_string, banners_string))}
|
||||||
|
|
||||||
|
pub fn gen_nav(links_map: Vec<(&str, &str)>) -> String{
|
||||||
|
let mut links:String = String::from("");
|
||||||
|
for (url, label) in links_map.into_iter() {
|
||||||
|
let mut newtab = "";
|
||||||
|
if url.chars().nth(0).unwrap() != '/' {
|
||||||
|
newtab = "target='_blank'"
|
||||||
|
}
|
||||||
|
let link_tag = format!("<li><a class='navlink' {} href='{}'>{}</a></li>", newtab ,url, label);
|
||||||
|
links = format!("{links}{link_tag}");
|
||||||
|
}
|
||||||
|
|
||||||
|
String::from(format!(r#"
|
||||||
|
<nav class="window">
|
||||||
|
<h2 style="color: rgb(222,222,108);">travel to...</h2>
|
||||||
|
<ul>
|
||||||
|
{}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
"#, links))}
|
||||||
|
|
||||||
|
// use for when no content for main availiable
|
||||||
|
pub fn gen_placeholder() -> String{
|
||||||
|
String::from(format!(r#"
|
||||||
|
<article>
|
||||||
|
<div class="window">
|
||||||
|
<h2>!under construction!</h2>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
"#))}
|
||||||
|
|
||||||
|
fn gen_imgs(images: &str) -> String {
|
||||||
|
let paths = fs::read_dir(format!("./static/img/{images}/")).unwrap();
|
||||||
|
let mut imgs:String = String::from("");
|
||||||
|
|
||||||
|
for path in paths {
|
||||||
|
let file_name = OsString::from(path.unwrap().file_name());
|
||||||
|
let img_tag = format!("<img src='./img/{images}/{}'>", file_name.to_str().unwrap());
|
||||||
|
imgs = format!("{imgs}{img_tag}");
|
||||||
|
}
|
||||||
|
|
||||||
|
return imgs;
|
||||||
|
}
|
||||||
|
|
||||||
|
//content
|
||||||
|
pub fn home_content() -> String {
|
||||||
|
String::from(format!(r#"
|
||||||
|
<article>
|
||||||
|
<div class="window">
|
||||||
|
<h2 style="color: rgb(222,222,108);">welcome!</h2>
|
||||||
|
<p>hiii!!! welcome to my site, feel free to look around and learn something your government doesn't want you to :3</p>
|
||||||
|
</div>
|
||||||
|
<div class="window" style="max-width: 400px;">
|
||||||
|
<h2>stampbook</h2>
|
||||||
|
<div class="stamps">
|
||||||
|
{}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
"#, gen_imgs("stamps")))}
|
11
src/htmlgenerator/builder.rs
Normal file
11
src/htmlgenerator/builder.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
pub fn build_page(head: String, header: String, main: String, footer: String) -> String {format!(r#"
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
{}
|
||||||
|
<body>
|
||||||
|
{}
|
||||||
|
{}
|
||||||
|
{}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
"#, head, header, main, footer)}
|
22
src/htmlgenerator/errors.rs
Normal file
22
src/htmlgenerator/errors.rs
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
use rocket::response::content::RawHtml;
|
||||||
|
use rocket::Request;
|
||||||
|
use rocket::http::Status;
|
||||||
|
|
||||||
|
use crate::*;
|
||||||
|
|
||||||
|
#[catch(default)]
|
||||||
|
pub fn default(status: Status, req: &Request)-> RawHtml<String>{
|
||||||
|
RawHtml(crate::htmlgenerator::builder::build_page(
|
||||||
|
gen_head("UTF-8", "genki_angel", "banii.cafe", "base"),
|
||||||
|
gen_header("BANII.CAFE", "uh-oh, something has gone wrong!".to_string()),
|
||||||
|
gen_main(gen_nav(get_links()), String::from(format!(r#"
|
||||||
|
<article>
|
||||||
|
<div class="window">
|
||||||
|
<img src="https://http.cat/{}"/>
|
||||||
|
<p>{}</p>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
"#, status.code, req.uri()))),
|
||||||
|
gen_footer()
|
||||||
|
))
|
||||||
|
}
|
|
@ -1,130 +0,0 @@
|
||||||
use std::ffi::OsString;
|
|
||||||
use std::fs;
|
|
||||||
|
|
||||||
pub fn build_index() -> String {format!(r#"
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
{}
|
|
||||||
<body>
|
|
||||||
{}
|
|
||||||
{}
|
|
||||||
{}
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
"#, gen_head(), gen_header(), gen_main(), gen_footer())}
|
|
||||||
|
|
||||||
fn gen_head() -> String {String::from(format!(r#"
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<meta name="author" content="banii_angel">
|
|
||||||
<title>banii.cafe</title>
|
|
||||||
<link rel="stylesheet" href="./styles/base.css">
|
|
||||||
</head>
|
|
||||||
"#))}
|
|
||||||
|
|
||||||
fn gen_header() -> String {
|
|
||||||
let blinkie_string = gen_img("blinkies");
|
|
||||||
String::from(format!(r#"
|
|
||||||
<header>
|
|
||||||
<div class="header-greet">welcome to...</div>
|
|
||||||
<h1>{}</h1>
|
|
||||||
<div id="header-quotebox" class="window">
|
|
||||||
<div class="billboard">{}</div>
|
|
||||||
</div>
|
|
||||||
<div id="blinkiebox" class="window">
|
|
||||||
<div class="marquee"><div class="blinkies">{}</div><div class="blinkies">{}</div></div>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
"#, "BANII.CAFE", "Site under construction...", blinkie_string, blinkie_string))}
|
|
||||||
|
|
||||||
fn gen_main() -> String {String::from(format!(r#"
|
|
||||||
<main>
|
|
||||||
<nav class="window">
|
|
||||||
<h2 style="color: rgb(222,222,108);">travel to...</h2>
|
|
||||||
<ul>
|
|
||||||
<li><a class="navlink" href="/">/home</a></li>
|
|
||||||
<!-- <li><a class="navlink" href="/gallery">/gallery</a></li> -->
|
|
||||||
<li><a class="navlink" href="/repos">/repos</a></li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
<article>
|
|
||||||
<div class="windowbox">
|
|
||||||
<div class="window">
|
|
||||||
<h2 style="color: #cc4c4c; margin-bottom: 1em;">$$ most wanted $$</h2>
|
|
||||||
<div class="mostwanted">
|
|
||||||
<div class="mw-picture">
|
|
||||||
<img style="width: 200px" src="{}">
|
|
||||||
</div>
|
|
||||||
<div class="mw-profile">
|
|
||||||
<table style="width: 100%;">
|
|
||||||
<tr>
|
|
||||||
<td>name:</td>
|
|
||||||
<td><span style="color: rgb(222,222,108);">genki_angel</span></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>height:</td>
|
|
||||||
<td>mouse-sized</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>gender:</td>
|
|
||||||
<td><span style="color: #cc4c4c;">dangerous</span></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><span style="color: #cc4c4c;">wanted</span> for:</td>
|
|
||||||
<td>being too silly</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>last seen:</td>
|
|
||||||
<td>in your walls</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<div class="mw-desc">
|
|
||||||
<p style="text-align: left;">
|
|
||||||
<span style="color: rgb(49, 99, 235);">!INFO:</span> likes to smell plants and look at funny animals... <br>can be found eating <span class="highlight">plastic</span> from your bins and drinking <span class="highlight">kerosene</span> at your nearest airport
|
|
||||||
</p>
|
|
||||||
<br>
|
|
||||||
<p style="text-align: left;">
|
|
||||||
<span style="color: #cc4c4c;">!CAUTION:</span> will <span class="highlight">bark</span> very loud if approached
|
|
||||||
</p>
|
|
||||||
<br>
|
|
||||||
<p class="window">
|
|
||||||
<span style="color: rgb(222,222,108);">!REWARD!</span><br>second-hand <span class="highlight">Hwasong-18</span> ICBM<br>[fuel not included]
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="window">
|
|
||||||
<h2>stampbook</h2>
|
|
||||||
<div class="stamps">
|
|
||||||
{}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</article>
|
|
||||||
</main>
|
|
||||||
"#,"./img/genki.gif", gen_img("stamps")))}
|
|
||||||
|
|
||||||
fn gen_footer() -> String {
|
|
||||||
let banners_string = gen_img("banners");
|
|
||||||
String::from(format!(r#"
|
|
||||||
<footer>
|
|
||||||
<div id="bannerbox">
|
|
||||||
<div class="marquee"><div class="banners">{}</div><div class="banners">{}</div></div>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
"#, banners_string, banners_string))}
|
|
||||||
|
|
||||||
fn gen_img(images: &str) -> String {
|
|
||||||
let paths = fs::read_dir(format!("./static/img/{images}/")).unwrap();
|
|
||||||
let mut imgs:String = String::from("");
|
|
||||||
|
|
||||||
for path in paths {
|
|
||||||
let file_name = OsString::from(path.unwrap().file_name());
|
|
||||||
let img_tag = format!("<img src='./img/{images}/{}'>", file_name.to_str().unwrap());
|
|
||||||
imgs = format!("{imgs}{img_tag}");
|
|
||||||
}
|
|
||||||
|
|
||||||
return imgs;
|
|
||||||
}
|
|
39
src/main.rs
39
src/main.rs
|
@ -1,21 +1,48 @@
|
||||||
use index_builder::build_index;
|
use htmlgenerator::errors::*;
|
||||||
|
use htmlgenerator::blocks::*;
|
||||||
|
use randomquote::get_quote;
|
||||||
use rocket::fs::FileServer;
|
use rocket::fs::FileServer;
|
||||||
use rocket::response::content::RawHtml;
|
use rocket::response::content::RawHtml;
|
||||||
|
|
||||||
mod index_builder;
|
mod htmlgenerator;
|
||||||
|
mod randomquote;
|
||||||
|
|
||||||
#[macro_use] extern crate rocket;
|
#[macro_use] extern crate rocket;
|
||||||
|
|
||||||
|
//TODO replace with file/env configuration
|
||||||
|
fn get_links() -> Vec<(&'static str, &'static str)>{
|
||||||
|
Vec::from([
|
||||||
|
("/", "/home"),
|
||||||
|
("/gallery", "/gallery"),
|
||||||
|
("https://git.banii.cafe", "/repos"),
|
||||||
|
("https://github.com/genki-angel", ">github")
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
#[get("/")]
|
#[get("/")]
|
||||||
fn index() -> RawHtml<String> {
|
fn index() -> RawHtml<String> {
|
||||||
RawHtml(build_index())
|
RawHtml(htmlgenerator::builder::build_page(
|
||||||
|
gen_head("UTF-8", "genki_angel", "banii.cafe", "base"),
|
||||||
|
gen_header("BANII.CAFE", get_quote()),
|
||||||
|
gen_main(gen_nav(get_links()), home_content()),
|
||||||
|
gen_footer()
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[get("/gallery")]
|
||||||
|
fn gallery()-> RawHtml<String> {
|
||||||
|
RawHtml(htmlgenerator::builder::build_page(
|
||||||
|
gen_head("UTF-8", "genki_angel", "banii.cafe", "base"),
|
||||||
|
gen_header("BANII.CAFE", "under construction!".to_string()),
|
||||||
|
gen_main(gen_nav(get_links()), gen_placeholder()),
|
||||||
|
gen_footer()
|
||||||
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[launch]
|
#[launch]
|
||||||
fn rocket() -> _ {
|
fn rocket() -> _ {
|
||||||
rocket::build()
|
rocket::build()
|
||||||
.mount("/", routes![index])
|
.register("/", catchers![default])
|
||||||
|
.mount("/", routes![index, gallery])
|
||||||
.mount("/", FileServer::from("./static"))
|
.mount("/", FileServer::from("./static"))
|
||||||
}
|
}
|
||||||
|
|
15
src/randomquote.rs
Normal file
15
src/randomquote.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
use rand::seq::SliceRandom;
|
||||||
|
|
||||||
|
pub fn get_quote() -> String{
|
||||||
|
let quotes = Vec::from([
|
||||||
|
"random quote here",
|
||||||
|
"made with rust!",
|
||||||
|
"don't trust anyone that calls me a furry",
|
||||||
|
"haters welcome!",
|
||||||
|
"no bunnies were harmed in the making of this site",
|
||||||
|
"check out my repos and github!",
|
||||||
|
"remember to be nice :3",
|
||||||
|
":3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3 :3"
|
||||||
|
]);
|
||||||
|
quotes.choose(&mut rand::thread_rng()).unwrap().to_string()
|
||||||
|
}
|
Loading…
Reference in a new issue