Warp/node_modules/vitepress/dist/client/theme-default/support/sidebar.js
2024-01-05 19:14:38 +07:00

89 lines
2.7 KiB
JavaScript

import { ensureStartingSlash } from './utils';
import { isActive } from '../../shared';
/**
* Get the `Sidebar` from sidebar option. This method will ensure to get correct
* sidebar config from `MultiSideBarConfig` with various path combinations such
* as matching `guide/` and `/guide/`. If no matching config was found, it will
* return empty array.
*/
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((dir) => {
// make sure the multi sidebar key starts with slash too
return path.startsWith(ensureStartingSlash(dir));
});
const sidebar = dir ? _sidebar[dir] : [];
return Array.isArray(sidebar)
? addBase(sidebar)
: addBase(sidebar.items, sidebar.base);
}
/**
* Get or generate sidebar group from the given sidebar items.
*/
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;
}
/**
* Check if the given sidebar item contains any active link.
*/
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;
});
}