use crate::{embedded_hljs as hljs, embedded_pico};
pub const TASKS_CHUNK_ROUTE: &str = "/components/mbr-tasks.min.js";
pub const REVIEW_CHUNK_ROUTE: &str = "/components/mbr-review.min.js";
pub const SEARCH_EXTRAS_CHUNK_ROUTE: &str = "/components/mbr-search-extras.min.js";
const JS: &str = "application/javascript";
const CSS: &str = "text/css";
pub const FAVICON_PNG: &[u8] = include_bytes!("../templates/favicon.png");
pub const THEME_CSS: &[u8] = include_bytes!("../templates/theme.css");
pub const USER_CSS: &[u8] = include_bytes!("../templates/user.css");
pub const COMPONENTS_JS: &[u8] = include_bytes!("../templates/components-js/mbr-components.min.js");
pub const EDITOR_JS: &[u8] = include_bytes!("../templates/components-js/mbr-editor.min.js");
pub const GRAPH_JS: &[u8] = include_bytes!("../templates/components-js/mbr-graph.min.js");
pub const GENEALOGY_JS: &[u8] = include_bytes!("../templates/components-js/mbr-genealogy.min.js");
pub const TASKS_JS: &[u8] = include_bytes!("../templates/components-js/mbr-tasks.min.js");
pub const REVIEW_JS: &[u8] = include_bytes!("../templates/components-js/mbr-review.min.js");
pub const SEARCH_EXTRAS_JS: &[u8] =
include_bytes!("../templates/components-js/mbr-search-extras.min.js");
pub const FLASHCARDS_JS: &[u8] = include_bytes!("../templates/components-js/mbr-flashcards.min.js");
pub const FLASHCARDS_READING_JS: &[u8] =
include_bytes!("../templates/components-js/mbr-flashcards-reading.min.js");
pub const MERMAID_JS: &[u8] = include_bytes!("../templates/mermaid.12.1.0.min.js");
pub const REVEAL_JS: &[u8] = include_bytes!("../templates/reveal.6.0.2.js");
pub const REVEAL_CSS: &[u8] = include_bytes!("../templates/reveal.6.0.2.css");
pub const REVEAL_THEME_BLANK_CSS: &[u8] =
include_bytes!("../templates/reveal.theme.blank.5.2.1.css");
pub const REVEAL_THEME_BLACK_CSS: &[u8] =
include_bytes!("../templates/reveal.theme.black.5.2.1.css");
pub const REVEAL_THEME_WHITE_CSS: &[u8] =
include_bytes!("../templates/reveal.theme.white.5.2.1.css");
pub const REVEAL_SLIDES_CSS: &[u8] = include_bytes!("../templates/reveal-slides.css");
pub const REVEAL_NOTES_JS: &[u8] = include_bytes!("../templates/reveal.notes.6.0.2.js");
pub const DEFAULT_FILES: &[(&str, &[u8], &str)] = &[
("/favicon.png", FAVICON_PNG, "image/png"),
("/theme.css", THEME_CSS, CSS),
("/user.css", USER_CSS, CSS),
("/pico.min.css", embedded_pico::PICO_DEFAULT, CSS),
("/components/mbr-components.min.js", COMPONENTS_JS, JS),
("/components/mbr-editor.min.js", EDITOR_JS, JS),
("/components/mbr-graph.min.js", GRAPH_JS, JS),
("/components/mbr-genealogy.min.js", GENEALOGY_JS, JS),
(TASKS_CHUNK_ROUTE, TASKS_JS, JS),
(REVIEW_CHUNK_ROUTE, REVIEW_JS, JS),
(SEARCH_EXTRAS_CHUNK_ROUTE, SEARCH_EXTRAS_JS, JS),
("/components/mbr-flashcards.min.js", FLASHCARDS_JS, JS),
(
"/components/mbr-flashcards-reading.min.js",
FLASHCARDS_READING_JS,
JS,
),
("/hljs.dark.css", hljs::HLJS_DARK_CSS, CSS),
("/hljs.atom-one-dark.css", hljs::HLJS_ATOM_ONE_DARK_CSS, CSS),
("/hljs.js", hljs::HLJS_JS, JS),
("/hljs.lang.css.js", hljs::HLJS_LANG_CSS, JS),
("/hljs.lang.javascript.js", hljs::HLJS_LANG_JAVASCRIPT, JS),
("/hljs.lang.typescript.js", hljs::HLJS_LANG_TYPESCRIPT, JS),
("/hljs.lang.rust.js", hljs::HLJS_LANG_RUST, JS),
("/hljs.lang.python.js", hljs::HLJS_LANG_PYTHON, JS),
("/hljs.lang.bash.js", hljs::HLJS_LANG_BASH, JS),
("/hljs.lang.java.js", hljs::HLJS_LANG_JAVA, JS),
("/hljs.lang.scala.js", hljs::HLJS_LANG_SCALA, JS),
("/hljs.lang.go.js", hljs::HLJS_LANG_GO, JS),
("/hljs.lang.ruby.js", hljs::HLJS_LANG_RUBY, JS),
("/hljs.lang.nix.js", hljs::HLJS_LANG_NIX, JS),
("/hljs.lang.json.js", hljs::HLJS_LANG_JSON, JS),
("/hljs.lang.yaml.js", hljs::HLJS_LANG_YAML, JS),
("/hljs.lang.xml.js", hljs::HLJS_LANG_XML, JS),
("/hljs.lang.sql.js", hljs::HLJS_LANG_SQL, JS),
("/hljs.lang.dockerfile.js", hljs::HLJS_LANG_DOCKERFILE, JS),
("/hljs.lang.markdown.js", hljs::HLJS_LANG_MARKDOWN, JS),
("/mermaid.min.js", MERMAID_JS, JS),
("/reveal.js", REVEAL_JS, JS),
("/reveal.css", REVEAL_CSS, CSS),
("/reveal-theme-blank.css", REVEAL_THEME_BLANK_CSS, CSS),
("/reveal-theme-black.css", REVEAL_THEME_BLACK_CSS, CSS),
("/reveal-theme-white.css", REVEAL_THEME_WHITE_CSS, CSS),
("/reveal-slides.css", REVEAL_SLIDES_CSS, CSS),
("/reveal-notes.js", REVEAL_NOTES_JS, JS),
];
#[must_use]
pub fn default_file(route: &str) -> Option<(&'static [u8], &'static str)> {
DEFAULT_FILES
.iter()
.find(|(name, _, _)| *name == route)
.map(|(_, bytes, mime)| (*bytes, *mime))
}
#[cfg(test)]
mod tests {
use super::*;
use std::collections::HashSet;
#[test]
fn routes_are_unique_and_rooted() {
let mut seen = HashSet::new();
for (route, _, _) in DEFAULT_FILES {
assert!(route.starts_with('/'), "route {route} must start with /");
assert!(seen.insert(*route), "duplicate route {route}");
}
}
#[test]
fn default_file_finds_every_table_entry() {
for (route, bytes, mime) in DEFAULT_FILES {
assert_eq!(default_file(route), Some((*bytes, *mime)));
}
assert_eq!(default_file("/nope.js"), None);
}
#[test]
fn chunk_routes_are_in_the_table() {
for route in [
TASKS_CHUNK_ROUTE,
REVIEW_CHUNK_ROUTE,
SEARCH_EXTRAS_CHUNK_ROUTE,
] {
assert!(default_file(route).is_some(), "{route} missing");
}
}
#[test]
fn quicklook_assets_match_their_routes() {
assert_eq!(default_file("/theme.css").map(|(b, _)| b), Some(THEME_CSS));
assert_eq!(
default_file("/mermaid.min.js").map(|(b, _)| b),
Some(MERMAID_JS)
);
}
}