f2baf869c9
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>
54 lines
1.7 KiB
TypeScript
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();
|