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>
This commit is contained in:
+53
@@ -0,0 +1,53 @@
|
||||
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();
|
||||
Reference in New Issue
Block a user