Grammalecte  Hex Artifact Content

Artifact aaa0b82c6babc000391c7034cb002a34aa0c66c26c2801a915ba768659d26eec:


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: 32 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73 31 2c  2: function (s1,
00a0: 20 73 32 29 20 7b 0a 20 20 20 20 20 20 20 20 2f   s2) {.        /
00b0: 2f 20 64 69 73 74 61 6e 63 65 20 6f 66 20 44 61  / distance of Da
00c0: 6d 65 72 61 75 2d 4c 65 76 65 6e 73 68 74 65 69  merau-Levenshtei
00d0: 6e 20 62 65 74 77 65 65 6e 20 3c 73 31 3e 20 61  n between <s1> a
00e0: 6e 64 20 3c 73 32 3e 0a 20 20 20 20 20 20 20 20  nd <s2>.        
00f0: 2f 2f 20 68 74 74 70 73 3a 2f 2f 66 72 2e 77 69  // https://fr.wi
0100: 6b 69 70 65 64 69 61 2e 6f 72 67 2f 77 69 6b 69  kipedia.org/wiki
0110: 2f 44 69 73 74 61 6e 63 65 5f 64 65 5f 44 61 6d  /Distance_de_Dam
0120: 65 72 61 75 2d 4c 65 76 65 6e 73 68 74 65 69 6e  erau-Levenshtein
0130: 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20  .        try {. 
0140: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e             let n
0150: 4c 65 6e 31 20 3d 20 73 31 2e 6c 65 6e 67 74 68  Len1 = s1.length
0160: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  ;.            le
0170: 74 20 6e 4c 65 6e 32 20 3d 20 73 32 2e 6c 65 6e  t nLen2 = s2.len
0180: 67 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20  gth;.           
0190: 20 6c 65 74 20 6d 61 74 72 69 78 20 3d 20 5b 5d   let matrix = []
01a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
01b0: 72 20 28 6c 65 74 20 69 20 3d 20 30 3b 20 20 69  r (let i = 0;  i
01c0: 20 3c 3d 20 6e 4c 65 6e 31 3b 20 20 69 2b 2b 29   <= nLen1;  i++)
01d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
01e0: 20 20 20 6d 61 74 72 69 78 5b 69 5d 20 3d 20 6e     matrix[i] = n
01f0: 65 77 20 41 72 72 61 79 28 6e 4c 65 6e 32 20 2b  ew Array(nLen2 +
0200: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
0210: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   }.            f
0220: 6f 72 20 28 6c 65 74 20 69 20 3d 20 30 3b 20 20  or (let i = 0;  
0230: 69 20 3c 3d 20 6e 4c 65 6e 31 3b 20 20 69 2b 2b  i <= nLen1;  i++
0240: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0250: 20 20 20 20 6d 61 74 72 69 78 5b 69 5d 5b 30 5d      matrix[i][0]
0260: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
0270: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
0280: 66 6f 72 20 28 6c 65 74 20 6a 20 3d 20 30 3b 20  for (let j = 0; 
0290: 20 6a 20 3c 3d 20 6e 4c 65 6e 32 3b 20 20 6a 2b   j <= nLen2;  j+
02a0: 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  +) {.           
02b0: 20 20 20 20 20 6d 61 74 72 69 78 5b 30 5d 5b 6a       matrix[0][j
02c0: 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  ] = j;.         
02d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
02e0: 20 66 6f 72 20 28 6c 65 74 20 69 20 3d 20 31 3b   for (let i = 1;
02f0: 20 20 69 20 3c 3d 20 6e 4c 65 6e 31 3b 20 20 69    i <= nLen1;  i
0300: 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ++) {.          
0310: 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 6a        for (let j
0320: 20 3d 20 31 3b 20 20 6a 20 3c 3d 20 6e 4c 65 6e   = 1;  j <= nLen
0330: 32 3b 20 20 6a 2b 2b 29 20 7b 0a 20 20 20 20 20  2;  j++) {.     
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
0350: 65 74 20 6e 43 6f 73 74 20 3d 20 28 73 31 5b 69  et nCost = (s1[i
0360: 5d 20 3d 3d 3d 20 73 32 5b 6a 5d 29 20 3f 20 30  ] === s2[j]) ? 0
0370: 20 3a 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   : 1;.          
0380: 20 20 20 20 20 20 20 20 20 20 6d 61 74 72 69 78            matrix
0390: 5b 69 5d 5b 6a 5d 20 3d 20 4d 61 74 68 2e 6d 69  [i][j] = Math.mi
03a0: 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n(.             
03b0: 20 20 20 20 20 20 20 20 20 20 20 6d 61 74 72 69             matri
03c0: 78 5b 69 2d 31 5d 5b 6a 5d 20 2b 20 31 2c 20 20  x[i-1][j] + 1,  
03d0: 20 20 20 20 20 20 20 2f 2f 20 44 65 6c 65 74 69         // Deleti
03e0: 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  on.             
03f0: 20 20 20 20 20 20 20 20 20 20 20 6d 61 74 72 69             matri
0400: 78 5b 69 5d 5b 6a 2d 31 5d 20 2b 20 31 2c 20 20  x[i][j-1] + 1,  
0410: 20 20 20 20 20 20 20 2f 2f 20 49 6e 73 65 72 74         // Insert
0420: 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ion.            
0430: 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 74 72              matr
0440: 69 78 5b 69 2d 31 5d 5b 6a 2d 31 5d 20 2b 20 6e  ix[i-1][j-1] + n
0450: 43 6f 73 74 20 20 20 20 2f 2f 20 53 75 62 73 74  Cost    // Subst
0460: 69 74 75 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  itution.        
0470: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
0480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0490: 20 20 20 69 66 20 28 69 20 3e 20 31 20 26 26 20     if (i > 1 && 
04a0: 6a 20 3e 20 31 20 26 26 20 73 31 5b 69 5d 20 3d  j > 1 && s1[i] =
04b0: 3d 20 73 32 5b 6a 2d 31 5d 20 26 26 20 73 31 5b  = s2[j-1] && s1[
04c0: 69 2d 31 5d 20 3d 3d 20 73 32 5b 6a 5d 29 20 7b  i-1] == s2[j]) {
04d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
04e0: 20 20 20 20 20 20 20 20 20 6d 61 74 72 69 78 5b           matrix[
04f0: 69 5d 5b 6a 5d 20 3d 20 4d 61 74 68 2e 6d 69 6e  i][j] = Math.min
0500: 28 6d 61 74 72 69 78 5b 69 5d 5b 6a 5d 2c 20 6d  (matrix[i][j], m
0510: 61 74 72 69 78 5b 69 2d 32 5d 5b 6a 2d 32 5d 20  atrix[i-2][j-2] 
0520: 2b 20 6e 43 6f 73 74 29 3b 20 20 2f 2f 20 54 72  + nCost);  // Tr
0530: 61 6e 73 70 6f 73 69 74 69 6f 6e 0a 20 20 20 20  ansposition.    
0540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0550: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
0560: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
0570: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  }.            re
0580: 74 75 72 6e 20 6d 61 74 72 69 78 5b 6e 4c 65 6e  turn matrix[nLen
0590: 31 5d 5b 6e 4c 65 6e 32 5d 3b 0a 20 20 20 20 20  1][nLen2];.     
05a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 74     }.        cat
05b0: 63 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20  ch (e) {.       
05c0: 20 20 20 20 20 68 65 6c 70 65 72 73 2e 6c 6f 67       helpers.log
05d0: 65 72 72 6f 72 28 65 29 3b 0a 20 20 20 20 20 20  error(e);.      
05e0: 20 20 7d 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20    }.    },..    
05f0: 64 69 73 74 61 6e 63 65 44 61 6d 65 72 61 75 4c  distanceDamerauL
0600: 65 76 65 6e 73 68 74 65 69 6e 3a 20 66 75 6e 63  evenshtein: func
0610: 74 69 6f 6e 20 28 73 31 2c 20 73 32 29 20 7b 0a  tion (s1, s2) {.
0620: 20 20 20 20 20 20 20 20 2f 2f 20 64 69 73 74 61          // dista
0630: 6e 63 65 20 6f 66 20 44 61 6d 65 72 61 75 2d 4c  nce of Damerau-L
0640: 65 76 65 6e 73 68 74 65 69 6e 20 62 65 74 77 65  evenshtein betwe
0650: 65 6e 20 3c 73 31 3e 20 61 6e 64 20 3c 73 32 3e  en <s1> and <s2>
0660: 0a 20 20 20 20 20 20 20 20 2f 2f 20 68 74 74 70  .        // http
0670: 73 3a 2f 2f 66 72 2e 77 69 6b 69 70 65 64 69 61  s://fr.wikipedia
0680: 2e 6f 72 67 2f 77 69 6b 69 2f 44 69 73 74 61 6e  .org/wiki/Distan
0690: 63 65 5f 64 65 5f 44 61 6d 65 72 61 75 2d 4c 65  ce_de_Damerau-Le
06a0: 76 65 6e 73 68 74 65 69 6e 0a 20 20 20 20 20 20  venshtein.      
06b0: 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20    try {.        
06c0: 20 20 20 20 6c 65 74 20 6e 4c 65 6e 31 20 3d 20      let nLen1 = 
06d0: 73 31 2e 6c 65 6e 67 74 68 3b 0a 20 20 20 20 20  s1.length;.     
06e0: 20 20 20 20 20 20 20 6c 65 74 20 6e 4c 65 6e 32         let nLen2
06f0: 20 3d 20 73 32 2e 6c 65 6e 67 74 68 3b 0a 20 20   = s2.length;.  
0700: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 49 4e            let IN
0710: 46 20 3d 20 6e 4c 65 6e 31 20 2b 20 6e 4c 65 6e  F = nLen1 + nLen
0720: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  2;.            l
0730: 65 74 20 6d 61 74 72 69 78 20 3d 20 5b 5d 3b 0a  et matrix = [];.
0740: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
0750: 73 64 20 3d 20 7b 7d 3b 0a 20 20 20 20 20 20 20  sd = {};.       
0760: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 69 20       for (let i 
0770: 3d 20 30 3b 20 69 20 3c 20 6e 4c 65 6e 31 2b 32  = 0; i < nLen1+2
0780: 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20  ; i++) {.       
0790: 20 20 20 20 20 20 20 20 20 6d 61 74 72 69 78 5b           matrix[
07a0: 69 5d 20 3d 20 6e 65 77 20 41 72 72 61 79 28 6e  i] = new Array(n
07b0: 4c 65 6e 32 2b 32 29 3b 0a 20 20 20 20 20 20 20  Len2+2);.       
07c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
07d0: 20 20 20 6d 61 74 72 69 78 5b 30 5d 5b 30 5d 20     matrix[0][0] 
07e0: 3d 20 49 4e 46 3b 0a 20 20 20 20 20 20 20 20 20  = INF;.         
07f0: 20 20 20 66 6f 72 20 28 6c 65 74 20 69 20 3d 20     for (let i = 
0800: 30 3b 20 69 20 3c 3d 20 6e 4c 65 6e 31 3b 20 69  0; i <= nLen1; i
0810: 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ++) {.          
0820: 20 20 20 20 20 20 6d 61 74 72 69 78 5b 69 2b 31        matrix[i+1
0830: 5d 5b 31 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  ][1] = i;.      
0840: 20 20 20 20 20 20 20 20 20 20 6d 61 74 72 69 78            matrix
0850: 5b 69 2b 31 5d 5b 30 5d 20 3d 20 49 4e 46 3b 0a  [i+1][0] = INF;.
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 73 64 5b 73 31 5b 69 5d 5d 20 3d 20 30 3b 0a 20  sd[s1[i]] = 0;. 
0880: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0890: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65           for (le
08a0: 74 20 6a 20 3d 20 30 3b 20 6a 20 3c 3d 20 6e 4c  t j = 0; j <= nL
08b0: 65 6e 32 3b 20 6a 2b 2b 29 20 7b 0a 20 20 20 20  en2; j++) {.    
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 74 72              matr
08d0: 69 78 5b 31 5d 5b 6a 2b 31 5d 20 3d 20 6a 3b 0a  ix[1][j+1] = j;.
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 6d 61 74 72 69 78 5b 30 5d 5b 6a 2b 31 5d 20 3d  matrix[0][j+1] =
0900: 20 49 4e 46 3b 0a 20 20 20 20 20 20 20 20 20 20   INF;.          
0910: 20 20 20 20 20 20 73 64 5b 73 32 5b 6a 5d 5d 20        sd[s2[j]] 
0920: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
0930: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
0940: 66 6f 72 20 28 6c 65 74 20 69 20 3d 20 31 3b 20  for (let i = 1; 
0950: 69 20 3c 3d 20 6e 4c 65 6e 31 3b 20 69 2b 2b 29  i <= nLen1; i++)
0960: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
0970: 20 20 20 6c 65 74 20 44 42 20 3d 20 30 3b 0a 20     let DB = 0;. 
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
0990: 6f 72 20 28 6c 65 74 20 6a 20 3d 20 31 3b 20 6a  or (let j = 1; j
09a0: 20 3c 3d 20 6e 4c 65 6e 32 3b 20 6a 2b 2b 29 20   <= nLen2; j++) 
09b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
09c0: 20 20 20 20 20 20 6c 65 74 20 69 31 20 3d 20 73        let i1 = s
09d0: 64 5b 73 32 5b 6a 2d 31 5d 5d 3b 0a 20 20 20 20  d[s2[j-1]];.    
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09f0: 6c 65 74 20 6a 31 20 3d 20 44 42 3b 0a 20 20 20  let j1 = DB;.   
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a10: 20 69 66 20 28 73 31 5b 69 2d 31 5d 20 3d 3d 3d   if (s1[i-1] ===
0a20: 20 73 32 5b 6a 2d 31 5d 29 20 7b 0a 20 20 20 20   s2[j-1]) {.    
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 20 20 20 20 6d 61 74 72 69 78 5b 69 2b 31 5d 5b      matrix[i+1][
0a50: 6a 2b 31 5d 20 3d 20 6d 61 74 72 69 78 5b 69 5d  j+1] = matrix[i]
0a60: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [j];.           
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 42 20               DB 
0a80: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
0a90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
0ab0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61                ma
0ad0: 74 72 69 78 5b 69 2b 31 5d 5b 6a 2b 31 5d 20 3d  trix[i+1][j+1] =
0ae0: 20 4d 61 74 68 2e 6d 69 6e 28 6d 61 74 72 69 78   Math.min(matrix
0af0: 5b 69 5d 5b 6a 5d 2c 20 4d 61 74 68 2e 6d 69 6e  [i][j], Math.min
0b00: 28 6d 61 74 72 69 78 5b 69 2b 31 5d 5b 6a 5d 2c  (matrix[i+1][j],
0b10: 20 6d 61 74 72 69 78 5b 69 5d 5b 6a 2b 31 5d 29   matrix[i][j+1])
0b20: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20  ) + 1;.         
0b30: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 6d 61 74 72 69 78 5b 69 2b 31 5d 5b 6a 2b 31   matrix[i+1][j+1
0b60: 5d 20 3d 20 4d 61 74 68 2e 6d 69 6e 28 6d 61 74  ] = Math.min(mat
0b70: 72 69 78 5b 69 2b 31 5d 5b 6a 2b 31 5d 2c 20 6d  rix[i+1][j+1], m
0b80: 61 74 72 69 78 5b 69 31 5d 20 3f 20 6d 61 74 72  atrix[i1] ? matr
0b90: 69 78 5b 69 31 5d 5b 6a 31 5d 20 2b 20 28 69 2d  ix[i1][j1] + (i-
0ba0: 69 31 2d 31 29 20 2b 20 31 20 2b 20 28 6a 2d 6a  i1-1) + 1 + (j-j
0bb0: 31 2d 31 29 20 3a 20 49 6e 66 69 6e 69 74 79 29  1-1) : Infinity)
0bc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
0bd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
0be0: 20 20 20 20 73 64 5b 73 31 5b 69 2d 31 5d 5d 20      sd[s1[i-1]] 
0bf0: 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
0c00: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72   }.            r
0c10: 65 74 75 72 6e 20 6d 61 74 72 69 78 5b 6e 4c 65  eturn matrix[nLe
0c20: 6e 31 2b 31 5d 5b 6e 4c 65 6e 32 2b 31 5d 3b 0a  n1+1][nLen2+1];.
0c30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0c40: 20 20 63 61 74 63 68 20 28 65 29 20 7b 0a 20 20    catch (e) {.  
0c50: 20 20 20 20 20 20 20 20 20 20 68 65 6c 70 65 72            helper
0c60: 73 2e 6c 6f 67 65 72 72 6f 72 28 65 29 3b 0a 20  s.logerror(e);. 
0c70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 2c 0a         }.    },.
0c80: 0a 20 20 20 20 73 68 6f 77 44 69 73 74 61 6e 63  .    showDistanc
0c90: 65 20 28 73 31 2c 20 73 32 29 20 7b 0a 20 20 20  e (s1, s2) {.   
0ca0: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
0cb0: 28 60 44 69 73 74 61 6e 63 65 3a 20 24 7b 73 31  (`Distance: ${s1
0cc0: 7d 20 2f 20 24 7b 73 32 7d 20 3d 20 24 7b 74 68  } / ${s2} = ${th
0cd0: 69 73 2e 64 69 73 74 61 6e 63 65 44 61 6d 65 72  is.distanceDamer
0ce0: 61 75 4c 65 76 65 6e 73 68 74 65 69 6e 28 73 31  auLevenshtein(s1
0cf0: 2c 20 73 32 29 7d 29 60 29 3b 0a 20 20 20 20 7d  , s2)})`);.    }
0d00: 2c 0a 0a 20 20 20 20 67 65 74 53 74 65 6d 46 72  ,..    getStemFr
0d10: 6f 6d 53 75 66 66 69 78 43 6f 64 65 3a 20 66 75  omSuffixCode: fu
0d20: 6e 63 74 69 6f 6e 20 28 73 46 6c 65 78 2c 20 73  nction (sFlex, s
0d30: 53 66 78 43 6f 64 65 29 20 7b 0a 20 20 20 20 20  SfxCode) {.     
0d40: 20 20 20 2f 2f 20 53 75 66 66 69 78 20 6f 6e 6c     // Suffix onl
0d50: 79 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 53  y.        if (sS
0d60: 66 78 43 6f 64 65 20 3d 3d 20 22 30 22 29 20 7b  fxCode == "0") {
0d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
0d80: 75 72 6e 20 73 46 6c 65 78 3b 0a 20 20 20 20 20  urn sFlex;.     
0d90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
0da0: 75 72 6e 20 73 53 66 78 43 6f 64 65 5b 30 5d 20  urn sSfxCode[0] 
0db0: 3d 3d 20 27 30 27 20 3f 20 73 46 6c 65 78 20 2b  == '0' ? sFlex +
0dc0: 20 73 53 66 78 43 6f 64 65 2e 73 6c 69 63 65 28   sSfxCode.slice(
0dd0: 31 29 20 3a 20 73 46 6c 65 78 2e 73 6c 69 63 65  1) : sFlex.slice
0de0: 28 30 2c 20 2d 28 73 53 66 78 43 6f 64 65 2e 63  (0, -(sSfxCode.c
0df0: 68 61 72 43 6f 64 65 41 74 28 30 29 2d 34 38 29  harCodeAt(0)-48)
0e00: 29 20 2b 20 73 53 66 78 43 6f 64 65 2e 73 6c 69  ) + sSfxCode.sli
0e10: 63 65 28 31 29 3b 0a 20 20 20 20 7d 2c 0a 20 20  ce(1);.    },.  
0e20: 20 20 0a 20 20 20 20 67 65 74 53 74 65 6d 46 72    .    getStemFr
0e30: 6f 6d 41 66 66 69 78 43 6f 64 65 3a 20 66 75 6e  omAffixCode: fun
0e40: 63 74 69 6f 6e 20 28 73 46 6c 65 78 2c 20 73 41  ction (sFlex, sA
0e50: 66 66 43 6f 64 65 29 20 7b 0a 20 20 20 20 20 20  ffCode) {.      
0e60: 20 20 2f 2f 20 50 72 65 66 69 78 20 61 6e 64 20    // Prefix and 
0e70: 73 75 66 66 69 78 0a 20 20 20 20 20 20 20 20 69  suffix.        i
0e80: 66 20 28 73 41 66 66 43 6f 64 65 20 3d 3d 20 22  f (sAffCode == "
0e90: 30 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  0") {.          
0ea0: 20 20 72 65 74 75 72 6e 20 73 46 6c 65 78 3b 0a    return sFlex;.
0eb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0ec0: 20 20 69 66 20 28 21 73 41 66 66 43 6f 64 65 2e    if (!sAffCode.
0ed0: 69 6e 63 6c 75 64 65 73 28 22 2f 22 29 29 20 7b  includes("/")) {
0ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
0ef0: 75 72 6e 20 22 23 20 65 72 72 6f 72 20 23 22 3b  urn "# error #";
0f00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
0f10: 20 20 20 6c 65 74 20 5b 73 50 66 78 43 6f 64 65     let [sPfxCode
0f20: 2c 20 73 53 66 78 43 6f 64 65 5d 20 3d 20 73 41  , sSfxCode] = sA
0f30: 66 66 43 6f 64 65 2e 73 70 6c 69 74 28 27 2f 27  ffCode.split('/'
0f40: 29 3b 0a 20 20 20 20 20 20 20 20 73 46 6c 65 78  );.        sFlex
0f50: 20 3d 20 73 50 66 78 43 6f 64 65 2e 73 6c 69 63   = sPfxCode.slic
0f60: 65 28 31 29 20 2b 20 73 46 6c 65 78 2e 73 6c 69  e(1) + sFlex.sli
0f70: 63 65 28 73 50 66 78 43 6f 64 65 2e 63 68 61 72  ce(sPfxCode.char
0f80: 43 6f 64 65 41 74 28 30 29 2d 34 38 29 3b 0a 20  CodeAt(0)-48);. 
0f90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 53         return sS
0fa0: 66 78 43 6f 64 65 5b 30 5d 20 3d 3d 20 27 30 27  fxCode[0] == '0'
0fb0: 20 3f 20 73 46 6c 65 78 20 2b 20 73 53 66 78 43   ? sFlex + sSfxC
0fc0: 6f 64 65 2e 73 6c 69 63 65 28 31 29 20 3a 20 73  ode.slice(1) : s
0fd0: 46 6c 65 78 2e 73 6c 69 63 65 28 30 2c 20 2d 28  Flex.slice(0, -(
0fe0: 73 53 66 78 43 6f 64 65 2e 63 68 61 72 43 6f 64  sSfxCode.charCod
0ff0: 65 41 74 28 30 29 2d 34 38 29 29 20 2b 20 73 53  eAt(0)-48)) + sS
1000: 66 78 43 6f 64 65 2e 73 6c 69 63 65 28 31 29 3b  fxCode.slice(1);
1010: 0a 20 20 20 20 7d 0a 7d 3b 0a 0a 0a 69 66 20 28  .    }.};...if (
1020: 74 79 70 65 6f 66 28 65 78 70 6f 72 74 73 29 20  typeof(exports) 
1030: 21 3d 3d 20 27 75 6e 64 65 66 69 6e 65 64 27 29  !== 'undefined')
1040: 20 7b 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 67   {.    exports.g
1050: 65 74 53 74 65 6d 46 72 6f 6d 53 75 66 66 69 78  etStemFromSuffix
1060: 43 6f 64 65 20 3d 20 73 74 72 5f 74 72 61 6e 73  Code = str_trans
1070: 66 6f 72 6d 2e 67 65 74 53 74 65 6d 46 72 6f 6d  form.getStemFrom
1080: 53 75 66 66 69 78 43 6f 64 65 3b 0a 20 20 20 20  SuffixCode;.    
1090: 65 78 70 6f 72 74 73 2e 67 65 74 53 74 65 6d 46  exports.getStemF
10a0: 72 6f 6d 41 66 66 69 78 43 6f 64 65 20 3d 20 73  romAffixCode = s
10b0: 74 72 5f 74 72 61 6e 73 66 6f 72 6d 2e 67 65 74  tr_transform.get
10c0: 53 74 65 6d 46 72 6f 6d 41 66 66 69 78 43 6f 64  StemFromAffixCod
10d0: 65 3b 0a 7d 0a                                   e;.}.