This commit is contained in:
2026-04-24 13:43:00 +09:00
parent c4d8c8145a
commit be4c383b6f
23 changed files with 533 additions and 1833 deletions

42
script/extract.ts Normal file
View File

@@ -0,0 +1,42 @@
import { parseTja } from './parse';
import { factorize } from './factorize';
import { readdirSync, readFileSync, writeFileSync, existsSync } from 'fs';
import { join } from 'path';
import iconv from 'iconv-lite';
const [,, workingDir, dataDir] = process.argv;
if (existsSync(join(workingDir, 'features.json'))) {
console.log('features.json already exists. Skipping extraction.');
process.exit(0);
}
const tjaDir = join(dataDir, 'tja');
const results: any[] = [];
for (const file of readdirSync(tjaDir)) {
if (!file.endsWith('.tja')) continue;
const songno = file.replace(/\D/g, '');
const buffer = readFileSync(join(tjaDir, file));
let content = iconv.decode(buffer, 'shift-jis', { stripBOM: true });
content = content.replace(/\uFFFD/g, '').replace(/[\u{0080}-\u{FFFF}]/gu, '').replace(/\r\n/g, '\n');
let parsed = parseTja(content);
if (!parsed) {
content = iconv.decode(buffer, 'utf-8', { stripBOM: true });
content = content.replace(/\uFFFD/g, '').replace(/[\u{0080}-\u{FFFF}]/gu, '').replace(/\r\n/g, '\n');
parsed = parseTja(content);
}
if (!parsed) continue;
for (const diff of ['oni', 'edit'] as const) {
if (!parsed[diff]) continue;
const factors = factorize(parsed[diff]!);
results.push({ songno, diff: diff === 'oni' ? 'oni' : 'ura', ...factors });
}
}
writeFileSync(join(workingDir, 'features.json'), JSON.stringify(results, null, 2));
console.log(`Features extracted to ${workingDir}/features.json`);