mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-22 14:38:12 +02:00
Repris d'AJEAN (d6136caa, #123) : script, feuille de style, polices woff2 et licence MIT sous internal/loki/ui/katex/, embarqués par le go:embed et par build.rs de la façade. Pas de CDN : l'interface doit marcher hors ligne. Route /katex/ des deux côtés avec les mêmes en-têtes : katex.min.js (application/javascript), katex.min.css (text/css), fonts/*.woff2 (font/woff2), Cache-Control public 1 jour ; script et feuille compressés en gzip, polices non. Contrairement à AJEAN (http.FileServer), le Go (web_katex.go) ne sert que ces fichiers, avec un Content-Type fixe : ni index de dossier, ni type décidé par le registre MIME de l'OS. La façade (ui.rs) rend les mêmes réponses ; le reste de /katex/ part au Go (404). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
74 lines
3.1 KiB
Rust
74 lines
3.1 KiB
Rust
//! Embarque l'UI web dans le binaire, depuis la MÊME source que le `go:embed`
|
|
//! du serveur Go (`internal/loki/ui/`) : les deux binaires d'un build servent
|
|
//! donc toujours la même interface. Génère `$OUT_DIR/ui_assets.rs`.
|
|
|
|
use std::fmt::Write as _;
|
|
use std::path::PathBuf;
|
|
|
|
fn main() {
|
|
let manifest = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap());
|
|
let ui = manifest.join("../../internal/loki/ui");
|
|
let ui = ui
|
|
.canonicalize()
|
|
.unwrap_or_else(|e| panic!("UI introuvable ({}) : {e}", ui.display()));
|
|
println!("cargo:rerun-if-changed={}", ui.display());
|
|
|
|
let mut out = String::new();
|
|
for name in [
|
|
"index.html",
|
|
"marked.min.js",
|
|
"sw.js",
|
|
"manifest.webmanifest",
|
|
] {
|
|
let p = ui.join(name);
|
|
assert!(p.is_file(), "fichier d'UI manquant : {}", p.display());
|
|
println!("cargo:rerun-if-changed={}", p.display());
|
|
let ident = name.replace(['.', '-'], "_").to_uppercase();
|
|
writeln!(out, "pub static {ident}: &[u8] = include_bytes!({:?});", p).unwrap();
|
|
}
|
|
|
|
let fonts_dir = ui.join("fonts");
|
|
println!("cargo:rerun-if-changed={}", fonts_dir.display());
|
|
let mut fonts: Vec<PathBuf> = std::fs::read_dir(&fonts_dir)
|
|
.unwrap_or_else(|e| panic!("{} : {e}", fonts_dir.display()))
|
|
.filter_map(|e| e.ok().map(|e| e.path()))
|
|
.filter(|p| p.extension().is_some_and(|x| x == "woff2"))
|
|
.collect();
|
|
fonts.sort();
|
|
out.push_str("pub static FONTS: &[(&str, &[u8])] = &[\n");
|
|
for p in &fonts {
|
|
let name = p.file_name().unwrap().to_str().unwrap();
|
|
writeln!(out, " ({name:?}, include_bytes!({p:?})),").unwrap();
|
|
}
|
|
out.push_str("];\n");
|
|
|
|
// KaTeX (formules LaTeX, repris d'AJEAN) : script, feuille et polices
|
|
// woff2 sous ui/katex/, les polices nommées par leur chemin relatif
|
|
// (« fonts/x.woff2 »), comme les sert web_katex.go.
|
|
let katex = ui.join("katex");
|
|
println!("cargo:rerun-if-changed={}", katex.display());
|
|
for (ident, name) in [("KATEX_JS", "katex.min.js"), ("KATEX_CSS", "katex.min.css")] {
|
|
let p = katex.join(name);
|
|
assert!(p.is_file(), "fichier KaTeX manquant : {}", p.display());
|
|
println!("cargo:rerun-if-changed={}", p.display());
|
|
writeln!(out, "pub static {ident}: &[u8] = include_bytes!({p:?});").unwrap();
|
|
}
|
|
let katex_fonts = katex.join("fonts");
|
|
println!("cargo:rerun-if-changed={}", katex_fonts.display());
|
|
let mut kfonts: Vec<PathBuf> = std::fs::read_dir(&katex_fonts)
|
|
.unwrap_or_else(|e| panic!("{} : {e}", katex_fonts.display()))
|
|
.filter_map(|e| e.ok().map(|e| e.path()))
|
|
.filter(|p| p.extension().is_some_and(|x| x == "woff2"))
|
|
.collect();
|
|
kfonts.sort();
|
|
out.push_str("pub static KATEX_FONTS: &[(&str, &[u8])] = &[\n");
|
|
for p in &kfonts {
|
|
let name = format!("fonts/{}", p.file_name().unwrap().to_str().unwrap());
|
|
writeln!(out, " ({name:?}, include_bytes!({p:?})),").unwrap();
|
|
}
|
|
out.push_str("];\n");
|
|
|
|
let dst = PathBuf::from(std::env::var("OUT_DIR").unwrap()).join("ui_assets.rs");
|
|
std::fs::write(dst, out).unwrap();
|
|
}
|