Grammalecte  Hex Artifact Content

Artifact f1453842f844ba17153cde418a99f4b3576020b724de71190c1bc97aab0b5ad0:


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 65 78 74 65 6e 64 65 64 20 64 69 63 74  he extended dict
0100: 69 6f 6e 61 72 79 0a 2f 2f 20 2d 20 74 68 65 20  ionary.// - the 
0110: 63 6f 6d 6d 75 6e 69 74 79 20 64 69 63 74 69 6f  community dictio
0120: 6e 61 72 79 2c 20 61 64 64 65 64 20 62 79 20 61  nary, added by a
0130: 6e 20 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 0a 2f  n organization./
0140: 2f 20 2d 20 74 68 65 20 70 65 72 73 6f 6e 61 6c  / - the personal
0150: 20 64 69 63 74 69 6f 6e 61 72 79 2c 20 63 72 65   dictionary, cre
0160: 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72  ated by the user
0170: 20 66 6f 72 20 69 74 73 20 6f 77 6e 20 63 6f 6e   for its own con
0180: 76 65 6e 69 65 6e 63 65 0a 0a 0a 22 75 73 65 20  venience..."use 
0190: 73 74 72 69 63 74 22 3b 0a 0a 0a 69 66 20 28 74  strict";...if (t
01a0: 79 70 65 6f 66 28 72 65 71 75 69 72 65 29 20 21  ypeof(require) !
01b0: 3d 3d 20 27 75 6e 64 65 66 69 6e 65 64 27 29 20  == 'undefined') 
01c0: 7b 0a 20 20 20 20 76 61 72 20 69 62 64 61 77 67  {.    var ibdawg
01d0: 20 3d 20 72 65 71 75 69 72 65 28 22 72 65 73 6f   = require("reso
01e0: 75 72 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63  urce://grammalec
01f0: 74 65 2f 67 72 61 70 68 73 70 65 6c 6c 2f 69 62  te/graphspell/ib
0200: 64 61 77 67 2e 6a 73 22 29 3b 0a 20 20 20 20 76  dawg.js");.    v
0210: 61 72 20 74 6f 6b 65 6e 69 7a 65 72 20 3d 20 72  ar tokenizer = r
0220: 65 71 75 69 72 65 28 22 72 65 73 6f 75 72 63 65  equire("resource
0230: 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67  ://grammalecte/g
0240: 72 61 70 68 73 70 65 6c 6c 2f 74 6f 6b 65 6e 69  raphspell/tokeni
0250: 7a 65 72 2e 6a 73 22 29 3b 0a 7d 0a 0a 0a 24 7b  zer.js");.}...${
0260: 6d 61 70 7d 0a 0a 0a 63 6f 6e 73 74 20 64 44 65  map}...const dDe
0270: 66 61 75 6c 74 44 69 63 74 69 6f 6e 61 72 69 65  faultDictionarie
0280: 73 20 3d 20 6e 65 77 20 4d 61 70 28 5b 0a 20 20  s = new Map([.  
0290: 20 20 5b 22 66 72 22 2c 20 22 66 72 2e 6a 73 6f    ["fr", "fr.jso
02a0: 6e 22 5d 2c 0a 20 20 20 20 5b 22 65 6e 22 2c 20  n"],.    ["en", 
02b0: 22 65 6e 2e 6a 73 6f 6e 22 5d 0a 5d 29 3b 0a 0a  "en.json"].]);..
02c0: 0a 63 6c 61 73 73 20 53 70 65 6c 6c 43 68 65 63  .class SpellChec
02d0: 6b 65 72 20 7b 0a 0a 20 20 20 20 63 6f 6e 73 74  ker {..    const
02e0: 72 75 63 74 6f 72 20 28 73 4c 61 6e 67 43 6f 64  ructor (sLangCod
02f0: 65 2c 20 73 50 61 74 68 3d 22 22 2c 20 6d 61 69  e, sPath="", mai
0300: 6e 44 69 63 3d 22 22 2c 20 65 78 74 65 6e 74 65  nDic="", extente
0310: 64 44 69 63 3d 22 22 2c 20 63 6f 6d 6d 75 6e 69  dDic="", communi
0320: 74 79 44 69 63 3d 22 22 2c 20 70 65 72 73 6f 6e  tyDic="", person
0330: 61 6c 44 69 63 3d 22 22 29 20 7b 0a 20 20 20 20  alDic="") {.    
0340: 20 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 74      // returns t
0350: 72 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  rue if the main 
0360: 64 69 63 74 69 6f 6e 61 72 79 20 69 73 20 6c 6f  dictionary is lo
0370: 61 64 65 64 0a 20 20 20 20 20 20 20 20 74 68 69  aded.        thi
0380: 73 2e 73 4c 61 6e 67 43 6f 64 65 20 3d 20 73 4c  s.sLangCode = sL
0390: 61 6e 67 43 6f 64 65 3b 0a 20 20 20 20 20 20 20  angCode;.       
03a0: 20 69 66 20 28 21 6d 61 69 6e 44 69 63 29 20 7b   if (!mainDic) {
03b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 69  .            mai
03c0: 6e 44 69 63 20 3d 20 64 44 65 66 61 75 6c 74 44  nDic = dDefaultD
03d0: 69 63 74 69 6f 6e 61 72 69 65 73 2e 67 6c 5f 67  ictionaries.gl_g
03e0: 65 74 28 73 4c 61 6e 67 43 6f 64 65 2c 20 22 22  et(sLangCode, ""
03f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
0400: 20 20 20 20 20 74 68 69 73 2e 6f 4d 61 69 6e 44       this.oMainD
0410: 69 63 20 3d 20 74 68 69 73 2e 5f 6c 6f 61 64 44  ic = this._loadD
0420: 69 63 74 69 6f 6e 61 72 79 28 6d 61 69 6e 44 69  ictionary(mainDi
0430: 63 2c 20 73 50 61 74 68 2c 20 74 72 75 65 29 3b  c, sPath, true);
0440: 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 6f 45  .        this.oE
0450: 78 74 65 6e 64 65 64 44 69 63 20 3d 20 74 68 69  xtendedDic = thi
0460: 73 2e 5f 6c 6f 61 64 44 69 63 74 69 6f 6e 61 72  s._loadDictionar
0470: 79 28 65 78 74 65 6e 74 65 64 44 69 63 2c 20 73  y(extentedDic, s
0480: 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 74  Path);.        t
0490: 68 69 73 2e 6f 43 6f 6d 6d 75 6e 69 74 79 44 69  his.oCommunityDi
04a0: 63 20 3d 20 74 68 69 73 2e 5f 6c 6f 61 64 44 69  c = this._loadDi
04b0: 63 74 69 6f 6e 61 72 79 28 63 6f 6d 6d 75 6e 69  ctionary(communi
04c0: 74 79 44 69 63 2c 20 73 50 61 74 68 29 3b 0a 20  tyDic, sPath);. 
04d0: 20 20 20 20 20 20 20 74 68 69 73 2e 6f 50 65 72         this.oPer
04e0: 73 6f 6e 61 6c 44 69 63 20 3d 20 74 68 69 73 2e  sonalDic = this.
04f0: 5f 6c 6f 61 64 44 69 63 74 69 6f 6e 61 72 79 28  _loadDictionary(
0500: 70 65 72 73 6f 6e 61 6c 44 69 63 2c 20 73 50 61  personalDic, sPa
0510: 74 68 29 3b 0a 20 20 20 20 20 20 20 20 74 68 69  th);.        thi
0520: 73 2e 62 45 78 74 65 6e 64 65 64 44 69 63 20 3d  s.bExtendedDic =
0530: 20 42 6f 6f 6c 65 61 6e 28 74 68 69 73 2e 6f 45   Boolean(this.oE
0540: 78 74 65 6e 64 65 64 44 69 63 29 3b 0a 20 20 20  xtendedDic);.   
0550: 20 20 20 20 20 74 68 69 73 2e 62 43 6f 6d 6d 75       this.bCommu
0560: 6e 69 74 79 44 69 63 20 3d 20 42 6f 6f 6c 65 61  nityDic = Boolea
0570: 6e 28 74 68 69 73 2e 6f 43 6f 6d 6d 75 6e 69 74  n(this.oCommunit
0580: 79 44 69 63 29 3b 0a 20 20 20 20 20 20 20 20 74  yDic);.        t
0590: 68 69 73 2e 62 50 65 72 73 6f 6e 61 6c 44 69 63  his.bPersonalDic
05a0: 20 3d 20 42 6f 6f 6c 65 61 6e 28 74 68 69 73 2e   = Boolean(this.
05b0: 6f 50 65 72 73 6f 6e 61 6c 44 69 63 29 3b 0a 20  oPersonalDic);. 
05c0: 20 20 20 20 20 20 20 74 68 69 73 2e 6f 54 6f 6b         this.oTok
05d0: 65 6e 69 7a 65 72 20 3d 20 6e 75 6c 6c 3b 0a 20  enizer = null;. 
05e0: 20 20 20 7d 0a 0a 20 20 20 20 5f 6c 6f 61 64 44     }..    _loadD
05f0: 69 63 74 69 6f 6e 61 72 79 20 28 64 69 63 74 69  ictionary (dicti
0600: 6f 6e 61 72 79 2c 20 73 50 61 74 68 3d 22 22 2c  onary, sPath="",
0610: 20 62 4e 65 63 65 73 73 61 72 79 3d 66 61 6c 73   bNecessary=fals
0620: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20  e) {.        // 
0630: 72 65 74 75 72 6e 73 20 61 6e 20 49 42 44 41 57  returns an IBDAW
0640: 47 20 6f 62 6a 65 63 74 0a 20 20 20 20 20 20 20  G object.       
0650: 20 69 66 20 28 21 64 69 63 74 69 6f 6e 61 72 79   if (!dictionary
0660: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0670: 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20  return null;.   
0680: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
0690: 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ry {.           
06a0: 20 69 66 20 28 74 79 70 65 6f 66 28 69 62 64 61   if (typeof(ibda
06b0: 77 67 29 20 21 3d 3d 20 27 75 6e 64 65 66 69 6e  wg) !== 'undefin
06c0: 65 64 27 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ed') {.         
06d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65         return ne
06e0: 77 20 69 62 64 61 77 67 2e 49 42 44 41 57 47 28  w ibdawg.IBDAWG(
06f0: 64 69 63 74 69 6f 6e 61 72 79 29 3b 20 20 2f 2f  dictionary);  //
0700: 20 64 69 63 74 69 6f 6e 61 72 79 20 63 61 6e 20   dictionary can 
0710: 62 65 20 61 20 66 69 6c 65 6e 61 6d 65 20 6f 72  be a filename or
0720: 20 61 20 4a 53 4f 4e 20 6f 62 6a 65 63 74 0a 20   a JSON object. 
0730: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
0740: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
0750: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 77 20 49      return new I
0760: 42 44 41 57 47 28 64 69 63 74 69 6f 6e 61 72 79  BDAWG(dictionary
0770: 2c 20 73 50 61 74 68 29 3b 20 20 2f 2f 20 64 69  , sPath);  // di
0780: 63 74 69 6f 6e 61 72 79 20 63 61 6e 20 62 65 20  ctionary can be 
0790: 61 20 66 69 6c 65 6e 61 6d 65 20 6f 72 20 61 20  a filename or a 
07a0: 4a 53 4f 4e 20 6f 62 6a 65 63 74 0a 20 20 20 20  JSON object.    
07b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
07c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 74 63    }.        catc
07d0: 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20  h (e) {.        
07e0: 20 20 20 20 6c 65 74 20 73 66 44 69 63 74 69 6f      let sfDictio
07f0: 6e 61 72 79 20 3d 20 28 74 79 70 65 6f 66 28 64  nary = (typeof(d
0800: 69 63 74 69 6f 6e 61 72 79 29 20 3d 3d 20 22 73  ictionary) == "s
0810: 74 72 69 6e 67 22 29 20 3f 20 64 69 63 74 69 6f  tring") ? dictio
0820: 6e 61 72 79 20 3a 20 64 69 63 74 69 6f 6e 61 72  nary : dictionar
0830: 79 2e 73 4c 61 6e 67 4e 61 6d 65 20 2b 20 22 2f  y.sLangName + "/
0840: 22 20 2b 20 64 69 63 74 69 6f 6e 61 72 79 2e 73  " + dictionary.s
0850: 46 69 6c 65 4e 61 6d 65 3b 0a 20 20 20 20 20 20  FileName;.      
0860: 20 20 20 20 20 20 69 66 20 28 62 4e 65 63 65 73        if (bNeces
0870: 73 61 72 79 29 20 7b 0a 20 20 20 20 20 20 20 20  sary) {.        
0880: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 22 45          throw "E
0890: 72 72 6f 72 3a 20 3c 22 20 2b 20 73 66 44 69 63  rror: <" + sfDic
08a0: 74 69 6f 6e 61 72 79 20 2b 20 22 3e 20 6e 6f 74  tionary + "> not
08b0: 20 6c 6f 61 64 65 64 2e 20 22 20 2b 20 65 2e 6d   loaded. " + e.m
08c0: 65 73 73 61 67 65 3b 0a 20 20 20 20 20 20 20 20  essage;.        
08d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
08e0: 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 45    console.log("E
08f0: 72 72 6f 72 3a 20 3c 22 20 2b 20 73 66 44 69 63  rror: <" + sfDic
0900: 74 69 6f 6e 61 72 79 20 2b 20 22 3e 20 6e 6f 74  tionary + "> not
0910: 20 6c 6f 61 64 65 64 2e 22 29 0a 20 20 20 20 20   loaded.").     
0920: 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c         console.l
0930: 6f 67 28 65 2e 6d 65 73 73 61 67 65 29 3b 0a 20  og(e.message);. 
0940: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
0950: 6e 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  n null;.        
0960: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c 6f 61  }.    }..    loa
0970: 64 54 6f 6b 65 6e 69 7a 65 72 20 28 29 20 7b 0a  dTokenizer () {.
0980: 20 20 20 20 20 20 20 20 69 66 20 28 74 79 70 65          if (type
0990: 6f 66 28 74 6f 6b 65 6e 69 7a 65 72 29 20 21 3d  of(tokenizer) !=
09a0: 3d 20 27 75 6e 64 65 66 69 6e 65 64 27 29 20 7b  = 'undefined') {
09b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69  .            thi
09c0: 73 2e 6f 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 6e  s.oTokenizer = n
09d0: 65 77 20 74 6f 6b 65 6e 69 7a 65 72 2e 54 6f 6b  ew tokenizer.Tok
09e0: 65 6e 69 7a 65 72 28 74 68 69 73 2e 73 4c 61 6e  enizer(this.sLan
09f0: 67 43 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  gCode);.        
0a00: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
0a10: 20 20 20 20 20 74 68 69 73 2e 6f 54 6f 6b 65 6e       this.oToken
0a20: 69 7a 65 72 20 3d 20 6e 65 77 20 54 6f 6b 65 6e  izer = new Token
0a30: 69 7a 65 72 28 74 68 69 73 2e 73 4c 61 6e 67 43  izer(this.sLangC
0a40: 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ode);.        }.
0a50: 20 20 20 20 7d 0a 0a 20 20 20 20 67 65 74 54 6f      }..    getTo
0a60: 6b 65 6e 69 7a 65 72 20 28 29 20 7b 0a 20 20 20  kenizer () {.   
0a70: 20 20 20 20 20 69 66 20 28 21 74 68 69 73 2e 6f       if (!this.o
0a80: 54 6f 6b 65 6e 69 7a 65 72 29 20 7b 0a 20 20 20  Tokenizer) {.   
0a90: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6c 6f           this.lo
0aa0: 61 64 54 6f 6b 65 6e 69 7a 65 72 28 29 3b 0a 20  adTokenizer();. 
0ab0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
0ac0: 20 72 65 74 75 72 6e 20 74 68 69 73 2e 6f 54 6f   return this.oTo
0ad0: 6b 65 6e 69 7a 65 72 3b 0a 20 20 20 20 7d 0a 0a  kenizer;.    }..
0ae0: 20 20 20 20 73 65 74 4d 61 69 6e 44 69 63 74 69      setMainDicti
0af0: 6f 6e 61 72 79 20 28 64 69 63 74 69 6f 6e 61 72  onary (dictionar
0b00: 79 2c 20 73 50 61 74 68 3d 22 22 29 20 7b 0a 20  y, sPath="") {. 
0b10: 20 20 20 20 20 20 20 2f 2f 20 72 65 74 75 72 6e         // return
0b20: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 64 69  s true if the di
0b30: 63 74 69 6f 6e 61 72 79 20 69 73 20 6c 6f 61 64  ctionary is load
0b40: 65 64 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e  ed.        this.
0b50: 6f 4d 61 69 6e 44 69 63 20 3d 20 74 68 69 73 2e  oMainDic = this.
0b60: 5f 6c 6f 61 64 44 69 63 74 69 6f 6e 61 72 79 28  _loadDictionary(
0b70: 64 69 63 74 69 6f 6e 61 72 79 2c 20 73 50 61 74  dictionary, sPat
0b80: 68 2c 20 74 72 75 65 29 3b 0a 20 20 20 20 20 20  h, true);.      
0b90: 20 20 72 65 74 75 72 6e 20 42 6f 6f 6c 65 61 6e    return Boolean
0ba0: 28 74 68 69 73 2e 6f 4d 61 69 6e 44 69 63 29 3b  (this.oMainDic);
0bb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 45  .    }..    setE
0bc0: 78 74 65 6e 64 65 64 44 69 63 74 69 6f 6e 61 72  xtendedDictionar
0bd0: 79 20 28 64 69 63 74 69 6f 6e 61 72 79 2c 20 73  y (dictionary, s
0be0: 50 61 74 68 3d 22 22 2c 20 62 41 63 74 69 76 61  Path="", bActiva
0bf0: 74 65 3d 74 72 75 65 29 20 7b 0a 20 20 20 20 20  te=true) {.     
0c00: 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 74 72     // returns tr
0c10: 75 65 20 69 66 20 74 68 65 20 64 69 63 74 69 6f  ue if the dictio
0c20: 6e 61 72 79 20 69 73 20 6c 6f 61 64 65 64 0a 20  nary is loaded. 
0c30: 20 20 20 20 20 20 20 74 68 69 73 2e 6f 45 78 74         this.oExt
0c40: 65 6e 64 65 64 44 69 63 20 3d 20 74 68 69 73 2e  endedDic = this.
0c50: 5f 6c 6f 61 64 44 69 63 74 69 6f 6e 61 72 79 28  _loadDictionary(
0c60: 64 69 63 74 69 6f 6e 61 72 79 2c 20 73 50 61 74  dictionary, sPat
0c70: 68 29 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73  h);.        this
0c80: 2e 62 45 78 74 65 6e 64 65 64 44 69 63 20 3d 20  .bExtendedDic = 
0c90: 28 62 41 63 74 69 76 61 74 65 29 20 3f 20 42 6f  (bActivate) ? Bo
0ca0: 6f 6c 65 61 6e 28 74 68 69 73 2e 6f 45 78 74 65  olean(this.oExte
0cb0: 6e 64 65 64 44 69 63 29 20 3a 20 66 61 6c 73 65  ndedDic) : false
0cc0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
0cd0: 20 74 68 69 73 2e 62 45 78 74 65 6e 64 65 64 44   this.bExtendedD
0ce0: 69 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  ic;.    }..    s
0cf0: 65 74 43 6f 6d 6d 75 6e 69 74 79 44 69 63 74 69  etCommunityDicti
0d00: 6f 6e 61 72 79 20 28 64 69 63 74 69 6f 6e 61 72  onary (dictionar
0d10: 79 2c 20 73 50 61 74 68 3d 22 22 2c 20 62 41 63  y, sPath="", bAc
0d20: 74 69 76 61 74 65 3d 74 72 75 65 29 20 7b 0a 20  tivate=true) {. 
0d30: 20 20 20 20 20 20 20 2f 2f 20 72 65 74 75 72 6e         // return
0d40: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 64 69  s true if the di
0d50: 63 74 69 6f 6e 61 72 79 20 69 73 20 6c 6f 61 64  ctionary is load
0d60: 65 64 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e  ed.        this.
0d70: 6f 43 6f 6d 6d 75 6e 69 74 79 44 69 63 20 3d 20  oCommunityDic = 
0d80: 74 68 69 73 2e 5f 6c 6f 61 64 44 69 63 74 69 6f  this._loadDictio
0d90: 6e 61 72 79 28 64 69 63 74 69 6f 6e 61 72 79 2c  nary(dictionary,
0da0: 20 73 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20   sPath);.       
0db0: 20 74 68 69 73 2e 62 43 6f 6d 6d 75 6e 69 74 79   this.bCommunity
0dc0: 44 69 63 20 3d 20 28 62 41 63 74 69 76 61 74 65  Dic = (bActivate
0dd0: 29 20 3f 20 42 6f 6f 6c 65 61 6e 28 74 68 69 73  ) ? Boolean(this
0de0: 2e 6f 43 6f 6d 6d 75 6e 69 74 79 44 69 63 29 20  .oCommunityDic) 
0df0: 3a 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20  : false;.       
0e00: 20 72 65 74 75 72 6e 20 74 68 69 73 2e 62 43 6f   return this.bCo
0e10: 6d 6d 75 6e 69 74 79 44 69 63 3b 0a 20 20 20 20  mmunityDic;.    
0e20: 7d 0a 0a 20 20 20 20 73 65 74 50 65 72 73 6f 6e  }..    setPerson
0e30: 61 6c 44 69 63 74 69 6f 6e 61 72 79 20 28 64 69  alDictionary (di
0e40: 63 74 69 6f 6e 61 72 79 2c 20 73 50 61 74 68 3d  ctionary, sPath=
0e50: 22 22 2c 20 62 41 63 74 69 76 61 74 65 3d 74 72  "", bActivate=tr
0e60: 75 65 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f  ue) {.        //
0e70: 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66   returns true if
0e80: 20 74 68 65 20 64 69 63 74 69 6f 6e 61 72 79 20   the dictionary 
0e90: 69 73 20 6c 6f 61 64 65 64 0a 20 20 20 20 20 20  is loaded.      
0ea0: 20 20 74 68 69 73 2e 6f 50 65 72 73 6f 6e 61 6c    this.oPersonal
0eb0: 44 69 63 20 3d 20 74 68 69 73 2e 5f 6c 6f 61 64  Dic = this._load
0ec0: 44 69 63 74 69 6f 6e 61 72 79 28 64 69 63 74 69  Dictionary(dicti
0ed0: 6f 6e 61 72 79 2c 20 73 50 61 74 68 29 3b 0a 20  onary, sPath);. 
0ee0: 20 20 20 20 20 20 20 74 68 69 73 2e 62 50 65 72         this.bPer
0ef0: 73 6f 6e 61 6c 44 69 63 20 3d 20 28 62 41 63 74  sonalDic = (bAct
0f00: 69 76 61 74 65 29 20 3f 20 42 6f 6f 6c 65 61 6e  ivate) ? Boolean
0f10: 28 74 68 69 73 2e 6f 50 65 72 73 6f 6e 61 6c 44  (this.oPersonalD
0f20: 69 63 29 20 3a 20 66 61 6c 73 65 3b 0a 20 20 20  ic) : false;.   
0f30: 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 69 73       return this
0f40: 2e 62 50 65 72 73 6f 6e 61 6c 44 69 63 3b 0a 20  .bPersonalDic;. 
0f50: 20 20 20 7d 0a 0a 20 20 20 20 61 63 74 69 76 61     }..    activa
0f60: 74 65 45 78 74 65 6e 64 65 64 44 69 63 74 69 6f  teExtendedDictio
0f70: 6e 61 72 79 20 28 29 20 7b 0a 20 20 20 20 20 20  nary () {.      
0f80: 20 20 74 68 69 73 2e 62 45 78 74 65 6e 64 65 64    this.bExtended
0f90: 44 69 63 20 3d 20 42 6f 6f 6c 65 61 6e 28 74 68  Dic = Boolean(th
0fa0: 69 73 2e 6f 45 78 74 65 6e 64 65 64 44 69 63 29  is.oExtendedDic)
0fb0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 63 74  ;.    }..    act
0fc0: 69 76 61 74 65 43 6f 6d 6d 75 6e 69 74 79 44 69  ivateCommunityDi
0fd0: 63 74 69 6f 6e 61 72 79 20 28 29 20 7b 0a 20 20  ctionary () {.  
0fe0: 20 20 20 20 20 20 74 68 69 73 2e 62 43 6f 6d 6d        this.bComm
0ff0: 75 6e 69 74 79 44 69 63 20 3d 20 42 6f 6f 6c 65  unityDic = Boole
1000: 61 6e 28 74 68 69 73 2e 6f 43 6f 6d 6d 75 6e 69  an(this.oCommuni
1010: 74 79 44 69 63 29 3b 0a 20 20 20 20 7d 0a 0a 20  tyDic);.    }.. 
1020: 20 20 20 61 63 74 69 76 61 74 65 50 65 72 73 6f     activatePerso
1030: 6e 61 6c 44 69 63 74 69 6f 6e 61 72 79 20 28 29  nalDictionary ()
1040: 20 7b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e   {.        this.
1050: 62 50 65 72 73 6f 6e 61 6c 44 69 63 20 3d 20 42  bPersonalDic = B
1060: 6f 6f 6c 65 61 6e 28 74 68 69 73 2e 6f 50 65 72  oolean(this.oPer
1070: 73 6f 6e 61 6c 44 69 63 29 3b 0a 20 20 20 20 7d  sonalDic);.    }
1080: 0a 0a 20 20 20 20 64 65 61 63 74 69 76 61 74 65  ..    deactivate
1090: 45 78 74 65 6e 64 65 64 44 69 63 74 69 6f 6e 61  ExtendedDictiona
10a0: 72 79 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20  ry () {.        
10b0: 74 68 69 73 2e 62 45 78 74 65 6e 64 65 64 44 69  this.bExtendedDi
10c0: 63 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d  c = false;.    }
10d0: 0a 0a 20 20 20 20 64 65 61 63 74 69 76 61 74 65  ..    deactivate
10e0: 43 6f 6d 6d 75 6e 69 74 79 44 69 63 74 69 6f 6e  CommunityDiction
10f0: 61 72 79 20 28 29 20 7b 0a 20 20 20 20 20 20 20  ary () {.       
1100: 20 74 68 69 73 2e 62 43 6f 6d 6d 75 6e 69 74 79   this.bCommunity
1110: 44 69 63 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20  Dic = false;.   
1120: 20 7d 0a 0a 20 20 20 20 64 65 61 63 74 69 76 61   }..    deactiva
1130: 74 65 50 65 72 73 6f 6e 61 6c 44 69 63 74 69 6f  tePersonalDictio
1140: 6e 61 72 79 20 28 29 20 7b 0a 20 20 20 20 20 20  nary () {.      
1150: 20 20 74 68 69 73 2e 62 50 65 72 73 6f 6e 61 6c    this.bPersonal
1160: 44 69 63 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20  Dic = false;.   
1170: 20 7d 0a 0a 0a 20 20 20 20 2f 2f 20 70 61 72 73   }...    // pars
1180: 65 20 74 65 78 74 20 66 75 6e 63 74 69 6f 6e 73  e text functions
1190: 0a 0a 20 20 20 20 70 61 72 73 65 50 61 72 61 67  ..    parseParag
11a0: 72 61 70 68 20 28 73 54 65 78 74 29 20 7b 0a 20  raph (sText) {. 
11b0: 20 20 20 20 20 20 20 69 66 20 28 21 74 68 69 73         if (!this
11c0: 2e 6f 54 6f 6b 65 6e 69 7a 65 72 29 20 7b 0a 20  .oTokenizer) {. 
11d0: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
11e0: 6c 6f 61 64 54 6f 6b 65 6e 69 7a 65 72 28 29 3b  loadTokenizer();
11f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1200: 20 20 20 6c 65 74 20 61 53 70 65 6c 6c 45 72 72     let aSpellErr
1210: 20 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20 66   = [];.        f
1220: 6f 72 20 28 6c 65 74 20 6f 54 6f 6b 65 6e 20 6f  or (let oToken o
1230: 66 20 74 68 69 73 2e 6f 54 6f 6b 65 6e 69 7a 65  f this.oTokenize
1240: 72 2e 67 65 6e 54 6f 6b 65 6e 73 28 73 54 65 78  r.genTokens(sTex
1250: 74 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  t)) {.          
1260: 20 20 69 66 20 28 6f 54 6f 6b 65 6e 2e 73 54 79    if (oToken.sTy
1270: 70 65 20 3d 3d 3d 20 27 57 4f 52 44 27 20 26 26  pe === 'WORD' &&
1280: 20 21 74 68 69 73 2e 69 73 56 61 6c 69 64 54 6f   !this.isValidTo
1290: 6b 65 6e 28 6f 54 6f 6b 65 6e 2e 73 56 61 6c 75  ken(oToken.sValu
12a0: 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  e)) {.          
12b0: 20 20 20 20 20 20 61 53 70 65 6c 6c 45 72 72 2e        aSpellErr.
12c0: 70 75 73 68 28 6f 54 6f 6b 65 6e 29 3b 0a 20 20  push(oToken);.  
12d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
12f0: 74 75 72 6e 20 61 53 70 65 6c 6c 45 72 72 3b 0a  turn aSpellErr;.
1300: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 49 42      }..    // IB
1310: 44 41 57 47 20 66 75 6e 63 74 69 6f 6e 73 0a 0a  DAWG functions..
1320: 20 20 20 20 69 73 56 61 6c 69 64 54 6f 6b 65 6e      isValidToken
1330: 20 28 73 54 6f 6b 65 6e 29 20 7b 0a 20 20 20 20   (sToken) {.    
1340: 20 20 20 20 2f 2f 20 63 68 65 63 6b 73 20 69 66      // checks if
1350: 20 73 54 6f 6b 65 6e 20 69 73 20 76 61 6c 69 64   sToken is valid
1360: 20 28 69 66 20 74 68 65 72 65 20 69 73 20 68 79   (if there is hy
1370: 70 68 65 6e 73 20 69 6e 20 73 54 6f 6b 65 6e 2c  phens in sToken,
1380: 20 73 54 6f 6b 65 6e 20 69 73 20 73 70 6c 69 74   sToken is split
1390: 2c 20 65 61 63 68 20 70 61 72 74 20 69 73 20 63  , each part is c
13a0: 68 65 63 6b 65 64 29 0a 20 20 20 20 20 20 20 20  hecked).        
13b0: 69 66 20 28 74 68 69 73 2e 6f 4d 61 69 6e 44 69  if (this.oMainDi
13c0: 63 2e 69 73 56 61 6c 69 64 54 6f 6b 65 6e 28 73  c.isValidToken(s
13d0: 54 6f 6b 65 6e 29 29 20 7b 0a 20 20 20 20 20 20  Token)) {.      
13e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
13f0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1400: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 62 45       if (this.bE
1410: 78 74 65 6e 64 65 64 44 69 63 20 26 26 20 74 68  xtendedDic && th
1420: 69 73 2e 6f 45 78 74 65 6e 64 65 64 44 69 63 2e  is.oExtendedDic.
1430: 69 73 56 61 6c 69 64 54 6f 6b 65 6e 28 73 54 6f  isValidToken(sTo
1440: 6b 65 6e 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ken)) {.        
1450: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b      return true;
1460: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1470: 20 20 20 69 66 20 28 74 68 69 73 2e 62 43 6f 6d     if (this.bCom
1480: 6d 75 6e 69 74 79 44 69 63 20 26 26 20 74 68 69  munityDic && thi
1490: 73 2e 6f 43 6f 6d 6d 75 6e 69 74 79 44 69 63 2e  s.oCommunityDic.
14a0: 69 73 56 61 6c 69 64 54 6f 6b 65 6e 28 73 54 6f  isValidToken(sTo
14b0: 6b 65 6e 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ken)) {.        
14c0: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b      return true;
14d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14e0: 20 20 20 69 66 20 28 74 68 69 73 2e 62 50 65 72     if (this.bPer
14f0: 73 6f 6e 61 6c 44 69 63 20 26 26 20 74 68 69 73  sonalDic && this
1500: 2e 6f 50 65 72 73 6f 6e 61 6c 44 69 63 2e 69 73  .oPersonalDic.is
1510: 56 61 6c 69 64 54 6f 6b 65 6e 28 73 54 6f 6b 65  ValidToken(sToke
1520: 6e 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  n)) {.          
1530: 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20    return true;. 
1540: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1550: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20   return false;. 
1560: 20 20 20 7d 0a 0a 20 20 20 20 69 73 56 61 6c 69     }..    isVali
1570: 64 20 28 73 57 6f 72 64 29 20 7b 0a 20 20 20 20  d (sWord) {.    
1580: 20 20 20 20 2f 2f 20 63 68 65 63 6b 73 20 69 66      // checks if
1590: 20 73 57 6f 72 64 20 69 73 20 76 61 6c 69 64 20   sWord is valid 
15a0: 28 64 69 66 66 65 72 65 6e 74 20 63 61 73 69 6e  (different casin
15b0: 67 20 74 65 73 74 65 64 20 69 66 20 74 68 65 20  g tested if the 
15c0: 66 69 72 73 74 20 6c 65 74 74 65 72 20 69 73 20  first letter is 
15d0: 61 20 63 61 70 69 74 61 6c 29 0a 20 20 20 20 20  a capital).     
15e0: 20 20 20 69 66 20 28 74 68 69 73 2e 6f 4d 61 69     if (this.oMai
15f0: 6e 44 69 63 2e 69 73 56 61 6c 69 64 28 73 57 6f  nDic.isValid(sWo
1600: 72 64 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  rd)) {.         
1610: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a     return true;.
1620: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1630: 20 20 69 66 20 28 74 68 69 73 2e 62 45 78 74 65    if (this.bExte
1640: 6e 64 65 64 44 69 63 20 26 26 20 74 68 69 73 2e  ndedDic && this.
1650: 6f 45 78 74 65 6e 64 65 64 44 69 63 2e 69 73 56  oExtendedDic.isV
1660: 61 6c 69 64 28 73 57 6f 72 64 29 29 20 7b 0a 20  alid(sWord)) {. 
1670: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1680: 6e 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20  n true;.        
1690: 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 74 68  }.        if (th
16a0: 69 73 2e 62 43 6f 6d 6d 75 6e 69 74 79 44 69 63  is.bCommunityDic
16b0: 20 26 26 20 74 68 69 73 2e 6f 43 6f 6d 6d 75 6e   && this.oCommun
16c0: 69 74 79 44 69 63 2e 69 73 56 61 6c 69 64 28 73  ityDic.isValid(s
16d0: 54 6f 6b 65 6e 29 29 20 7b 0a 20 20 20 20 20 20  Token)) {.      
16e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
16f0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1700: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 62 50       if (this.bP
1710: 65 72 73 6f 6e 61 6c 44 69 63 20 26 26 20 74 68  ersonalDic && th
1720: 69 73 2e 6f 50 65 72 73 6f 6e 61 6c 44 69 63 2e  is.oPersonalDic.
1730: 69 73 56 61 6c 69 64 28 73 57 6f 72 64 29 29 20  isValid(sWord)) 
1740: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1750: 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 20  turn true;.     
1760: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
1770: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d  urn false;.    }
1780: 0a 0a 20 20 20 20 6c 6f 6f 6b 75 70 20 28 73 57  ..    lookup (sW
1790: 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  ord) {.        /
17a0: 2f 20 63 68 65 63 6b 73 20 69 66 20 73 57 6f 72  / checks if sWor
17b0: 64 20 69 73 20 69 6e 20 64 69 63 74 69 6f 6e 61  d is in dictiona
17c0: 72 79 20 61 73 20 69 73 20 28 73 74 72 69 63 74  ry as is (strict
17d0: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 29 0a 20   verification). 
17e0: 20 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e         if (this.
17f0: 6f 4d 61 69 6e 44 69 63 2e 6c 6f 6f 6b 75 70 28  oMainDic.lookup(
1800: 73 57 6f 72 64 29 29 20 7b 0a 20 20 20 20 20 20  sWord)) {.      
1810: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
1820: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1830: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 62 45       if (this.bE
1840: 78 74 65 6e 64 65 64 44 69 63 20 26 26 20 74 68  xtendedDic && th
1850: 69 73 2e 6f 45 78 74 65 6e 64 65 64 44 69 63 2e  is.oExtendedDic.
1860: 6c 6f 6f 6b 75 70 28 73 57 6f 72 64 29 29 20 7b  lookup(sWord)) {
1870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1880: 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 20 20  urn true;.      
1890: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28    }.        if (
18a0: 74 68 69 73 2e 62 43 6f 6d 6d 75 6e 69 74 79 44  this.bCommunityD
18b0: 69 63 20 26 26 20 74 68 69 73 2e 6f 43 6f 6d 6d  ic && this.oComm
18c0: 75 6e 69 74 79 44 69 63 2e 6c 6f 6f 6b 75 70 28  unityDic.lookup(
18d0: 73 54 6f 6b 65 6e 29 29 20 7b 0a 20 20 20 20 20  sToken)) {.     
18e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
18f0: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
1900: 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 62        if (this.b
1910: 50 65 72 73 6f 6e 61 6c 44 69 63 20 26 26 20 74  PersonalDic && t
1920: 68 69 73 2e 6f 50 65 72 73 6f 6e 61 6c 44 69 63  his.oPersonalDic
1930: 2e 6c 6f 6f 6b 75 70 28 73 57 6f 72 64 29 29 20  .lookup(sWord)) 
1940: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1950: 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 20  turn true;.     
1960: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
1970: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d  urn false;.    }
1980: 0a 0a 20 20 20 20 67 65 74 4d 6f 72 70 68 20 28  ..    getMorph (
1990: 73 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20  sWord) {.       
19a0: 20 2f 2f 20 72 65 74 72 69 65 76 65 73 20 6d 6f   // retrieves mo
19b0: 72 70 68 6f 6c 6f 67 69 65 73 20 6c 69 73 74 2c  rphologies list,
19c0: 20 64 69 66 66 65 72 65 6e 74 20 63 61 73 69 6e   different casin
19d0: 67 20 61 6c 6c 6f 77 65 64 0a 20 20 20 20 20 20  g allowed.      
19e0: 20 20 6c 65 74 20 6c 52 65 73 75 6c 74 20 3d 20    let lResult = 
19f0: 74 68 69 73 2e 6f 4d 61 69 6e 44 69 63 2e 67 65  this.oMainDic.ge
1a00: 74 4d 6f 72 70 68 28 73 57 6f 72 64 29 3b 0a 20  tMorph(sWord);. 
1a10: 20 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e         if (this.
1a20: 62 45 78 74 65 6e 64 65 64 44 69 63 29 20 7b 0a  bExtendedDic) {.
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 6c 52 65 73              lRes
1a40: 75 6c 74 2e 70 75 73 68 28 2e 2e 2e 74 68 69 73  ult.push(...this
1a50: 2e 6f 45 78 74 65 6e 64 65 64 44 69 63 2e 67 65  .oExtendedDic.ge
1a60: 74 4d 6f 72 70 68 28 73 57 6f 72 64 29 29 3b 0a  tMorph(sWord));.
1a70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a80: 20 20 69 66 20 28 74 68 69 73 2e 62 43 6f 6d 6d    if (this.bComm
1a90: 75 6e 69 74 79 44 69 63 29 20 7b 0a 20 20 20 20  unityDic) {.    
1aa0: 20 20 20 20 20 20 20 20 6c 52 65 73 75 6c 74 2e          lResult.
1ab0: 70 75 73 68 28 2e 2e 2e 74 68 69 73 2e 6f 43 6f  push(...this.oCo
1ac0: 6d 6d 75 6e 69 74 79 44 69 63 2e 67 65 74 4d 6f  mmunityDic.getMo
1ad0: 72 70 68 28 73 57 6f 72 64 29 29 3b 0a 20 20 20  rph(sWord));.   
1ae0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1af0: 66 20 28 74 68 69 73 2e 62 50 65 72 73 6f 6e 61  f (this.bPersona
1b00: 6c 44 69 63 29 20 7b 0a 20 20 20 20 20 20 20 20  lDic) {.        
1b10: 20 20 20 20 6c 52 65 73 75 6c 74 2e 70 75 73 68      lResult.push
1b20: 28 2e 2e 2e 74 68 69 73 2e 6f 50 65 72 73 6f 6e  (...this.oPerson
1b30: 61 6c 44 69 63 2e 67 65 74 4d 6f 72 70 68 28 73  alDic.getMorph(s
1b40: 57 6f 72 64 29 29 3b 0a 20 20 20 20 20 20 20 20  Word));.        
1b50: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
1b60: 20 6c 52 65 73 75 6c 74 3b 0a 20 20 20 20 7d 0a   lResult;.    }.
1b70: 0a 20 20 20 20 2a 20 73 75 67 67 65 73 74 20 28  .    * suggest (
1b80: 73 57 6f 72 64 2c 20 6e 53 75 67 67 4c 69 6d 69  sWord, nSuggLimi
1b90: 74 3d 31 30 29 20 7b 0a 20 20 20 20 20 20 20 20  t=10) {.        
1ba0: 2f 2f 20 67 65 6e 65 72 61 74 6f 72 3a 20 72 65  // generator: re
1bb0: 74 75 72 6e 73 20 31 2c 20 32 20 6f 72 20 33 20  turns 1, 2 or 3 
1bc0: 6c 69 73 74 73 20 6f 66 20 73 75 67 67 65 73 74  lists of suggest
1bd0: 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 79 69 65  ions.        yie
1be0: 6c 64 20 74 68 69 73 2e 6f 4d 61 69 6e 44 69 63  ld this.oMainDic
1bf0: 2e 73 75 67 67 65 73 74 28 73 57 6f 72 64 2c 20  .suggest(sWord, 
1c00: 6e 53 75 67 67 4c 69 6d 69 74 29 3b 0a 20 20 20  nSuggLimit);.   
1c10: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 62 45       if (this.bE
1c20: 78 74 65 6e 64 65 64 44 69 63 29 20 7b 0a 20 20  xtendedDic) {.  
1c30: 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
1c40: 74 68 69 73 2e 6f 45 78 74 65 6e 64 65 64 44 69  this.oExtendedDi
1c50: 63 2e 73 75 67 67 65 73 74 28 73 57 6f 72 64 2c  c.suggest(sWord,
1c60: 20 6e 53 75 67 67 4c 69 6d 69 74 29 3b 0a 20 20   nSuggLimit);.  
1c70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c80: 69 66 20 28 74 68 69 73 2e 62 43 6f 6d 6d 75 6e  if (this.bCommun
1c90: 69 74 79 44 69 63 29 20 7b 0a 20 20 20 20 20 20  ityDic) {.      
1ca0: 20 20 20 20 20 20 79 69 65 6c 64 20 74 68 69 73        yield this
1cb0: 2e 6f 43 6f 6d 6d 75 6e 69 74 79 44 69 63 2e 73  .oCommunityDic.s
1cc0: 75 67 67 65 73 74 28 73 57 6f 72 64 2c 20 6e 53  uggest(sWord, nS
1cd0: 75 67 67 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  uggLimit);.     
1ce0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20     }.        if 
1cf0: 28 74 68 69 73 2e 62 50 65 72 73 6f 6e 61 6c 44  (this.bPersonalD
1d00: 69 63 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ic) {.          
1d10: 20 20 79 69 65 6c 64 20 74 68 69 73 2e 6f 50 65    yield this.oPe
1d20: 72 73 6f 6e 61 6c 44 69 63 2e 73 75 67 67 65 73  rsonalDic.sugges
1d30: 74 28 73 57 6f 72 64 2c 20 6e 53 75 67 67 4c 69  t(sWord, nSuggLi
1d40: 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mit);.        }.
1d50: 20 20 20 20 7d 0a 0a 20 20 20 20 2a 20 73 65 6c      }..    * sel
1d60: 65 63 74 20 28 73 46 6c 65 78 50 61 74 74 65 72  ect (sFlexPatter
1d70: 6e 3d 22 22 2c 20 73 54 61 67 73 50 61 74 74 65  n="", sTagsPatte
1d80: 72 6e 3d 22 22 29 20 7b 0a 20 20 20 20 20 20 20  rn="") {.       
1d90: 20 2f 2f 20 67 65 6e 65 72 61 74 6f 72 3a 20 72   // generator: r
1da0: 65 74 75 72 6e 73 20 61 6c 6c 20 65 6e 74 72 69  eturns all entri
1db0: 65 73 20 77 68 69 63 68 20 66 6c 65 78 69 6f 6e  es which flexion
1dc0: 20 66 69 74 73 20 3c 73 46 6c 65 78 50 61 74 74   fits <sFlexPatt
1dd0: 65 72 6e 3e 20 61 6e 64 20 6d 6f 72 70 68 6f 6c  ern> and morphol
1de0: 6f 67 79 20 66 69 74 73 20 3c 73 54 61 67 73 50  ogy fits <sTagsP
1df0: 61 74 74 65 72 6e 3e 0a 20 20 20 20 20 20 20 20  attern>.        
1e00: 79 69 65 6c 64 2a 20 74 68 69 73 2e 6f 4d 61 69  yield* this.oMai
1e10: 6e 44 69 63 2e 73 65 6c 65 63 74 28 73 46 6c 65  nDic.select(sFle
1e20: 78 50 61 74 74 65 72 6e 2c 20 73 54 61 67 73 50  xPattern, sTagsP
1e30: 61 74 74 65 72 6e 29 0a 20 20 20 20 20 20 20 20  attern).        
1e40: 69 66 20 28 74 68 69 73 2e 62 45 78 74 65 6e 64  if (this.bExtend
1e50: 65 64 44 69 63 29 20 7b 0a 20 20 20 20 20 20 20  edDic) {.       
1e60: 20 20 20 20 20 79 69 65 6c 64 2a 20 74 68 69 73       yield* this
1e70: 2e 6f 45 78 74 65 6e 64 65 64 44 69 63 2e 73 65  .oExtendedDic.se
1e80: 6c 65 63 74 28 73 46 6c 65 78 50 61 74 74 65 72  lect(sFlexPatter
1e90: 6e 2c 20 73 54 61 67 73 50 61 74 74 65 72 6e 29  n, sTagsPattern)
1ea0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1eb0: 20 20 20 20 69 66 20 28 74 68 69 73 2e 62 43 6f      if (this.bCo
1ec0: 6d 6d 75 6e 69 74 79 44 69 63 29 20 7b 0a 20 20  mmunityDic) {.  
1ed0: 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 2a            yield*
1ee0: 20 74 68 69 73 2e 6f 43 6f 6d 6d 75 6e 69 74 79   this.oCommunity
1ef0: 44 69 63 2e 73 65 6c 65 63 74 28 73 46 6c 65 78  Dic.select(sFlex
1f00: 50 61 74 74 65 72 6e 2c 20 73 54 61 67 73 50 61  Pattern, sTagsPa
1f10: 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20  ttern);.        
1f20: 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 74 68  }.        if (th
1f30: 69 73 2e 62 50 65 72 73 6f 6e 61 6c 44 69 63 29  is.bPersonalDic)
1f40: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 79   {.            y
1f50: 69 65 6c 64 2a 20 74 68 69 73 2e 6f 50 65 72 73  ield* this.oPers
1f60: 6f 6e 61 6c 44 69 63 2e 73 65 6c 65 63 74 28 73  onalDic.select(s
1f70: 46 6c 65 78 50 61 74 74 65 72 6e 2c 20 73 54 61  FlexPattern, sTa
1f80: 67 73 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20  gsPattern);.    
1f90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1fa0: 20 67 65 74 53 69 6d 69 6c 61 72 45 6e 74 72 69   getSimilarEntri
1fb0: 65 73 20 28 73 57 6f 72 64 2c 20 6e 53 75 67 67  es (sWord, nSugg
1fc0: 4c 69 6d 69 74 3d 31 30 29 20 7b 0a 20 20 20 20  Limit=10) {.    
1fd0: 20 20 20 20 2f 2f 20 72 65 74 75 72 6e 20 61 20      // return a 
1fe0: 6c 69 73 74 20 6f 66 20 74 75 70 6c 65 73 20 28  list of tuples (
1ff0: 73 69 6d 69 6c 61 72 20 77 6f 72 64 2c 20 73 74  similar word, st
2000: 65 6d 2c 20 6d 6f 72 70 68 6f 6c 6f 67 79 29 0a  em, morphology).
2010: 20 20 20 20 20 20 20 20 6c 65 74 20 6c 52 65 73          let lRes
2020: 75 6c 74 20 3d 20 74 68 69 73 2e 6f 4d 61 69 6e  ult = this.oMain
2030: 44 69 63 2e 67 65 74 53 69 6d 69 6c 61 72 45 6e  Dic.getSimilarEn
2040: 74 72 69 65 73 28 73 57 6f 72 64 2c 20 6e 53 75  tries(sWord, nSu
2050: 67 67 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  ggLimit);.      
2060: 20 20 69 66 20 28 74 68 69 73 2e 62 45 78 74 65    if (this.bExte
2070: 6e 64 65 64 44 69 63 29 20 7b 0a 20 20 20 20 20  ndedDic) {.     
2080: 20 20 20 20 20 20 20 6c 52 65 73 75 6c 74 2e 70         lResult.p
2090: 75 73 68 28 2e 2e 2e 74 68 69 73 2e 6f 45 78 74  ush(...this.oExt
20a0: 65 6e 64 65 64 44 69 63 2e 67 65 74 53 69 6d 69  endedDic.getSimi
20b0: 6c 61 72 45 6e 74 72 69 65 73 28 73 57 6f 72 64  larEntries(sWord
20c0: 2c 20 6e 53 75 67 67 4c 69 6d 69 74 29 29 3b 0a  , nSuggLimit));.
20d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20e0: 20 20 69 66 20 28 74 68 69 73 2e 62 43 6f 6d 6d    if (this.bComm
20f0: 75 6e 69 74 79 44 69 63 29 20 7b 0a 20 20 20 20  unityDic) {.    
2100: 20 20 20 20 20 20 20 20 6c 52 65 73 75 6c 74 2e          lResult.
2110: 70 75 73 68 28 2e 2e 2e 74 68 69 73 2e 6f 43 6f  push(...this.oCo
2120: 6d 6d 75 6e 69 74 79 44 69 63 2e 67 65 74 53 69  mmunityDic.getSi
2130: 6d 69 6c 61 72 45 6e 74 72 69 65 73 28 73 57 6f  milarEntries(sWo
2140: 72 64 2c 20 6e 53 75 67 67 4c 69 6d 69 74 29 29  rd, nSuggLimit))
2150: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2160: 20 20 20 20 69 66 20 28 74 68 69 73 2e 62 50 65      if (this.bPe
2170: 72 73 6f 6e 61 6c 44 69 63 29 20 7b 0a 20 20 20  rsonalDic) {.   
2180: 20 20 20 20 20 20 20 20 20 6c 52 65 73 75 6c 74           lResult
2190: 2e 70 75 73 68 28 2e 2e 2e 74 68 69 73 2e 6f 50  .push(...this.oP
21a0: 65 72 73 6f 6e 61 6c 44 69 63 2e 67 65 74 53 69  ersonalDic.getSi
21b0: 6d 69 6c 61 72 45 6e 74 72 69 65 73 28 73 57 6f  milarEntries(sWo
21c0: 72 64 2c 20 6e 53 75 67 67 4c 69 6d 69 74 29 29  rd, nSuggLimit))
21d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21e0: 20 20 20 20 72 65 74 75 72 6e 20 6c 52 65 73 75      return lResu
21f0: 6c 74 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 69 66 20  lt;.    }.}..if 
2200: 28 74 79 70 65 6f 66 28 65 78 70 6f 72 74 73 29  (typeof(exports)
2210: 20 21 3d 3d 20 27 75 6e 64 65 66 69 6e 65 64 27   !== 'undefined'
2220: 29 20 7b 0a 20 20 20 20 65 78 70 6f 72 74 73 2e  ) {.    exports.
2230: 53 70 65 6c 6c 43 68 65 63 6b 65 72 20 3d 20 53  SpellChecker = S
2240: 70 65 6c 6c 43 68 65 63 6b 65 72 3b 0a 7d 0a     pellChecker;.}.