diff --git a/network-poc/static/index.html b/network-poc/static/index.html index a91819d..fe282e3 100644 --- a/network-poc/static/index.html +++ b/network-poc/static/index.html @@ -2242,11 +2242,58 @@ Files: ${Object.keys(generatedFiles).join(', ')}`; termLog(`\n━━━ Pipeline valmis ━━━`); } + // 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(`$ ${esc(cmd)}`); termHistory.unshift(cmd); termHistIdx = -1; + // Autokorjaus + const corrected = autocorrect(cmd.trim()); + if (corrected && corrected !== cmd.trim()) { + cmd = corrected; + termLog(` → korjattu: ${esc(cmd)}`); + } + const parts = cmd.trim().split(/\s+/); if (parts[0] !== 'kpn') { termLog('kpn: tuntematon komento. Kokeile: kpn help', '#f85149');