@neosjs/vitepress-theme
Version:
NeosJS VitePress theme
65 lines (64 loc) • 1.96 kB
JavaScript
import { isActive } from "../shared.mjs";
import { ensureStartingSlash } from "./utils.mjs";
export function getSidebar(_sidebar, path) {
if (Array.isArray(_sidebar)) return addBase(_sidebar);
if (_sidebar == null) return [];
path = ensureStartingSlash(path);
const dir = Object.keys(_sidebar).sort((a, b) => {
return b.split("/").length - a.split("/").length;
}).find((dir2) => {
return path.startsWith(ensureStartingSlash(dir2));
});
const sidebar = dir ? _sidebar[dir] : [];
return Array.isArray(sidebar) ? addBase(sidebar) : addBase(sidebar.items, sidebar.base);
}
export function getSidebarGroups(sidebar) {
const groups = [];
let lastGroupIndex = 0;
for (const index in sidebar) {
const item = sidebar[index];
if (item.items) {
lastGroupIndex = groups.push(item);
continue;
}
if (!groups[lastGroupIndex]) {
groups.push({ items: [] });
}
groups[lastGroupIndex].items.push(item);
}
return groups;
}
export function getFlatSideBarLinks(sidebar) {
const links = [];
function recursivelyExtractLinks(items) {
for (const item of items) {
if (item.text && item.link) {
links.push({
text: item.text,
link: item.link,
docFooterText: item.docFooterText
});
}
if (item.items) {
recursivelyExtractLinks(item.items);
}
}
}
recursivelyExtractLinks(sidebar);
return links;
}
export function hasActiveLink(path, items) {
if (Array.isArray(items)) {
return items.some((item) => hasActiveLink(path, item));
}
return isActive(path, items.link) ? true : items.items ? hasActiveLink(path, items.items) : false;
}
function addBase(items, _base) {
return [...items].map((_item) => {
const item = { ..._item };
const base = item.base || _base;
if (base && item.link) item.link = base + item.link;
if (item.items) item.items = addBase(item.items, base);
return item;
});
}