Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/FoxxMD/multi-scrobbler. Scrobble plays from multiple sources to multiple clients docs.multi-scrobbler.app
deezer docker jellyfin koito lastfm listenbrainz maloja mopidy mpris music music-assistant plex scrobble self-hosted spotify subsonic tautulli youtube-music
Something went wrong. Try again.
2.0 kB · 34 lines
JavaScript
at master
1234567891011121314151617181920212223242526272829303132333435// Starlight can't autogenerate from the content root inside an explicit `sidebar` array// (`autogenerate: { directory: '' }` matches nothing), so expand the root level here:// top-level pages become links, top-level directories become groups that autogenerate their contents.// Ordering uses `sidebar.order` frontmatter / `_meta.yml` `order`, like Docusaurus' sidebar_position / _category_.json.// `extra` items are explicit sidebar entries with an optional `order` that are sorted in alongside them.// `groupItems` appends explicit entries to a directory's group, keyed by directory name.import fs from 'node:fs';import path from 'node:path';import matter from 'gray-matter';import yaml from 'js-yaml';
export function rootSidebar(docsDir, extra = [], groupItems = {}) { const items = extra.map(({ order, ...item }) => ({ order: order ?? Number.MAX_VALUE, name: item.label ?? '', item })); for (const entry of fs.readdirSync(docsDir, { withFileTypes: true })) { if (entry.name.startsWith('_')) continue; const full = path.join(docsDir, entry.name); if (entry.isDirectory()) { const metaFile = path.join(full, '_meta.yml'); const meta = fs.existsSync(metaFile) ? yaml.load(fs.readFileSync(metaFile, 'utf8')) : {}; if (meta.hidden) continue; items.push({ order: meta.order ?? Number.MAX_VALUE, name: entry.name, item: { label: meta.label ?? entry.name, collapsed: meta.collapsed ?? false, items: [{ autogenerate: { directory: entry.name } }, ...(groupItems[entry.name] ?? [])] }, }); } else if (/\.mdx?$/.test(entry.name)) { const { data } = matter(fs.readFileSync(full, 'utf8')); if (data.sidebar?.hidden) continue; const slug = data.slug ?? entry.name.replace(/\.mdx?$/, '').toLowerCase(); items.push({ order: data.sidebar?.order ?? Number.MAX_VALUE, name: entry.name, item: slug === 'index' || slug === '' ? { slug: '' , label: data.sidebar?.label ?? data.title } : slug }); } } return items.sort((a, b) => a.order - b.order || a.name.localeCompare(b.name)).map((x) => x.item);}