Terminaalin autokorjaus: knp→kpn, kpn rnu→kpn run jne.
Typo-taulukko yleisimmille kirjoitusvirheille + Levenshtein-etäisyys tuntemattomille ensimmäisille sanoille (max 2 merkin ero → kpn). Korjaus näytetään terminaalissa keltaisella. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2242,11 +2242,58 @@ Files: ${Object.keys(generatedFiles).join(', ')}`;
|
||||
termLog(`\n<span style="color:#a371f7;font-weight:bold">━━━ Pipeline valmis ━━━</span>`);
|
||||
}
|
||||
|
||||
// Autokorjaus: tunnetut kirjoitusvirheet ja lähimmän komennon ehdotus
|
||||
function autocorrect(input) {
|
||||
const typos = {
|
||||
'knp': 'kpn', 'kpb': 'kpn', 'kpm': 'kpn', 'kn': 'kpn', 'kp': 'kpn',
|
||||
'kpn rnu': 'kpn run', 'kpn rn': 'kpn run', 'kpn ru': 'kpn run',
|
||||
'kpn laod': 'kpn load', 'kpn lod': 'kpn load', 'kpn loa': 'kpn load',
|
||||
'kpn porject': 'kpn project', 'kpn projcet': 'kpn project', 'kpn proejct': 'kpn project',
|
||||
'kpn pipelien': 'kpn pipeline', 'kpn pipline': 'kpn pipeline',
|
||||
'kpn staus': 'kpn status', 'kpn stauts': 'kpn status',
|
||||
'kpn modles': 'kpn models', 'kpn mdoels': 'kpn models',
|
||||
'kpn hlep': 'kpn help', 'kpn hep': 'kpn help',
|
||||
'kpn clera': 'kpn clear', 'kpn claer': 'kpn clear',
|
||||
'kpn helo': 'kpn hello', 'kpn hell': 'kpn hello',
|
||||
};
|
||||
// Tarkista koko komento ja ensimmäinen sana + alikomento
|
||||
const lower = input.toLowerCase();
|
||||
for (const [typo, fix] of Object.entries(typos)) {
|
||||
if (lower === typo || lower.startsWith(typo + ' ')) {
|
||||
return fix + input.slice(typo.length);
|
||||
}
|
||||
}
|
||||
// Levenshtein-etäisyys ensimmäiselle sanalle
|
||||
const firstWord = input.trim().split(/\s+/)[0].toLowerCase();
|
||||
if (firstWord !== 'kpn' && firstWord.length >= 2 && firstWord.length <= 5) {
|
||||
const dist = levenshtein(firstWord, 'kpn');
|
||||
if (dist <= 2) return 'kpn' + input.slice(firstWord.length);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function levenshtein(a, b) {
|
||||
const m = a.length, n = b.length;
|
||||
const d = Array.from({length: m + 1}, (_, i) => [i]);
|
||||
for (let j = 1; j <= n; j++) d[0][j] = j;
|
||||
for (let i = 1; i <= m; i++)
|
||||
for (let j = 1; j <= n; j++)
|
||||
d[i][j] = Math.min(d[i-1][j] + 1, d[i][j-1] + 1, d[i-1][j-1] + (a[i-1] !== b[j-1] ? 1 : 0));
|
||||
return d[m][n];
|
||||
}
|
||||
|
||||
function termExec(cmd) {
|
||||
termLog(`<span class="terminal-prompt">$</span> ${esc(cmd)}`);
|
||||
termHistory.unshift(cmd);
|
||||
termHistIdx = -1;
|
||||
|
||||
// Autokorjaus
|
||||
const corrected = autocorrect(cmd.trim());
|
||||
if (corrected && corrected !== cmd.trim()) {
|
||||
cmd = corrected;
|
||||
termLog(` <span style="color:#d29922">→ korjattu: ${esc(cmd)}</span>`);
|
||||
}
|
||||
|
||||
const parts = cmd.trim().split(/\s+/);
|
||||
if (parts[0] !== 'kpn') {
|
||||
termLog('kpn: tuntematon komento. Kokeile: kpn help', '#f85149');
|
||||
|
||||
Reference in New Issue
Block a user