diff --git a/Cargo.lock b/Cargo.lock index 86d9432..f5b18a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "1.0.4" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] @@ -62,7 +62,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -72,7 +72,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c677ab05e09154296dd37acecd46420c17b9713e8366facafa8fc0885167cf4c" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -168,6 +168,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "bit_field" version = "0.10.2" @@ -396,23 +402,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.2" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", "libc", + "windows-sys 0.52.0", ] [[package]] @@ -467,9 +462,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -645,12 +640,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "http-range-header" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ce4ef31cda248bbdb6e6820603b82dfcd9e833db65a43e997a0ccec777d11fe" - [[package]] name = "httparse" version = "1.8.0" @@ -704,6 +693,16 @@ dependencies = [ "tokio", ] +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "image" version = "0.24.8" @@ -740,7 +739,7 @@ checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -772,9 +771,9 @@ checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "linux-raw-sys" -version = "0.4.5" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" @@ -800,9 +799,9 @@ checksum = "ed1202b2a6f884ae56f04cff409ab315c5ce26b5e58d7412e484f01fd52f52ef" [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "mime" @@ -810,16 +809,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime", - "unicase", -] - [[package]] name = "miniz_oxide" version = "0.7.1" @@ -838,7 +827,7 @@ checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -895,14 +884,14 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.48.3", ] [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" @@ -1133,15 +1122,15 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustix" -version = "0.38.8" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ "bitflags 2.4.0", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1281,7 +1270,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1301,9 +1290,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "2.0.29" +version = "2.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2" dependencies = [ "proc-macro2", "quote", @@ -1356,6 +1345,21 @@ dependencies = [ "weezl", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.36.0" @@ -1372,7 +1376,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1438,31 +1442,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tower-http" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da193277a4e2c33e59e09b5861580c33dd0a637c3883d0fa74ba40c0374af2e" -dependencies = [ - "bitflags 2.4.0", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "http-range-header", - "httpdate", - "mime", - "mime_guess", - "percent-encoding", - "pin-project-lite", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "tower-layer" version = "0.3.2" @@ -1516,6 +1495,7 @@ version = "0.1.0" dependencies = [ "anyhow", "axum", + "base64", "clap", "codespan-reporting", "copy_dir", @@ -1530,10 +1510,10 @@ dependencies = [ "serde_json", "tokio", "toml_edit", - "tower-http", "tower-livereload", "treehouse-format", "ulid", + "url", "walkdir", ] @@ -1574,18 +1554,44 @@ dependencies = [ "version_check", ] +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + [[package]] name = "unicode-ident" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-width" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + [[package]] name = "utf8parse" version = "0.2.1" @@ -1657,7 +1663,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.3", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.3", ] [[package]] @@ -1666,13 +1681,28 @@ version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27f51fb4c64f8b770a823c043c7fad036323e1c48f55287b7bbb7987b2fcdf3b" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.3", + "windows_aarch64_msvc 0.48.3", + "windows_i686_gnu 0.48.3", + "windows_i686_msvc 0.48.3", + "windows_x86_64_gnu 0.48.3", + "windows_x86_64_gnullvm 0.48.3", + "windows_x86_64_msvc 0.48.3", +] + +[[package]] +name = "windows-targets" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" +dependencies = [ + "windows_aarch64_gnullvm 0.52.3", + "windows_aarch64_msvc 0.52.3", + "windows_i686_gnu 0.52.3", + "windows_i686_msvc 0.52.3", + "windows_x86_64_gnu 0.52.3", + "windows_x86_64_gnullvm 0.52.3", + "windows_x86_64_msvc 0.52.3", ] [[package]] @@ -1681,42 +1711,84 @@ version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fde1bb55ae4ce76a597a8566d82c57432bc69c039449d61572a7a353da28f68c" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" + [[package]] name = "windows_aarch64_msvc" version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1513e8d48365a78adad7322fd6b5e4c4e99d92a69db8df2d435b25b1f1f286d4" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" + [[package]] name = "windows_i686_gnu" version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60587c0265d2b842298f5858e1a5d79d146f9ee0c37be5782e92a6eb5e1d7a83" +[[package]] +name = "windows_i686_gnu" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" + [[package]] name = "windows_i686_msvc" version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "224fe0e0ffff5d2ea6a29f82026c8f43870038a0ffc247aa95a52b47df381ac4" +[[package]] +name = "windows_i686_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" + [[package]] name = "windows_x86_64_gnu" version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62fc52a0f50a088de499712cbc012df7ebd94e2d6eb948435449d76a6287e7ad" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2093925509d91ea3d69bcd20238f4c2ecdb1a29d3c281d026a09705d0dd35f3d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" + [[package]] name = "windows_x86_64_msvc" version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6ade45bc8bf02ae2aa34a9d54ba660a1a58204da34ba793c00d83ca3730b5f1" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" + [[package]] name = "winnow" version = "0.5.14" diff --git a/Justfile b/Justfile index 4feda74..1c50c61 100644 --- a/Justfile +++ b/Justfile @@ -1,5 +1,4 @@ port := "8080" -export TREEHOUSE_SITE := "http://localhost:" + port serve: cargo watch -- cargo run -- serve --port {{port}} diff --git a/content/2023-08-20-under-construction.tree b/content/2023-08-20-under-construction.tree deleted file mode 100644 index b03002c..0000000 --- a/content/2023-08-20-under-construction.tree +++ /dev/null @@ -1,2 +0,0 @@ -% id = "01H8V55MGHGYXWY8F287FMNXNY" -- section under construction. sorry! in the meantime, maybe you wanna read [my ramblings about the treehouse][branch:01H89RFHCQCD3E1XS5XAPW86J5]? diff --git a/crates/treehouse/Cargo.toml b/crates/treehouse/Cargo.toml index e792b55..218c818 100644 --- a/crates/treehouse/Cargo.toml +++ b/crates/treehouse/Cargo.toml @@ -23,7 +23,8 @@ serde = { version = "1.0.183", features = ["derive"] } serde_json = "1.0.105" tokio = { version = "1.32.0", features = ["full"] } toml_edit = { version = "0.19.14", features = ["serde"] } -tower-http = { version = "0.5.1", features = ["fs"] } tower-livereload = "0.9.2" walkdir = "2.3.3" ulid = "1.0.0" +url = "2.5.0" +base64 = "0.21.7" diff --git a/crates/treehouse/src/cli/mod.rs b/crates/treehouse/src/cli.rs similarity index 100% rename from crates/treehouse/src/cli/mod.rs rename to crates/treehouse/src/cli.rs diff --git a/crates/treehouse/src/cli/serve.rs b/crates/treehouse/src/cli/serve.rs index 12caddf..3ee911d 100644 --- a/crates/treehouse/src/cli/serve.rs +++ b/crates/treehouse/src/cli/serve.rs @@ -1,11 +1,12 @@ #[cfg(debug_assertions)] mod live_reload; -use std::{net::Ipv4Addr, path::PathBuf, sync::Arc}; +use std::{borrow::Cow, net::Ipv4Addr, path::PathBuf, sync::Arc}; use anyhow::Context; use axum::{ - extract::{RawQuery, State}, + extract::{Path, RawQuery, State}, + http::{header::CONTENT_TYPE, HeaderValue, StatusCode}, response::{Html, IntoResponse, Response}, routing::get, Router, @@ -13,16 +14,18 @@ use axum::{ use log::{error, info}; use pulldown_cmark::escape::escape_html; use tokio::net::TcpListener; -use tower_http::services::ServeDir; use crate::state::{Source, Treehouse}; use super::Paths; struct SystemPages { + index: String, four_oh_four: String, b_docs: String, sandbox: String, + + navmap: String, } struct Server { @@ -33,19 +36,27 @@ struct Server { pub async fn serve(treehouse: Treehouse, paths: &Paths<'_>, port: u16) -> anyhow::Result<()> { let app = Router::new() - .nest_service("/", ServeDir::new(paths.target_dir)) + .route("/", get(index)) + .route("/*page", get(page)) .route("/b", get(branch)) + .route("/navmap.js", get(navmap)) .route("/sandbox", get(sandbox)) + .route("/static/*file", get(static_file)) + .fallback(get(four_oh_four)) .with_state(Arc::new(Server { treehouse, target_dir: paths.target_dir.to_owned(), system_pages: SystemPages { + index: std::fs::read_to_string(paths.target_dir.join("index.html")) + .context("cannot read index page")?, four_oh_four: std::fs::read_to_string(paths.target_dir.join("_treehouse/404.html")) .context("cannot read 404 page")?, b_docs: std::fs::read_to_string(paths.target_dir.join("_treehouse/b.html")) .context("cannot read /b documentation page")?, sandbox: std::fs::read_to_string(paths.target_dir.join("static/html/sandbox.html")) .context("cannot read sandbox page")?, + navmap: std::fs::read_to_string(paths.target_dir.join("navmap.js")) + .context("cannot read navigation map")?, }, })); @@ -57,6 +68,65 @@ pub async fn serve(treehouse: Treehouse, paths: &Paths<'_>, port: u16) -> anyhow Ok(axum::serve(listener, app).await?) } +fn get_content_type(path: &str) -> Option<&'static str> { + match () { + _ if path.ends_with(".html") => Some("text/html"), + _ if path.ends_with(".js") => Some("text/javascript"), + _ if path.ends_with(".woff2") => Some("font/woff2"), + _ => None, + } +} + +async fn index(State(state): State>) -> Response { + Html(state.system_pages.index.clone()).into_response() +} + +async fn navmap(State(state): State>) -> Response { + let mut response = state.system_pages.navmap.clone().into_response(); + response + .headers_mut() + .insert(CONTENT_TYPE, HeaderValue::from_static("text/javascript")); + response +} + +async fn four_oh_four(State(state): State>) -> Response { + ( + StatusCode::NOT_FOUND, + Html(state.system_pages.four_oh_four.clone()), + ) + .into_response() +} + +async fn static_file(Path(path): Path, State(state): State>) -> Response { + if let Ok(file) = tokio::fs::read(state.target_dir.join("static").join(&path)).await { + let mut response = file.into_response(); + if let Some(content_type) = get_content_type(&path) { + response + .headers_mut() + .insert(CONTENT_TYPE, HeaderValue::from_static(content_type)); + } else { + response.headers_mut().remove(CONTENT_TYPE); + } + response + } else { + four_oh_four(State(state)).await + } +} + +async fn page(Path(path): Path, State(state): State>) -> Response { + let path = if !path.ends_with(".html") { + Cow::Owned(path + ".html") + } else { + Cow::Borrowed(&path) + }; + + if let Ok(file) = tokio::fs::read(state.target_dir.join(&*path)).await { + ([(CONTENT_TYPE, "text/html")], file).into_response() + } else { + four_oh_four(State(state)).await + } +} + async fn sandbox(State(state): State>) -> Response { // Small hack to prevent the LiveReloadLayer from injecting itself into the sandbox. // The sandbox is always nested under a different page, so there's no need to do that. diff --git a/crates/treehouse/src/cli/serve/live_reload.rs b/crates/treehouse/src/cli/serve/live_reload.rs index d88fc52..2201b25 100644 --- a/crates/treehouse/src/cli/serve/live_reload.rs +++ b/crates/treehouse/src/cli/serve/live_reload.rs @@ -1,4 +1,7 @@ -use axum::{http::Response, Router}; +use axum::{ + http::{header::CONTENT_TYPE, Response}, + Router, +}; #[derive(Debug, Clone, Copy)] pub struct DisableLiveReload; @@ -8,8 +11,9 @@ pub fn live_reload(router: Router) -> Router { |response: &Response<_>| { let is_html = response .headers() - .get("Content-Type") - .is_some_and(|v| v == "text/html"); + .get(CONTENT_TYPE) + .and_then(|v| v.to_str().ok()) + .is_some_and(|v| v.starts_with("text/html")); let is_disabled = response.extensions().get::().is_some(); is_html && !is_disabled }, diff --git a/crates/treehouse/src/config.rs b/crates/treehouse/src/config.rs index a5b5db9..6b109a9 100644 --- a/crates/treehouse/src/config.rs +++ b/crates/treehouse/src/config.rs @@ -100,6 +100,10 @@ impl Config { Ok(()) } + pub fn page_url(&self, page: &str) -> String { + format!("{}/{}", self.site, page) + } + pub fn pic_url(&self, id: &str) -> String { format!( "{}/static/pic/{}", diff --git a/crates/treehouse/src/html/mod.rs b/crates/treehouse/src/html.rs similarity index 100% rename from crates/treehouse/src/html/mod.rs rename to crates/treehouse/src/html.rs diff --git a/crates/treehouse/src/html/tree.rs b/crates/treehouse/src/html/tree.rs index af1d0f7..9e26416 100644 --- a/crates/treehouse/src/html/tree.rs +++ b/crates/treehouse/src/html/tree.rs @@ -122,9 +122,7 @@ pub fn branch_to_html( "".into(), ) }), - "page" => { - Some((format!("{}/{}.html", config.site, linked).into(), "".into())) - } + "page" => Some((config.page_url(linked).into(), "".into())), "pic" => config.pics.get(linked).map(|filename| { ( format!("{}/static/pic/{}", config.site, &filename).into(), @@ -160,7 +158,7 @@ pub fn branch_to_html( if let Content::Link(link) = &branch.attributes.content { write!( s, - "", + "", EscapeAttribute(&config.site), EscapeAttribute(link), EscapeHtml(link), @@ -174,7 +172,7 @@ pub fn branch_to_html( if let Content::Link(link) = &branch.attributes.content { write!( s, - "", + "", EscapeAttribute(&config.site), EscapeAttribute(link), ) diff --git a/crates/treehouse/src/tree/mod.rs b/crates/treehouse/src/tree.rs similarity index 100% rename from crates/treehouse/src/tree/mod.rs rename to crates/treehouse/src/tree.rs diff --git a/static/css/main.css b/static/css/main.css index 80c2436..fae54f8 100644 --- a/static/css/main.css +++ b/static/css/main.css @@ -781,4 +781,4 @@ section[is="th-settings"] { /* Don't display settings when JavaScript is disabled. JS overrides this value on the element itself. */ display: none; -} \ No newline at end of file +} diff --git a/static/js/components/literate-programming.js b/static/js/components/literate-programming.js index 49da606..28ab03f 100644 --- a/static/js/components/literate-programming.js +++ b/static/js/components/literate-programming.js @@ -1,5 +1,5 @@ -import { CodeJar } from "../vendor/codejar.js"; -import { compileSyntax, highlight } from "./literate-programming/highlight.js"; +import { CodeJar } from "treehouse/vendor/codejar.js"; +import { compileSyntax, highlight } from "treehouse/components/literate-programming/highlight.js"; let literatePrograms = new Map(); diff --git a/static/js/news.js b/static/js/news.js index 6415846..8cbcd52 100644 --- a/static/js/news.js +++ b/static/js/news.js @@ -1,8 +1,8 @@ // news.js because new.js makes the TypeScript language server flip out. // Likely because `new` is a keyword, but also, what the fuck. -import { getSettingValue } from "./settings.js"; -import { Branch } from "./tree.js"; +import { getSettingValue } from "treehouse/settings.js"; +import { Branch } from "treehouse/tree.js"; const seenStatesKey = "treehouse.news.seenBranches"; const seenStates = new Set(JSON.parse(localStorage.getItem(seenStatesKey)) || []); diff --git a/static/js/tree.js b/static/js/tree.js index 003d21d..3dd9d2f 100644 --- a/static/js/tree.js +++ b/static/js/tree.js @@ -1,7 +1,7 @@ // This is definitely not a three.js ripoff. import { navigationMap } from "/navmap.js"; -import * as ulid from './ulid.js'; +import * as ulid from "treehouse/ulid.js"; /* Branch persistence */ diff --git a/template/components/_head.hbs b/template/components/_head.hbs index 7facde4..d1f00d1 100644 --- a/template/components/_head.hbs +++ b/template/components/_head.hbs @@ -9,6 +9,12 @@ + +