Index: gc_core/js/char_player.js ================================================================== --- gc_core/js/char_player.js +++ gc_core/js/char_player.js @@ -8,33 +8,37 @@ distanceDamerauLevenshtein: function (s1, s2) { // distance of Damerau-Levenshtein between and // https://fr.wikipedia.org/wiki/Distance_de_Damerau-Levenshtein try { - let d = new Map(); - let nLen1 = s1.length; - let nLen2 = s2.length; - for (let i = -1; i <= nLen1; i++) { - d.set([i, -1], i + 1); - } - for (let j = -1; j <= nLen2; j++) { - d.set([-1, j], j + 1); - } - for (let i = 0; i < nLen1; i++) { - for (let j = 0; j < nLen2; j++) { - let nCost = (s1[i] === s2[j]) ? 0 : 1; - d.set([i, j], Math.min( - d.get([i-1, j]) + 1, // Deletion - d.get([i, j-1]) + 1, // Insertion - d.get([i-1, j-1]) + nCost, // Substitution - )); - if (i && j && s1[i] == s2[j-1] && s1[i-1] == s2[j]) { - d.set([i, j], Math.min(d.get([i, j]), d.get([i-2, j-2]) + nCost)); // Transposition - } - } - } - return d.get([nLen1-1, nLen2-1]); + let nLen1 = s1.length; + let nLen2 = s2.length; + let matrix = []; + for (let i = 0; i <= nLen1; i++) { + matrix[i] = new Array(nLen2 + 1); + } + for (let i = 0; i <= nLen1; i++) { + matrix[i][0] = i; + } + for (let j = 0; j <= nLen2; j++) { + matrix[0][j] = j; + } + for (let i = 1; i <= nLen1; i++) { + for (let j = 1; j <= nLen2; j++) { + let nCost = (s1[i] === s2[j]) ? 0 : 1; + matrix[i][j] = Math.min( + matrix[i-1][j] + 1, // Deletion + matrix[i][j-1] + 1, // Insertion + matrix[i-1][j-1] + nCost // Substitution + ); + if (i > 1 && j > 1 && s1[i] == s2[j-1] && s1[i-1] == s2[j]) { + matrix[i][j] = Math.min(matrix[i][j], matrix[i-2][j-2] + nCost); // Transposition + } + } + } + console.log(s2 + ": " + matrix[nLen1][nLen2]); + return matrix[nLen1][nLen2]; } catch (e) { helpers.logerror(e); } }, Index: gc_core/js/ibdawg.js ================================================================== --- gc_core/js/ibdawg.js +++ gc_core/js/ibdawg.js @@ -190,11 +190,13 @@ aSugg = Array.from(aSugg); aSugg = aSugg.filter((sSugg) => { return !sSugg.endsWith("è") && !sSugg.endsWith("È"); }); // fr language if (sWord.gl_isTitle()) { aSugg = aSugg.map((sSugg) => { return sSugg.gl_toCapitalize(); }); } - return aSugg.sort((sSugg) => { return char_player.distanceDamerauLevenshtein(sWord, sSugg); }).slice(0, nMaxSugg); + return aSugg.sort((sA, sB) => { + return char_player.distanceDamerauLevenshtein(sWord, sA) - char_player.distanceDamerauLevenshtein(sWord, sB); + }).slice(0, nMaxSugg); } _suggest (sRemain, nMaxDel=0, nDeep=0, iAddr=0, sNewWord="", bAvoidLoop=false) { // returns a set of suggestions // recursive function