mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-10-23 20:29:06 -05:00
generate_site.py writes the Starlight project in website/ and nothing else: mkdocs.yml, the MkDocs hooks, theme overrides and stylesheet go, and the wiki is written in Starlight's syntax. Both workflows set up Node with the official actions/setup-node pinned by commit, run npm ci from the committed lockfile, build with the strict link validator and check the result with validate_site.py. The search weighs a page by what it answers: Start here pages first, a system page's cards and file names before a guide citing them, deep guides, launchers, aliases and frozen copies after. Status badges, hash blocks and the export change lists leave the index. The ranking sits at the centre of a range where the 13 queries of search_gate.py all answer, in the search box itself. 839 pages, every URL and 45,611 ids match the MkDocs build. The tests read the Starlight content and syntax.
102 lines
3.9 KiB
JavaScript
102 lines
3.9 KiB
JavaScript
// The RetroBIOS site. Pages, navigation and data files are written by
|
|
// scripts/generate_site.py; this folder holds the engine's configuration,
|
|
// the components and the styles.
|
|
import { copyFile } from 'node:fs/promises';
|
|
import { fileURLToPath } from 'node:url';
|
|
import { defineConfig } from 'astro/config';
|
|
import starlight from '@astrojs/starlight';
|
|
import sitemap from '@astrojs/sitemap';
|
|
import { satteri } from '@astrojs/markdown-satteri';
|
|
import starlightSidebarTopics from 'starlight-sidebar-topics';
|
|
import starlightLinksValidator from 'starlight-links-validator';
|
|
import sidebar from './src/generated/sidebar.json' with { type: 'json' };
|
|
import lastmod from './src/generated/lastmod.json' with { type: 'json' };
|
|
|
|
const SITE = 'https://abdess.github.io';
|
|
const BASE = '/retrobios/';
|
|
|
|
// The sitemap keeps the address MkDocs gave it: sitemap.xml, beside the index.
|
|
const sitemapAlias = {
|
|
name: 'retrobios-sitemap-alias',
|
|
hooks: {
|
|
'astro:build:done': async ({ dir }) => {
|
|
const root = fileURLToPath(dir);
|
|
await copyFile(`${root}sitemap-index.xml`, `${root}sitemap.xml`);
|
|
},
|
|
},
|
|
};
|
|
|
|
export default defineConfig({
|
|
site: SITE,
|
|
base: BASE,
|
|
trailingSlash: 'always',
|
|
markdown: {
|
|
processor: satteri({
|
|
features: {
|
|
headingAttributes: true,
|
|
definitionList: true,
|
|
// Straight quotes: curly ones would change a copied command.
|
|
smartPunctuation: false,
|
|
},
|
|
}),
|
|
},
|
|
integrations: [
|
|
starlight({
|
|
title: 'RetroBIOS',
|
|
titleDelimiter: '-',
|
|
description:
|
|
'Source-verified BIOS and firmware packs for RetroArch, Batocera, Recalbox, Lakka, RetroPie, EmuDeck, RetroBat, RetroDECK, RomM, BizHawk, ROCKNIX, KNULLI, AmberELEC, EmuELEC and MiSTer FPGA.',
|
|
// The brand mark is white on the indigo of the old header: indigo on a light page.
|
|
logo: { light: './src/assets/logo-light.svg', dark: './src/assets/logo-dark.svg', replacesTitle: false },
|
|
favicon: '/assets/brand/favicon-32.png',
|
|
head: [
|
|
{ tag: 'link', attrs: { rel: 'icon', type: 'image/svg+xml', href: `${BASE}assets/brand/favicon.svg` } },
|
|
{ tag: 'link', attrs: { rel: 'apple-touch-icon', sizes: '180x180', href: `${BASE}assets/brand/apple-touch-icon.png` } },
|
|
],
|
|
social: [{ icon: 'github', label: 'RetroBIOS on GitHub', href: 'https://github.com/Abdess/retrobios' }],
|
|
customCss: ['./src/styles/retrobios.css'],
|
|
components: {
|
|
PageTitle: './src/components/PageTitle.astro',
|
|
MarkdownContent: './src/components/MarkdownContent.astro',
|
|
Footer: './src/components/Footer.astro',
|
|
},
|
|
routeMiddleware: ['./src/routeData.ts'],
|
|
tableOfContents: { minHeadingLevel: 2, maxHeadingLevel: 3 },
|
|
// Commands wrap instead of scrolling, so the end of a one-liner stays visible.
|
|
expressiveCode: { defaultProps: { wrap: true } },
|
|
lastUpdated: false,
|
|
pagination: true,
|
|
// Measured on the queries of tools/search_gate.py, at the centre of a
|
|
// range where all of them answer. How often a word appears counts more
|
|
// than in Starlight's defaults (0.1, 0.1, 2, 9), a page's title weighs
|
|
// ten times its text, so "dolphin" finds Dolphin, and the file names of
|
|
// a system page (its `files` field, written by sitestarlight.py) count
|
|
// half, so "scph5501" finds the Sony page without a file name winning
|
|
// every other query.
|
|
pagefind: {
|
|
ranking: {
|
|
pageLength: 0.1,
|
|
termFrequency: 0.5,
|
|
termSaturation: 1.4,
|
|
termSimilarity: 9,
|
|
metaWeights: { title: 10, files: 0.5 },
|
|
},
|
|
},
|
|
plugins: [
|
|
starlightSidebarTopics(sidebar.topics, sidebar.options),
|
|
starlightLinksValidator(),
|
|
],
|
|
}),
|
|
// A page that states its own date (an emulator page: the day its
|
|
// profile was last read against the source) gives it to the sitemap.
|
|
// The others get no lastmod rather than the build date.
|
|
sitemap({
|
|
serialize(item) {
|
|
const date = lastmod[new URL(item.url).pathname];
|
|
return date ? { ...item, lastmod: date } : item;
|
|
},
|
|
}),
|
|
sitemapAlias,
|
|
],
|
|
});
|