Add betalupi page
This commit is contained in:
@@ -1,11 +1,108 @@
|
||||
use markdown::{CompileOptions, Constructs, LineEnding, Options, ParseOptions};
|
||||
use maud::{Markup, PreEscaped, Render};
|
||||
|
||||
pub struct Markdown<'a>(pub &'a str);
|
||||
|
||||
const OPTS: Options = Options {
|
||||
parse: ParseOptions {
|
||||
constructs: Constructs {
|
||||
attention: true,
|
||||
autolink: false,
|
||||
block_quote: true,
|
||||
character_escape: true,
|
||||
character_reference: true,
|
||||
code_indented: false,
|
||||
code_fenced: true,
|
||||
code_text: true,
|
||||
definition: true,
|
||||
frontmatter: false,
|
||||
gfm_autolink_literal: true,
|
||||
gfm_footnote_definition: false,
|
||||
gfm_label_start_footnote: false,
|
||||
gfm_strikethrough: false,
|
||||
gfm_table: false,
|
||||
gfm_task_list_item: false,
|
||||
hard_break_escape: false,
|
||||
hard_break_trailing: false,
|
||||
heading_atx: true,
|
||||
heading_setext: false,
|
||||
label_start_image: false,
|
||||
label_start_link: true,
|
||||
label_end: true,
|
||||
list_item: true,
|
||||
math_flow: false,
|
||||
math_text: false,
|
||||
mdx_esm: false,
|
||||
thematic_break: false,
|
||||
|
||||
// INLINE HTML
|
||||
html_flow: false,
|
||||
html_text: false,
|
||||
|
||||
// INLINE {}
|
||||
mdx_expression_flow: true,
|
||||
mdx_expression_text: true,
|
||||
|
||||
// INLINE HTML (alternative)
|
||||
mdx_jsx_flow: false,
|
||||
mdx_jsx_text: false,
|
||||
},
|
||||
|
||||
gfm_strikethrough_single_tilde: false,
|
||||
math_text_single_dollar: false,
|
||||
mdx_expression_parse: None,
|
||||
mdx_esm_parse: None,
|
||||
},
|
||||
|
||||
compile: CompileOptions {
|
||||
allow_any_img_src: false,
|
||||
allow_dangerous_html: false,
|
||||
allow_dangerous_protocol: false,
|
||||
default_line_ending: LineEnding::LineFeed,
|
||||
gfm_footnote_back_label: None,
|
||||
gfm_footnote_clobber_prefix: None,
|
||||
gfm_footnote_label_attributes: None,
|
||||
gfm_footnote_label_tag_name: None,
|
||||
gfm_footnote_label: None,
|
||||
gfm_task_list_item_checkable: false,
|
||||
gfm_tagfilter: false,
|
||||
},
|
||||
};
|
||||
|
||||
impl Render for Markdown<'_> {
|
||||
fn render(&self) -> Markup {
|
||||
// TODO: cache, style
|
||||
let md = markdown::to_html(self.0);
|
||||
// TODO: cache
|
||||
|
||||
/*
|
||||
let mut ast = markdown::to_mdast(MD_A, &opts.parse).unwrap();
|
||||
let walk = AstWalkMut::new(&mut ast);
|
||||
|
||||
for i in walk {
|
||||
match i {
|
||||
AstWalkMutStep::Exit(node) => {
|
||||
match node {
|
||||
Node::MdxTextExpression(x) => {
|
||||
println!("{x:?}");
|
||||
}
|
||||
Node::MdxFlowExpression(x) => {
|
||||
println!("{x:?}");
|
||||
}
|
||||
_ => continue,
|
||||
}
|
||||
|
||||
*node = Node::Text(Text {
|
||||
value: "LOL".to_owned(),
|
||||
position: node.position().cloned(),
|
||||
})
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
println!("{ast:?}");
|
||||
*/
|
||||
|
||||
let md = markdown::to_html_with_options(self.0, &OPTS).unwrap();
|
||||
return PreEscaped(md);
|
||||
}
|
||||
}
|
||||
|
||||
101
crates/service-webpage/src/routes/betalupi.rs
Normal file
101
crates/service-webpage/src/routes/betalupi.rs
Normal file
@@ -0,0 +1,101 @@
|
||||
use assetserver::Asset;
|
||||
use macro_sass::sass;
|
||||
use maud::{DOCTYPE, Markup, PreEscaped, html};
|
||||
|
||||
use crate::{
|
||||
components::{md::Markdown, misc::FarLink},
|
||||
routes::{
|
||||
assets::{Image_Betalupi, Image_Icon},
|
||||
index::PageMetadata,
|
||||
},
|
||||
};
|
||||
|
||||
const CSS: &str = sass!("css/main.scss");
|
||||
|
||||
pub async fn betalupi() -> Markup {
|
||||
let meta = PageMetadata {
|
||||
title: "What's a \"betalupi?\"".into(),
|
||||
author: Some("Mark".into()),
|
||||
description: None,
|
||||
image: Some(Image_Icon::URL.into()),
|
||||
};
|
||||
|
||||
html! {
|
||||
(DOCTYPE)
|
||||
html {
|
||||
head {
|
||||
meta charset="UTF" {}
|
||||
meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" {}
|
||||
meta content="text/html; charset=UTF-8" http-equiv="content-type" {}
|
||||
meta property="og:type" content="website" {}
|
||||
|
||||
(meta)
|
||||
title { (PreEscaped(meta.title)) }
|
||||
style { (PreEscaped(CSS)) }
|
||||
}
|
||||
|
||||
body {
|
||||
div class="wrapper" {
|
||||
main {
|
||||
|
||||
// TODO: no metadata class, generate backlink array
|
||||
div {
|
||||
a href="/" style="padding-left:4pt;padding-right:4pt;" {"home"}
|
||||
"/"
|
||||
span class="metaData" style="padding-left:4pt;padding-right:4pt;" { "whats-a-betalupi" }
|
||||
}
|
||||
|
||||
(Markdown(MD_A))
|
||||
|
||||
br {}
|
||||
|
||||
(Markdown(MD_B))
|
||||
|
||||
br {}
|
||||
|
||||
img alt="betalupi map" class="image" src=(Image_Betalupi::URL) {}
|
||||
}
|
||||
|
||||
footer {
|
||||
hr class = "footline" {}
|
||||
div class = "footContainer" {
|
||||
p {
|
||||
"This site was built by hand using "
|
||||
(FarLink("https://rust-lang.org", "Rust"))
|
||||
", "
|
||||
(FarLink("https://maud.lambda.xyz", "Maud"))
|
||||
", "
|
||||
(FarLink("https://github.com/connorskees/grass", "Grass"))
|
||||
", and "
|
||||
(FarLink("https://docs.rs/axum/latest/axum", "Axum"))
|
||||
"."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const MD_A: &str = r#"[es]: https://github.com/endless-sky/endless-sky
|
||||
[*Stellaris*]: https://www.paradoxinteractive.com/games/stellaris/about
|
||||
[Arabic]: https://en.wikipedia.org/wiki/List_of_Arabic_star_names
|
||||
[wiki-betalupi]: https://en.wikipedia.org/wiki/Beta_Lupi
|
||||
|
||||
# What's a "betalupi?"
|
||||
|
||||
Beta Lupi is a solar system on the [_Endless Sky_][es] galaxy map,
|
||||
which is the first place I look whenever I need to name a server.
|
||||
|
||||
Stellar names (especially those of [Arabic] origin) make pretty good hostnames: they're meaningless (in English), they sound interesting, and the "hyperlanes" that connect them in titles like [_Endless Sky_][es] and [*Stellaris*] look a lot like a network topology.
|
||||
|
||||
Beta Lupi also happens to be a real star in the southern constellation of Lupus ([wiki][wiki-betalupi]), but that's not particularly important.
|
||||
|
||||
A snippet of the [_Endless Sky_][es] map is below."#;
|
||||
|
||||
const MD_B: &str = r#"**In other words:** Try finding a `.com` domain that...
|
||||
|
||||
- Isn't already taken
|
||||
- Doesn't sound awful
|
||||
- Isn't owned by a scalper that's selling it for $300"#;
|
||||
@@ -14,7 +14,7 @@ use crate::{
|
||||
|
||||
const CSS: &str = sass!("css/main.scss");
|
||||
|
||||
struct PageMetadata {
|
||||
pub struct PageMetadata {
|
||||
/// Text shown in tab
|
||||
pub title: String,
|
||||
pub author: Option<String>,
|
||||
|
||||
@@ -4,6 +4,7 @@ use tracing::info;
|
||||
use utoipa::OpenApi;
|
||||
|
||||
mod assets;
|
||||
mod betalupi;
|
||||
mod index;
|
||||
|
||||
#[derive(OpenApi)]
|
||||
@@ -16,5 +17,6 @@ pub(super) fn router() -> Router<()> {
|
||||
|
||||
Router::new()
|
||||
.route("/", get(index::index))
|
||||
.route("/whats-a-betalupi", get(betalupi::betalupi))
|
||||
.nest(asset_prefix, asset_router)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user