import { t } from "../i18n/index.ts"; import type { IconName } from "./icons.js"; import { normalizeLowercaseStringOrEmpty } from "./string-coerce.ts";
const PATH_TO_TAB = new Map<string, Tab>([
...Object.entries(TAB_PATHS).map(([tab, path]) => [path, tab as Tab] as const),
...Object.entries(PATH_ALIASES),
]);
export function normalizeBasePath(basePath: string): string { if (!basePath) { return"";
}
let base = basePath.trim(); if (!base.startsWith("/")) {
base = `/${base}`;
} if (base === "/") { return"";
} if (base.endsWith("/")) {
base = base.slice(0, -1);
} return base;
}
export function normalizePath(path: string): string { if (!path) { return"/";
}
let normalized = path.trim(); if (!normalized.startsWith("/")) {
normalized = `/${normalized}`;
} if (normalized.length > 1 && normalized.endsWith("/")) {
normalized = normalized.slice(0, -1);
} return normalized;
}
export function pathForTab(tab: Tab, basePath = ""): string { const base = normalizeBasePath(basePath); const path = TAB_PATHS[tab]; return base ? `${base}${path}` : path;
}
export function tabFromPath(pathname: string, basePath = ""): Tab | null { const base = normalizeBasePath(basePath);
let path = pathname || "/"; if (base) { if (path === base) {
path = "/";
} elseif (path.startsWith(`${base}/`)) {
path = path.slice(base.length);
}
}
let normalized = normalizeLowercaseStringOrEmpty(normalizePath(path)); if (normalized.endsWith("/index.html")) {
normalized = "/";
} if (normalized === "/") { return"chat";
} return PATH_TO_TAB.get(normalized) ?? null;
}
export function inferBasePathFromPathname(pathname: string): string {
let normalized = normalizePath(pathname); if (normalized.endsWith("/index.html")) {
normalized = normalizePath(normalized.slice(0, -"/index.html".length));
} if (normalized === "/") { return"";
} const segments = normalized.split("/").filter(Boolean); if (segments.length === 0) { return"";
} for (let i = 0; i < segments.length; i++) { const candidate = normalizeLowercaseStringOrEmpty(`/${segments.slice(i).join("/")}`); if (PATH_TO_TAB.has(candidate)) { const prefix = segments.slice(0, i); return prefix.length ? `/${prefix.join("/")}` : "";
}
} return `/${segments.join("/")}`;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.