Grammalecte  Hex Artifact Content

Artifact 299826c38fe0ae10172ea6af97a3671c0f9e3b7b9c509eec6db6177aa9362bb0:


0000: 2f 2f 20 53 70 65 6c 6c 63 68 65 63 6b 65 72 0a  // Spellchecker.
0010: 2f 2f 20 57 72 61 70 70 65 72 20 66 6f 72 20 74  // Wrapper for t
0020: 68 65 20 49 42 44 41 57 47 20 63 6c 61 73 73 2e  he IBDAWG class.
0030: 0a 2f 2f 20 55 73 65 66 75 6c 20 74 6f 20 63 68  .// Useful to ch
0040: 65 63 6b 20 73 65 76 65 72 61 6c 20 64 69 63 74  eck several dict
0050: 69 6f 6e 61 72 69 65 73 20 61 74 20 6f 6e 63 65  ionaries at once
0060: 2e 0a 0a 2f 2f 20 54 6f 20 61 76 6f 69 64 20 69  ...// To avoid i
0070: 74 65 72 61 74 69 6e 67 20 6f 76 65 72 20 61 20  terating over a 
0080: 70 69 6c 65 20 6f 66 20 64 69 63 74 69 6f 6e 61  pile of dictiona
0090: 72 69 65 73 2c 20 69 74 20 69 73 20 61 73 73 75  ries, it is assu
00a0: 6d 65 64 20 74 68 61 74 20 33 20 61 72 65 20 65  med that 3 are e
00b0: 6e 6f 75 67 68 3a 0a 2f 2f 20 2d 20 74 68 65 20  nough:.// - the 
00c0: 6d 61 69 6e 20 64 69 63 74 69 6f 6e 61 72 79 2c  main dictionary,
00d0: 20 62 75 6e 64 6c 65 64 20 77 69 74 68 20 74 68   bundled with th
00e0: 65 20 70 61 63 6b 61 67 65 0a 2f 2f 20 2d 20 74  e package.// - t
00f0: 68 65 20 63 6f 6d 6d 75 6e 69 74 79 20 64 69 63  he community dic
0100: 74 69 6f 6e 61 72 79 2c 20 61 20 6d 65 72 67 65  tionary, a merge
0110: 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 65 78   of different ex
0120: 74 65 72 6e 61 6c 20 64 69 63 74 69 6f 6e 61 72  ternal dictionar
0130: 69 65 73 0a 2f 2f 20 2d 20 74 68 65 20 70 65 72  ies.// - the per
0140: 73 6f 6e 61 6c 20 64 69 63 74 69 6f 6e 61 72 79  sonal dictionary
0150: 2c 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  , created by the
0160: 20 75 73 65 72 20 66 6f 72 20 69 74 73 20 6f 77   user for its ow
0170: 6e 20 63 6f 6e 76 65 6e 69 65 6e 63 65 0a 0a 2f  n convenience../
0180: 2a 20 6a 73 68 69 6e 74 20 65 73 76 65 72 73 69  * jshint esversi
0190: 6f 6e 3a 36 2c 20 2d 57 30 39 37 20 2a 2f 0a 2f  on:6, -W097 */./
01a0: 2a 20 6a 73 6c 69 6e 74 20 65 73 76 65 72 73 69  * jslint esversi
01b0: 6f 6e 3a 36 20 2a 2f 0a 2f 2a 20 67 6c 6f 62 61  on:6 */./* globa
01c0: 6c 20 72 65 71 75 69 72 65 2c 20 65 78 70 6f 72  l require, expor
01d0: 74 73 2c 20 63 6f 6e 73 6f 6c 65 2c 20 49 42 44  ts, console, IBD
01e0: 41 57 47 2c 20 54 6f 6b 65 6e 69 7a 65 72 20 2a  AWG, Tokenizer *
01f0: 2f 0a 0a 22 75 73 65 20 73 74 72 69 63 74 22 3b  /.."use strict";
0200: 0a 0a 24 7b 6d 61 70 7d 0a 24 7b 73 74 72 69 6e  ..${map}.${strin
0210: 67 7d 0a 0a 0a 69 66 20 28 74 79 70 65 6f 66 28  g}...if (typeof(
0220: 70 72 6f 63 65 73 73 29 20 21 3d 3d 20 27 75 6e  process) !== 'un
0230: 64 65 66 69 6e 65 64 27 29 20 7b 0a 20 20 20 20  defined') {.    
0240: 76 61 72 20 69 62 64 61 77 67 20 3d 20 72 65 71  var ibdawg = req
0250: 75 69 72 65 28 22 2e 2f 69 62 64 61 77 67 2e 6a  uire("./ibdawg.j
0260: 73 22 29 3b 0a 20 20 20 20 76 61 72 20 74 6f 6b  s");.    var tok
0270: 65 6e 69 7a 65 72 20 3d 20 72 65 71 75 69 72 65  enizer = require
0280: 28 22 2e 2f 74 6f 6b 65 6e 69 7a 65 72 2e 6a 73  ("./tokenizer.js
0290: 22 29 3b 0a 7d 0a 0a 0a 63 6f 6e 73 74 20 64 44  ");.}...const dD
02a0: 65 66 61 75 6c 74 44 69 63 74 69 6f 6e 61 72 69  efaultDictionari
02b0: 65 73 20 3d 20 6e 65 77 20 4d 61 70 28 5b 0a 20  es = new Map([. 
02c0: 20 20 20 5b 22 66 72 22 2c 20 22 66 72 2d 61 6c     ["fr", "fr-al
02d0: 6c 76 61 72 73 2e 6a 73 6f 6e 22 5d 2c 0a 20 20  lvars.json"],.  
02e0: 20 20 5b 22 65 6e 22 2c 20 22 65 6e 2e 6a 73 6f    ["en", "en.jso
02f0: 6e 22 5d 0a 5d 29 3b 0a 0a 0a 63 6c 61 73 73 20  n"].]);...class 
0300: 53 70 65 6c 6c 43 68 65 63 6b 65 72 20 7b 0a 0a  SpellChecker {..
0310: 20 20 20 20 63 6f 6e 73 74 72 75 63 74 6f 72 20      constructor 
0320: 28 73 4c 61 6e 67 43 6f 64 65 2c 20 73 50 61 74  (sLangCode, sPat
0330: 68 3d 22 22 2c 20 6d 61 69 6e 44 69 63 3d 22 22  h="", mainDic=""
0340: 2c 20 63 6f 6d 6d 75 6e 69 74 79 44 69 63 3d 22  , communityDic="
0350: 22 2c 20 70 65 72 73 6f 6e 61 6c 44 69 63 3d 22  ", personalDic="
0360: 22 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20  ") {.        // 
0370: 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
0380: 74 68 65 20 6d 61 69 6e 20 64 69 63 74 69 6f 6e  the main diction
0390: 61 72 79 20 69 73 20 6c 6f 61 64 65 64 0a 20 20  ary is loaded.  
03a0: 20 20 20 20 20 20 74 68 69 73 2e 73 4c 61 6e 67        this.sLang
03b0: 43 6f 64 65 20 3d 20 73 4c 61 6e 67 43 6f 64 65  Code = sLangCode
03c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 6d  ;.        if (!m
03d0: 61 69 6e 44 69 63 29 20 7b 0a 20 20 20 20 20 20  ainDic) {.      
03e0: 20 20 20 20 20 20 6d 61 69 6e 44 69 63 20 3d 20        mainDic = 
03f0: 64 44 65 66 61 75 6c 74 44 69 63 74 69 6f 6e 61  dDefaultDictiona
0400: 72 69 65 73 2e 67 6c 5f 67 65 74 28 73 4c 61 6e  ries.gl_get(sLan
0410: 67 43 6f 64 65 2c 20 22 22 29 3b 0a 20 20 20 20  gCode, "");.    
0420: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 68      }.        th
0430: 69 73 2e 6f 4d 61 69 6e 44 69 63 20 3d 20 74 68  is.oMainDic = th
0440: 69 73 2e 5f 6c 6f 61 64 44 69 63 74 69 6f 6e 61  is._loadDictiona
0450: 72 79 28 6d 61 69 6e 44 69 63 2c 20 73 50 61 74  ry(mainDic, sPat
0460: 68 2c 20 74 72 75 65 29 3b 0a 20 20 20 20 20 20  h, true);.      
0470: 20 20 74 68 69 73 2e 6f 43 6f 6d 6d 75 6e 69 74    this.oCommunit
0480: 79 44 69 63 20 3d 20 74 68 69 73 2e 5f 6c 6f 61  yDic = this._loa
0490: 64 44 69 63 74 69 6f 6e 61 72 79 28 63 6f 6d 6d  dDictionary(comm
04a0: 75 6e 69 74 79 44 69 63 2c 20 73 50 61 74 68 29  unityDic, sPath)
04b0: 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 6f  ;.        this.o
04c0: 50 65 72 73 6f 6e 61 6c 44 69 63 20 3d 20 74 68  PersonalDic = th
04d0: 69 73 2e 5f 6c 6f 61 64 44 69 63 74 69 6f 6e 61  is._loadDictiona
04e0: 72 79 28 70 65 72 73 6f 6e 61 6c 44 69 63 2c 20  ry(personalDic, 
04f0: 73 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  sPath);.        
0500: 74 68 69 73 2e 62 43 6f 6d 6d 75 6e 69 74 79 44  this.bCommunityD
0510: 69 63 20 3d 20 42 6f 6f 6c 65 61 6e 28 74 68 69  ic = Boolean(thi
0520: 73 2e 6f 43 6f 6d 6d 75 6e 69 74 79 44 69 63 29  s.oCommunityDic)
0530: 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 62  ;.        this.b
0540: 50 65 72 73 6f 6e 61 6c 44 69 63 20 3d 20 42 6f  PersonalDic = Bo
0550: 6f 6c 65 61 6e 28 74 68 69 73 2e 6f 50 65 72 73  olean(this.oPers
0560: 6f 6e 61 6c 44 69 63 29 3b 0a 20 20 20 20 20 20  onalDic);.      
0570: 20 20 74 68 69 73 2e 6f 54 6f 6b 65 6e 69 7a 65    this.oTokenize
0580: 72 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20  r = null;.      
0590: 20 20 2f 2f 20 4c 65 78 69 63 6f 67 72 61 70 68    // Lexicograph
05a0: 65 72 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e  er.        this.
05b0: 6c 65 78 69 63 6f 67 72 61 70 68 65 72 20 3d 20  lexicographer = 
05c0: 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 74 68  null;.        th
05d0: 69 73 2e 6c 6f 61 64 4c 65 78 69 63 6f 67 72 61  is.loadLexicogra
05e0: 70 68 65 72 28 73 4c 61 6e 67 43 6f 64 65 29 0a  pher(sLangCode).
05f0: 20 20 20 20 20 20 20 20 2f 2f 20 73 74 6f 72 61          // stora
0600: 67 65 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e  ge.        this.
0610: 62 53 74 6f 72 61 67 65 20 3d 20 66 61 6c 73 65  bStorage = false
0620: 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f  ;.        this._
0630: 64 4d 6f 72 70 68 6f 6c 6f 67 69 65 73 20 3d 20  dMorphologies = 
0640: 6e 65 77 20 4d 61 70 28 29 3b 20 20 20 20 20 20  new Map();      
0650: 20 20 20 20 20 20 2f 2f 20 6b 65 79 3a 20 66 6c        // key: fl
0660: 65 78 69 6f 6e 2c 20 76 61 6c 75 65 3a 20 6c 69  exion, value: li
0670: 73 74 20 6f 66 20 6d 6f 72 70 68 6f 6c 6f 67 69  st of morphologi
0680: 65 73 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e  es.        this.
0690: 5f 64 4c 65 6d 6d 61 73 20 3d 20 6e 65 77 20 4d  _dLemmas = new M
06a0: 61 70 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  ap();           
06b0: 20 20 20 20 20 20 20 2f 2f 20 6b 65 79 3a 20 66         // key: f
06c0: 6c 65 78 69 6f 6e 2c 20 76 61 6c 75 65 3a 20 6c  lexion, value: l
06d0: 69 73 74 20 6f 66 20 6c 65 6d 6d 61 73 0a 20 20  ist of lemmas.  
06e0: 20 20 7d 0a 0a 20 20 20 20 5f 6c 6f 61 64 44 69    }..    _loadDi
06f0: 63 74 69 6f 6e 61 72 79 20 28 64 69 63 74 69 6f  ctionary (dictio
0700: 6e 61 72 79 2c 20 73 50 61 74 68 3d 22 22 2c 20  nary, sPath="", 
0710: 62 4e 65 63 65 73 73 61 72 79 3d 66 61 6c 73 65  bNecessary=false
0720: 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 3c  ) {.        // <
0730: 64 69 63 74 69 6f 6e 61 72 79 3e 20 63 61 6e 20  dictionary> can 
0740: 62 65 20 61 20 66 69 6c 65 6e 61 6d 65 20 6f 72  be a filename or
0750: 20 61 20 4a 53 4f 4e 20 6f 62 6a 65 63 74 2c 20   a JSON object, 
0760: 72 65 74 75 72 6e 73 20 61 6e 20 49 42 44 41 57  returns an IBDAW
0770: 47 20 6f 62 6a 65 63 74 0a 20 20 20 20 20 20 20  G object.       
0780: 20 69 66 20 28 21 64 69 63 74 69 6f 6e 61 72 79   if (!dictionary
0790: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
07a0: 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20  return null;.   
07b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
07c0: 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ry {.           
07d0: 20 69 66 20 28 74 79 70 65 6f 66 28 69 62 64 61   if (typeof(ibda
07e0: 77 67 29 20 21 3d 3d 20 27 75 6e 64 65 66 69 6e  wg) !== 'undefin
07f0: 65 64 27 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ed') {.         
0800: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65         return ne
0810: 77 20 69 62 64 61 77 67 2e 49 42 44 41 57 47 28  w ibdawg.IBDAWG(
0820: 64 69 63 74 69 6f 6e 61 72 79 2c 20 73 50 61 74  dictionary, sPat
0830: 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  h);.            
0840: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
0850: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0860: 6e 65 77 20 49 42 44 41 57 47 28 64 69 63 74 69  new IBDAWG(dicti
0870: 6f 6e 61 72 79 2c 20 73 50 61 74 68 29 3b 0a 20  onary, sPath);. 
0880: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
08a0: 61 74 63 68 20 28 65 29 20 7b 0a 20 20 20 20 20  atch (e) {.     
08b0: 20 20 20 20 20 20 20 6c 65 74 20 73 66 44 69 63         let sfDic
08c0: 74 69 6f 6e 61 72 79 20 3d 20 28 74 79 70 65 6f  tionary = (typeo
08d0: 66 28 64 69 63 74 69 6f 6e 61 72 79 29 20 3d 3d  f(dictionary) ==
08e0: 20 22 73 74 72 69 6e 67 22 29 20 3f 20 64 69 63   "string") ? dic
08f0: 74 69 6f 6e 61 72 79 20 3a 20 64 69 63 74 69 6f  tionary : dictio
0900: 6e 61 72 79 2e 73 4c 61 6e 67 4e 61 6d 65 20 2b  nary.sLangName +
0910: 20 22 2f 22 20 2b 20 64 69 63 74 69 6f 6e 61 72   "/" + dictionar
0920: 79 2e 73 46 69 6c 65 4e 61 6d 65 3b 0a 20 20 20  y.sFileName;.   
0930: 20 20 20 20 20 20 20 20 20 6c 65 74 20 73 45 72           let sEr
0940: 72 6f 72 4d 65 73 73 61 67 65 20 3d 20 22 45 72  rorMessage = "Er
0950: 72 6f 72 20 5b 22 20 2b 20 74 68 69 73 2e 73 4c  ror [" + this.sL
0960: 61 6e 67 43 6f 64 65 20 2b 20 22 5d 3a 20 3c 22  angCode + "]: <"
0970: 20 2b 20 73 66 44 69 63 74 69 6f 6e 61 72 79 20   + sfDictionary 
0980: 2b 20 22 3e 20 6e 6f 74 20 6c 6f 61 64 65 64 2e  + "> not loaded.
0990: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ";.            i
09a0: 66 20 28 62 4e 65 63 65 73 73 61 72 79 29 20 7b  f (bNecessary) {
09b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
09c0: 20 74 68 72 6f 77 20 73 45 72 72 6f 72 4d 65 73   throw sErrorMes
09d0: 73 61 67 65 20 2b 20 22 20 7c 20 22 20 2b 20 65  sage + " | " + e
09e0: 2e 6d 65 73 73 61 67 65 3b 0a 20 20 20 20 20 20  .message;.      
09f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0a00: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28      console.log(
0a10: 73 45 72 72 6f 72 4d 65 73 73 61 67 65 29 3b 0a  sErrorMessage);.
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
0a30: 6f 6c 65 2e 6c 6f 67 28 65 2e 6d 65 73 73 61 67  ole.log(e.messag
0a40: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
0a50: 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20  return null;.   
0a60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
0a70: 20 20 6c 6f 61 64 54 6f 6b 65 6e 69 7a 65 72 20    loadTokenizer 
0a80: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  () {.        if 
0a90: 28 74 79 70 65 6f 66 28 74 6f 6b 65 6e 69 7a 65  (typeof(tokenize
0aa0: 72 29 20 21 3d 3d 20 27 75 6e 64 65 66 69 6e 65  r) !== 'undefine
0ab0: 64 27 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  d') {.          
0ac0: 20 20 74 68 69 73 2e 6f 54 6f 6b 65 6e 69 7a 65    this.oTokenize
0ad0: 72 20 3d 20 6e 65 77 20 74 6f 6b 65 6e 69 7a 65  r = new tokenize
0ae0: 72 2e 54 6f 6b 65 6e 69 7a 65 72 28 74 68 69 73  r.Tokenizer(this
0af0: 2e 73 4c 61 6e 67 43 6f 64 65 29 3b 0a 20 20 20  .sLangCode);.   
0b00: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
0b10: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6f            this.o
0b20: 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 6e 65 77 20  Tokenizer = new 
0b30: 54 6f 6b 65 6e 69 7a 65 72 28 74 68 69 73 2e 73  Tokenizer(this.s
0b40: 4c 61 6e 67 43 6f 64 65 29 3b 0a 20 20 20 20 20  LangCode);.     
0b50: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
0b60: 67 65 74 54 6f 6b 65 6e 69 7a 65 72 20 28 29 20  getTokenizer () 
0b70: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 74  {.        if (!t
0b80: 68 69 73 2e 6f 54 6f 6b 65 6e 69 7a 65 72 29 20  his.oTokenizer) 
0b90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68  {.            th
0ba0: 69 73 2e 6c 6f 61 64 54 6f 6b 65 6e 69 7a 65 72  is.loadTokenizer
0bb0: 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ();.        }.  
0bc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 69        return thi
0bd0: 73 2e 6f 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20  s.oTokenizer;.  
0be0: 20 20 7d 0a 0a 20 20 20 20 73 65 74 4d 61 69 6e    }..    setMain
0bf0: 44 69 63 74 69 6f 6e 61 72 79 20 28 64 69 63 74  Dictionary (dict
0c00: 69 6f 6e 61 72 79 2c 20 73 50 61 74 68 3d 22 22  ionary, sPath=""
0c10: 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 72  ) {.        // r
0c20: 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74  eturns true if t
0c30: 68 65 20 64 69 63 74 69 6f 6e 61 72 79 20 69 73  he dictionary is
0c40: 20 6c 6f 61 64 65 64 0a 20 20 20 20 20 20 20 20   loaded.        
0c50: 74 68 69 73 2e 6f 4d 61 69 6e 44 69 63 20 3d 20  this.oMainDic = 
0c60: 74 68 69 73 2e 5f 6c 6f 61 64 44 69 63 74 69 6f  this._loadDictio
0c70: 6e 61 72 79 28 64 69 63 74 69 6f 6e 61 72 79 2c  nary(dictionary,
0c80: 20 73 50 61 74 68 2c 20 74 72 75 65 29 3b 0a 20   sPath, true);. 
0c90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 42 6f         return Bo
0ca0: 6f 6c 65 61 6e 28 74 68 69 73 2e 6f 4d 61 69 6e  olean(this.oMain
0cb0: 44 69 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Dic);.    }..   
0cc0: 20 73 65 74 43 6f 6d 6d 75 6e 69 74 79 44 69 63   setCommunityDic
0cd0: 74 69 6f 6e 61 72 79 20 28 64 69 63 74 69 6f 6e  tionary (diction
0ce0: 61 72 79 2c 20 73 50 61 74 68 3d 22 22 2c 20 62  ary, sPath="", b
0cf0: 41 63 74 69 76 61 74 65 3d 74 72 75 65 29 20 7b  Activate=true) {
0d00: 0a 20 20 20 20 20 20 20 20 2f 2f 20 72 65 74 75  .        // retu
0d10: 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20  rns true if the 
0d20: 64 69 63 74 69 6f 6e 61 72 79 20 69 73 20 6c 6f  dictionary is lo
0d30: 61 64 65 64 0a 20 20 20 20 20 20 20 20 74 68 69  aded.        thi
0d40: 73 2e 6f 43 6f 6d 6d 75 6e 69 74 79 44 69 63 20  s.oCommunityDic 
0d50: 3d 20 74 68 69 73 2e 5f 6c 6f 61 64 44 69 63 74  = this._loadDict
0d60: 69 6f 6e 61 72 79 28 64 69 63 74 69 6f 6e 61 72  ionary(dictionar
0d70: 79 2c 20 73 50 61 74 68 29 3b 0a 20 20 20 20 20  y, sPath);.     
0d80: 20 20 20 74 68 69 73 2e 62 43 6f 6d 6d 75 6e 69     this.bCommuni
0d90: 74 79 44 69 63 20 3d 20 28 62 41 63 74 69 76 61  tyDic = (bActiva
0da0: 74 65 29 20 3f 20 42 6f 6f 6c 65 61 6e 28 74 68  te) ? Boolean(th
0db0: 69 73 2e 6f 43 6f 6d 6d 75 6e 69 74 79 44 69 63  is.oCommunityDic
0dc0: 29 20 3a 20 66 61 6c 73 65 3b 0a 20 20 20 20 20  ) : false;.     
0dd0: 20 20 20 72 65 74 75 72 6e 20 42 6f 6f 6c 65 61     return Boolea
0de0: 6e 28 74 68 69 73 2e 6f 43 6f 6d 6d 75 6e 69 74  n(this.oCommunit
0df0: 79 44 69 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  yDic);.    }..  
0e00: 20 20 73 65 74 50 65 72 73 6f 6e 61 6c 44 69 63    setPersonalDic
0e10: 74 69 6f 6e 61 72 79 20 28 64 69 63 74 69 6f 6e  tionary (diction
0e20: 61 72 79 2c 20 73 50 61 74 68 3d 22 22 2c 20 62  ary, sPath="", b
0e30: 41 63 74 69 76 61 74 65 3d 74 72 75 65 29 20 7b  Activate=true) {
0e40: 0a 20 20 20 20 20 20 20 20 2f 2f 20 72 65 74 75  .        // retu
0e50: 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20  rns true if the 
0e60: 64 69 63 74 69 6f 6e 61 72 79 20 69 73 20 6c 6f  dictionary is lo
0e70: 61 64 65 64 0a 20 20 20 20 20 20 20 20 74 68 69  aded.        thi
0e80: 73 2e 6f 50 65 72 73 6f 6e 61 6c 44 69 63 20 3d  s.oPersonalDic =
0e90: 20 74 68 69 73 2e 5f 6c 6f 61 64 44 69 63 74 69   this._loadDicti
0ea0: 6f 6e 61 72 79 28 64 69 63 74 69 6f 6e 61 72 79  onary(dictionary
0eb0: 2c 20 73 50 61 74 68 29 3b 0a 20 20 20 20 20 20  , sPath);.      
0ec0: 20 20 74 68 69 73 2e 62 50 65 72 73 6f 6e 61 6c    this.bPersonal
0ed0: 44 69 63 20 3d 20 28 62 41 63 74 69 76 61 74 65  Dic = (bActivate
0ee0: 29 20 3f 20 42 6f 6f 6c 65 61 6e 28 74 68 69 73  ) ? Boolean(this
0ef0: 2e 6f 50 65 72 73 6f 6e 61 6c 44 69 63 29 20 3a  .oPersonalDic) :
0f00: 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20   false;.        
0f10: 72 65 74 75 72 6e 20 42 6f 6f 6c 65 61 6e 28 74  return Boolean(t
0f20: 68 69 73 2e 6f 50 65 72 73 6f 6e 61 6c 44 69 63  his.oPersonalDic
0f30: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 63  );.    }..    ac
0f40: 74 69 76 61 74 65 43 6f 6d 6d 75 6e 69 74 79 44  tivateCommunityD
0f50: 69 63 74 69 6f 6e 61 72 79 20 28 29 20 7b 0a 20  ictionary () {. 
0f60: 20 20 20 20 20 20 20 74 68 69 73 2e 62 43 6f 6d         this.bCom
0f70: 6d 75 6e 69 74 79 44 69 63 20 3d 20 42 6f 6f 6c  munityDic = Bool
0f80: 65 61 6e 28 74 68 69 73 2e 6f 43 6f 6d 6d 75 6e  ean(this.oCommun
0f90: 69 74 79 44 69 63 29 3b 0a 20 20 20 20 7d 0a 0a  ityDic);.    }..
0fa0: 20 20 20 20 61 63 74 69 76 61 74 65 50 65 72 73      activatePers
0fb0: 6f 6e 61 6c 44 69 63 74 69 6f 6e 61 72 79 20 28  onalDictionary (
0fc0: 29 20 7b 0a 20 20 20 20 20 20 20 20 74 68 69 73  ) {.        this
0fd0: 2e 62 50 65 72 73 6f 6e 61 6c 44 69 63 20 3d 20  .bPersonalDic = 
0fe0: 42 6f 6f 6c 65 61 6e 28 74 68 69 73 2e 6f 50 65  Boolean(this.oPe
0ff0: 72 73 6f 6e 61 6c 44 69 63 29 3b 0a 20 20 20 20  rsonalDic);.    
1000: 7d 0a 0a 20 20 20 20 64 65 61 63 74 69 76 61 74  }..    deactivat
1010: 65 43 6f 6d 6d 75 6e 69 74 79 44 69 63 74 69 6f  eCommunityDictio
1020: 6e 61 72 79 20 28 29 20 7b 0a 20 20 20 20 20 20  nary () {.      
1030: 20 20 74 68 69 73 2e 62 43 6f 6d 6d 75 6e 69 74    this.bCommunit
1040: 79 44 69 63 20 3d 20 66 61 6c 73 65 3b 0a 20 20  yDic = false;.  
1050: 20 20 7d 0a 0a 20 20 20 20 64 65 61 63 74 69 76    }..    deactiv
1060: 61 74 65 50 65 72 73 6f 6e 61 6c 44 69 63 74 69  atePersonalDicti
1070: 6f 6e 61 72 79 20 28 29 20 7b 0a 20 20 20 20 20  onary () {.     
1080: 20 20 20 74 68 69 73 2e 62 50 65 72 73 6f 6e 61     this.bPersona
1090: 6c 44 69 63 20 3d 20 66 61 6c 73 65 3b 0a 20 20  lDic = false;.  
10a0: 20 20 7d 0a 0a 0a 20 20 20 20 2f 2f 20 4c 65 78    }...    // Lex
10b0: 69 63 6f 67 72 61 70 68 65 72 0a 0a 20 20 20 20  icographer..    
10c0: 6c 6f 61 64 4c 65 78 69 63 6f 67 72 61 70 68 65  loadLexicographe
10d0: 72 20 28 73 4c 61 6e 67 43 6f 64 65 29 20 7b 0a  r (sLangCode) {.
10e0: 20 20 20 20 20 20 20 20 2f 2f 20 6c 6f 61 64 20          // load 
10f0: 64 65 66 61 75 6c 74 20 73 75 67 67 65 73 74 69  default suggesti
1100: 6f 6e 20 6d 6f 64 75 6c 65 20 66 6f 72 20 3c 73  on module for <s
1110: 4c 61 6e 67 43 6f 64 65 3e 0a 20 20 20 20 20 20  LangCode>.      
1120: 20 20 69 66 20 28 74 79 70 65 6f 66 28 70 72 6f    if (typeof(pro
1130: 63 65 73 73 29 20 21 3d 3d 20 27 75 6e 64 65 66  cess) !== 'undef
1140: 69 6e 65 64 27 29 20 7b 0a 20 20 20 20 20 20 20  ined') {.       
1150: 20 20 20 20 20 74 68 69 73 2e 6c 65 78 69 63 6f       this.lexico
1160: 67 72 61 70 68 65 72 20 3d 20 72 65 71 75 69 72  grapher = requir
1170: 65 28 60 2e 2f 6c 65 78 67 72 61 70 68 5f 24 7b  e(`./lexgraph_${
1180: 73 4c 61 6e 67 43 6f 64 65 7d 2e 6a 73 60 29 3b  sLangCode}.js`);
1190: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11a0: 20 20 20 65 6c 73 65 20 69 66 20 28 73 65 6c 66     else if (self
11b0: 20 26 26 20 73 65 6c 66 2e 68 61 73 4f 77 6e 50   && self.hasOwnP
11c0: 72 6f 70 65 72 74 79 28 22 6c 65 78 67 72 61 70  roperty("lexgrap
11d0: 68 5f 22 2b 73 4c 61 6e 67 43 6f 64 65 29 29 20  h_"+sLangCode)) 
11e0: 7b 20 2f 2f 20 73 65 6c 66 20 69 73 20 74 68 65  { // self is the
11f0: 20 57 6f 72 6b 65 72 0a 20 20 20 20 20 20 20 20   Worker.        
1200: 20 20 20 20 74 68 69 73 2e 6c 65 78 69 63 6f 67      this.lexicog
1210: 72 61 70 68 65 72 20 3d 20 73 65 6c 66 5b 22 6c  rapher = self["l
1220: 65 78 67 72 61 70 68 5f 22 2b 73 4c 61 6e 67 43  exgraph_"+sLangC
1230: 6f 64 65 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ode];.        }.
1240: 20 20 20 20 7d 0a 0a 20 20 20 20 61 6e 61 6c 79      }..    analy
1250: 7a 65 20 28 73 57 6f 72 64 29 20 7b 0a 20 20 20  ze (sWord) {.   
1260: 20 20 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20       // returns 
1270: 61 20 6c 69 73 74 20 6f 66 20 77 6f 72 64 73 20  a list of words 
1280: 61 6e 64 20 74 68 65 69 72 20 6d 6f 72 70 68 6f  and their morpho
1290: 6c 6f 67 69 65 73 0a 20 20 20 20 20 20 20 20 69  logies.        i
12a0: 66 20 28 21 74 68 69 73 2e 6c 65 78 69 63 6f 67  f (!this.lexicog
12b0: 72 61 70 68 65 72 29 20 7b 0a 20 20 20 20 20 20  rapher) {.      
12c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 5d 3b        return [];
12d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12e0: 20 20 20 6c 65 74 20 6c 57 6f 72 64 41 6e 64 4d     let lWordAndM
12f0: 6f 72 70 68 20 3d 20 5b 5d 3b 0a 20 20 20 20 20  orph = [];.     
1300: 20 20 20 66 6f 72 20 28 6c 65 74 20 73 45 6c 65     for (let sEle
1310: 6d 20 6f 66 20 74 68 69 73 2e 6c 65 78 69 63 6f  m of this.lexico
1320: 67 72 61 70 68 65 72 2e 73 70 6c 69 74 28 73 57  grapher.split(sW
1330: 6f 72 64 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ord)) {.        
1340: 20 20 20 20 69 66 20 28 73 45 6c 65 6d 29 20 7b      if (sElem) {
1350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1360: 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20 74 68   let lMorph = th
1370: 69 73 2e 67 65 74 4d 6f 72 70 68 28 73 45 6c 65  is.getMorph(sEle
1380: 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  m);.            
1390: 20 20 20 20 6c 65 74 20 73 4c 65 78 20 3d 20 74      let sLex = t
13a0: 68 69 73 2e 6c 65 78 69 63 6f 67 72 61 70 68 65  his.lexicographe
13b0: 72 2e 61 6e 61 6c 79 7a 65 28 73 45 6c 65 6d 29  r.analyze(sElem)
13c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
13d0: 20 20 6c 65 74 20 61 52 65 73 20 3d 20 5b 5d 3b    let aRes = [];
13e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13f0: 20 69 66 20 28 73 4c 65 78 29 20 7b 0a 20 20 20   if (sLex) {.   
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 61 52 65 73 20 3d 20 5b 20 5b 6c 4d 6f 72 70   aRes = [ [lMorp
1420: 68 2e 6a 6f 69 6e 28 22 20 7c 20 22 29 2c 20 73  h.join(" | "), s
1430: 4c 65 78 5d 20 5d 3b 0a 20 20 20 20 20 20 20 20  Lex] ];.        
1440: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1460: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 73 4d       for (let sM
1470: 6f 72 70 68 20 6f 66 20 6c 4d 6f 72 70 68 29 20  orph of lMorph) 
1480: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1490: 20 20 20 20 20 20 20 20 20 20 61 52 65 73 2e 70            aRes.p
14a0: 75 73 68 28 5b 73 4d 6f 72 70 68 2c 20 74 68 69  ush([sMorph, thi
14b0: 73 2e 6c 65 78 69 63 6f 67 72 61 70 68 65 72 2e  s.lexicographer.
14c0: 72 65 61 64 61 62 6c 65 4d 6f 72 70 68 28 73 4d  readableMorph(sM
14d0: 6f 72 70 68 29 5d 29 3b 0a 20 20 20 20 20 20 20  orph)]);.       
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1510: 20 69 66 20 28 61 52 65 73 2e 6c 65 6e 67 74 68   if (aRes.length
1520: 20 3e 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20   > 0) {.        
1530: 20 20 20 20 20 20 20 20 20 20 20 20 6c 57 6f 72              lWor
1540: 64 41 6e 64 4d 6f 72 70 68 2e 70 75 73 68 28 5b  dAndMorph.push([
1550: 73 45 6c 65 6d 2c 20 61 52 65 73 5d 29 3b 0a 20  sElem, aRes]);. 
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1580: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1590: 20 72 65 74 75 72 6e 20 6c 57 6f 72 64 41 6e 64   return lWordAnd
15a0: 4d 6f 72 70 68 3b 0a 20 20 20 20 7d 0a 0a 20 20  Morph;.    }..  
15b0: 20 20 72 65 61 64 61 62 6c 65 4d 6f 72 70 68 20    readableMorph 
15c0: 28 73 4d 6f 72 70 68 29 20 7b 0a 20 20 20 20 20  (sMorph) {.     
15d0: 20 20 20 69 66 20 28 21 74 68 69 73 2e 6c 65 78     if (!this.lex
15e0: 69 63 6f 67 72 61 70 68 65 72 29 20 7b 0a 20 20  icographer) {.  
15f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1600: 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   [];.        }. 
1610: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68         return th
1620: 69 73 2e 6c 65 78 69 63 6f 67 72 61 70 68 65 72  is.lexicographer
1630: 2e 72 65 61 64 61 62 6c 65 4d 6f 72 70 68 28 73  .readableMorph(s
1640: 4d 6f 72 70 68 29 3b 0a 20 20 20 20 7d 0a 0a 20  Morph);.    }.. 
1650: 20 20 20 73 65 74 4c 61 62 65 6c 73 4f 6e 54 6f     setLabelsOnTo
1660: 6b 65 6e 20 28 6f 54 6f 6b 65 6e 29 20 7b 0a 20  ken (oToken) {. 
1670: 20 20 20 20 20 20 20 69 66 20 28 21 74 68 69 73         if (!this
1680: 2e 6c 65 78 69 63 6f 67 72 61 70 68 65 72 29 20  .lexicographer) 
1690: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
16a0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
16b0: 20 20 20 20 20 20 20 20 69 66 20 28 6f 54 6f 6b          if (oTok
16c0: 65 6e 5b 22 73 54 79 70 65 22 5d 2e 73 74 61 72  en["sType"].star
16d0: 74 73 57 69 74 68 28 22 57 4f 52 44 22 29 29 20  tsWith("WORD")) 
16e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 54  {.            oT
16f0: 6f 6b 65 6e 5b 22 62 56 61 6c 69 64 54 6f 6b 65  oken["bValidToke
1700: 6e 22 5d 20 3d 20 28 6f 54 6f 6b 65 6e 2e 68 61  n"] = (oToken.ha
1710: 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 22 6c 4d  sOwnProperty("lM
1720: 6f 72 70 68 22 29 29 20 3f 20 74 72 75 65 20 3a  orph")) ? true :
1730: 20 74 68 69 73 2e 69 73 56 61 6c 69 64 54 6f 6b   this.isValidTok
1740: 65 6e 28 6f 54 6f 6b 65 6e 5b 22 73 56 61 6c 75  en(oToken["sValu
1750: 65 22 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  e"]);.        }.
1760: 20 20 20 20 20 20 20 20 69 66 20 28 21 6f 54 6f          if (!oTo
1770: 6b 65 6e 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72  ken.hasOwnProper
1780: 74 79 28 22 6c 4d 6f 72 70 68 22 29 29 20 7b 0a  ty("lMorph")) {.
1790: 20 20 20 20 20 20 20 20 20 20 20 20 6f 54 6f 6b              oTok
17a0: 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 20 3d 20 74  en["lMorph"] = t
17b0: 68 69 73 2e 67 65 74 4d 6f 72 70 68 28 6f 54 6f  his.getMorph(oTo
17c0: 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 29 3b 0a  ken["sValue"]);.
17d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17e0: 20 20 69 66 20 28 6f 54 6f 6b 65 6e 5b 22 73 54    if (oToken["sT
17f0: 79 70 65 22 5d 2e 73 74 61 72 74 73 57 69 74 68  ype"].startsWith
1800: 28 22 57 4f 52 44 22 29 29 20 7b 0a 20 20 20 20  ("WORD")) {.    
1810: 20 20 20 20 20 20 20 20 6c 65 74 20 5b 73 50 72          let [sPr
1820: 65 66 69 78 2c 20 73 53 74 65 6d 2c 20 73 53 75  efix, sStem, sSu
1830: 66 66 69 78 5d 20 3d 20 74 68 69 73 2e 6c 65 78  ffix] = this.lex
1840: 69 63 6f 67 72 61 70 68 65 72 2e 73 70 6c 69 74  icographer.split
1850: 28 6f 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22  (oToken["sValue"
1860: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
1870: 69 66 20 28 73 53 74 65 6d 20 21 3d 20 6f 54 6f  if (sStem != oTo
1880: 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 29 20 7b  ken["sValue"]) {
1890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18a0: 20 6f 54 6f 6b 65 6e 5b 22 6c 53 75 62 54 6f 6b   oToken["lSubTok
18b0: 65 6e 73 22 5d 20 3d 20 5b 0a 20 20 20 20 20 20  ens"] = [.      
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
18d0: 22 73 54 79 70 65 22 3a 20 22 57 4f 52 44 22 2c  "sType": "WORD",
18e0: 20 22 73 56 61 6c 75 65 22 3a 20 73 50 72 65 66   "sValue": sPref
18f0: 69 78 2c 20 22 6c 4d 6f 72 70 68 22 3a 20 74 68  ix, "lMorph": th
1900: 69 73 2e 67 65 74 4d 6f 72 70 68 28 73 50 72 65  is.getMorph(sPre
1910: 66 69 78 29 20 7d 2c 0a 20 20 20 20 20 20 20 20  fix) },.        
1920: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 73              { "s
1930: 54 79 70 65 22 3a 20 22 57 4f 52 44 22 2c 20 22  Type": "WORD", "
1940: 73 56 61 6c 75 65 22 3a 20 73 53 74 65 6d 2c 20  sValue": sStem, 
1950: 20 20 22 6c 4d 6f 72 70 68 22 3a 20 74 68 69 73    "lMorph": this
1960: 2e 67 65 74 4d 6f 72 70 68 28 73 53 74 65 6d 29  .getMorph(sStem)
1970: 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20     },.          
1980: 20 20 20 20 20 20 20 20 20 20 7b 20 22 73 54 79            { "sTy
1990: 70 65 22 3a 20 22 57 4f 52 44 22 2c 20 22 73 56  pe": "WORD", "sV
19a0: 61 6c 75 65 22 3a 20 73 53 75 66 66 69 78 2c 20  alue": sSuffix, 
19b0: 22 6c 4d 6f 72 70 68 22 3a 20 74 68 69 73 2e 67  "lMorph": this.g
19c0: 65 74 4d 6f 72 70 68 28 73 53 75 66 66 69 78 29  etMorph(sSuffix)
19d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
19e0: 20 20 20 5d 3b 0a 20 20 20 20 20 20 20 20 20 20     ];.          
19f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1a00: 20 20 20 20 20 20 74 68 69 73 2e 6c 65 78 69 63        this.lexic
1a10: 6f 67 72 61 70 68 65 72 2e 73 65 74 4c 61 62 65  ographer.setLabe
1a20: 6c 73 4f 6e 54 6f 6b 65 6e 28 6f 54 6f 6b 65 6e  lsOnToken(oToken
1a30: 29 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  );.    }...    /
1a40: 2f 20 53 74 6f 72 61 67 65 0a 0a 20 20 20 20 61  / Storage..    a
1a50: 63 74 69 76 61 74 65 53 74 6f 72 61 67 65 20 28  ctivateStorage (
1a60: 29 20 7b 0a 20 20 20 20 20 20 20 20 74 68 69 73  ) {.        this
1a70: 2e 62 53 74 6f 72 61 67 65 20 3d 20 74 72 75 65  .bStorage = true
1a80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 61  ;.    }..    dea
1a90: 63 74 69 76 61 74 65 53 74 6f 72 61 67 65 20 28  ctivateStorage (
1aa0: 29 20 7b 0a 20 20 20 20 20 20 20 20 74 68 69 73  ) {.        this
1ab0: 2e 62 53 74 6f 72 61 67 65 20 3d 20 66 61 6c 73  .bStorage = fals
1ac0: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6c  e;.    }..    cl
1ad0: 65 61 72 53 74 6f 72 61 67 65 20 28 29 20 7b 0a  earStorage () {.
1ae0: 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f 64 4c          this._dL
1af0: 65 6d 6d 61 73 2e 63 6c 65 61 72 28 29 3b 0a 20  emmas.clear();. 
1b00: 20 20 20 20 20 20 20 74 68 69 73 2e 5f 64 4d 6f         this._dMo
1b10: 72 70 68 6f 6c 6f 67 69 65 73 2e 63 6c 65 61 72  rphologies.clear
1b20: 28 29 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ();.    }...    
1b30: 2f 2f 20 70 61 72 73 65 20 74 65 78 74 20 66 75  // parse text fu
1b40: 6e 63 74 69 6f 6e 73 0a 0a 20 20 20 20 70 61 72  nctions..    par
1b50: 73 65 50 61 72 61 67 72 61 70 68 20 28 73 54 65  seParagraph (sTe
1b60: 78 74 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66  xt) {.        if
1b70: 20 28 21 74 68 69 73 2e 6f 54 6f 6b 65 6e 69 7a   (!this.oTokeniz
1b80: 65 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  er) {.          
1b90: 20 20 74 68 69 73 2e 6c 6f 61 64 54 6f 6b 65 6e    this.loadToken
1ba0: 69 7a 65 72 28 29 3b 0a 20 20 20 20 20 20 20 20  izer();.        
1bb0: 7d 0a 20 20 20 20 20 20 20 20 6c 65 74 20 61 53  }.        let aS
1bc0: 70 65 6c 6c 45 72 72 20 3d 20 5b 5d 3b 0a 20 20  pellErr = [];.  
1bd0: 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 6f        for (let o
1be0: 54 6f 6b 65 6e 20 6f 66 20 74 68 69 73 2e 6f 54  Token of this.oT
1bf0: 6f 6b 65 6e 69 7a 65 72 2e 67 65 6e 54 6f 6b 65  okenizer.genToke
1c00: 6e 73 28 73 54 65 78 74 29 29 20 7b 0a 20 20 20  ns(sText)) {.   
1c10: 20 20 20 20 20 20 20 20 20 69 66 20 28 6f 54 6f           if (oTo
1c20: 6b 65 6e 2e 73 54 79 70 65 20 3d 3d 3d 20 27 57  ken.sType === 'W
1c30: 4f 52 44 27 20 26 26 20 21 74 68 69 73 2e 69 73  ORD' && !this.is
1c40: 56 61 6c 69 64 54 6f 6b 65 6e 28 6f 54 6f 6b 65  ValidToken(oToke
1c50: 6e 2e 73 56 61 6c 75 65 29 29 20 7b 0a 20 20 20  n.sValue)) {.   
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 70               aSp
1c70: 65 6c 6c 45 72 72 2e 70 75 73 68 28 6f 54 6f 6b  ellErr.push(oTok
1c80: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
1c90: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1ca0: 20 20 20 20 20 72 65 74 75 72 6e 20 61 53 70 65       return aSpe
1cb0: 6c 6c 45 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  llErr;.    }..  
1cc0: 20 20 2f 2f 20 49 42 44 41 57 47 20 66 75 6e 63    // IBDAWG func
1cd0: 74 69 6f 6e 73 0a 0a 20 20 20 20 69 73 56 61 6c  tions..    isVal
1ce0: 69 64 54 6f 6b 65 6e 20 28 73 54 6f 6b 65 6e 29  idToken (sToken)
1cf0: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 63 68   {.        // ch
1d00: 65 63 6b 73 20 69 66 20 73 54 6f 6b 65 6e 20 69  ecks if sToken i
1d10: 73 20 76 61 6c 69 64 20 28 69 66 20 74 68 65 72  s valid (if ther
1d20: 65 20 69 73 20 68 79 70 68 65 6e 73 20 69 6e 20  e is hyphens in 
1d30: 73 54 6f 6b 65 6e 2c 20 73 54 6f 6b 65 6e 20 69  sToken, sToken i
1d40: 73 20 73 70 6c 69 74 2c 20 65 61 63 68 20 70 61  s split, each pa
1d50: 72 74 20 69 73 20 63 68 65 63 6b 65 64 29 0a 20  rt is checked). 
1d60: 20 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e         if (this.
1d70: 6f 4d 61 69 6e 44 69 63 2e 69 73 56 61 6c 69 64  oMainDic.isValid
1d80: 54 6f 6b 65 6e 28 73 54 6f 6b 65 6e 29 29 20 7b  Token(sToken)) {
1d90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1da0: 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 20 20  urn true;.      
1db0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28    }.        if (
1dc0: 74 68 69 73 2e 62 43 6f 6d 6d 75 6e 69 74 79 44  this.bCommunityD
1dd0: 69 63 20 26 26 20 74 68 69 73 2e 6f 43 6f 6d 6d  ic && this.oComm
1de0: 75 6e 69 74 79 44 69 63 2e 69 73 56 61 6c 69 64  unityDic.isValid
1df0: 54 6f 6b 65 6e 28 73 54 6f 6b 65 6e 29 29 20 7b  Token(sToken)) {
1e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1e10: 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 20 20  urn true;.      
1e20: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28    }.        if (
1e30: 74 68 69 73 2e 62 50 65 72 73 6f 6e 61 6c 44 69  this.bPersonalDi
1e40: 63 20 26 26 20 74 68 69 73 2e 6f 50 65 72 73 6f  c && this.oPerso
1e50: 6e 61 6c 44 69 63 2e 69 73 56 61 6c 69 64 54 6f  nalDic.isValidTo
1e60: 6b 65 6e 28 73 54 6f 6b 65 6e 29 29 20 7b 0a 20  ken(sToken)) {. 
1e70: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1e80: 6e 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20  n true;.        
1e90: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
1ea0: 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 0a 20   false;.    }.. 
1eb0: 20 20 20 69 73 56 61 6c 69 64 20 28 73 57 6f 72     isValid (sWor
1ec0: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20  d) {.        // 
1ed0: 63 68 65 63 6b 73 20 69 66 20 73 57 6f 72 64 20  checks if sWord 
1ee0: 69 73 20 76 61 6c 69 64 20 28 64 69 66 66 65 72  is valid (differ
1ef0: 65 6e 74 20 63 61 73 69 6e 67 20 74 65 73 74 65  ent casing teste
1f00: 64 20 69 66 20 74 68 65 20 66 69 72 73 74 20 6c  d if the first l
1f10: 65 74 74 65 72 20 69 73 20 61 20 63 61 70 69 74  etter is a capit
1f20: 61 6c 29 0a 20 20 20 20 20 20 20 20 69 66 20 28  al).        if (
1f30: 74 68 69 73 2e 6f 4d 61 69 6e 44 69 63 2e 69 73  this.oMainDic.is
1f40: 56 61 6c 69 64 28 73 57 6f 72 64 29 29 20 7b 0a  Valid(sWord)) {.
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1f60: 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20  rn true;.       
1f70: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 74   }.        if (t
1f80: 68 69 73 2e 62 43 6f 6d 6d 75 6e 69 74 79 44 69  his.bCommunityDi
1f90: 63 20 26 26 20 74 68 69 73 2e 6f 43 6f 6d 6d 75  c && this.oCommu
1fa0: 6e 69 74 79 44 69 63 2e 69 73 56 61 6c 69 64 28  nityDic.isValid(
1fb0: 73 57 6f 72 64 29 29 20 7b 0a 20 20 20 20 20 20  sWord)) {.      
1fc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
1fd0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1fe0: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 62 50       if (this.bP
1ff0: 65 72 73 6f 6e 61 6c 44 69 63 20 26 26 20 74 68  ersonalDic && th
2000: 69 73 2e 6f 50 65 72 73 6f 6e 61 6c 44 69 63 2e  is.oPersonalDic.
2010: 69 73 56 61 6c 69 64 28 73 57 6f 72 64 29 29 20  isValid(sWord)) 
2020: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
2030: 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 20  turn true;.     
2040: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
2050: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d  urn false;.    }
2060: 0a 0a 20 20 20 20 6c 6f 6f 6b 75 70 20 28 73 57  ..    lookup (sW
2070: 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  ord) {.        /
2080: 2f 20 63 68 65 63 6b 73 20 69 66 20 73 57 6f 72  / checks if sWor
2090: 64 20 69 73 20 69 6e 20 64 69 63 74 69 6f 6e 61  d is in dictiona
20a0: 72 79 20 61 73 20 69 73 20 28 73 74 72 69 63 74  ry as is (strict
20b0: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 29 0a 20   verification). 
20c0: 20 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e         if (this.
20d0: 6f 4d 61 69 6e 44 69 63 2e 6c 6f 6f 6b 75 70 28  oMainDic.lookup(
20e0: 73 57 6f 72 64 29 29 20 7b 0a 20 20 20 20 20 20  sWord)) {.      
20f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
2100: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2110: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 62 43       if (this.bC
2120: 6f 6d 6d 75 6e 69 74 79 44 69 63 20 26 26 20 74  ommunityDic && t
2130: 68 69 73 2e 6f 43 6f 6d 6d 75 6e 69 74 79 44 69  his.oCommunityDi
2140: 63 2e 6c 6f 6f 6b 75 70 28 73 57 6f 72 64 29 29  c.lookup(sWord))
2150: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72   {.            r
2160: 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20  eturn true;.    
2170: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2180: 20 28 74 68 69 73 2e 62 50 65 72 73 6f 6e 61 6c   (this.bPersonal
2190: 44 69 63 20 26 26 20 74 68 69 73 2e 6f 50 65 72  Dic && this.oPer
21a0: 73 6f 6e 61 6c 44 69 63 2e 6c 6f 6f 6b 75 70 28  sonalDic.lookup(
21b0: 73 57 6f 72 64 29 29 20 7b 0a 20 20 20 20 20 20  sWord)) {.      
21c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
21d0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
21e0: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
21f0: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 67 65  e;.    }..    ge
2200: 74 4d 6f 72 70 68 20 28 73 57 6f 72 64 29 20 7b  tMorph (sWord) {
2210: 0a 20 20 20 20 20 20 20 20 2f 2f 20 72 65 74 72  .        // retr
2220: 69 65 76 65 73 20 6d 6f 72 70 68 6f 6c 6f 67 69  ieves morphologi
2230: 65 73 20 6c 69 73 74 2c 20 64 69 66 66 65 72 65  es list, differe
2240: 6e 74 20 63 61 73 69 6e 67 20 61 6c 6c 6f 77 65  nt casing allowe
2250: 64 0a 20 20 20 20 20 20 20 20 69 66 20 28 74 68  d.        if (th
2260: 69 73 2e 62 53 74 6f 72 61 67 65 20 26 26 20 74  is.bStorage && t
2270: 68 69 73 2e 5f 64 4d 6f 72 70 68 6f 6c 6f 67 69  his._dMorphologi
2280: 65 73 2e 68 61 73 28 73 57 6f 72 64 29 29 20 7b  es.has(sWord)) {
2290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
22a0: 75 72 6e 20 74 68 69 73 2e 5f 64 4d 6f 72 70 68  urn this._dMorph
22b0: 6f 6c 6f 67 69 65 73 2e 67 65 74 28 73 57 6f 72  ologies.get(sWor
22c0: 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d);.        }.  
22d0: 20 20 20 20 20 20 6c 65 74 20 6c 4d 6f 72 70 68        let lMorph
22e0: 20 3d 20 74 68 69 73 2e 6f 4d 61 69 6e 44 69 63   = this.oMainDic
22f0: 2e 67 65 74 4d 6f 72 70 68 28 73 57 6f 72 64 29  .getMorph(sWord)
2300: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 74 68  ;.        if (th
2310: 69 73 2e 62 43 6f 6d 6d 75 6e 69 74 79 44 69 63  is.bCommunityDic
2320: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2330: 6c 4d 6f 72 70 68 2e 70 75 73 68 28 2e 2e 2e 74  lMorph.push(...t
2340: 68 69 73 2e 6f 43 6f 6d 6d 75 6e 69 74 79 44 69  his.oCommunityDi
2350: 63 2e 67 65 74 4d 6f 72 70 68 28 73 57 6f 72 64  c.getMorph(sWord
2360: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
2370: 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 62        if (this.b
2380: 50 65 72 73 6f 6e 61 6c 44 69 63 29 20 7b 0a 20  PersonalDic) {. 
2390: 20 20 20 20 20 20 20 20 20 20 20 6c 4d 6f 72 70             lMorp
23a0: 68 2e 70 75 73 68 28 2e 2e 2e 74 68 69 73 2e 6f  h.push(...this.o
23b0: 50 65 72 73 6f 6e 61 6c 44 69 63 2e 67 65 74 4d  PersonalDic.getM
23c0: 6f 72 70 68 28 73 57 6f 72 64 29 29 3b 0a 20 20  orph(sWord));.  
23d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23e0: 69 66 20 28 74 68 69 73 2e 62 53 74 6f 72 61 67  if (this.bStorag
23f0: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
2400: 20 74 68 69 73 2e 5f 64 4d 6f 72 70 68 6f 6c 6f   this._dMorpholo
2410: 67 69 65 73 2e 73 65 74 28 73 57 6f 72 64 2c 20  gies.set(sWord, 
2420: 6c 4d 6f 72 70 68 29 3b 0a 20 20 20 20 20 20 20  lMorph);.       
2430: 20 20 20 20 20 74 68 69 73 2e 5f 64 4c 65 6d 6d       this._dLemm
2440: 61 73 2e 73 65 74 28 73 57 6f 72 64 2c 20 41 72  as.set(sWord, Ar
2450: 72 61 79 2e 66 72 6f 6d 28 6e 65 77 20 53 65 74  ray.from(new Set
2460: 28 74 68 69 73 2e 67 65 74 4d 6f 72 70 68 28 73  (this.getMorph(s
2470: 57 6f 72 64 29 2e 6d 61 70 28 28 73 4d 6f 72 70  Word).map((sMorp
2480: 68 29 20 3d 3e 20 7b 20 72 65 74 75 72 6e 20 73  h) => { return s
2490: 4d 6f 72 70 68 2e 73 6c 69 63 65 28 31 2c 20 73  Morph.slice(1, s
24a0: 4d 6f 72 70 68 2e 69 6e 64 65 78 4f 66 28 22 2f  Morph.indexOf("/
24b0: 22 29 29 3b 20 7d 29 29 29 29 3b 0a 20 20 20 20  ")); }))));.    
24c0: 20 20 20 20 20 20 20 20 2f 2f 63 6f 6e 73 6f 6c          //consol
24d0: 65 2e 6c 6f 67 28 73 57 6f 72 64 2c 20 74 68 69  e.log(sWord, thi
24e0: 73 2e 5f 64 4c 65 6d 6d 61 73 2e 67 65 74 28 73  s._dLemmas.get(s
24f0: 57 6f 72 64 29 29 3b 0a 20 20 20 20 20 20 20 20  Word));.        
2500: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
2510: 20 6c 4d 6f 72 70 68 3b 0a 20 20 20 20 7d 0a 0a   lMorph;.    }..
2520: 20 20 20 20 6d 6f 72 70 68 20 28 73 57 6f 72 64      morph (sWord
2530: 2c 20 73 50 61 74 74 65 72 6e 2c 20 73 4e 65 67  , sPattern, sNeg
2540: 50 61 74 74 65 72 6e 3d 22 22 29 20 7b 0a 20 20  Pattern="") {.  
2550: 20 20 20 20 20 20 2f 2f 20 61 6e 61 6c 79 73 65        // analyse
2560: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
2570: 20 54 72 75 65 20 69 66 20 3c 73 4e 65 67 50 61   True if <sNegPa
2580: 74 74 65 72 6e 3e 20 6e 6f 74 20 69 6e 20 6d 6f  ttern> not in mo
2590: 72 70 68 6f 6c 6f 67 69 65 73 20 61 6e 64 20 3c  rphologies and <
25a0: 73 50 61 74 74 65 72 6e 3e 20 69 6e 20 6d 6f 72  sPattern> in mor
25b0: 70 68 6f 6c 6f 67 69 65 73 0a 20 20 20 20 20 20  phologies.      
25c0: 20 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20 74    let lMorph = t
25d0: 68 69 73 2e 67 65 74 4d 6f 72 70 68 28 73 57 6f  his.getMorph(sWo
25e0: 72 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20  rd);.        if 
25f0: 28 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d  (lMorph.length =
2600: 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20  = 0) {.         
2610: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
2620: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2630: 20 20 20 2f 2f 20 63 68 65 63 6b 20 6e 65 67 61     // check nega
2640: 74 69 76 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20  tive condition. 
2650: 20 20 20 20 20 20 20 69 66 20 28 73 4e 65 67 50         if (sNegP
2660: 61 74 74 65 72 6e 29 20 7b 0a 20 20 20 20 20 20  attern) {.      
2670: 20 20 20 20 20 20 69 66 20 28 73 4e 65 67 50 61        if (sNegPa
2680: 74 74 65 72 6e 20 3d 3d 20 22 2a 22 29 20 7b 0a  ttern == "*") {.
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 2f 2f 20 61 6c 6c 20 6d 6f 72 70 68 20 6d 75 73  // all morph mus
26b0: 74 20 6d 61 74 63 68 20 73 50 61 74 74 65 72 6e  t match sPattern
26c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26d0: 20 72 65 74 75 72 6e 20 6c 4d 6f 72 70 68 2e 65   return lMorph.e
26e0: 76 65 72 79 28 73 4d 6f 72 70 68 20 20 3d 3e 20  very(sMorph  => 
26f0: 20 28 73 4d 6f 72 70 68 2e 73 65 61 72 63 68 28   (sMorph.search(
2700: 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31  sPattern) !== -1
2710: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
2720: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  }.            el
2730: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
2740: 20 20 20 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e       if (lMorph.
2750: 73 6f 6d 65 28 73 4d 6f 72 70 68 20 20 3d 3e 20  some(sMorph  => 
2760: 20 28 73 4d 6f 72 70 68 2e 73 65 61 72 63 68 28   (sMorph.search(
2770: 73 4e 65 67 50 61 74 74 65 72 6e 29 20 21 3d 3d  sNegPattern) !==
2780: 20 2d 31 29 29 29 20 7b 0a 20 20 20 20 20 20 20   -1))) {.       
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
27a0: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 20  urn false;.     
27b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f 20     }.        // 
27e0: 73 65 61 72 63 68 20 73 50 61 74 74 65 72 6e 0a  search sPattern.
27f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c          return l
2800: 4d 6f 72 70 68 2e 73 6f 6d 65 28 73 4d 6f 72 70  Morph.some(sMorp
2810: 68 20 20 3d 3e 20 20 28 73 4d 6f 72 70 68 2e 73  h  =>  (sMorph.s
2820: 65 61 72 63 68 28 73 50 61 74 74 65 72 6e 29 20  earch(sPattern) 
2830: 21 3d 3d 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a  !== -1));.    }.
2840: 0a 20 20 20 20 67 65 74 4c 65 6d 6d 61 20 28 73  .    getLemma (s
2850: 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20  Word) {.        
2860: 2f 2f 20 72 65 74 72 69 65 76 65 73 20 6c 65 6d  // retrieves lem
2870: 6d 61 73 0a 20 20 20 20 20 20 20 20 69 66 20 28  mas.        if (
2880: 74 68 69 73 2e 62 53 74 6f 72 61 67 65 29 20 7b  this.bStorage) {
2890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
28a0: 28 21 74 68 69 73 2e 5f 64 4c 65 6d 6d 61 73 2e  (!this._dLemmas.
28b0: 68 61 73 28 73 57 6f 72 64 29 29 20 7b 0a 20 20  has(sWord)) {.  
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
28d0: 69 73 2e 67 65 74 4d 6f 72 70 68 28 73 57 6f 72  is.getMorph(sWor
28e0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
28f0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  }.            re
2900: 74 75 72 6e 20 74 68 69 73 2e 5f 64 4c 65 6d 6d  turn this._dLemm
2910: 61 73 2e 67 65 74 28 73 57 6f 72 64 29 3b 0a 20  as.get(sWord);. 
2920: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2930: 20 72 65 74 75 72 6e 20 41 72 72 61 79 2e 66 72   return Array.fr
2940: 6f 6d 28 6e 65 77 20 53 65 74 28 74 68 69 73 2e  om(new Set(this.
2950: 67 65 74 4d 6f 72 70 68 28 73 57 6f 72 64 29 2e  getMorph(sWord).
2960: 6d 61 70 28 28 73 4d 6f 72 70 68 29 20 3d 3e 20  map((sMorph) => 
2970: 7b 20 72 65 74 75 72 6e 20 73 4d 6f 72 70 68 2e  { return sMorph.
2980: 73 6c 69 63 65 28 31 2c 20 73 4d 6f 72 70 68 2e  slice(1, sMorph.
2990: 69 6e 64 65 78 4f 66 28 22 2f 22 29 29 3b 20 7d  indexOf("/")); }
29a0: 29 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  )));.    }..    
29b0: 2a 20 73 75 67 67 65 73 74 20 28 73 57 6f 72 64  * suggest (sWord
29c0: 2c 20 6e 53 75 67 67 4c 69 6d 69 74 3d 31 30 29  , nSuggLimit=10)
29d0: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 67 65   {.        // ge
29e0: 6e 65 72 61 74 6f 72 3a 20 72 65 74 75 72 6e 73  nerator: returns
29f0: 20 31 2c 20 32 20 6f 72 20 33 20 6c 69 73 74 73   1, 2 or 3 lists
2a00: 20 6f 66 20 73 75 67 67 65 73 74 69 6f 6e 73 0a   of suggestions.
2a10: 20 20 20 20 20 20 20 20 69 66 20 28 74 68 69 73          if (this
2a20: 2e 6c 65 78 69 63 6f 67 72 61 70 68 65 72 29 20  .lexicographer) 
2a30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2a40: 20 28 74 68 69 73 2e 6c 65 78 69 63 6f 67 72 61   (this.lexicogra
2a50: 70 68 65 72 2e 64 53 75 67 67 2e 68 61 73 28 73  pher.dSugg.has(s
2a60: 57 6f 72 64 29 29 20 7b 0a 20 20 20 20 20 20 20  Word)) {.       
2a70: 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 74           yield t
2a80: 68 69 73 2e 6c 65 78 69 63 6f 67 72 61 70 68 65  his.lexicographe
2a90: 72 2e 64 53 75 67 67 2e 67 65 74 28 73 57 6f 72  r.dSugg.get(sWor
2aa0: 64 29 2e 73 70 6c 69 74 28 22 7c 22 29 3b 0a 20  d).split("|");. 
2ab0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
2ac0: 65 20 69 66 20 28 73 57 6f 72 64 2e 67 6c 5f 69  e if (sWord.gl_i
2ad0: 73 54 69 74 6c 65 28 29 20 26 26 20 74 68 69 73  sTitle() && this
2ae0: 2e 6c 65 78 69 63 6f 67 72 61 70 68 65 72 2e 64  .lexicographer.d
2af0: 53 75 67 67 2e 68 61 73 28 73 57 6f 72 64 2e 74  Sugg.has(sWord.t
2b00: 6f 4c 6f 77 65 72 43 61 73 65 28 29 29 29 20 7b  oLowerCase())) {
2b10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b20: 20 6c 65 74 20 6c 53 75 67 67 73 20 3d 20 74 68   let lSuggs = th
2b30: 69 73 2e 6c 65 78 69 63 6f 67 72 61 70 68 65 72  is.lexicographer
2b40: 2e 64 53 75 67 67 2e 67 65 74 28 73 57 6f 72 64  .dSugg.get(sWord
2b50: 2e 74 6f 4c 6f 77 65 72 43 61 73 65 28 29 29 2e  .toLowerCase()).
2b60: 73 70 6c 69 74 28 22 7c 22 29 3b 0a 20 20 20 20  split("|");.    
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c              yiel
2b80: 64 20 6c 53 75 67 67 73 2e 6d 61 70 28 28 73 53  d lSuggs.map((sS
2b90: 75 67 67 29 20 3d 3e 20 7b 20 72 65 74 75 72 6e  ugg) => { return
2ba0: 20 73 53 75 67 67 2e 73 6c 69 63 65 28 30 2c 31   sSugg.slice(0,1
2bb0: 29 2e 74 6f 55 70 70 65 72 43 61 73 65 28 29 20  ).toUpperCase() 
2bc0: 2b 20 73 53 75 67 67 2e 73 6c 69 63 65 28 31 29  + sSugg.slice(1)
2bd0: 3b 20 7d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ; });.          
2be0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6c             let l
2c00: 53 75 67 67 73 20 3d 20 74 68 69 73 2e 6f 4d 61  Suggs = this.oMa
2c10: 69 6e 44 69 63 2e 73 75 67 67 65 73 74 28 73 57  inDic.suggest(sW
2c20: 6f 72 64 2c 20 6e 53 75 67 67 4c 69 6d 69 74 2c  ord, nSuggLimit,
2c30: 20 74 72 75 65 29 3b 0a 20 20 20 20 20 20 20 20   true);.        
2c40: 20 20 20 20 20 20 20 20 6c 53 75 67 67 73 20 3d          lSuggs =
2c50: 20 6c 53 75 67 67 73 2e 66 69 6c 74 65 72 28 28   lSuggs.filter((
2c60: 73 53 75 67 67 29 20 3d 3e 20 74 68 69 73 2e 6c  sSugg) => this.l
2c70: 65 78 69 63 6f 67 72 61 70 68 65 72 2e 69 73 56  exicographer.isV
2c80: 61 6c 69 64 53 75 67 67 28 73 53 75 67 67 2c 20  alidSugg(sSugg, 
2c90: 74 68 69 73 29 29 3b 0a 20 20 20 20 20 20 20 20  this));.        
2ca0: 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 6c 53          yield lS
2cb0: 75 67 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  uggs;.          
2cc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c    }.        } el
2cd0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
2ce0: 20 79 69 65 6c 64 20 74 68 69 73 2e 6f 4d 61 69   yield this.oMai
2cf0: 6e 44 69 63 2e 73 75 67 67 65 73 74 28 73 57 6f  nDic.suggest(sWo
2d00: 72 64 2c 20 6e 53 75 67 67 4c 69 6d 69 74 2c 20  rd, nSuggLimit, 
2d10: 74 72 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  true);.        }
2d20: 0a 20 20 20 20 20 20 20 20 69 66 20 28 74 68 69  .        if (thi
2d30: 73 2e 62 43 6f 6d 6d 75 6e 69 74 79 44 69 63 29  s.bCommunityDic)
2d40: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 79   {.            y
2d50: 69 65 6c 64 20 74 68 69 73 2e 6f 43 6f 6d 6d 75  ield this.oCommu
2d60: 6e 69 74 79 44 69 63 2e 73 75 67 67 65 73 74 28  nityDic.suggest(
2d70: 73 57 6f 72 64 2c 20 4d 61 74 68 2e 66 6c 6f 6f  sWord, Math.floo
2d80: 72 28 6e 53 75 67 67 4c 69 6d 69 74 2f 32 29 2b  r(nSuggLimit/2)+
2d90: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
2da0: 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 62        if (this.b
2db0: 50 65 72 73 6f 6e 61 6c 44 69 63 29 20 7b 0a 20  PersonalDic) {. 
2dc0: 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64             yield
2dd0: 20 74 68 69 73 2e 6f 50 65 72 73 6f 6e 61 6c 44   this.oPersonalD
2de0: 69 63 2e 73 75 67 67 65 73 74 28 73 57 6f 72 64  ic.suggest(sWord
2df0: 2c 20 4d 61 74 68 2e 66 6c 6f 6f 72 28 6e 53 75  , Math.floor(nSu
2e00: 67 67 4c 69 6d 69 74 2f 32 29 2b 31 29 3b 0a 20  ggLimit/2)+1);. 
2e10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
2e20: 20 20 20 20 2a 20 73 65 6c 65 63 74 20 28 73 46      * select (sF
2e30: 6c 65 78 50 61 74 74 65 72 6e 3d 22 22 2c 20 73  lexPattern="", s
2e40: 54 61 67 73 50 61 74 74 65 72 6e 3d 22 22 29 20  TagsPattern="") 
2e50: 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 67 65 6e  {.        // gen
2e60: 65 72 61 74 6f 72 3a 20 72 65 74 75 72 6e 73 20  erator: returns 
2e70: 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 68 69 63  all entries whic
2e80: 68 20 66 6c 65 78 69 6f 6e 20 66 69 74 73 20 3c  h flexion fits <
2e90: 73 46 6c 65 78 50 61 74 74 65 72 6e 3e 20 61 6e  sFlexPattern> an
2ea0: 64 20 6d 6f 72 70 68 6f 6c 6f 67 79 20 66 69 74  d morphology fit
2eb0: 73 20 3c 73 54 61 67 73 50 61 74 74 65 72 6e 3e  s <sTagsPattern>
2ec0: 0a 20 20 20 20 20 20 20 20 79 69 65 6c 64 2a 20  .        yield* 
2ed0: 74 68 69 73 2e 6f 4d 61 69 6e 44 69 63 2e 73 65  this.oMainDic.se
2ee0: 6c 65 63 74 28 73 46 6c 65 78 50 61 74 74 65 72  lect(sFlexPatter
2ef0: 6e 2c 20 73 54 61 67 73 50 61 74 74 65 72 6e 29  n, sTagsPattern)
2f00: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 74 68  ;.        if (th
2f10: 69 73 2e 62 43 6f 6d 6d 75 6e 69 74 79 44 69 63  is.bCommunityDic
2f20: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2f30: 79 69 65 6c 64 2a 20 74 68 69 73 2e 6f 43 6f 6d  yield* this.oCom
2f40: 6d 75 6e 69 74 79 44 69 63 2e 73 65 6c 65 63 74  munityDic.select
2f50: 28 73 46 6c 65 78 50 61 74 74 65 72 6e 2c 20 73  (sFlexPattern, s
2f60: 54 61 67 73 50 61 74 74 65 72 6e 29 3b 0a 20 20  TagsPattern);.  
2f70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f80: 69 66 20 28 74 68 69 73 2e 62 50 65 72 73 6f 6e  if (this.bPerson
2f90: 61 6c 44 69 63 29 20 7b 0a 20 20 20 20 20 20 20  alDic) {.       
2fa0: 20 20 20 20 20 79 69 65 6c 64 2a 20 74 68 69 73       yield* this
2fb0: 2e 6f 50 65 72 73 6f 6e 61 6c 44 69 63 2e 73 65  .oPersonalDic.se
2fc0: 6c 65 63 74 28 73 46 6c 65 78 50 61 74 74 65 72  lect(sFlexPatter
2fd0: 6e 2c 20 73 54 61 67 73 50 61 74 74 65 72 6e 29  n, sTagsPattern)
2fe0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ff0: 7d 0a 0a 20 20 20 20 67 65 74 53 69 6d 69 6c 61  }..    getSimila
3000: 72 45 6e 74 72 69 65 73 20 28 73 57 6f 72 64 2c  rEntries (sWord,
3010: 20 6e 53 75 67 67 4c 69 6d 69 74 3d 31 30 29 20   nSuggLimit=10) 
3020: 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 72 65 74  {.        // ret
3030: 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 75  urn a list of tu
3040: 70 6c 65 73 20 28 73 69 6d 69 6c 61 72 20 77 6f  ples (similar wo
3050: 72 64 2c 20 73 74 65 6d 2c 20 6d 6f 72 70 68 6f  rd, stem, morpho
3060: 6c 6f 67 79 29 0a 20 20 20 20 20 20 20 20 6c 65  logy).        le
3070: 74 20 6c 52 65 73 75 6c 74 20 3d 20 74 68 69 73  t lResult = this
3080: 2e 6f 4d 61 69 6e 44 69 63 2e 67 65 74 53 69 6d  .oMainDic.getSim
3090: 69 6c 61 72 45 6e 74 72 69 65 73 28 73 57 6f 72  ilarEntries(sWor
30a0: 64 2c 20 6e 53 75 67 67 4c 69 6d 69 74 29 3b 0a  d, nSuggLimit);.
30b0: 20 20 20 20 20 20 20 20 69 66 20 28 74 68 69 73          if (this
30c0: 2e 62 43 6f 6d 6d 75 6e 69 74 79 44 69 63 29 20  .bCommunityDic) 
30d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 52  {.            lR
30e0: 65 73 75 6c 74 2e 70 75 73 68 28 2e 2e 2e 74 68  esult.push(...th
30f0: 69 73 2e 6f 43 6f 6d 6d 75 6e 69 74 79 44 69 63  is.oCommunityDic
3100: 2e 67 65 74 53 69 6d 69 6c 61 72 45 6e 74 72 69  .getSimilarEntri
3110: 65 73 28 73 57 6f 72 64 2c 20 6e 53 75 67 67 4c  es(sWord, nSuggL
3120: 69 6d 69 74 29 29 3b 0a 20 20 20 20 20 20 20 20  imit));.        
3130: 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 74 68  }.        if (th
3140: 69 73 2e 62 50 65 72 73 6f 6e 61 6c 44 69 63 29  is.bPersonalDic)
3150: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c   {.            l
3160: 52 65 73 75 6c 74 2e 70 75 73 68 28 2e 2e 2e 74  Result.push(...t
3170: 68 69 73 2e 6f 50 65 72 73 6f 6e 61 6c 44 69 63  his.oPersonalDic
3180: 2e 67 65 74 53 69 6d 69 6c 61 72 45 6e 74 72 69  .getSimilarEntri
3190: 65 73 28 73 57 6f 72 64 2c 20 6e 53 75 67 67 4c  es(sWord, nSuggL
31a0: 69 6d 69 74 29 29 3b 0a 20 20 20 20 20 20 20 20  imit));.        
31b0: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
31c0: 20 6c 52 65 73 75 6c 74 3b 0a 20 20 20 20 7d 0a   lResult;.    }.
31d0: 7d 0a 0a 69 66 20 28 74 79 70 65 6f 66 28 65 78  }..if (typeof(ex
31e0: 70 6f 72 74 73 29 20 21 3d 3d 20 27 75 6e 64 65  ports) !== 'unde
31f0: 66 69 6e 65 64 27 29 20 7b 0a 20 20 20 20 65 78  fined') {.    ex
3200: 70 6f 72 74 73 2e 53 70 65 6c 6c 43 68 65 63 6b  ports.SpellCheck
3210: 65 72 20 3d 20 53 70 65 6c 6c 43 68 65 63 6b 65  er = SpellChecke
3220: 72 3b 0a 7d 0a                                   r;.}.