120 lines
3.1 KiB
JavaScript
120 lines
3.1 KiB
JavaScript
#!/usr/bin/env node
|
||
|
||
const fs = require('node:fs');
|
||
const path = require('node:path');
|
||
const {
|
||
PROJECT_ROOT,
|
||
DEFAULT_ALLOWED_EXTENSIONS,
|
||
collectSourceFiles,
|
||
toProjectRelativePath,
|
||
} = require('./source-files.cjs');
|
||
|
||
const SOURCE_DIRECTORIES = [
|
||
path.join(PROJECT_ROOT, 'backend', 'src'),
|
||
path.join(PROJECT_ROOT, 'src'),
|
||
];
|
||
const ALLOWED_EXTENSIONS = DEFAULT_ALLOWED_EXTENSIONS;
|
||
const WRITE_MODE = process.argv.includes('--write');
|
||
|
||
const DIRECT_REPLACEMENTS = [
|
||
['Ä', 'Ä'],
|
||
['Ö', 'Ö'],
|
||
['Ü', 'Ü'],
|
||
['ä', 'ä'],
|
||
['ö', 'ö'],
|
||
['ü', 'ü'],
|
||
['ß', 'ß'],
|
||
['’', '’'],
|
||
['“', '“'],
|
||
['â€', '”'],
|
||
['–', '–'],
|
||
['—', '—'],
|
||
['…', '…'],
|
||
['§', '§'],
|
||
['Ä', 'Ä'],
|
||
['Ö', 'Ö'],
|
||
['Ü', 'Ü'],
|
||
['ä', 'ä'],
|
||
['ö', 'ö'],
|
||
['ü', 'ü'],
|
||
['ß', 'ß'],
|
||
['§', '§'],
|
||
];
|
||
|
||
const WORD_REPLACEMENTS = [
|
||
[/\bAufrufzaehler\b/gu, 'Aufrufzähler'],
|
||
[/\baufzaehlen\b/gu, 'aufzählen'],
|
||
[/\bAusfuellen\b/gu, 'Ausfüllen'],
|
||
[/\bausfuellen\b/gu, 'ausfüllen'],
|
||
[/\bAuswaehlen\b/gu, 'Auswählen'],
|
||
[/\bauswaehlen\b/gu, 'auswählen'],
|
||
[/\bEnthaelt\b/gu, 'Enthält'],
|
||
[/\benthaelt\b/gu, 'enthält'],
|
||
[/\bFuer\b/gu, 'Für'],
|
||
[/\bfuer\b/gu, 'für'],
|
||
[/\bGeschuetzt\b/gu, 'Geschützt'],
|
||
[/\bgeschuetzt\b/gu, 'geschützt'],
|
||
[/\bGueltig\b/gu, 'Gültig'],
|
||
[/\bgueltig\b/gu, 'gültig'],
|
||
[/\bOesterreich\b/gu, 'Österreich'],
|
||
[/\boesterreich\b/gu, 'österreich'],
|
||
[/\bUeberein\b/gu, 'Überein'],
|
||
[/\bueberein\b/gu, 'überein'],
|
||
[/\bUngueltig\b/gu, 'Ungültig'],
|
||
[/\bungueltig\b/gu, 'ungültig'],
|
||
[/\bVerschluesselt\b/gu, 'Verschlüsselt'],
|
||
[/\bverschluesselt\b/gu, 'verschlüsselt'],
|
||
[/\bWaehlen\b/gu, 'Wählen'],
|
||
[/\bwaehlen\b/gu, 'wählen'],
|
||
[/\bZaehler\b/gu, 'Zähler'],
|
||
[/\bzaehler\b/gu, 'zähler'],
|
||
[/\bZurueck\b/gu, 'Zurück'],
|
||
[/\bzurueck\b/gu, 'zurück'],
|
||
];
|
||
|
||
function applyTextFixes(source) {
|
||
let nextSource = source;
|
||
|
||
for (const [searchValue, replaceValue] of DIRECT_REPLACEMENTS) {
|
||
if (nextSource.includes(searchValue)) {
|
||
nextSource = nextSource.split(searchValue).join(replaceValue);
|
||
}
|
||
}
|
||
|
||
for (const [pattern, replaceValue] of WORD_REPLACEMENTS) {
|
||
nextSource = nextSource.replace(pattern, replaceValue);
|
||
}
|
||
|
||
return nextSource;
|
||
}
|
||
|
||
const changedFiles = [];
|
||
|
||
for (const directoryPath of SOURCE_DIRECTORIES) {
|
||
for (const filePath of collectSourceFiles(directoryPath, ALLOWED_EXTENSIONS)) {
|
||
const source = fs.readFileSync(filePath, 'utf8');
|
||
const nextSource = applyTextFixes(source);
|
||
if (nextSource === source) {
|
||
continue;
|
||
}
|
||
|
||
changedFiles.push(toProjectRelativePath(filePath));
|
||
if (WRITE_MODE) {
|
||
fs.writeFileSync(filePath, nextSource, 'utf8');
|
||
}
|
||
}
|
||
}
|
||
|
||
if (changedFiles.length === 0) {
|
||
console.log(`Source text fixer: no changes ${WRITE_MODE ? 'written' : 'needed'}.`);
|
||
process.exit(0);
|
||
}
|
||
|
||
const actionLabel = WRITE_MODE ? 'updated' : 'would update';
|
||
console.log(`Source text fixer ${actionLabel} ${changedFiles.length} file(s):`);
|
||
for (const filePath of changedFiles) {
|
||
console.log(`- ${filePath}`);
|
||
}
|
||
|
||
process.exit(WRITE_MODE ? 0 : 1);
|