UNPKG

starlight-view-modes

Version:

Starlight plugin adding view mode capabilities to your documentation website.

73 lines (65 loc) 1.93 kB
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, }); } }