starlight-view-modes
Version:
Starlight plugin adding view mode capabilities to your documentation website.
73 lines (65 loc) • 1.93 kB
text/typescript
import type { APIContext } from "astro";
import astroConfig from "virtual:starlight-view-modes-context";
import type { StarlightViewModesRouteData } from "../data";
import {
type AvailableMode,
AvailableModes,
isAdditionalMode,
} from "./definitions";
import {
stripLeadingSlash,
stripTrailingSlash,
trimToExactlyOneLeadingSlash,
} from "./path";
import { getCurrentModeFromPath } from "./server";
import { getUpdatedModePathname, isExcludedPage } from "./utils";
export async function getRouteData(
context: APIContext
): Promise<StarlightViewModesRouteData> {
let { id } = context.locals.starlightRoute;
const currentMode = await getCurrentModeFromPath(id);
const base = stripTrailingSlash(astroConfig?.base || "");
if (base !== "" && base !== "/") {
id = `${base}/${id}`;
}
let modes: StarlightViewModesRouteData["modes"] = [];
for (const mode of AvailableModes) {
if (mode.name === currentMode) {
addMode(modes, mode, id, true);
continue;
}
if (isAdditionalMode(mode)) {
if (mode.enabled === false) continue;
if (isExcludedPage(stripLeadingSlash(id), mode.exclude)) continue;
}
const link = await getUpdatedModePathname(id, mode.name);
addMode(modes, mode, link, false);
}
return { modes };
}
function addMode(
modes: StarlightViewModesRouteData["modes"],
mode: AvailableMode,
link: string,
isCurrent: boolean
) {
if (isAdditionalMode(mode)) {
modes.push({
name: mode.name,
title: mode.title,
switchToText: mode.switchToText,
icon: isCurrent ? mode.disableIcon : mode.enableIcon,
href: trimToExactlyOneLeadingSlash(link),
isCurrent,
keyboardShortcuts: mode.keyboardShortcut,
});
} else {
modes.push({
name: mode.name,
title: mode.title,
switchToText: mode.switchToText,
href: trimToExactlyOneLeadingSlash(link),
isCurrent,
});
}
}