/* * Client-side wiki routes. * * This module owns page/CMap hash construction and all hash recognition. It * returns plain route records and has no knowledge of sessions, permissions, * application state or DOM views. */ /** Build the client-side route for a wiki page reference. */ function pageRoute(reference) { return `#/${encodeURIComponent(reference)}`; } /** Build the client-side route for a concept map. */ function cmapRoute(slug) { return `#cmap/${encodeURIComponent(slug)}`; } /** * goal : Recognize one browser hash as a wiki application route. * pre : hash is the current location hash or another string to inspect. * post : No browser or application state is changed. * result : A named route record; unknown and empty hashes produce home. * internals: Exact special views are recognized first. Parameterized Todo, * CMap, search and page routes are then decoded into their values. */ function parseWikiRoute(hash) { const value = String(hash || ""); switch (value) { case "#profile": return { name: "profile" }; case "#cmaps": return { name: "cmaps" }; case "#recent": return { name: "recent" }; case "#bookmarks": return { name: "bookmarks" }; case "#todos": return { name: "todos" }; case "#admin": return { name: "admin" }; case "#admin/users": return { name: "admin-users" }; case "#admin/mail": return { name: "admin-mail" }; case "#admin/aliases": return { name: "admin-aliases" }; case "#admin/orphaned-uploads": return { name: "admin-orphaned-uploads" }; case "#admin/archived-cmaps": return { name: "admin-archived-cmaps" }; } const todoMatch = value.match(/^#todo\/([^/]+)\/(\d+)$/); if (todoMatch) { return { name: "todo", slug: decodeURIComponent(todoMatch[1]), number: Number(todoMatch[2]) }; } const cmapMatch = value.match(/^#cmap\/([^/]+)$/); if (cmapMatch) { return { name: "cmap", slug: decodeURIComponent(cmapMatch[1]) }; } const searchMatch = value.match(/^#search\/(.+)$/); if (searchMatch) { return { name: "search", query: decodeURIComponent(searchMatch[1]) }; } const pageMatch = value.match(/^#\/([^/]+)$/); if (pageMatch) { return { name: "page", slug: decodeURIComponent(pageMatch[1]) }; } return { name: "home" }; } export { cmapRoute, pageRoute, parseWikiRoute };