Grammalecte  Hex Artifact Content

Artifact e70f6ede557ce25058d5621082b16bc03019657618a881835c72c3cdd5a94d5a:


0000: 2f 2f 2f 2f 20 53 54 52 49 4e 47 20 54 52 41 4e  //// STRING TRAN
0010: 53 46 4f 52 4d 41 54 49 4f 4e 0a 2f 2a 6a 73 6c  SFORMATION./*jsl
0020: 69 6e 74 20 65 73 76 65 72 73 69 6f 6e 3a 20 36  int esversion: 6
0030: 2a 2f 0a 0a 2f 2f 20 4e 6f 74 65 3a 20 34 38 20  */..// Note: 48 
0040: 69 73 20 74 68 65 20 41 53 43 49 49 20 63 6f 64  is the ASCII cod
0050: 65 20 66 6f 72 20 22 30 22 0a 0a 76 61 72 20 73  e for "0"..var s
0060: 74 72 5f 74 72 61 6e 73 66 6f 72 6d 20 3d 20 7b  tr_transform = {
0070: 0a 0a 20 20 20 20 64 69 73 74 61 6e 63 65 44 61  ..    distanceDa
0080: 6d 65 72 61 75 4c 65 76 65 6e 73 68 74 65 69 6e  merauLevenshtein
0090: 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73 31 2c 20  : function (s1, 
00a0: 73 32 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f  s2) {.        //
00b0: 20 64 69 73 74 61 6e 63 65 20 6f 66 20 44 61 6d   distance of Dam
00c0: 65 72 61 75 2d 4c 65 76 65 6e 73 68 74 65 69 6e  erau-Levenshtein
00d0: 20 62 65 74 77 65 65 6e 20 3c 73 31 3e 20 61 6e   between <s1> an
00e0: 64 20 3c 73 32 3e 0a 20 20 20 20 20 20 20 20 2f  d <s2>.        /
00f0: 2f 20 68 74 74 70 73 3a 2f 2f 66 72 2e 77 69 6b  / https://fr.wik
0100: 69 70 65 64 69 61 2e 6f 72 67 2f 77 69 6b 69 2f  ipedia.org/wiki/
0110: 44 69 73 74 61 6e 63 65 5f 64 65 5f 44 61 6d 65  Distance_de_Dame
0120: 72 61 75 2d 4c 65 76 65 6e 73 68 74 65 69 6e 0a  rau-Levenshtein.
0130: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
0140: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e 4c            let nL
0150: 65 6e 31 20 3d 20 73 31 2e 6c 65 6e 67 74 68 3b  en1 = s1.length;
0160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74  .            let
0170: 20 6e 4c 65 6e 32 20 3d 20 73 32 2e 6c 65 6e 67   nLen2 = s2.leng
0180: 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  th;.            
0190: 6c 65 74 20 6d 61 74 72 69 78 20 3d 20 5b 5d 3b  let matrix = [];
01a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
01b0: 20 28 6c 65 74 20 69 20 3d 20 30 3b 20 20 69 20   (let i = 0;  i 
01c0: 3c 3d 20 6e 4c 65 6e 31 3b 20 20 69 2b 2b 29 20  <= nLen1;  i++) 
01d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
01e0: 20 20 6d 61 74 72 69 78 5b 69 5d 20 3d 20 6e 65    matrix[i] = ne
01f0: 77 20 41 72 72 61 79 28 6e 4c 65 6e 32 20 2b 20  w Array(nLen2 + 
0200: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
0210: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  }.            fo
0220: 72 20 28 6c 65 74 20 69 20 3d 20 30 3b 20 20 69  r (let i = 0;  i
0230: 20 3c 3d 20 6e 4c 65 6e 31 3b 20 20 69 2b 2b 29   <= nLen1;  i++)
0240: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
0250: 20 20 20 6d 61 74 72 69 78 5b 69 5d 5b 30 5d 20     matrix[i][0] 
0260: 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
0270: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   }.            f
0280: 6f 72 20 28 6c 65 74 20 6a 20 3d 20 30 3b 20 20  or (let j = 0;  
0290: 6a 20 3c 3d 20 6e 4c 65 6e 32 3b 20 20 6a 2b 2b  j <= nLen2;  j++
02a0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
02b0: 20 20 20 20 6d 61 74 72 69 78 5b 30 5d 5b 6a 5d      matrix[0][j]
02c0: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
02d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
02e0: 66 6f 72 20 28 6c 65 74 20 69 20 3d 20 31 3b 20  for (let i = 1; 
02f0: 20 69 20 3c 3d 20 6e 4c 65 6e 31 3b 20 20 69 2b   i <= nLen1;  i+
0300: 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  +) {.           
0310: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 6a 20       for (let j 
0320: 3d 20 31 3b 20 20 6a 20 3c 3d 20 6e 4c 65 6e 32  = 1;  j <= nLen2
0330: 3b 20 20 6a 2b 2b 29 20 7b 0a 20 20 20 20 20 20  ;  j++) {.      
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
0350: 74 20 6e 43 6f 73 74 20 3d 20 28 73 31 5b 69 5d  t nCost = (s1[i]
0360: 20 3d 3d 3d 20 73 32 5b 6a 5d 29 20 3f 20 30 20   === s2[j]) ? 0 
0370: 3a 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  : 1;.           
0380: 20 20 20 20 20 20 20 20 20 6d 61 74 72 69 78 5b           matrix[
0390: 69 5d 5b 6a 5d 20 3d 20 4d 61 74 68 2e 6d 69 6e  i][j] = Math.min
03a0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
03b0: 20 20 20 20 20 20 20 20 20 20 6d 61 74 72 69 78            matrix
03c0: 5b 69 2d 31 5d 5b 6a 5d 20 2b 20 31 2c 20 20 20  [i-1][j] + 1,   
03d0: 20 20 20 20 20 20 2f 2f 20 44 65 6c 65 74 69 6f        // Deletio
03e0: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
03f0: 20 20 20 20 20 20 20 20 20 20 6d 61 74 72 69 78            matrix
0400: 5b 69 5d 5b 6a 2d 31 5d 20 2b 20 31 2c 20 20 20  [i][j-1] + 1,   
0410: 20 20 20 20 20 20 2f 2f 20 49 6e 73 65 72 74 69        // Inserti
0420: 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  on.             
0430: 20 20 20 20 20 20 20 20 20 20 20 6d 61 74 72 69             matri
0440: 78 5b 69 2d 31 5d 5b 6a 2d 31 5d 20 2b 20 6e 43  x[i-1][j-1] + nC
0450: 6f 73 74 20 20 20 20 2f 2f 20 53 75 62 73 74 69  ost    // Substi
0460: 74 75 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20  tution.         
0470: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
0480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0490: 20 20 69 66 20 28 69 20 3e 20 31 20 26 26 20 6a    if (i > 1 && j
04a0: 20 3e 20 31 20 26 26 20 73 31 5b 69 5d 20 3d 3d   > 1 && s1[i] ==
04b0: 20 73 32 5b 6a 2d 31 5d 20 26 26 20 73 31 5b 69   s2[j-1] && s1[i
04c0: 2d 31 5d 20 3d 3d 20 73 32 5b 6a 5d 29 20 7b 0a  -1] == s2[j]) {.
04d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04e0: 20 20 20 20 20 20 20 20 6d 61 74 72 69 78 5b 69          matrix[i
04f0: 5d 5b 6a 5d 20 3d 20 4d 61 74 68 2e 6d 69 6e 28  ][j] = Math.min(
0500: 6d 61 74 72 69 78 5b 69 5d 5b 6a 5d 2c 20 6d 61  matrix[i][j], ma
0510: 74 72 69 78 5b 69 2d 32 5d 5b 6a 2d 32 5d 20 2b  trix[i-2][j-2] +
0520: 20 6e 43 6f 73 74 29 3b 20 20 2f 2f 20 54 72 61   nCost);  // Tra
0530: 6e 73 70 6f 73 69 74 69 6f 6e 0a 20 20 20 20 20  nsposition.     
0540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
0550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0560: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
0570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 63  .            //c
0580: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 73 32 20 2b 20  onsole.log(s2 + 
0590: 22 3a 20 22 20 2b 20 6d 61 74 72 69 78 5b 6e 4c  ": " + matrix[nL
05a0: 65 6e 31 5d 5b 6e 4c 65 6e 32 5d 29 3b 0a 20 20  en1][nLen2]);.  
05b0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
05c0: 20 6d 61 74 72 69 78 5b 6e 4c 65 6e 31 5d 5b 6e   matrix[nLen1][n
05d0: 4c 65 6e 32 5d 3b 0a 20 20 20 20 20 20 20 20 7d  Len2];.        }
05e0: 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28  .        catch (
05f0: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
0600: 20 68 65 6c 70 65 72 73 2e 6c 6f 67 65 72 72 6f   helpers.logerro
0610: 72 28 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  r(e);.        }.
0620: 20 20 20 20 7d 2c 0a 0a 20 20 20 20 73 68 6f 77      },..    show
0630: 44 69 73 74 61 6e 63 65 20 28 73 31 2c 20 73 32  Distance (s1, s2
0640: 29 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  ) {.        cons
0650: 6f 6c 65 2e 6c 6f 67 28 60 44 69 73 74 61 6e 63  ole.log(`Distanc
0660: 65 3a 20 24 7b 73 31 7d 20 2f 20 24 7b 73 32 7d  e: ${s1} / ${s2}
0670: 20 3d 20 24 7b 74 68 69 73 2e 64 69 73 74 61 6e   = ${this.distan
0680: 63 65 44 61 6d 65 72 61 75 4c 65 76 65 6e 73 68  ceDamerauLevensh
0690: 74 65 69 6e 28 73 31 2c 20 73 32 29 7d 29 60 29  tein(s1, s2)})`)
06a0: 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 67 65  ;.    },..    ge
06b0: 74 53 74 65 6d 46 72 6f 6d 53 75 66 66 69 78 43  tStemFromSuffixC
06c0: 6f 64 65 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73  ode: function (s
06d0: 46 6c 65 78 2c 20 73 53 66 78 43 6f 64 65 29 20  Flex, sSfxCode) 
06e0: 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 53 75 66  {.        // Suf
06f0: 66 69 78 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20  fix only.       
0700: 20 69 66 20 28 73 53 66 78 43 6f 64 65 20 3d 3d   if (sSfxCode ==
0710: 20 22 30 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "0") {.        
0720: 20 20 20 20 72 65 74 75 72 6e 20 73 46 6c 65 78      return sFlex
0730: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
0740: 20 20 20 20 72 65 74 75 72 6e 20 73 53 66 78 43      return sSfxC
0750: 6f 64 65 5b 30 5d 20 3d 3d 20 27 30 27 20 3f 20  ode[0] == '0' ? 
0760: 73 46 6c 65 78 20 2b 20 73 53 66 78 43 6f 64 65  sFlex + sSfxCode
0770: 2e 73 6c 69 63 65 28 31 29 20 3a 20 73 46 6c 65  .slice(1) : sFle
0780: 78 2e 73 6c 69 63 65 28 30 2c 20 2d 28 73 53 66  x.slice(0, -(sSf
0790: 78 43 6f 64 65 2e 63 68 61 72 43 6f 64 65 41 74  xCode.charCodeAt
07a0: 28 30 29 2d 34 38 29 29 20 2b 20 73 53 66 78 43  (0)-48)) + sSfxC
07b0: 6f 64 65 2e 73 6c 69 63 65 28 31 29 3b 0a 20 20  ode.slice(1);.  
07c0: 20 20 7d 2c 0a 20 20 20 20 0a 20 20 20 20 67 65    },.    .    ge
07d0: 74 53 74 65 6d 46 72 6f 6d 41 66 66 69 78 43 6f  tStemFromAffixCo
07e0: 64 65 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73 46  de: function (sF
07f0: 6c 65 78 2c 20 73 41 66 66 43 6f 64 65 29 20 7b  lex, sAffCode) {
0800: 0a 20 20 20 20 20 20 20 20 2f 2f 20 50 72 65 66  .        // Pref
0810: 69 78 20 61 6e 64 20 73 75 66 66 69 78 0a 20 20  ix and suffix.  
0820: 20 20 20 20 20 20 69 66 20 28 73 41 66 66 43 6f        if (sAffCo
0830: 64 65 20 3d 3d 20 22 30 22 29 20 7b 0a 20 20 20  de == "0") {.   
0840: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0850: 73 46 6c 65 78 3b 0a 20 20 20 20 20 20 20 20 7d  sFlex;.        }
0860: 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 73 41  .        if (!sA
0870: 66 66 43 6f 64 65 2e 69 6e 63 6c 75 64 65 73 28  ffCode.includes(
0880: 22 2f 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20  "/")) {.        
0890: 20 20 20 20 72 65 74 75 72 6e 20 22 23 20 65 72      return "# er
08a0: 72 6f 72 20 23 22 3b 0a 20 20 20 20 20 20 20 20  ror #";.        
08b0: 7d 0a 20 20 20 20 20 20 20 20 6c 65 74 20 5b 73  }.        let [s
08c0: 50 66 78 43 6f 64 65 2c 20 73 53 66 78 43 6f 64  PfxCode, sSfxCod
08d0: 65 5d 20 3d 20 73 41 66 66 43 6f 64 65 2e 73 70  e] = sAffCode.sp
08e0: 6c 69 74 28 27 2f 27 29 3b 0a 20 20 20 20 20 20  lit('/');.      
08f0: 20 20 73 46 6c 65 78 20 3d 20 73 50 66 78 43 6f    sFlex = sPfxCo
0900: 64 65 2e 73 6c 69 63 65 28 31 29 20 2b 20 73 46  de.slice(1) + sF
0910: 6c 65 78 2e 73 6c 69 63 65 28 73 50 66 78 43 6f  lex.slice(sPfxCo
0920: 64 65 2e 63 68 61 72 43 6f 64 65 41 74 28 30 29  de.charCodeAt(0)
0930: 2d 34 38 29 3b 0a 20 20 20 20 20 20 20 20 72 65  -48);.        re
0940: 74 75 72 6e 20 73 53 66 78 43 6f 64 65 5b 30 5d  turn sSfxCode[0]
0950: 20 3d 3d 20 27 30 27 20 3f 20 73 46 6c 65 78 20   == '0' ? sFlex 
0960: 2b 20 73 53 66 78 43 6f 64 65 2e 73 6c 69 63 65  + sSfxCode.slice
0970: 28 31 29 20 3a 20 73 46 6c 65 78 2e 73 6c 69 63  (1) : sFlex.slic
0980: 65 28 30 2c 20 2d 28 73 53 66 78 43 6f 64 65 2e  e(0, -(sSfxCode.
0990: 63 68 61 72 43 6f 64 65 41 74 28 30 29 2d 34 38  charCodeAt(0)-48
09a0: 29 29 20 2b 20 73 53 66 78 43 6f 64 65 2e 73 6c  )) + sSfxCode.sl
09b0: 69 63 65 28 31 29 3b 0a 20 20 20 20 7d 0a 7d 3b  ice(1);.    }.};
09c0: 0a 0a 0a 69 66 20 28 74 79 70 65 6f 66 28 65 78  ...if (typeof(ex
09d0: 70 6f 72 74 73 29 20 21 3d 3d 20 27 75 6e 64 65  ports) !== 'unde
09e0: 66 69 6e 65 64 27 29 20 7b 0a 20 20 20 20 65 78  fined') {.    ex
09f0: 70 6f 72 74 73 2e 67 65 74 53 74 65 6d 46 72 6f  ports.getStemFro
0a00: 6d 53 75 66 66 69 78 43 6f 64 65 20 3d 20 73 74  mSuffixCode = st
0a10: 72 5f 74 72 61 6e 73 66 6f 72 6d 2e 67 65 74 53  r_transform.getS
0a20: 74 65 6d 46 72 6f 6d 53 75 66 66 69 78 43 6f 64  temFromSuffixCod
0a30: 65 3b 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 67  e;.    exports.g
0a40: 65 74 53 74 65 6d 46 72 6f 6d 41 66 66 69 78 43  etStemFromAffixC
0a50: 6f 64 65 20 3d 20 73 74 72 5f 74 72 61 6e 73 66  ode = str_transf
0a60: 6f 72 6d 2e 67 65 74 53 74 65 6d 46 72 6f 6d 41  orm.getStemFromA
0a70: 66 66 69 78 43 6f 64 65 3b 0a 7d 0a              ffixCode;.}.