Files
doki-theme-gitea/generate.ts
T
codinget f2baf869c9 Add TypeScript theme generator for doki-master-theme palettes
Generates one Gitea-compatible CSS theme file per doki-master-theme
definition (88 themes). Each file contains a gitea-theme-meta-info
block and a :root block with the full set of CSS custom properties
derived from the character's colour palette.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 17:38:38 +00:00

54 lines
1.7 KiB
TypeScript

import { readdir, writeFile, mkdir } from 'node:fs/promises';
import { join, resolve } from 'node:path';
import { loadTheme } from './src/palette.js';
import { buildVariables } from './src/themeBuilder.js';
import { renderThemeCSS } from './src/cssWriter.js';
const DOKI_REPO = resolve(process.env['DOKI_REPO'] ?? './doki-master-theme');
const OUTPUT_DIR = resolve(process.env['OUTPUT_DIR'] ?? './output');
async function findDefinitionFiles(dir: string): Promise<string[]> {
const entries = await readdir(dir, { recursive: true });
return entries
.filter((f) => f.endsWith('.master.definition.json'))
.map((f) => join(dir, f));
}
async function main(): Promise<void> {
await mkdir(OUTPUT_DIR, { recursive: true });
const definitionsDir = join(DOKI_REPO, 'definitions');
const definitionFiles = await findDefinitionFiles(definitionsDir);
if (definitionFiles.length === 0) {
console.error(`No definition files found in ${definitionsDir}`);
console.error('Make sure the doki-master-theme submodule is initialised:');
console.error(' git submodule update --init');
process.exit(1);
}
let success = 0;
let errors = 0;
for (const defPath of definitionFiles) {
try {
const theme = loadTheme(defPath, DOKI_REPO);
const variables = buildVariables(theme);
const css = renderThemeCSS(theme, variables);
const outPath = join(OUTPUT_DIR, `theme-${theme.internalName}.css`);
await writeFile(outPath, css, 'utf8');
console.log(`${theme.internalName}`);
success++;
} catch (err) {
console.error(`${defPath}: ${err}`);
errors++;
}
}
console.log(`\nGenerated ${success} theme${success !== 1 ? 's' : ''}. Errors: ${errors}.`);
}
main();