Grammalecte  Hex Artifact Content

Artifact c3e17d2693e258d5dbd1d76b6e1b3cbf3654878ca75d28e593c9bd18d940320a:


0000: 2f 2f 20 47 72 61 6d 6d 61 72 20 63 68 65 63 6b  // Grammar check
0010: 65 72 20 65 6e 67 69 6e 65 0a 0a 2f 2a 20 6a 73  er engine../* js
0020: 68 69 6e 74 20 65 73 76 65 72 73 69 6f 6e 3a 36  hint esversion:6
0030: 2c 20 2d 57 30 39 37 20 2a 2f 0a 2f 2a 20 6a 73  , -W097 */./* js
0040: 6c 69 6e 74 20 65 73 76 65 72 73 69 6f 6e 3a 36  lint esversion:6
0050: 20 2a 2f 0a 2f 2a 20 67 6c 6f 62 61 6c 20 72 65   */./* global re
0060: 71 75 69 72 65 2c 20 65 78 70 6f 72 74 73 2c 20  quire, exports, 
0070: 63 6f 6e 73 6f 6c 65 20 2a 2f 0a 0a 22 75 73 65  console */.."use
0080: 20 73 74 72 69 63 74 22 3b 0a 0a 24 7b 73 74 72   strict";..${str
0090: 69 6e 67 7d 0a 24 7b 72 65 67 65 78 7d 0a 24 7b  ing}.${regex}.${
00a0: 6d 61 70 7d 0a 0a 0a 69 66 20 28 74 79 70 65 6f  map}...if (typeo
00b0: 66 28 70 72 6f 63 65 73 73 29 20 21 3d 3d 20 27  f(process) !== '
00c0: 75 6e 64 65 66 69 6e 65 64 27 29 20 7b 0a 20 20  undefined') {.  
00d0: 20 20 76 61 72 20 67 63 5f 65 6e 67 69 6e 65 5f    var gc_engine_
00e0: 66 75 6e 63 20 3d 20 72 65 71 75 69 72 65 28 22  func = require("
00f0: 2e 2f 67 63 5f 65 6e 67 69 6e 65 5f 66 75 6e 63  ./gc_engine_func
0100: 2e 6a 73 22 29 3b 0a 20 20 20 20 76 61 72 20 67  .js");.    var g
0110: 63 5f 6f 70 74 69 6f 6e 73 20 3d 20 72 65 71 75  c_options = requ
0120: 69 72 65 28 22 2e 2f 67 63 5f 6f 70 74 69 6f 6e  ire("./gc_option
0130: 73 2e 6a 73 22 29 3b 0a 20 20 20 20 76 61 72 20  s.js");.    var 
0140: 67 63 5f 72 75 6c 65 73 20 3d 20 72 65 71 75 69  gc_rules = requi
0150: 72 65 28 22 2e 2f 67 63 5f 72 75 6c 65 73 2e 6a  re("./gc_rules.j
0160: 73 22 29 3b 0a 20 20 20 20 76 61 72 20 67 63 5f  s");.    var gc_
0170: 72 75 6c 65 73 5f 67 72 61 70 68 20 3d 20 72 65  rules_graph = re
0180: 71 75 69 72 65 28 22 2e 2f 67 63 5f 72 75 6c 65  quire("./gc_rule
0190: 73 5f 67 72 61 70 68 2e 6a 73 22 29 3b 0a 20 20  s_graph.js");.  
01a0: 20 20 76 61 72 20 63 72 65 67 65 78 20 3d 20 72    var cregex = r
01b0: 65 71 75 69 72 65 28 22 2e 2f 63 72 65 67 65 78  equire("./cregex
01c0: 2e 6a 73 22 29 3b 0a 20 20 20 20 76 61 72 20 74  .js");.    var t
01d0: 65 78 74 20 3d 20 72 65 71 75 69 72 65 28 22 2e  ext = require(".
01e0: 2e 2f 74 65 78 74 2e 6a 73 22 29 3b 0a 7d 0a 65  ./text.js");.}.e
01f0: 6c 73 65 20 69 66 20 28 74 79 70 65 6f 66 28 72  lse if (typeof(r
0200: 65 71 75 69 72 65 29 20 21 3d 3d 20 27 75 6e 64  equire) !== 'und
0210: 65 66 69 6e 65 64 27 29 20 7b 0a 20 20 20 20 76  efined') {.    v
0220: 61 72 20 67 63 5f 65 6e 67 69 6e 65 5f 66 75 6e  ar gc_engine_fun
0230: 63 20 3d 20 72 65 71 75 69 72 65 28 22 72 65 73  c = require("res
0240: 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65  ource://grammale
0250: 63 74 65 2f 24 7b 6c 61 6e 67 7d 2f 67 63 5f 65  cte/${lang}/gc_e
0260: 6e 67 69 6e 65 5f 66 75 6e 63 2e 6a 73 22 29 3b  ngine_func.js");
0270: 0a 20 20 20 20 76 61 72 20 67 63 5f 6f 70 74 69  .    var gc_opti
0280: 6f 6e 73 20 3d 20 72 65 71 75 69 72 65 28 22 72  ons = require("r
0290: 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d 61  esource://gramma
02a0: 6c 65 63 74 65 2f 24 7b 6c 61 6e 67 7d 2f 67 63  lecte/${lang}/gc
02b0: 5f 6f 70 74 69 6f 6e 73 2e 6a 73 22 29 3b 0a 20  _options.js");. 
02c0: 20 20 20 76 61 72 20 67 63 5f 72 75 6c 65 73 20     var gc_rules 
02d0: 3d 20 72 65 71 75 69 72 65 28 22 72 65 73 6f 75  = require("resou
02e0: 72 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74  rce://grammalect
02f0: 65 2f 24 7b 6c 61 6e 67 7d 2f 67 63 5f 72 75 6c  e/${lang}/gc_rul
0300: 65 73 2e 6a 73 22 29 3b 0a 20 20 20 20 76 61 72  es.js");.    var
0310: 20 67 63 5f 72 75 6c 65 73 5f 67 72 61 70 68 20   gc_rules_graph 
0320: 3d 20 72 65 71 75 69 72 65 28 22 72 65 73 6f 75  = require("resou
0330: 72 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74  rce://grammalect
0340: 65 2f 24 7b 6c 61 6e 67 7d 2f 67 63 5f 72 75 6c  e/${lang}/gc_rul
0350: 65 73 5f 67 72 61 70 68 2e 6a 73 22 29 3b 0a 20  es_graph.js");. 
0360: 20 20 20 76 61 72 20 63 72 65 67 65 78 20 3d 20     var cregex = 
0370: 72 65 71 75 69 72 65 28 22 72 65 73 6f 75 72 63  require("resourc
0380: 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74 65 2f  e://grammalecte/
0390: 24 7b 6c 61 6e 67 7d 2f 63 72 65 67 65 78 2e 6a  ${lang}/cregex.j
03a0: 73 22 29 3b 0a 20 20 20 20 76 61 72 20 74 65 78  s");.    var tex
03b0: 74 20 3d 20 72 65 71 75 69 72 65 28 22 72 65 73  t = require("res
03c0: 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65  ource://grammale
03d0: 63 74 65 2f 74 65 78 74 2e 6a 73 22 29 3b 0a 7d  cte/text.js");.}
03e0: 0a 0a 0a 66 75 6e 63 74 69 6f 6e 20 63 61 70 69  ...function capi
03f0: 74 61 6c 69 7a 65 41 72 72 61 79 20 28 61 41 72  talizeArray (aAr
0400: 72 61 79 29 20 7b 0a 20 20 20 20 2f 2f 20 63 61  ray) {.    // ca
0410: 6e e2 80 99 74 20 6d 61 70 20 6f 6e 20 75 73 65  n...t map on use
0420: 72 20 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r defined functi
0430: 6f 6e 3f 3f 0a 20 20 20 20 6c 65 74 20 61 4e 65  on??.    let aNe
0440: 77 20 3d 20 5b 5d 3b 0a 20 20 20 20 66 6f 72 20  w = [];.    for 
0450: 28 6c 65 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (let i = 0; i < 
0460: 61 41 72 72 61 79 2e 6c 65 6e 67 74 68 3b 20 69  aArray.length; i
0470: 20 3d 20 69 20 2b 20 31 29 20 7b 0a 20 20 20 20   = i + 1) {.    
0480: 20 20 20 20 61 4e 65 77 5b 69 5d 20 3d 20 61 41      aNew[i] = aA
0490: 72 72 61 79 5b 69 5d 2e 73 6c 69 63 65 28 30 2c  rray[i].slice(0,
04a0: 31 29 2e 74 6f 55 70 70 65 72 43 61 73 65 28 29  1).toUpperCase()
04b0: 20 2b 20 61 41 72 72 61 79 5b 69 5d 2e 73 6c 69   + aArray[i].sli
04c0: 63 65 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ce(1);.    }.   
04d0: 20 72 65 74 75 72 6e 20 61 4e 65 77 3b 0a 7d 0a   return aNew;.}.
04e0: 0a 0a 76 61 72 20 67 63 5f 65 6e 67 69 6e 65 20  ..var gc_engine 
04f0: 3d 20 7b 0a 0a 20 20 20 20 2f 2f 2f 2f 20 49 6e  = {..    //// In
0500: 66 6f 72 6d 61 74 69 6f 6e 73 0a 0a 20 20 20 20  formations..    
0510: 6c 61 6e 67 3a 20 22 24 7b 6c 61 6e 67 7d 22 2c  lang: "${lang}",
0520: 0a 20 20 20 20 6c 6f 63 61 6c 65 73 3a 20 24 7b  .    locales: ${
0530: 6c 6f 63 7d 2c 0a 20 20 20 20 70 6b 67 3a 20 22  loc},.    pkg: "
0540: 24 7b 69 6d 70 6c 6e 61 6d 65 7d 22 2c 0a 20 20  ${implname}",.  
0550: 20 20 6e 61 6d 65 3a 20 22 24 7b 6e 61 6d 65 7d    name: "${name}
0560: 22 2c 0a 20 20 20 20 76 65 72 73 69 6f 6e 3a 20  ",.    version: 
0570: 22 24 7b 76 65 72 73 69 6f 6e 7d 22 2c 0a 20 20  "${version}",.  
0580: 20 20 61 75 74 68 6f 72 3a 20 22 24 7b 61 75 74    author: "${aut
0590: 68 6f 72 7d 22 2c 0a 0a 20 20 20 20 2f 2f 2f 2f  hor}",..    ////
05a0: 20 54 6f 6f 6c 73 0a 20 20 20 20 6f 53 70 65 6c   Tools.    oSpel
05b0: 6c 43 68 65 63 6b 65 72 3a 20 6e 75 6c 6c 2c 0a  lChecker: null,.
05c0: 20 20 20 20 6f 54 6f 6b 65 6e 69 7a 65 72 3a 20      oTokenizer: 
05d0: 6e 75 6c 6c 2c 0a 0a 20 20 20 20 2f 2f 2f 2f 20  null,..    //// 
05e0: 44 61 74 61 0a 20 20 20 20 61 49 67 6e 6f 72 65  Data.    aIgnore
05f0: 64 52 75 6c 65 73 3a 20 6e 65 77 20 53 65 74 28  dRules: new Set(
0600: 29 2c 0a 20 20 20 20 6f 4f 70 74 69 6f 6e 73 43  ),.    oOptionsC
0610: 6f 6c 6f 72 73 3a 20 6e 75 6c 6c 2c 0a 0a 20 20  olors: null,..  
0620: 20 20 2f 2f 2f 2f 20 49 6e 69 74 69 61 6c 69 7a    //// Initializ
0630: 61 74 69 6f 6e 0a 0a 20 20 20 20 6c 6f 61 64 3a  ation..    load:
0640: 20 66 75 6e 63 74 69 6f 6e 20 28 73 43 6f 6e 74   function (sCont
0650: 65 78 74 3d 22 4a 61 76 61 53 63 72 69 70 74 22  ext="JavaScript"
0660: 2c 20 73 43 6f 6c 6f 72 54 79 70 65 3d 22 61 52  , sColorType="aR
0670: 47 42 22 2c 20 73 50 61 74 68 3d 22 22 29 20 7b  GB", sPath="") {
0680: 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20  .        try {. 
0690: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74             if (t
06a0: 79 70 65 6f 66 28 70 72 6f 63 65 73 73 29 20 21  ypeof(process) !
06b0: 3d 3d 20 27 75 6e 64 65 66 69 6e 65 64 27 29 20  == 'undefined') 
06c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
06d0: 20 20 76 61 72 20 73 70 65 6c 6c 63 68 65 63 6b    var spellcheck
06e0: 65 72 20 3d 20 72 65 71 75 69 72 65 28 22 2e 2e  er = require("..
06f0: 2f 67 72 61 70 68 73 70 65 6c 6c 2f 73 70 65 6c  /graphspell/spel
0700: 6c 63 68 65 63 6b 65 72 2e 6a 73 22 29 3b 0a 20  lchecker.js");. 
0710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
0720: 68 69 73 2e 6f 53 70 65 6c 6c 43 68 65 63 6b 65  his.oSpellChecke
0730: 72 20 3d 20 6e 65 77 20 73 70 65 6c 6c 63 68 65  r = new spellche
0740: 63 6b 65 72 2e 53 70 65 6c 6c 43 68 65 63 6b 65  cker.SpellChecke
0750: 72 28 22 24 7b 6c 61 6e 67 7d 22 2c 20 22 22 2c  r("${lang}", "",
0760: 20 22 24 7b 64 69 63 5f 6d 61 69 6e 5f 66 69 6c   "${dic_main_fil
0770: 65 6e 61 6d 65 5f 6a 73 7d 22 2c 20 22 24 7b 64  ename_js}", "${d
0780: 69 63 5f 63 6f 6d 6d 75 6e 69 74 79 5f 66 69 6c  ic_community_fil
0790: 65 6e 61 6d 65 5f 6a 73 7d 22 2c 20 22 24 7b 64  ename_js}", "${d
07a0: 69 63 5f 70 65 72 73 6f 6e 61 6c 5f 66 69 6c 65  ic_personal_file
07b0: 6e 61 6d 65 5f 6a 73 7d 22 29 3b 0a 20 20 20 20  name_js}");.    
07c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
07d0: 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 74        else if (t
07e0: 79 70 65 6f 66 28 72 65 71 75 69 72 65 29 20 21  ypeof(require) !
07f0: 3d 3d 20 27 75 6e 64 65 66 69 6e 65 64 27 29 20  == 'undefined') 
0800: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
0810: 20 20 76 61 72 20 73 70 65 6c 6c 63 68 65 63 6b    var spellcheck
0820: 65 72 20 3d 20 72 65 71 75 69 72 65 28 22 72 65  er = require("re
0830: 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c  source://grammal
0840: 65 63 74 65 2f 67 72 61 70 68 73 70 65 6c 6c 2f  ecte/graphspell/
0850: 73 70 65 6c 6c 63 68 65 63 6b 65 72 2e 6a 73 22  spellchecker.js"
0860: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
0870: 20 20 20 74 68 69 73 2e 6f 53 70 65 6c 6c 43 68     this.oSpellCh
0880: 65 63 6b 65 72 20 3d 20 6e 65 77 20 73 70 65 6c  ecker = new spel
0890: 6c 63 68 65 63 6b 65 72 2e 53 70 65 6c 6c 43 68  lchecker.SpellCh
08a0: 65 63 6b 65 72 28 22 24 7b 6c 61 6e 67 7d 22 2c  ecker("${lang}",
08b0: 20 22 22 2c 20 22 24 7b 64 69 63 5f 6d 61 69 6e   "", "${dic_main
08c0: 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 7d 22 2c 20  _filename_js}", 
08d0: 22 24 7b 64 69 63 5f 63 6f 6d 6d 75 6e 69 74 79  "${dic_community
08e0: 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 7d 22 2c 20  _filename_js}", 
08f0: 22 24 7b 64 69 63 5f 70 65 72 73 6f 6e 61 6c 5f  "${dic_personal_
0900: 66 69 6c 65 6e 61 6d 65 5f 6a 73 7d 22 29 3b 0a  filename_js}");.
0910: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
0920: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 7b            else {
0930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0940: 20 74 68 69 73 2e 6f 53 70 65 6c 6c 43 68 65 63   this.oSpellChec
0950: 6b 65 72 20 3d 20 6e 65 77 20 53 70 65 6c 6c 43  ker = new SpellC
0960: 68 65 63 6b 65 72 28 22 24 7b 6c 61 6e 67 7d 22  hecker("${lang}"
0970: 2c 20 73 50 61 74 68 2c 20 22 24 7b 64 69 63 5f  , sPath, "${dic_
0980: 6d 61 69 6e 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73  main_filename_js
0990: 7d 22 2c 20 22 24 7b 64 69 63 5f 63 6f 6d 6d 75  }", "${dic_commu
09a0: 6e 69 74 79 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73  nity_filename_js
09b0: 7d 22 2c 20 22 24 7b 64 69 63 5f 70 65 72 73 6f  }", "${dic_perso
09c0: 6e 61 6c 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 7d  nal_filename_js}
09d0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
09e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68  }.            th
09f0: 69 73 2e 6f 4f 70 74 69 6f 6e 73 43 6f 6c 6f 72  is.oOptionsColor
0a00: 73 20 3d 20 67 63 5f 6f 70 74 69 6f 6e 73 2e 67  s = gc_options.g
0a10: 65 74 4f 70 74 69 6f 6e 73 43 6f 6c 6f 72 73 28  etOptionsColors(
0a20: 73 43 6f 6e 74 65 78 74 2c 20 73 43 6f 6c 6f 72  sContext, sColor
0a30: 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Type);.         
0a40: 20 20 20 74 68 69 73 2e 6f 54 6f 6b 65 6e 69 7a     this.oTokeniz
0a50: 65 72 20 3d 20 74 68 69 73 2e 6f 53 70 65 6c 6c  er = this.oSpell
0a60: 43 68 65 63 6b 65 72 2e 67 65 74 54 6f 6b 65 6e  Checker.getToken
0a70: 69 7a 65 72 28 29 3b 0a 20 20 20 20 20 20 20 20  izer();.        
0a80: 20 20 20 20 74 68 69 73 2e 6f 53 70 65 6c 6c 43      this.oSpellC
0a90: 68 65 63 6b 65 72 2e 61 63 74 69 76 61 74 65 53  hecker.activateS
0aa0: 74 6f 72 61 67 65 28 29 3b 0a 20 20 20 20 20 20  torage();.      
0ab0: 20 20 20 20 20 20 67 63 5f 65 6e 67 69 6e 65 5f        gc_engine_
0ac0: 66 75 6e 63 2e 6c 6f 61 64 28 73 43 6f 6e 74 65  func.load(sConte
0ad0: 78 74 2c 20 74 68 69 73 2e 6f 53 70 65 6c 6c 43  xt, this.oSpellC
0ae0: 68 65 63 6b 65 72 29 3b 0a 20 20 20 20 20 20 20  hecker);.       
0af0: 20 20 20 20 20 67 63 5f 6f 70 74 69 6f 6e 73 2e       gc_options.
0b00: 6c 6f 61 64 28 73 43 6f 6e 74 65 78 74 29 3b 0a  load(sContext);.
0b10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0b20: 20 20 63 61 74 63 68 20 28 65 29 20 7b 0a 20 20    catch (e) {.  
0b30: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
0b40: 65 2e 65 72 72 6f 72 28 65 29 3b 0a 20 20 20 20  e.error(e);.    
0b50: 20 20 20 20 7d 0a 20 20 20 20 7d 2c 0a 0a 20 20      }.    },..  
0b60: 20 20 67 65 74 53 70 65 6c 6c 43 68 65 63 6b 65    getSpellChecke
0b70: 72 3a 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b  r: function () {
0b80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0b90: 74 68 69 73 2e 6f 53 70 65 6c 6c 43 68 65 63 6b  this.oSpellCheck
0ba0: 65 72 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20  er;.    },..    
0bb0: 2f 2f 2f 2f 20 52 75 6c 65 73 0a 0a 20 20 20 20  //// Rules..    
0bc0: 67 65 74 52 75 6c 65 73 3a 20 66 75 6e 63 74 69  getRules: functi
0bd0: 6f 6e 20 28 62 50 61 72 61 67 72 61 70 68 29 20  on (bParagraph) 
0be0: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 62  {.        if (!b
0bf0: 50 61 72 61 67 72 61 70 68 29 20 7b 0a 20 20 20  Paragraph) {.   
0c00: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0c10: 67 63 5f 72 75 6c 65 73 2e 6c 53 65 6e 74 65 6e  gc_rules.lSenten
0c20: 63 65 52 75 6c 65 73 3b 0a 20 20 20 20 20 20 20  ceRules;.       
0c30: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
0c40: 6e 20 67 63 5f 72 75 6c 65 73 2e 6c 50 61 72 61  n gc_rules.lPara
0c50: 67 72 61 70 68 52 75 6c 65 73 3b 0a 20 20 20 20  graphRules;.    
0c60: 7d 2c 0a 0a 20 20 20 20 69 67 6e 6f 72 65 52 75  },..    ignoreRu
0c70: 6c 65 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73 52  le: function (sR
0c80: 75 6c 65 49 64 29 20 7b 0a 20 20 20 20 20 20 20  uleId) {.       
0c90: 20 74 68 69 73 2e 61 49 67 6e 6f 72 65 64 52 75   this.aIgnoredRu
0ca0: 6c 65 73 2e 61 64 64 28 73 52 75 6c 65 49 64 29  les.add(sRuleId)
0cb0: 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 72 65  ;.    },..    re
0cc0: 73 65 74 49 67 6e 6f 72 65 52 75 6c 65 73 3a 20  setIgnoreRules: 
0cd0: 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20  function () {.  
0ce0: 20 20 20 20 20 20 74 68 69 73 2e 61 49 67 6e 6f        this.aIgno
0cf0: 72 65 64 52 75 6c 65 73 2e 63 6c 65 61 72 28 29  redRules.clear()
0d00: 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 72 65  ;.    },..    re
0d10: 61 63 74 69 76 61 74 65 52 75 6c 65 3a 20 66 75  activateRule: fu
0d20: 6e 63 74 69 6f 6e 20 28 73 52 75 6c 65 49 64 29  nction (sRuleId)
0d30: 20 7b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e   {.        this.
0d40: 61 49 67 6e 6f 72 65 64 52 75 6c 65 73 2e 64 65  aIgnoredRules.de
0d50: 6c 65 74 65 28 73 52 75 6c 65 49 64 29 3b 0a 20  lete(sRuleId);. 
0d60: 20 20 20 7d 2c 0a 0a 20 20 20 20 6c 69 73 74 52     },..    listR
0d70: 75 6c 65 73 3a 20 66 75 6e 63 74 69 6f 6e 2a 20  ules: function* 
0d80: 28 73 46 69 6c 74 65 72 3d 6e 75 6c 6c 29 20 7b  (sFilter=null) {
0d90: 0a 20 20 20 20 20 20 20 20 2f 2f 20 67 65 6e 65  .        // gene
0da0: 72 61 74 6f 72 3a 20 72 65 74 75 72 6e 73 20 74  rator: returns t
0db0: 75 70 6c 65 20 28 73 4f 70 74 69 6f 6e 2c 20 73  uple (sOption, s
0dc0: 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65 49 64 29  LineId, sRuleId)
0dd0: 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20  .        try {. 
0de0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
0df0: 6c 65 74 20 5b 73 4f 70 74 69 6f 6e 2c 20 6c 52  let [sOption, lR
0e00: 75 6c 65 47 72 6f 75 70 5d 20 6f 66 20 74 68 69  uleGroup] of thi
0e10: 73 2e 67 65 74 52 75 6c 65 73 28 74 72 75 65 29  s.getRules(true)
0e20: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0e30: 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 2c 2c      for (let [,,
0e40: 20 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65 49   sLineId, sRuleI
0e50: 64 2c 2c 5d 20 6f 66 20 6c 52 75 6c 65 47 72 6f  d,,] of lRuleGro
0e60: 75 70 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  up) {.          
0e70: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73            if (!s
0e80: 46 69 6c 74 65 72 20 7c 7c 20 73 52 75 6c 65 49  Filter || sRuleI
0e90: 64 2e 74 65 73 74 28 73 46 69 6c 74 65 72 29 29  d.test(sFilter))
0ea0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
0eb0: 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64             yield
0ec0: 20 5b 73 4f 70 74 69 6f 6e 2c 20 73 4c 69 6e 65   [sOption, sLine
0ed0: 49 64 2c 20 73 52 75 6c 65 49 64 5d 3b 0a 20 20  Id, sRuleId];.  
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ef0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
0f00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
0f10: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
0f20: 66 6f 72 20 28 6c 65 74 20 5b 73 4f 70 74 69 6f  for (let [sOptio
0f30: 6e 2c 20 6c 52 75 6c 65 47 72 6f 75 70 5d 20 6f  n, lRuleGroup] o
0f40: 66 20 74 68 69 73 2e 67 65 74 52 75 6c 65 73 28  f this.getRules(
0f50: 66 61 6c 73 65 29 29 20 7b 0a 20 20 20 20 20 20  false)) {.      
0f60: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c            for (l
0f70: 65 74 20 5b 2c 2c 20 73 4c 69 6e 65 49 64 2c 20  et [,, sLineId, 
0f80: 73 52 75 6c 65 49 64 2c 2c 5d 20 6f 66 20 6c 52  sRuleId,,] of lR
0f90: 75 6c 65 47 72 6f 75 70 29 20 7b 0a 20 20 20 20  uleGroup) {.    
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 69 66 20 28 21 73 46 69 6c 74 65 72 20 7c 7c 20  if (!sFilter || 
0fc0: 73 52 75 6c 65 49 64 2e 74 65 73 74 28 73 46 69  sRuleId.test(sFi
0fd0: 6c 74 65 72 29 29 20 7b 0a 20 20 20 20 20 20 20  lter)) {.       
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ff0: 20 79 69 65 6c 64 20 5b 73 4f 70 74 69 6f 6e 2c   yield [sOption,
1000: 20 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65 49   sLineId, sRuleI
1010: 64 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d];.            
1020: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1030: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1040: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1050: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 74 63    }.        catc
1060: 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20  h (e) {.        
1070: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f      console.erro
1080: 72 28 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  r(e);.        }.
1090: 20 20 20 20 7d 2c 0a 0a 20 20 20 20 2f 2f 2f 2f      },..    ////
10a0: 20 50 61 72 73 69 6e 67 0a 0a 20 20 20 20 70 61   Parsing..    pa
10b0: 72 73 65 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73  rse: function (s
10c0: 54 65 78 74 2c 20 73 43 6f 75 6e 74 72 79 3d 22  Text, sCountry="
10d0: 24 7b 63 6f 75 6e 74 72 79 5f 64 65 66 61 75 6c  ${country_defaul
10e0: 74 7d 22 2c 20 62 44 65 62 75 67 3d 66 61 6c 73  t}", bDebug=fals
10f0: 65 2c 20 64 4f 70 74 69 6f 6e 73 3d 6e 75 6c 6c  e, dOptions=null
1100: 2c 20 62 43 6f 6e 74 65 78 74 3d 66 61 6c 73 65  , bContext=false
1110: 2c 20 62 46 75 6c 6c 49 6e 66 6f 3d 66 61 6c 73  , bFullInfo=fals
1120: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20  e) {.        // 
1130: 69 6e 69 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  init point to an
1140: 61 6c 79 73 65 20 3c 73 54 65 78 74 3e 20 61 6e  alyse <sText> an
1150: 64 20 72 65 74 75 72 6e 73 20 61 6e 20 69 74 65  d returns an ite
1160: 72 61 62 6c 65 20 6f 66 20 65 72 72 6f 72 73 20  rable of errors 
1170: 6f 72 20 28 77 69 74 68 20 6f 70 74 69 6f 6e 20  or (with option 
1180: 3c 62 46 75 6c 6c 49 6e 66 6f 3e 29 20 61 20 6c  <bFullInfo>) a l
1190: 69 73 74 20 6f 66 20 73 65 6e 74 65 6e 63 65 73  ist of sentences
11a0: 20 77 69 74 68 20 74 6f 6b 65 6e 73 20 61 6e 64   with tokens and
11b0: 20 65 72 72 6f 72 73 0a 20 20 20 20 20 20 20 20   errors.        
11c0: 6c 65 74 20 6f 54 65 78 74 20 3d 20 6e 65 77 20  let oText = new 
11d0: 54 65 78 74 50 61 72 73 65 72 28 73 54 65 78 74  TextParser(sText
11e0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
11f0: 6e 20 6f 54 65 78 74 2e 70 61 72 73 65 28 73 43  n oText.parse(sC
1200: 6f 75 6e 74 72 79 2c 20 62 44 65 62 75 67 2c 20  ountry, bDebug, 
1210: 64 4f 70 74 69 6f 6e 73 2c 20 62 43 6f 6e 74 65  dOptions, bConte
1220: 78 74 2c 20 62 46 75 6c 6c 49 6e 66 6f 29 3b 0a  xt, bFullInfo);.
1230: 20 20 20 20 7d 0a 7d 3b 0a 0a 0a 63 6c 61 73 73      }.};...class
1240: 20 54 65 78 74 50 61 72 73 65 72 20 7b 0a 0a 20   TextParser {.. 
1250: 20 20 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 28     constructor (
1260: 73 54 65 78 74 29 20 7b 0a 20 20 20 20 20 20 20  sText) {.       
1270: 20 74 68 69 73 2e 73 54 65 78 74 20 3d 20 73 54   this.sText = sT
1280: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 74 68 69  ext;.        thi
1290: 73 2e 73 54 65 78 74 30 20 3d 20 73 54 65 78 74  s.sText0 = sText
12a0: 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 73  ;.        this.s
12b0: 53 65 6e 74 65 6e 63 65 20 3d 20 22 22 3b 0a 20  Sentence = "";. 
12c0: 20 20 20 20 20 20 20 74 68 69 73 2e 73 53 65 6e         this.sSen
12d0: 74 65 6e 63 65 30 20 3d 20 22 22 3b 0a 20 20 20  tence0 = "";.   
12e0: 20 20 20 20 20 74 68 69 73 2e 6e 4f 66 66 73 65       this.nOffse
12f0: 74 57 69 74 68 69 6e 50 61 72 61 67 72 61 70 68  tWithinParagraph
1300: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 74 68   = 0;.        th
1310: 69 73 2e 6c 54 6f 6b 65 6e 20 3d 20 5b 5d 3b 0a  is.lToken = [];.
1320: 20 20 20 20 20 20 20 20 74 68 69 73 2e 64 54 6f          this.dTo
1330: 6b 65 6e 50 6f 73 20 3d 20 6e 65 77 20 4d 61 70  kenPos = new Map
1340: 28 29 3b 20 20 20 20 20 20 20 20 20 2f 2f 20 7b  ();         // {
1350: 70 6f 73 69 74 69 6f 6e 3a 20 74 6f 6b 65 6e 7d  position: token}
1360: 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 64 54  .        this.dT
1370: 61 67 73 20 3d 20 6e 65 77 20 4d 61 70 28 29 3b  ags = new Map();
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
1390: 7b 70 6f 73 69 74 69 6f 6e 3a 20 74 61 67 73 7d  {position: tags}
13a0: 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 64 45  .        this.dE
13b0: 72 72 6f 72 20 3d 20 6e 65 77 20 4d 61 70 28 29  rror = new Map()
13c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  ;            // 
13d0: 7b 70 6f 73 69 74 69 6f 6e 3a 20 65 72 72 6f 72  {position: error
13e0: 7d 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 64  }.        this.d
13f0: 53 65 6e 74 65 6e 63 65 45 72 72 6f 72 20 3d 20  SentenceError = 
1400: 6e 65 77 20 4d 61 70 28 29 3b 20 20 20 20 2f 2f  new Map();    //
1410: 20 7b 70 6f 73 69 74 69 6f 6e 3a 20 65 72 72 6f   {position: erro
1420: 72 7d 20 28 66 6f 72 20 74 68 65 20 63 75 72 72  r} (for the curr
1430: 65 6e 74 20 73 65 6e 74 65 6e 63 65 20 6f 6e 6c  ent sentence onl
1440: 79 29 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e  y).        this.
1450: 64 45 72 72 6f 72 50 72 69 6f 72 69 74 79 20 3d  dErrorPriority =
1460: 20 6e 65 77 20 4d 61 70 28 29 3b 20 20 20 20 2f   new Map();    /
1470: 2f 20 7b 70 6f 73 69 74 69 6f 6e 3a 20 70 72 69  / {position: pri
1480: 6f 72 69 74 79 20 6f 66 20 74 68 65 20 63 75 72  ority of the cur
1490: 72 65 6e 74 20 65 72 72 6f 72 7d 0a 20 20 20 20  rent error}.    
14a0: 7d 0a 0a 20 20 20 20 61 73 53 74 72 69 6e 67 20  }..    asString 
14b0: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74  () {.        let
14c0: 20 73 20 3d 20 22 3d 3d 3d 3d 3d 20 54 45 58 54   s = "===== TEXT
14d0: 20 3d 3d 3d 3d 3d 5c 6e 22 3b 0a 20 20 20 20 20   =====\n";.     
14e0: 20 20 20 73 20 2b 3d 20 22 73 65 6e 74 65 6e 63     s += "sentenc
14f0: 65 3a 20 22 20 2b 20 74 68 69 73 2e 73 53 65 6e  e: " + this.sSen
1500: 74 65 6e 63 65 30 20 2b 20 22 5c 6e 22 3b 0a 20  tence0 + "\n";. 
1510: 20 20 20 20 20 20 20 73 20 2b 3d 20 22 6e 6f 77         s += "now
1520: 3a 20 20 20 20 20 20 22 20 2b 20 74 68 69 73 2e  :      " + this.
1530: 73 53 65 6e 74 65 6e 63 65 20 20 2b 20 22 5c 6e  sSentence  + "\n
1540: 22 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28  ";.        for (
1550: 6c 65 74 20 64 54 6f 6b 65 6e 20 6f 66 20 74 68  let dToken of th
1560: 69 73 2e 6c 54 6f 6b 65 6e 29 20 7b 0a 20 20 20  is.lToken) {.   
1570: 20 20 20 20 20 20 20 20 20 73 20 2b 3d 20 60 23           s += `#
1580: 24 7b 64 54 6f 6b 65 6e 5b 22 69 22 5d 7d 5c 74  ${dToken["i"]}\t
1590: 24 7b 64 54 6f 6b 65 6e 5b 22 6e 53 74 61 72 74  ${dToken["nStart
15a0: 22 5d 7d 3a 24 7b 64 54 6f 6b 65 6e 5b 22 6e 45  "]}:${dToken["nE
15b0: 6e 64 22 5d 7d 5c 74 24 7b 64 54 6f 6b 65 6e 5b  nd"]}\t${dToken[
15c0: 22 73 56 61 6c 75 65 22 5d 7d 5c 74 24 7b 64 54  "sValue"]}\t${dT
15d0: 6f 6b 65 6e 5b 22 73 54 79 70 65 22 5d 7d 60 3b  oken["sType"]}`;
15e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
15f0: 28 64 54 6f 6b 65 6e 2e 68 61 73 4f 77 6e 50 72  (dToken.hasOwnPr
1600: 6f 70 65 72 74 79 28 22 6c 4d 6f 72 70 68 22 29  operty("lMorph")
1610: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
1620: 20 20 20 20 73 20 2b 3d 20 22 5c 74 22 20 2b 20      s += "\t" + 
1630: 64 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d  dToken["lMorph"]
1640: 2e 74 6f 53 74 72 69 6e 67 28 29 3b 0a 20 20 20  .toString();.   
1650: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1660: 20 20 20 20 20 20 20 69 66 20 28 64 54 6f 6b 65         if (dToke
1670: 6e 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79  n.hasOwnProperty
1680: 28 22 61 54 61 67 73 22 29 29 20 7b 0a 20 20 20  ("aTags")) {.   
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 20 2b               s +
16a0: 3d 20 22 5c 74 22 20 2b 20 64 54 6f 6b 65 6e 5b  = "\t" + dToken[
16b0: 22 61 54 61 67 73 22 5d 2e 74 6f 53 74 72 69 6e  "aTags"].toStrin
16c0: 67 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  g();.           
16d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
16e0: 20 2b 3d 20 22 5c 6e 22 3b 0a 20 20 20 20 20 20   += "\n";.      
16f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
1700: 72 6e 20 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn s;.    }..   
1710: 20 70 61 72 73 65 20 28 73 43 6f 75 6e 74 72 79   parse (sCountry
1720: 3d 22 24 7b 63 6f 75 6e 74 72 79 5f 64 65 66 61  ="${country_defa
1730: 75 6c 74 7d 22 2c 20 62 44 65 62 75 67 3d 66 61  ult}", bDebug=fa
1740: 6c 73 65 2c 20 64 4f 70 74 69 6f 6e 73 3d 6e 75  lse, dOptions=nu
1750: 6c 6c 2c 20 62 43 6f 6e 74 65 78 74 3d 66 61 6c  ll, bContext=fal
1760: 73 65 2c 20 62 46 75 6c 6c 49 6e 66 6f 3d 66 61  se, bFullInfo=fa
1770: 6c 73 65 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  lse) {.        /
1780: 2f 20 61 6e 61 6c 79 73 65 73 20 3c 73 54 65 78  / analyses <sTex
1790: 74 3e 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  t> and returns a
17a0: 6e 20 69 74 65 72 61 62 6c 65 20 6f 66 20 65 72  n iterable of er
17b0: 72 6f 72 73 20 6f 72 20 28 77 69 74 68 20 6f 70  rors or (with op
17c0: 74 69 6f 6e 20 3c 62 46 75 6c 6c 49 6e 66 6f 3e  tion <bFullInfo>
17d0: 29 20 61 20 6c 69 73 74 20 6f 66 20 73 65 6e 74  ) a list of sent
17e0: 65 6e 63 65 73 20 77 69 74 68 20 74 6f 6b 65 6e  ences with token
17f0: 73 20 61 6e 64 20 65 72 72 6f 72 73 0a 20 20 20  s and errors.   
1800: 20 20 20 20 20 6c 65 74 20 64 4f 70 74 20 3d 20       let dOpt = 
1810: 64 4f 70 74 69 6f 6e 73 20 7c 7c 20 67 63 5f 6f  dOptions || gc_o
1820: 70 74 69 6f 6e 73 2e 64 4f 70 74 69 6f 6e 73 3b  ptions.dOptions;
1830: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 62 53 68  .        let bSh
1840: 6f 77 52 75 6c 65 49 64 20 3d 20 67 63 5f 6f 70  owRuleId = gc_op
1850: 74 69 6f 6e 73 2e 64 4f 70 74 69 6f 6e 73 2e 67  tions.dOptions.g
1860: 6c 5f 67 65 74 28 27 69 64 72 75 6c 65 27 2c 20  l_get('idrule', 
1870: 66 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20  false);.        
1880: 2f 2f 20 70 61 72 73 65 20 70 61 72 61 67 72 61  // parse paragra
1890: 70 68 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b  ph.        try {
18a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69  .            thi
18b0: 73 2e 70 61 72 73 65 54 65 78 74 28 74 68 69 73  s.parseText(this
18c0: 2e 73 54 65 78 74 2c 20 74 68 69 73 2e 73 54 65  .sText, this.sTe
18d0: 78 74 30 2c 20 74 72 75 65 2c 20 30 2c 20 73 43  xt0, true, 0, sC
18e0: 6f 75 6e 74 72 79 2c 20 64 4f 70 74 2c 20 62 53  ountry, dOpt, bS
18f0: 68 6f 77 52 75 6c 65 49 64 2c 20 62 44 65 62 75  howRuleId, bDebu
1900: 67 2c 20 62 43 6f 6e 74 65 78 74 29 3b 0a 20 20  g, bContext);.  
1910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1920: 63 61 74 63 68 20 28 65 29 20 7b 0a 20 20 20 20  catch (e) {.    
1930: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
1940: 65 72 72 6f 72 28 65 29 3b 0a 20 20 20 20 20 20  error(e);.      
1950: 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 65 74 20    }.        let 
1960: 6c 50 61 72 61 67 72 61 70 68 45 72 72 6f 72 73  lParagraphErrors
1970: 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20   = null;.       
1980: 20 69 66 20 28 62 46 75 6c 6c 49 6e 66 6f 29 20   if (bFullInfo) 
1990: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 50  {.            lP
19a0: 61 72 61 67 72 61 70 68 45 72 72 6f 72 73 20 3d  aragraphErrors =
19b0: 20 41 72 72 61 79 2e 66 72 6f 6d 28 74 68 69 73   Array.from(this
19c0: 2e 64 45 72 72 6f 72 2e 76 61 6c 75 65 73 28 29  .dError.values()
19d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
19e0: 68 69 73 2e 64 53 65 6e 74 65 6e 63 65 45 72 72  his.dSentenceErr
19f0: 6f 72 2e 63 6c 65 61 72 28 29 3b 0a 20 20 20 20  or.clear();.    
1a00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f      }.        //
1a10: 20 70 61 72 73 65 20 73 65 6e 74 65 6e 63 65 0a   parse sentence.
1a20: 20 20 20 20 20 20 20 20 6c 65 74 20 73 54 65 78          let sTex
1a30: 74 20 3d 20 74 68 69 73 2e 5f 67 65 74 43 6c 65  t = this._getCle
1a40: 61 6e 54 65 78 74 28 29 3b 0a 20 20 20 20 20 20  anText();.      
1a50: 20 20 6c 65 74 20 6c 53 65 6e 74 65 6e 63 65 73    let lSentences
1a60: 20 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20 6c   = [];.        l
1a70: 65 74 20 6f 53 65 6e 74 65 6e 63 65 20 3d 20 6e  et oSentence = n
1a80: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ull;.        for
1a90: 20 28 6c 65 74 20 5b 69 53 74 61 72 74 2c 20 69   (let [iStart, i
1aa0: 45 6e 64 5d 20 6f 66 20 74 65 78 74 2e 67 65 74  End] of text.get
1ab0: 53 65 6e 74 65 6e 63 65 42 6f 75 6e 64 61 72 69  SentenceBoundari
1ac0: 65 73 28 73 54 65 78 74 29 29 20 7b 0a 20 20 20  es(sText)) {.   
1ad0: 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20           try {. 
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1af0: 68 69 73 2e 73 53 65 6e 74 65 6e 63 65 20 3d 20  his.sSentence = 
1b00: 73 54 65 78 74 2e 73 6c 69 63 65 28 69 53 74 61  sText.slice(iSta
1b10: 72 74 2c 20 69 45 6e 64 29 3b 0a 20 20 20 20 20  rt, iEnd);.     
1b20: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
1b30: 73 53 65 6e 74 65 6e 63 65 30 20 3d 20 74 68 69  sSentence0 = thi
1b40: 73 2e 73 54 65 78 74 30 2e 73 6c 69 63 65 28 69  s.sText0.slice(i
1b50: 53 74 61 72 74 2c 20 69 45 6e 64 29 3b 0a 20 20  Start, iEnd);.  
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
1b70: 69 73 2e 6e 4f 66 66 73 65 74 57 69 74 68 69 6e  is.nOffsetWithin
1b80: 50 61 72 61 67 72 61 70 68 20 3d 20 69 53 74 61  Paragraph = iSta
1b90: 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt;.            
1ba0: 20 20 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 20      this.lToken 
1bb0: 3d 20 41 72 72 61 79 2e 66 72 6f 6d 28 67 63 5f  = Array.from(gc_
1bc0: 65 6e 67 69 6e 65 2e 6f 54 6f 6b 65 6e 69 7a 65  engine.oTokenize
1bd0: 72 2e 67 65 6e 54 6f 6b 65 6e 73 28 74 68 69 73  r.genTokens(this
1be0: 2e 73 53 65 6e 74 65 6e 63 65 2c 20 74 72 75 65  .sSentence, true
1bf0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
1c00: 20 20 20 20 74 68 69 73 2e 64 54 6f 6b 65 6e 50      this.dTokenP
1c10: 6f 73 2e 63 6c 65 61 72 28 29 3b 0a 20 20 20 20  os.clear();.    
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
1c30: 28 6c 65 74 20 64 54 6f 6b 65 6e 20 6f 66 20 74  (let dToken of t
1c40: 68 69 73 2e 6c 54 6f 6b 65 6e 29 20 7b 0a 20 20  his.lToken) {.  
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 20 20 69 66 20 28 64 54 6f 6b 65 6e 5b 22 73 54    if (dToken["sT
1c70: 79 70 65 22 5d 20 21 3d 20 22 49 4e 46 4f 22 29  ype"] != "INFO")
1c80: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1c90: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
1ca0: 64 54 6f 6b 65 6e 50 6f 73 2e 73 65 74 28 64 54  dTokenPos.set(dT
1cb0: 6f 6b 65 6e 5b 22 6e 53 74 61 72 74 22 5d 2c 20  oken["nStart"], 
1cc0: 64 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20  dToken);.       
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d00: 20 69 66 20 28 62 46 75 6c 6c 49 6e 66 6f 29 20   if (bFullInfo) 
1d10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1d20: 20 20 20 20 20 20 6f 53 65 6e 74 65 6e 63 65 20        oSentence 
1d30: 3d 20 7b 20 22 6e 53 74 61 72 74 22 3a 20 69 53  = { "nStart": iS
1d40: 74 61 72 74 2c 20 22 6e 45 6e 64 22 3a 20 69 45  tart, "nEnd": iE
1d50: 6e 64 2c 20 22 73 53 65 6e 74 65 6e 63 65 22 3a  nd, "sSentence":
1d60: 20 74 68 69 73 2e 73 53 65 6e 74 65 6e 63 65 2c   this.sSentence,
1d70: 20 22 6c 54 6f 6b 65 6e 22 3a 20 41 72 72 61 79   "lToken": Array
1d80: 2e 66 72 6f 6d 28 74 68 69 73 2e 6c 54 6f 6b 65  .from(this.lToke
1d90: 6e 29 20 7d 3b 0a 20 20 20 20 20 20 20 20 20 20  n) };.          
1da0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c            for (l
1db0: 65 74 20 6f 54 6f 6b 65 6e 20 6f 66 20 6f 53 65  et oToken of oSe
1dc0: 6e 74 65 6e 63 65 5b 22 6c 54 6f 6b 65 6e 22 5d  ntence["lToken"]
1dd0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
1df0: 6f 54 6f 6b 65 6e 5b 22 73 54 79 70 65 22 5d 20  oToken["sType"] 
1e00: 3d 3d 20 22 57 4f 52 44 22 29 20 7b 0a 20 20 20  == "WORD") {.   
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 20 20 20 20 20 20 20 6f 54 6f 6b 65 6e 5b           oToken[
1e30: 22 62 56 61 6c 69 64 54 6f 6b 65 6e 22 5d 20 3d  "bValidToken"] =
1e40: 20 67 63 5f 65 6e 67 69 6e 65 2e 6f 53 70 65 6c   gc_engine.oSpel
1e50: 6c 43 68 65 63 6b 65 72 2e 69 73 56 61 6c 69 64  lChecker.isValid
1e60: 54 6f 6b 65 6e 28 6f 54 6f 6b 65 6e 5b 22 73 56  Token(oToken["sV
1e70: 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20 20 20 20  alue"]);.       
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e90: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1ea0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
1ec0: 74 68 65 20 6c 69 73 74 20 6f 66 20 74 6f 6b 65  the list of toke
1ed0: 6e 73 20 69 73 20 64 75 70 6c 69 63 61 74 65 64  ns is duplicated
1ee0: 2c 20 74 6f 20 6b 65 65 70 20 61 6c 6c 20 74 6f  , to keep all to
1ef0: 6b 65 6e 73 20 66 72 6f 6d 20 62 65 69 6e 67 20  kens from being 
1f00: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 61 6e 61  deleted when ana
1f10: 6c 79 73 69 73 0a 20 20 20 20 20 20 20 20 20 20  lysis.          
1f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f30: 20 20 20 20 20 20 20 20 74 68 69 73 2e 70 61 72          this.par
1f40: 73 65 54 65 78 74 28 74 68 69 73 2e 73 53 65 6e  seText(this.sSen
1f50: 74 65 6e 63 65 2c 20 74 68 69 73 2e 73 53 65 6e  tence, this.sSen
1f60: 74 65 6e 63 65 30 2c 20 66 61 6c 73 65 2c 20 69  tence0, false, i
1f70: 53 74 61 72 74 2c 20 73 43 6f 75 6e 74 72 79 2c  Start, sCountry,
1f80: 20 64 4f 70 74 2c 20 62 53 68 6f 77 52 75 6c 65   dOpt, bShowRule
1f90: 49 64 2c 20 62 44 65 62 75 67 2c 20 62 43 6f 6e  Id, bDebug, bCon
1fa0: 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20  text);.         
1fb0: 20 20 20 20 20 20 20 69 66 20 28 62 46 75 6c 6c         if (bFull
1fc0: 49 6e 66 6f 29 20 7b 0a 20 20 20 20 20 20 20 20  Info) {.        
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 53 65 6e              oSen
1fe0: 74 65 6e 63 65 5b 22 6c 47 72 61 6d 6d 61 72 45  tence["lGrammarE
1ff0: 72 72 6f 72 73 22 5d 20 3d 20 41 72 72 61 79 2e  rrors"] = Array.
2000: 66 72 6f 6d 28 74 68 69 73 2e 64 53 65 6e 74 65  from(this.dSente
2010: 6e 63 65 45 72 72 6f 72 2e 76 61 6c 75 65 73 28  nceError.values(
2020: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
2030: 20 20 20 20 20 20 20 20 6c 53 65 6e 74 65 6e 63          lSentenc
2040: 65 73 2e 70 75 73 68 28 6f 53 65 6e 74 65 6e 63  es.push(oSentenc
2050: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2060: 20 20 20 20 20 20 20 20 74 68 69 73 2e 64 53 65          this.dSe
2070: 6e 74 65 6e 63 65 45 72 72 6f 72 2e 63 6c 65 61  ntenceError.clea
2080: 72 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r();.           
2090: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
20b0: 20 63 61 74 63 68 20 28 65 29 20 7b 0a 20 20 20   catch (e) {.   
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
20d0: 73 6f 6c 65 2e 65 72 72 6f 72 28 65 29 3b 0a 20  sole.error(e);. 
20e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2100: 66 20 28 62 46 75 6c 6c 49 6e 66 6f 29 20 7b 0a  f (bFullInfo) {.
2110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 47              // G
2120: 72 61 6d 6d 61 72 20 63 68 65 63 6b 69 6e 67 20  rammar checking 
2130: 61 6e 64 20 73 65 6e 74 65 6e 63 65 20 61 6e 61  and sentence ana
2140: 6c 79 73 69 73 0a 20 20 20 20 20 20 20 20 20 20  lysis.          
2150: 20 20 72 65 74 75 72 6e 20 5b 6c 50 61 72 61 67    return [lParag
2160: 72 61 70 68 45 72 72 6f 72 73 2c 20 6c 53 65 6e  raphErrors, lSen
2170: 74 65 6e 63 65 73 5d 3b 0a 20 20 20 20 20 20 20  tences];.       
2180: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
2190: 20 20 20 20 20 20 2f 2f 20 47 72 61 6d 6d 61 72        // Grammar
21a0: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 6c 79 0a 20   checking only. 
21b0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
21c0: 6e 20 41 72 72 61 79 2e 66 72 6f 6d 28 74 68 69  n Array.from(thi
21d0: 73 2e 64 45 72 72 6f 72 2e 76 61 6c 75 65 73 28  s.dError.values(
21e0: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
21f0: 20 20 7d 0a 0a 20 20 20 20 5f 67 65 74 43 6c 65    }..    _getCle
2200: 61 6e 54 65 78 74 20 28 29 20 7b 0a 20 20 20 20  anText () {.    
2210: 20 20 20 20 6c 65 74 20 73 54 65 78 74 20 3d 20      let sText = 
2220: 74 68 69 73 2e 73 54 65 78 74 3b 0a 20 20 20 20  this.sText;.    
2230: 20 20 20 20 69 66 20 28 73 54 65 78 74 2e 69 6e      if (sText.in
2240: 63 6c 75 64 65 73 28 22 c2 a0 22 29 29 20 7b 0a  cludes("..")) {.
2250: 20 20 20 20 20 20 20 20 20 20 20 20 73 54 65 78              sTex
2260: 74 20 3d 20 73 54 65 78 74 2e 72 65 70 6c 61 63  t = sText.replac
2270: 65 28 2f c2 a0 2f 67 2c 20 27 20 27 29 3b 20 2f  e(/../g, ' '); /
2280: 2f 20 6e 62 73 70 0a 20 20 20 20 20 20 20 20 7d  / nbsp.        }
2290: 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 54 65  .        if (sTe
22a0: 78 74 2e 69 6e 63 6c 75 64 65 73 28 22 e2 80 af  xt.includes("...
22b0: 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ")) {.          
22c0: 20 20 73 54 65 78 74 20 3d 20 73 54 65 78 74 2e    sText = sText.
22d0: 72 65 70 6c 61 63 65 28 2f e2 80 af 2f 67 2c 20  replace(/.../g, 
22e0: 27 20 27 29 3b 20 2f 2f 20 73 6e 62 73 70 0a 20  ' '); // snbsp. 
22f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2300: 20 69 66 20 28 73 54 65 78 74 2e 69 6e 63 6c 75   if (sText.inclu
2310: 64 65 73 28 22 27 22 29 29 20 7b 0a 20 20 20 20  des("'")) {.    
2320: 20 20 20 20 20 20 20 20 73 54 65 78 74 20 3d 20          sText = 
2330: 73 54 65 78 74 2e 72 65 70 6c 61 63 65 28 2f 27  sText.replace(/'
2340: 2f 67 2c 20 22 e2 80 99 22 29 3b 0a 20 20 20 20  /g, "...");.    
2350: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2360: 20 28 73 54 65 78 74 2e 69 6e 63 6c 75 64 65 73   (sText.includes
2370: 28 22 e2 80 91 22 29 29 20 7b 0a 20 20 20 20 20  ("...")) {.     
2380: 20 20 20 20 20 20 20 73 54 65 78 74 20 3d 20 73         sText = s
2390: 54 65 78 74 2e 72 65 70 6c 61 63 65 28 2f e2 80  Text.replace(/..
23a0: 91 2f 67 2c 20 22 2d 22 29 3b 20 2f 2f 20 6e 6f  ./g, "-"); // no
23b0: 62 72 65 61 6b 64 61 73 68 0a 20 20 20 20 20 20  breakdash.      
23c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28    }.        if (
23d0: 73 54 65 78 74 2e 69 6e 63 6c 75 64 65 73 28 22  sText.includes("
23e0: 40 40 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20  @@")) {.        
23f0: 20 20 20 20 73 54 65 78 74 20 3d 20 73 54 65 78      sText = sTex
2400: 74 2e 72 65 70 6c 61 63 65 28 2f 40 40 2b 2f 67  t.replace(/@@+/g
2410: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  , "");.        }
2420: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2430: 73 54 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  sText;.    }..  
2440: 20 20 70 61 72 73 65 54 65 78 74 20 28 73 54 65    parseText (sTe
2450: 78 74 2c 20 73 54 65 78 74 30 2c 20 62 50 61 72  xt, sText0, bPar
2460: 61 67 72 61 70 68 2c 20 6e 4f 66 66 73 65 74 2c  agraph, nOffset,
2470: 20 73 43 6f 75 6e 74 72 79 2c 20 64 4f 70 74 69   sCountry, dOpti
2480: 6f 6e 73 2c 20 62 53 68 6f 77 52 75 6c 65 49 64  ons, bShowRuleId
2490: 2c 20 62 44 65 62 75 67 2c 20 62 43 6f 6e 74 65  , bDebug, bConte
24a0: 78 74 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65  xt) {.        le
24b0: 74 20 62 43 68 61 6e 67 65 20 3d 20 66 61 6c 73  t bChange = fals
24c0: 65 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d  e;.        let m
24d0: 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28  ;..        for (
24e0: 6c 65 74 20 5b 73 4f 70 74 69 6f 6e 2c 20 6c 52  let [sOption, lR
24f0: 75 6c 65 47 72 6f 75 70 5d 20 6f 66 20 67 63 5f  uleGroup] of gc_
2500: 65 6e 67 69 6e 65 2e 67 65 74 52 75 6c 65 73 28  engine.getRules(
2510: 62 50 61 72 61 67 72 61 70 68 29 29 20 7b 0a 20  bParagraph)) {. 
2520: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73             if (s
2530: 4f 70 74 69 6f 6e 20 3d 3d 20 22 40 40 40 40 22  Option == "@@@@"
2540: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2550: 20 20 20 20 2f 2f 20 67 72 61 70 68 20 72 75 6c      // graph rul
2560: 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  es.             
2570: 20 20 20 69 66 20 28 21 62 50 61 72 61 67 72 61     if (!bParagra
2580: 70 68 20 26 26 20 62 43 68 61 6e 67 65 29 20 7b  ph && bChange) {
2590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25a0: 20 20 20 20 20 74 68 69 73 2e 75 70 64 61 74 65       this.update
25b0: 28 73 54 65 78 74 2c 20 62 44 65 62 75 67 29 3b  (sText, bDebug);
25c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25d0: 20 20 20 20 20 62 43 68 61 6e 67 65 20 3d 20 66       bChange = f
25e0: 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  alse;.          
25f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2600: 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74          for (let
2610: 20 5b 73 47 72 61 70 68 4e 61 6d 65 2c 20 73 4c   [sGraphName, sL
2620: 69 6e 65 49 64 5d 20 6f 66 20 6c 52 75 6c 65 47  ineId] of lRuleG
2630: 72 6f 75 70 29 20 7b 0a 20 20 20 20 20 20 20 20  roup) {.        
2640: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
2650: 21 64 4f 70 74 69 6f 6e 73 2e 68 61 73 28 73 47  !dOptions.has(sG
2660: 72 61 70 68 4e 61 6d 65 29 20 7c 7c 20 64 4f 70  raphName) || dOp
2670: 74 69 6f 6e 73 2e 67 65 74 28 73 47 72 61 70 68  tions.get(sGraph
2680: 4e 61 6d 65 29 29 20 7b 0a 20 20 20 20 20 20 20  Name)) {.       
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20   if (bDebug) {. 
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f             conso
26d0: 6c 65 2e 6c 6f 67 28 22 3e 3e 3e 3e 20 47 52 41  le.log(">>>> GRA
26e0: 50 48 3a 20 22 20 2b 20 73 47 72 61 70 68 4e 61  PH: " + sGraphNa
26f0: 6d 65 20 2b 20 22 20 22 20 2b 20 73 4c 69 6e 65  me + " " + sLine
2700: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Id);.           
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 20 20 20 20 20 20 20 73 54 65 78 74 20 3d 20 74         sText = t
2740: 68 69 73 2e 70 61 72 73 65 47 72 61 70 68 28 67  his.parseGraph(g
2750: 63 5f 72 75 6c 65 73 5f 67 72 61 70 68 2e 64 41  c_rules_graph.dA
2760: 6c 6c 47 72 61 70 68 5b 73 47 72 61 70 68 4e 61  llGraph[sGraphNa
2770: 6d 65 5d 2c 20 73 43 6f 75 6e 74 72 79 2c 20 64  me], sCountry, d
2780: 4f 70 74 69 6f 6e 73 2c 20 62 53 68 6f 77 52 75  Options, bShowRu
2790: 6c 65 49 64 2c 20 62 44 65 62 75 67 2c 20 62 43  leId, bDebug, bC
27a0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
27d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27e0: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
27f0: 69 66 20 28 21 73 4f 70 74 69 6f 6e 20 7c 7c 20  if (!sOption || 
2800: 67 63 5f 6f 70 74 69 6f 6e 73 2e 64 4f 70 74 69  gc_options.dOpti
2810: 6f 6e 73 2e 67 6c 5f 67 65 74 28 73 4f 70 74 69  ons.gl_get(sOpti
2820: 6f 6e 2c 20 66 61 6c 73 65 29 29 20 7b 0a 20 20  on, false)) {.  
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
2840: 72 20 28 6c 65 74 20 5b 7a 52 65 67 65 78 2c 20  r (let [zRegex, 
2850: 62 55 70 70 65 72 63 61 73 65 2c 20 73 4c 69 6e  bUppercase, sLin
2860: 65 49 64 2c 20 73 52 75 6c 65 49 64 2c 20 6e 50  eId, sRuleId, nP
2870: 72 69 6f 72 69 74 79 2c 20 6c 41 63 74 69 6f 6e  riority, lAction
2880: 73 2c 20 6c 47 72 6f 75 70 73 2c 20 6c 4e 65 67  s, lGroups, lNeg
2890: 4c 6f 6f 6b 42 65 66 6f 72 65 5d 20 6f 66 20 6c  LookBefore] of l
28a0: 52 75 6c 65 47 72 6f 75 70 29 20 7b 0a 20 20 20  RuleGroup) {.   
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 69 66 20 28 21 67 63 5f 65 6e 67 69 6e 65 2e   if (!gc_engine.
28d0: 61 49 67 6e 6f 72 65 64 52 75 6c 65 73 2e 68 61  aIgnoredRules.ha
28e0: 73 28 73 52 75 6c 65 49 64 29 29 20 7b 0a 20 20  s(sRuleId)) {.  
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 20 20 20 20 77 68 69 6c 65 20 28 28 6d 20        while ((m 
2910: 3d 20 7a 52 65 67 65 78 2e 67 6c 5f 65 78 65 63  = zRegex.gl_exec
2920: 32 28 73 54 65 78 74 2c 20 6c 47 72 6f 75 70 73  2(sText, lGroups
2930: 2c 20 6c 4e 65 67 4c 6f 6f 6b 42 65 66 6f 72 65  , lNegLookBefore
2940: 29 29 20 21 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20  )) !== null) {. 
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 62             let b
2970: 43 6f 6e 64 4d 65 6d 6f 20 3d 20 6e 75 6c 6c 3b  CondMemo = null;
2980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
29a0: 20 28 6c 65 74 20 5b 73 46 75 6e 63 43 6f 6e 64   (let [sFuncCond
29b0: 2c 20 63 41 63 74 69 6f 6e 54 79 70 65 2c 20 73  , cActionType, s
29c0: 57 68 61 74 2c 20 2e 2e 2e 65 41 63 74 5d 20 6f  What, ...eAct] o
29d0: 66 20 6c 41 63 74 69 6f 6e 73 29 20 7b 0a 20 20  f lActions) {.  
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2a00: 20 61 63 74 69 6f 6e 20 69 6e 20 6c 41 63 74 69   action in lActi
2a10: 6f 6e 73 3a 20 5b 20 63 6f 6e 64 69 74 69 6f 6e  ons: [ condition
2a20: 2c 20 61 63 74 69 6f 6e 20 74 79 70 65 2c 20 72  , action type, r
2a30: 65 70 6c 61 63 65 6d 65 6e 74 2f 73 75 67 67 65  eplacement/sugge
2a40: 73 74 69 6f 6e 2f 61 63 74 69 6f 6e 5b 2c 20 69  stion/action[, i
2a50: 47 72 6f 75 70 5b 2c 20 6d 65 73 73 61 67 65 2c  Group[, message,
2a60: 20 55 52 4c 5d 5d 20 5d 0a 20 20 20 20 20 20 20   URL]] ].       
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20           try {. 
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 62 43 6f 6e 64 4d 65 6d 6f 20 3d 20 28     bCondMemo = (
2ac0: 21 73 46 75 6e 63 43 6f 6e 64 20 7c 7c 20 67 63  !sFuncCond || gc
2ad0: 5f 65 6e 67 69 6e 65 5f 66 75 6e 63 5b 73 46 75  _engine_func[sFu
2ae0: 6e 63 43 6f 6e 64 5d 28 73 54 65 78 74 2c 20 73  ncCond](sText, s
2af0: 54 65 78 74 30 2c 20 6d 2c 20 74 68 69 73 2e 64  Text0, m, this.d
2b00: 54 6f 6b 65 6e 50 6f 73 2c 20 73 43 6f 75 6e 74  TokenPos, sCount
2b10: 72 79 2c 20 62 43 6f 6e 64 4d 65 6d 6f 29 29 3b  ry, bCondMemo));
2b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 20 20 20 20 69 66 20 28 62 43 6f 6e 64 4d 65       if (bCondMe
2b50: 6d 6f 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  mo) {.          
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 77                sw
2b80: 69 74 63 68 20 28 63 41 63 74 69 6f 6e 54 79 70  itch (cActionTyp
2b90: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc0: 20 63 61 73 65 20 22 2d 22 3a 0a 20 20 20 20 20   case "-":.     
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 67 72             // gr
2c00: 61 6d 6d 61 72 20 65 72 72 6f 72 0a 20 20 20 20  ammar error.    
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 63 6f              //co
2c40: 6e 73 6f 6c 65 2e 6c 6f 67 28 22 2d 3e 20 65 72  nsole.log("-> er
2c50: 72 6f 72 20 64 65 74 65 63 74 65 64 20 69 6e 20  ror detected in 
2c60: 22 20 2b 20 73 4c 69 6e 65 49 64 20 2b 20 22 5c  " + sLineId + "\
2c70: 6e 7a 52 65 67 65 78 3a 20 22 20 2b 20 7a 52 65  nzRegex: " + zRe
2c80: 67 65 78 2e 73 6f 75 72 63 65 29 3b 0a 20 20 20  gex.source);.   
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
2cc0: 20 6e 45 72 72 6f 72 53 74 61 72 74 20 3d 20 6e   nErrorStart = n
2cd0: 4f 66 66 73 65 74 20 2b 20 6d 2e 73 74 61 72 74  Offset + m.start
2ce0: 5b 65 41 63 74 5b 30 5d 5d 3b 0a 20 20 20 20 20  [eAct[0]];.     
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
2d20: 74 68 69 73 2e 64 45 72 72 6f 72 2e 68 61 73 28  this.dError.has(
2d30: 6e 45 72 72 6f 72 53 74 61 72 74 29 20 7c 7c 20  nErrorStart) || 
2d40: 6e 50 72 69 6f 72 69 74 79 20 3e 20 74 68 69 73  nPriority > this
2d50: 2e 64 45 72 72 6f 72 50 72 69 6f 72 69 74 79 2e  .dErrorPriority.
2d60: 67 65 74 28 6e 45 72 72 6f 72 53 74 61 72 74 29  get(nErrorStart)
2d70: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da0: 20 20 20 20 20 20 20 20 74 68 69 73 2e 64 45 72          this.dEr
2db0: 72 6f 72 2e 73 65 74 28 6e 45 72 72 6f 72 53 74  ror.set(nErrorSt
2dc0: 61 72 74 2c 20 74 68 69 73 2e 5f 63 72 65 61 74  art, this._creat
2dd0: 65 45 72 72 6f 72 46 72 6f 6d 52 65 67 65 78 28  eErrorFromRegex(
2de0: 73 54 65 78 74 2c 20 73 54 65 78 74 30 2c 20 73  sText, sText0, s
2df0: 57 68 61 74 2c 20 6e 4f 66 66 73 65 74 2c 20 6d  What, nOffset, m
2e00: 2c 20 65 41 63 74 5b 30 5d 2c 20 73 4c 69 6e 65  , eAct[0], sLine
2e10: 49 64 2c 20 73 52 75 6c 65 49 64 2c 20 62 55 70  Id, sRuleId, bUp
2e20: 70 65 72 63 61 73 65 2c 20 65 41 63 74 5b 31 5d  percase, eAct[1]
2e30: 2c 20 65 41 63 74 5b 32 5d 2c 20 62 53 68 6f 77  , eAct[2], bShow
2e40: 52 75 6c 65 49 64 2c 20 73 4f 70 74 69 6f 6e 2c  RuleId, sOption,
2e50: 20 62 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20   bContext));.   
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 20 74 68 69 73 2e 64 45 72 72 6f 72 50 72 69 6f   this.dErrorPrio
2ea0: 72 69 74 79 2e 73 65 74 28 6e 45 72 72 6f 72 53  rity.set(nErrorS
2eb0: 74 61 72 74 2c 20 6e 50 72 69 6f 72 69 74 79 29  tart, nPriority)
2ec0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef0: 20 20 20 20 20 20 74 68 69 73 2e 64 53 65 6e 74        this.dSent
2f00: 65 6e 63 65 45 72 72 6f 72 2e 73 65 74 28 6e 45  enceError.set(nE
2f10: 72 72 6f 72 53 74 61 72 74 2c 20 74 68 69 73 2e  rrorStart, this.
2f20: 64 45 72 72 6f 72 2e 67 65 74 28 6e 45 72 72 6f  dError.get(nErro
2f30: 72 53 74 61 72 74 29 29 3b 0a 20 20 20 20 20 20  rStart));.      
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f60: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2fa0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2fd0: 61 73 65 20 22 7e 22 3a 0a 20 20 20 20 20 20 20  ase "~":.       
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 20 20 20 20 20 20 20 20 20 2f 2f 20 74 65 78 74           // text
3010: 20 70 72 6f 63 65 73 73 6f 72 0a 20 20 20 20 20   processor.     
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3040: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 63 6f 6e             //con
3050: 73 6f 6c 65 2e 6c 6f 67 28 22 2d 3e 20 74 65 78  sole.log("-> tex
3060: 74 20 70 72 6f 63 65 73 73 6f 72 20 62 79 20 22  t processor by "
3070: 20 2b 20 73 4c 69 6e 65 49 64 20 2b 20 22 5c 6e   + sLineId + "\n
3080: 7a 52 65 67 65 78 3a 20 22 20 2b 20 7a 52 65 67  zRegex: " + zReg
3090: 65 78 2e 73 6f 75 72 63 65 29 3b 0a 20 20 20 20  ex.source);.    
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 54 65 78              sTex
30d0: 74 20 3d 20 74 68 69 73 2e 72 65 77 72 69 74 65  t = this.rewrite
30e0: 54 65 78 74 28 73 54 65 78 74 2c 20 73 57 68 61  Text(sText, sWha
30f0: 74 2c 20 65 41 63 74 5b 30 5d 2c 20 6d 2c 20 62  t, eAct[0], m, b
3100: 55 70 70 65 72 63 61 73 65 29 3b 0a 20 20 20 20  Uppercase);.    
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3130: 20 20 20 20 20 20 20 20 20 20 20 20 62 43 68 61              bCha
3140: 6e 67 65 20 3d 20 74 72 75 65 3b 0a 20 20 20 20  nge = true;.    
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
3180: 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20  bDebug) {.      
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
31c0: 6e 73 6f 6c 65 2e 6c 6f 67 28 22 7e 20 22 20 2b  nsole.log("~ " +
31d0: 20 73 54 65 78 74 20 2b 20 22 20 20 2d 2d 20 22   sText + "  -- "
31e0: 20 2b 20 6d 5b 65 41 63 74 5b 30 5d 5d 20 2b 20   + m[eAct[0]] + 
31f0: 22 20 20 23 20 22 20 2b 20 73 4c 69 6e 65 49 64  "  # " + sLineId
3200: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3230: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3260: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 20 20 20 20 20 20 20 63 61 73 65 20 22 3d 22          case "="
32a0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d0: 20 20 2f 2f 20 64 69 73 61 6d 62 69 67 75 61 74    // disambiguat
32e0: 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ion.            
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3310: 20 20 20 20 2f 2f 63 6f 6e 73 6f 6c 65 2e 6c 6f      //console.lo
3320: 67 28 22 2d 3e 20 64 69 73 61 6d 62 69 67 75 61  g("-> disambigua
3330: 74 69 6f 6e 20 62 79 20 22 20 2b 20 73 4c 69 6e  tion by " + sLin
3340: 65 49 64 20 2b 20 22 5c 6e 7a 52 65 67 65 78 3a  eId + "\nzRegex:
3350: 20 22 20 2b 20 7a 52 65 67 65 78 2e 73 6f 75 72   " + zRegex.sour
3360: 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ce);.           
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 20 20 20 20 67 63 5f 65 6e 67 69 6e 65 5f 66       gc_engine_f
33a0: 75 6e 63 5b 73 57 68 61 74 5d 28 73 54 65 78 74  unc[sWhat](sText
33b0: 2c 20 6d 2c 20 74 68 69 73 2e 64 54 6f 6b 65 6e  , m, this.dToken
33c0: 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Pos);.          
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 20 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67        if (bDebug
3400: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
3440: 6c 6f 67 28 22 3d 20 22 20 2b 20 6d 5b 30 5d 20  log("= " + m[0] 
3450: 2b 20 22 20 20 23 20 22 20 2b 20 73 4c 69 6e 65  + "  # " + sLine
3460: 49 64 2c 20 22 5c 6e 44 41 3a 22 2c 20 74 68 69  Id, "\nDA:", thi
3470: 73 2e 64 54 6f 6b 65 6e 50 6f 73 29 3b 0a 20 20  s.dTokenPos);.  
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3510: 20 20 20 63 61 73 65 20 22 3e 22 3a 0a 20 20 20     case ">":.   
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
3550: 77 65 20 64 6f 20 6e 6f 74 68 69 6e 67 2c 20 74  we do nothing, t
3560: 68 69 73 20 74 65 73 74 20 69 73 20 6a 75 73 74  his test is just
3570: 20 61 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20   a condition to 
3580: 61 70 70 6c 79 20 61 6c 6c 20 66 6f 6c 6c 6f 77  apply all follow
3590: 69 6e 67 20 61 63 74 69 6f 6e 73 0a 20 20 20 20  ing actions.    
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
35d0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
3600: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3630: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
3640: 6c 6f 67 28 22 23 20 65 72 72 6f 72 3a 20 75 6e  log("# error: un
3650: 6b 6e 6f 77 6e 20 61 63 74 69 6f 6e 20 61 74 20  known action at 
3660: 22 20 2b 20 73 4c 69 6e 65 49 64 29 3b 0a 20 20  " + sLineId);.  
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
36c0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
36f0: 28 63 41 63 74 69 6f 6e 54 79 70 65 20 3d 3d 20  (cActionType == 
3700: 22 3e 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ">") {.         
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3730: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3760: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
37d0: 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20  h (e) {.        
37e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
3800: 6f 6c 65 2e 6c 6f 67 28 73 54 65 78 74 29 3b 0a  ole.log(sText);.
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3830: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28      console.log(
3840: 22 23 20 6c 69 6e 65 20 69 64 3a 20 22 20 2b 20  "# line id: " + 
3850: 73 4c 69 6e 65 49 64 20 2b 20 22 5c 6e 23 20 72  sLineId + "\n# r
3860: 75 6c 65 20 69 64 3a 20 22 20 2b 20 73 52 75 6c  ule id: " + sRul
3870: 65 49 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eId);.          
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
38a0: 65 2e 65 72 72 6f 72 28 65 29 3b 0a 20 20 20 20  e.error(e);.    
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3910: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3920: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3930: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3940: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
3950: 20 28 62 43 68 61 6e 67 65 29 20 7b 0a 20 20 20   (bChange) {.   
3960: 20 20 20 20 20 20 20 20 20 69 66 20 28 62 50 61           if (bPa
3970: 72 61 67 72 61 70 68 29 20 7b 0a 20 20 20 20 20  ragraph) {.     
3980: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
3990: 73 54 65 78 74 20 3d 20 73 54 65 78 74 3b 0a 20  sText = sText;. 
39a0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
39b0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
39c0: 20 20 20 20 74 68 69 73 2e 73 53 65 6e 74 65 6e      this.sSenten
39d0: 63 65 20 3d 20 73 54 65 78 74 3b 0a 20 20 20 20  ce = sText;.    
39e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
39f0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 75    }.    }..    u
3a00: 70 64 61 74 65 20 28 73 53 65 6e 74 65 6e 63 65  pdate (sSentence
3a10: 2c 20 62 44 65 62 75 67 3d 66 61 6c 73 65 29 20  , bDebug=false) 
3a20: 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 75 70 64  {.        // upd
3a30: 61 74 65 20 3c 73 53 65 6e 74 65 6e 63 65 3e 20  ate <sSentence> 
3a40: 61 6e 64 20 72 65 74 6f 6b 65 6e 69 7a 65 0a 20  and retokenize. 
3a50: 20 20 20 20 20 20 20 74 68 69 73 2e 73 53 65 6e         this.sSen
3a60: 74 65 6e 63 65 20 3d 20 73 53 65 6e 74 65 6e 63  tence = sSentenc
3a70: 65 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6c  e;.        let l
3a80: 4e 65 77 54 6f 6b 65 6e 20 3d 20 41 72 72 61 79  NewToken = Array
3a90: 2e 66 72 6f 6d 28 67 63 5f 65 6e 67 69 6e 65 2e  .from(gc_engine.
3aa0: 6f 54 6f 6b 65 6e 69 7a 65 72 2e 67 65 6e 54 6f  oTokenizer.genTo
3ab0: 6b 65 6e 73 28 73 53 65 6e 74 65 6e 63 65 2c 20  kens(sSentence, 
3ac0: 74 72 75 65 29 29 3b 0a 20 20 20 20 20 20 20 20  true));.        
3ad0: 66 6f 72 20 28 6c 65 74 20 6f 54 6f 6b 65 6e 20  for (let oToken 
3ae0: 6f 66 20 6c 4e 65 77 54 6f 6b 65 6e 29 20 7b 0a  of lNewToken) {.
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
3b00: 74 68 69 73 2e 64 54 6f 6b 65 6e 50 6f 73 2e 67  this.dTokenPos.g
3b10: 6c 5f 67 65 74 28 6f 54 6f 6b 65 6e 5b 22 6e 53  l_get(oToken["nS
3b20: 74 61 72 74 22 5d 2c 20 7b 7d 29 2e 68 61 73 4f  tart"], {}).hasO
3b30: 77 6e 50 72 6f 70 65 72 74 79 28 22 6c 4d 6f 72  wnProperty("lMor
3b40: 70 68 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ph")) {.        
3b50: 20 20 20 20 20 20 20 20 6f 54 6f 6b 65 6e 5b 22          oToken["
3b60: 6c 4d 6f 72 70 68 22 5d 20 3d 20 74 68 69 73 2e  lMorph"] = this.
3b70: 64 54 6f 6b 65 6e 50 6f 73 2e 67 65 74 28 6f 54  dTokenPos.get(oT
3b80: 6f 6b 65 6e 5b 22 6e 53 74 61 72 74 22 5d 29 5b  oken["nStart"])[
3b90: 22 6c 4d 6f 72 70 68 22 5d 3b 0a 20 20 20 20 20  "lMorph"];.     
3ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3bb0: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 64 54       if (this.dT
3bc0: 6f 6b 65 6e 50 6f 73 2e 67 6c 5f 67 65 74 28 6f  okenPos.gl_get(o
3bd0: 54 6f 6b 65 6e 5b 22 6e 53 74 61 72 74 22 5d 2c  Token["nStart"],
3be0: 20 7b 7d 29 2e 68 61 73 4f 77 6e 50 72 6f 70 65   {}).hasOwnPrope
3bf0: 72 74 79 28 22 61 54 61 67 73 22 29 29 20 7b 0a  rty("aTags")) {.
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 6f 54 6f 6b 65 6e 5b 22 61 54 61 67 73 22 5d 20  oToken["aTags"] 
3c20: 3d 20 74 68 69 73 2e 64 54 6f 6b 65 6e 50 6f 73  = this.dTokenPos
3c30: 2e 67 65 74 28 6f 54 6f 6b 65 6e 5b 22 6e 53 74  .get(oToken["nSt
3c40: 61 72 74 22 5d 29 5b 22 61 54 61 67 73 22 5d 3b  art"])["aTags"];
3c50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3c60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3c70: 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 20 3d 20 6c   this.lToken = l
3c80: 4e 65 77 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  NewToken;.      
3c90: 20 20 74 68 69 73 2e 64 54 6f 6b 65 6e 50 6f 73    this.dTokenPos
3ca0: 2e 63 6c 65 61 72 28 29 3b 0a 20 20 20 20 20 20  .clear();.      
3cb0: 20 20 66 6f 72 20 28 6c 65 74 20 6f 54 6f 6b 65    for (let oToke
3cc0: 6e 20 6f 66 20 74 68 69 73 2e 6c 54 6f 6b 65 6e  n of this.lToken
3cd0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3ce0: 69 66 20 28 6f 54 6f 6b 65 6e 5b 22 73 54 79 70  if (oToken["sTyp
3cf0: 65 22 5d 20 21 3d 20 22 49 4e 46 4f 22 29 20 7b  e"] != "INFO") {
3d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3d10: 20 74 68 69 73 2e 64 54 6f 6b 65 6e 50 6f 73 2e   this.dTokenPos.
3d20: 73 65 74 28 6f 54 6f 6b 65 6e 5b 22 6e 53 74 61  set(oToken["nSta
3d30: 72 74 22 5d 2c 20 6f 54 6f 6b 65 6e 29 3b 0a 20  rt"], oToken);. 
3d40: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3d50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
3d60: 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20  f (bDebug) {.   
3d70: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65           console
3d80: 2e 6c 6f 67 28 22 55 50 44 41 54 45 3a 22 29 3b  .log("UPDATE:");
3d90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
3da0: 73 6f 6c 65 2e 6c 6f 67 28 74 68 69 73 2e 61 73  sole.log(this.as
3db0: 53 74 72 69 6e 67 28 29 29 3b 0a 20 20 20 20 20  String());.     
3dc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
3dd0: 2a 20 5f 67 65 74 4e 65 78 74 50 6f 69 6e 74 65  * _getNextPointe
3de0: 72 73 20 28 6f 54 6f 6b 65 6e 2c 20 6f 47 72 61  rs (oToken, oGra
3df0: 70 68 2c 20 6f 50 6f 69 6e 74 65 72 2c 20 62 44  ph, oPointer, bD
3e00: 65 62 75 67 3d 66 61 6c 73 65 29 20 7b 0a 20 20  ebug=false) {.  
3e10: 20 20 20 20 20 20 2f 2f 20 67 65 6e 65 72 61 74        // generat
3e20: 6f 72 3a 20 72 65 74 75 72 6e 20 6e 6f 64 65 73  or: return nodes
3e30: 20 77 68 65 72 65 20 3c 6f 54 6f 6b 65 6e 3e 20   where <oToken> 
3e40: e2 80 9c 76 61 6c 75 65 73 e2 80 9d 20 6d 61 74  ...values... mat
3e50: 63 68 20 3c 6f 4e 6f 64 65 3e 20 61 72 63 73 0a  ch <oNode> arcs.
3e60: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
3e70: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6f 4e            let oN
3e80: 6f 64 65 20 3d 20 6f 47 72 61 70 68 5b 6f 50 6f  ode = oGraph[oPo
3e90: 69 6e 74 65 72 5b 22 69 4e 6f 64 65 22 5d 5d 3b  inter["iNode"]];
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74  .            let
3eb0: 20 69 54 6f 6b 65 6e 31 20 3d 20 6f 50 6f 69 6e   iToken1 = oPoin
3ec0: 74 65 72 5b 22 69 54 6f 6b 65 6e 31 22 5d 3b 0a  ter["iToken1"];.
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
3ee0: 62 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20 66 61  bTokenFound = fa
3ef0: 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  lse;.           
3f00: 20 2f 2f 20 74 6f 6b 65 6e 20 76 61 6c 75 65 0a   // token value.
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
3f20: 6f 4e 6f 64 65 2e 68 61 73 4f 77 6e 50 72 6f 70  oNode.hasOwnProp
3f30: 65 72 74 79 28 6f 54 6f 6b 65 6e 5b 22 73 56 61  erty(oToken["sVa
3f40: 6c 75 65 22 5d 29 29 20 7b 0a 20 20 20 20 20 20  lue"])) {.      
3f50: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62 44            if (bD
3f60: 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20  ebug) {.        
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
3f80: 6f 6c 65 2e 6c 6f 67 28 22 20 20 4d 41 54 43 48  ole.log("  MATCH
3f90: 3a 20 22 20 2b 20 6f 54 6f 6b 65 6e 5b 22 73 56  : " + oToken["sV
3fa0: 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20 20 20 20  alue"]);.       
3fb0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3fc0: 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64             yield
3fd0: 20 7b 20 22 69 54 6f 6b 65 6e 31 22 3a 20 69 54   { "iToken1": iT
3fe0: 6f 6b 65 6e 31 2c 20 22 69 4e 6f 64 65 22 3a 20  oken1, "iNode": 
3ff0: 6f 4e 6f 64 65 5b 6f 54 6f 6b 65 6e 5b 22 73 56  oNode[oToken["sV
4000: 61 6c 75 65 22 5d 5d 20 7d 3b 0a 20 20 20 20 20  alue"]] };.     
4010: 20 20 20 20 20 20 20 20 20 20 20 62 54 6f 6b 65             bToke
4020: 6e 46 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0a 20  nFound = true;. 
4030: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4040: 20 20 20 20 20 20 20 20 20 69 66 20 28 6f 54 6f           if (oTo
4050: 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 2e 73 6c  ken["sValue"].sl
4060: 69 63 65 28 30 2c 32 29 2e 67 6c 5f 69 73 54 69  ice(0,2).gl_isTi
4070: 74 6c 65 28 29 29 20 7b 20 2f 2f 20 77 65 20 74  tle()) { // we t
4080: 65 73 74 20 6f 6e 6c 79 20 32 20 66 69 72 73 74  est only 2 first
4090: 20 63 68 61 72 73 2c 20 74 6f 20 6d 61 6b 65 20   chars, to make 
40a0: 76 61 6c 69 64 20 77 6f 72 64 73 20 73 75 63 68  valid words such
40b0: 20 61 73 20 22 4c 61 69 73 73 65 7a 2d 6c 65 73   as "Laissez-les
40c0: 22 2c 20 22 50 61 73 73 65 2d 70 61 72 74 6f 75  ", "Passe-partou
40d0: 74 22 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t"..            
40e0: 20 20 20 20 6c 65 74 20 73 56 61 6c 75 65 20 3d      let sValue =
40f0: 20 6f 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22   oToken["sValue"
4100: 5d 2e 74 6f 4c 6f 77 65 72 43 61 73 65 28 29 3b  ].toLowerCase();
4110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4120: 20 69 66 20 28 6f 4e 6f 64 65 2e 68 61 73 4f 77   if (oNode.hasOw
4130: 6e 50 72 6f 70 65 72 74 79 28 73 56 61 6c 75 65  nProperty(sValue
4140: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
4150: 20 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65           if (bDe
4160: 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20  bug) {.         
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
4180: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 4d 41  onsole.log("  MA
4190: 54 43 48 3a 20 22 20 2b 20 73 56 61 6c 75 65 29  TCH: " + sValue)
41a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
41b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c              yiel
41d0: 64 20 7b 20 22 69 54 6f 6b 65 6e 31 22 3a 20 69  d { "iToken1": i
41e0: 54 6f 6b 65 6e 31 2c 20 22 69 4e 6f 64 65 22 3a  Token1, "iNode":
41f0: 20 6f 4e 6f 64 65 5b 73 56 61 6c 75 65 5d 20 7d   oNode[sValue] }
4200: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4210: 20 20 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75 6e        bTokenFoun
4220: 64 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20  d = true;.      
4230: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4240: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4250: 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 6f        else if (o
4260: 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 2e  Token["sValue"].
4270: 67 6c 5f 69 73 55 70 70 65 72 43 61 73 65 28 29  gl_isUpperCase()
4280: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
4290: 20 20 20 20 6c 65 74 20 73 56 61 6c 75 65 20 3d      let sValue =
42a0: 20 6f 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22   oToken["sValue"
42b0: 5d 2e 74 6f 4c 6f 77 65 72 43 61 73 65 28 29 3b  ].toLowerCase();
42c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
42d0: 20 69 66 20 28 6f 4e 6f 64 65 2e 68 61 73 4f 77   if (oNode.hasOw
42e0: 6e 50 72 6f 70 65 72 74 79 28 73 56 61 6c 75 65  nProperty(sValue
42f0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
4300: 20 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65           if (bDe
4310: 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20  bug) {.         
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
4330: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 4d 41  onsole.log("  MA
4340: 54 43 48 3a 20 22 20 2b 20 73 56 61 6c 75 65 29  TCH: " + sValue)
4350: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4360: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4370: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c              yiel
4380: 64 20 7b 20 22 69 54 6f 6b 65 6e 31 22 3a 20 69  d { "iToken1": i
4390: 54 6f 6b 65 6e 31 2c 20 22 69 4e 6f 64 65 22 3a  Token1, "iNode":
43a0: 20 6f 4e 6f 64 65 5b 73 56 61 6c 75 65 5d 20 7d   oNode[sValue] }
43b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
43c0: 20 20 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75 6e        bTokenFoun
43d0: 64 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20  d = true;.      
43e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 56 61 6c              sVal
4400: 75 65 20 3d 20 6f 54 6f 6b 65 6e 5b 22 73 56 61  ue = oToken["sVa
4410: 6c 75 65 22 5d 2e 67 6c 5f 74 6f 43 61 70 69 74  lue"].gl_toCapit
4420: 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20 20 20 20  alize();.       
4430: 20 20 20 20 20 20 20 20 20 69 66 20 28 6f 4e 6f           if (oNo
4440: 64 65 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74  de.hasOwnPropert
4450: 79 28 73 56 61 6c 75 65 29 29 20 7b 0a 20 20 20  y(sValue)) {.   
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4470: 20 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20   if (bDebug) {. 
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c         console.l
44a0: 6f 67 28 22 20 20 4d 41 54 43 48 3a 20 22 20 2b  og("  MATCH: " +
44b0: 20 73 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20   sValue);.      
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 20 79 69 65 6c 64 20 7b 20 22 69 54 6f      yield { "iTo
44f0: 6b 65 6e 31 22 3a 20 69 54 6f 6b 65 6e 31 2c 20  ken1": iToken1, 
4500: 22 69 4e 6f 64 65 22 3a 20 6f 4e 6f 64 65 5b 73  "iNode": oNode[s
4510: 56 61 6c 75 65 5d 20 7d 3b 0a 20 20 20 20 20 20  Value] };.      
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 54                bT
4530: 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20 74 72 75 65  okenFound = true
4540: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4550: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
4560: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  }.            //
4570: 20 72 65 67 65 78 20 76 61 6c 75 65 20 61 72 63   regex value arc
4580: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  s.            if
4590: 20 28 6f 54 6f 6b 65 6e 5b 22 73 54 79 70 65 22   (oToken["sType"
45a0: 5d 20 21 3d 20 22 49 4e 46 4f 22 20 20 26 26 20  ] != "INFO"  && 
45b0: 20 6f 54 6f 6b 65 6e 5b 22 73 54 79 70 65 22 5d   oToken["sType"]
45c0: 20 21 3d 20 22 50 55 4e 43 22 20 20 26 26 20 20   != "PUNC"  &&  
45d0: 6f 54 6f 6b 65 6e 5b 22 73 54 79 70 65 22 5d 20  oToken["sType"] 
45e0: 21 3d 20 22 53 49 47 4e 22 29 20 7b 0a 20 20 20  != "SIGN") {.   
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
4600: 28 6f 4e 6f 64 65 2e 68 61 73 4f 77 6e 50 72 6f  (oNode.hasOwnPro
4610: 70 65 72 74 79 28 22 3c 72 65 5f 76 61 6c 75 65  perty("<re_value
4620: 3e 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  >")) {.         
4630: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
4640: 6c 65 74 20 73 52 65 67 65 78 20 69 6e 20 6f 4e  let sRegex in oN
4650: 6f 64 65 5b 22 3c 72 65 5f 76 61 6c 75 65 3e 22  ode["<re_value>"
4660: 5d 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ]) {.           
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
4680: 28 21 73 52 65 67 65 78 2e 69 6e 63 6c 75 64 65  (!sRegex.include
4690: 73 28 22 c2 ac 22 29 29 20 7b 0a 20 20 20 20 20  s("..")) {.     
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46b0: 20 20 20 20 20 20 20 2f 2f 20 6e 6f 20 61 6e 74         // no ant
46c0: 69 2d 70 61 74 74 65 72 6e 0a 20 20 20 20 20 20  i-pattern.      
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46e0: 20 20 20 20 20 20 69 66 20 28 6f 54 6f 6b 65 6e        if (oToken
46f0: 5b 22 73 56 61 6c 75 65 22 5d 2e 73 65 61 72 63  ["sValue"].searc
4700: 68 28 73 52 65 67 65 78 29 20 21 3d 3d 20 2d 31  h(sRegex) !== -1
4710: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4730: 20 20 20 20 69 66 20 28 62 44 65 62 75 67 29 20      if (bDebug) 
4740: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4760: 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f        console.lo
4770: 67 28 22 20 20 4d 41 54 43 48 3a 20 7e 22 20 2b  g("  MATCH: ~" +
4780: 20 73 52 65 67 65 78 29 3b 0a 20 20 20 20 20 20   sRegex);.      
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c              yiel
47d0: 64 20 7b 20 22 69 54 6f 6b 65 6e 31 22 3a 20 69  d { "iToken1": i
47e0: 54 6f 6b 65 6e 31 2c 20 22 69 4e 6f 64 65 22 3a  Token1, "iNode":
47f0: 20 6f 4e 6f 64 65 5b 22 3c 72 65 5f 76 61 6c 75   oNode["<re_valu
4800: 65 3e 22 5d 5b 73 52 65 67 65 78 5d 20 7d 3b 0a  e>"][sRegex] };.
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4830: 62 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20 74 72  bTokenFound = tr
4840: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
4870: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
4880: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
48a0: 2f 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 6e  / there is an an
48b0: 74 69 2d 70 61 74 74 65 72 6e 0a 20 20 20 20 20  ti-pattern.     
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48d0: 20 20 20 20 20 20 20 6c 65 74 20 5b 73 50 61 74         let [sPat
48e0: 74 65 72 6e 2c 20 73 4e 65 67 50 61 74 74 65 72  tern, sNegPatter
48f0: 6e 5d 20 3d 20 73 52 65 67 65 78 2e 73 70 6c 69  n] = sRegex.spli
4900: 74 28 22 c2 ac 22 2c 20 32 29 3b 0a 20 20 20 20  t("..", 2);.    
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4920: 20 20 20 20 20 20 20 20 69 66 20 28 73 4e 65 67          if (sNeg
4930: 50 61 74 74 65 72 6e 20 26 26 20 6f 54 6f 6b 65  Pattern && oToke
4940: 6e 5b 22 73 56 61 6c 75 65 22 5d 2e 73 65 61 72  n["sValue"].sear
4950: 63 68 28 73 4e 65 67 50 61 74 74 65 72 6e 29 20  ch(sNegPattern) 
4960: 21 3d 3d 20 2d 31 29 20 7b 0a 20 20 20 20 20 20  !== -1) {.      
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4980: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
4990: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
49d0: 20 28 21 73 50 61 74 74 65 72 6e 20 7c 7c 20 6f   (!sPattern || o
49e0: 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 2e  Token["sValue"].
49f0: 73 65 61 72 63 68 28 73 50 61 74 74 65 72 6e 29  search(sPattern)
4a00: 20 21 3d 3d 20 2d 31 29 20 7b 0a 20 20 20 20 20   !== -1) {.     
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62             if (b
4a30: 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20  Debug) {.       
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
4a60: 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 4d 41 54 43  sole.log("  MATC
4a70: 48 3a 20 7e 22 20 2b 20 73 52 65 67 65 78 29 3b  H: ~" + sRegex);
4a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4aa0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ac0: 20 20 20 79 69 65 6c 64 20 7b 20 22 69 54 6f 6b     yield { "iTok
4ad0: 65 6e 31 22 3a 20 69 54 6f 6b 65 6e 31 2c 20 22  en1": iToken1, "
4ae0: 69 4e 6f 64 65 22 3a 20 6f 4e 6f 64 65 5b 22 3c  iNode": oNode["<
4af0: 72 65 5f 76 61 6c 75 65 3e 22 5d 5b 73 52 65 67  re_value>"][sReg
4b00: 65 78 5d 20 7d 3b 0a 20 20 20 20 20 20 20 20 20  ex] };.         
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b20: 20 20 20 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75         bTokenFou
4b30: 6e 64 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  nd = true;.     
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b70: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
4b80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4b90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4bb0: 20 20 20 20 20 2f 2f 20 61 6e 61 6c 79 73 61 62       // analysab
4bc0: 6c 65 20 74 6f 6b 65 6e 73 0a 20 20 20 20 20 20  le tokens.      
4bd0: 20 20 20 20 20 20 69 66 20 28 6f 54 6f 6b 65 6e        if (oToken
4be0: 5b 22 73 54 79 70 65 22 5d 2e 73 6c 69 63 65 28  ["sType"].slice(
4bf0: 30 2c 34 29 20 3d 3d 20 22 57 4f 52 44 22 29 20  0,4) == "WORD") 
4c00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4c10: 20 20 2f 2f 20 74 6f 6b 65 6e 20 6c 65 6d 6d 61    // token lemma
4c20: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
4c30: 20 20 69 66 20 28 6f 4e 6f 64 65 2e 68 61 73 4f    if (oNode.hasO
4c40: 77 6e 50 72 6f 70 65 72 74 79 28 22 3c 6c 65 6d  wnProperty("<lem
4c50: 6d 61 73 3e 22 29 29 20 7b 0a 20 20 20 20 20 20  mas>")) {.      
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
4c70: 72 20 28 6c 65 74 20 73 4c 65 6d 6d 61 20 6f 66  r (let sLemma of
4c80: 20 67 63 5f 65 6e 67 69 6e 65 2e 6f 53 70 65 6c   gc_engine.oSpel
4c90: 6c 43 68 65 63 6b 65 72 2e 67 65 74 4c 65 6d 6d  lChecker.getLemm
4ca0: 61 28 6f 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65  a(oToken["sValue
4cb0: 22 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  "])) {.         
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4cd0: 66 20 28 6f 4e 6f 64 65 5b 22 3c 6c 65 6d 6d 61  f (oNode["<lemma
4ce0: 73 3e 22 5d 2e 68 61 73 4f 77 6e 50 72 6f 70 65  s>"].hasOwnPrope
4cf0: 72 74 79 28 73 4c 65 6d 6d 61 29 29 20 7b 0a 20  rty(sLemma)) {. 
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d10: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62             if (b
4d20: 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20  Debug) {.       
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d40: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65           console
4d50: 2e 6c 6f 67 28 22 20 20 4d 41 54 43 48 3a 20 3e  .log("  MATCH: >
4d60: 22 20 2b 20 73 4c 65 6d 6d 61 29 3b 0a 20 20 20  " + sLemma);.   
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4da0: 20 20 20 20 20 20 20 79 69 65 6c 64 20 7b 20 22         yield { "
4db0: 69 54 6f 6b 65 6e 31 22 3a 20 69 54 6f 6b 65 6e  iToken1": iToken
4dc0: 31 2c 20 22 69 4e 6f 64 65 22 3a 20 6f 4e 6f 64  1, "iNode": oNod
4dd0: 65 5b 22 3c 6c 65 6d 6d 61 73 3e 22 5d 5b 73 4c  e["<lemmas>"][sL
4de0: 65 6d 6d 61 5d 20 7d 3b 0a 20 20 20 20 20 20 20  emma] };.       
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e00: 20 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75 6e 64       bTokenFound
4e10: 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20   = true;.       
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
4e40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4e50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 6d 6f             // mo
4e70: 72 70 68 20 61 72 63 73 0a 20 20 20 20 20 20 20  rph arcs.       
4e80: 20 20 20 20 20 20 20 20 20 69 66 20 28 6f 4e 6f           if (oNo
4e90: 64 65 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74  de.hasOwnPropert
4ea0: 79 28 22 3c 6d 6f 72 70 68 3e 22 29 29 20 7b 0a  y("<morph>")) {.
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d      let lMorph =
4ed0: 20 28 6f 54 6f 6b 65 6e 2e 68 61 73 4f 77 6e 50   (oToken.hasOwnP
4ee0: 72 6f 70 65 72 74 79 28 22 6c 4d 6f 72 70 68 22  roperty("lMorph"
4ef0: 29 29 20 3f 20 6f 54 6f 6b 65 6e 5b 22 6c 4d 6f  )) ? oToken["lMo
4f00: 72 70 68 22 5d 20 3a 20 67 63 5f 65 6e 67 69 6e  rph"] : gc_engin
4f10: 65 2e 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e  e.oSpellChecker.
4f20: 67 65 74 4d 6f 72 70 68 28 6f 54 6f 6b 65 6e 5b  getMorph(oToken[
4f30: 22 73 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20  "sValue"]);.    
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f50: 69 66 20 28 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74  if (lMorph.lengt
4f60: 68 20 3e 20 30 29 20 7b 0a 20 20 20 20 20 20 20  h > 0) {.       
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f80: 20 66 6f 72 20 28 6c 65 74 20 73 53 65 61 72 63   for (let sSearc
4f90: 68 20 69 6e 20 6f 4e 6f 64 65 5b 22 3c 6d 6f 72  h in oNode["<mor
4fa0: 70 68 3e 22 5d 29 20 7b 0a 20 20 20 20 20 20 20  ph>"]) {.       
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fc0: 20 20 20 20 20 69 66 20 28 21 73 53 65 61 72 63       if (!sSearc
4fd0: 68 2e 69 6e 63 6c 75 64 65 73 28 22 c2 ac 22 29  h.includes("..")
4fe0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5000: 20 20 20 20 2f 2f 20 6e 6f 20 61 6e 74 69 2d 70      // no anti-p
5010: 61 74 74 65 72 6e 0a 20 20 20 20 20 20 20 20 20  attern.         
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5030: 20 20 20 20 20 20 20 69 66 20 28 6c 4d 6f 72 70         if (lMorp
5040: 68 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20 20 3d  h.some(sMorph  =
5050: 3e 20 20 28 73 4d 6f 72 70 68 2e 69 6e 63 6c 75  >  (sMorph.inclu
5060: 64 65 73 28 73 53 65 61 72 63 68 29 29 29 29 20  des(sSearch)))) 
5070: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5090: 20 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67        if (bDebug
50a0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
50d0: 6f 6c 65 2e 6c 6f 67 28 22 20 20 4d 41 54 43 48  ole.log("  MATCH
50e0: 3a 20 24 22 20 2b 20 73 53 65 61 72 63 68 29 3b  : $" + sSearch);
50f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5110: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64             yield
5140: 20 7b 20 22 69 54 6f 6b 65 6e 31 22 3a 20 69 54   { "iToken1": iT
5150: 6f 6b 65 6e 31 2c 20 22 69 4e 6f 64 65 22 3a 20  oken1, "iNode": 
5160: 6f 4e 6f 64 65 5b 22 3c 6d 6f 72 70 68 3e 22 5d  oNode["<morph>"]
5170: 5b 73 53 65 61 72 63 68 5d 20 7d 3b 0a 20 20 20  [sSearch] };.   
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 20 62 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20 74   bTokenFound = t
51b0: 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rue;.           
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74              // t
5220: 68 65 72 65 20 69 73 20 61 6e 20 61 6e 74 69 2d  here is an anti-
5230: 70 61 74 74 65 72 6e 0a 20 20 20 20 20 20 20 20  pattern.        
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 20 20 20 20 20 20 20 20 6c 65 74 20 5b 73 50 61          let [sPa
5260: 74 74 65 72 6e 2c 20 73 4e 65 67 50 61 74 74 65  ttern, sNegPatte
5270: 72 6e 5d 20 3d 20 73 53 65 61 72 63 68 2e 73 70  rn] = sSearch.sp
5280: 6c 69 74 28 22 c2 ac 22 2c 20 32 29 3b 0a 20 20  lit("..", 2);.  
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
52b0: 20 28 73 4e 65 67 50 61 74 74 65 72 6e 20 3d 3d   (sNegPattern ==
52c0: 20 22 2a 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "*") {.        
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 61              // a
52f0: 6c 6c 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20  ll morphologies 
5300: 6d 75 73 74 20 6d 61 74 63 68 20 77 69 74 68 20  must match with 
5310: 3c 73 50 61 74 74 65 72 6e 3e 0a 20 20 20 20 20  <sPattern>.     
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
5340: 66 20 28 73 50 61 74 74 65 72 6e 29 20 7b 0a 20  f (sPattern) {. 
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5370: 20 20 20 20 20 20 20 69 66 20 28 6c 4d 6f 72 70         if (lMorp
5380: 68 2e 65 76 65 72 79 28 73 4d 6f 72 70 68 20 20  h.every(sMorph  
5390: 3d 3e 20 20 28 73 4d 6f 72 70 68 2e 69 6e 63 6c  =>  (sMorph.incl
53a0: 75 64 65 73 28 73 50 61 74 74 65 72 6e 29 29 29  udes(sPattern)))
53b0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20  if (bDebug) {.  
53f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
5420: 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 4d 41 54  nsole.log("  MAT
5430: 43 48 3a 20 24 22 20 2b 20 73 53 65 61 72 63 68  CH: $" + sSearch
5440: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65               yie
54a0: 6c 64 20 7b 20 22 69 54 6f 6b 65 6e 31 22 3a 20  ld { "iToken1": 
54b0: 69 54 6f 6b 65 6e 31 2c 20 22 69 4e 6f 64 65 22  iToken1, "iNode"
54c0: 3a 20 6f 4e 6f 64 65 5b 22 3c 6d 6f 72 70 68 3e  : oNode["<morph>
54d0: 22 5d 5b 73 53 65 61 72 63 68 5d 20 7d 3b 0a 20  "][sSearch] };. 
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 20 20 20 20 20 20 20 20 20 20 20 62 54 6f 6b 65             bToke
5510: 6e 46 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0a 20  nFound = true;. 
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5590: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
55c0: 73 4e 65 67 50 61 74 74 65 72 6e 20 20 26 26 20  sNegPattern  && 
55d0: 20 6c 4d 6f 72 70 68 2e 73 6f 6d 65 28 73 4d 6f   lMorph.some(sMo
55e0: 72 70 68 20 20 3d 3e 20 20 28 73 4d 6f 72 70 68  rph  =>  (sMorph
55f0: 2e 69 6e 63 6c 75 64 65 73 28 73 4e 65 67 50 61  .includes(sNegPa
5600: 74 74 65 72 6e 29 29 29 29 20 7b 0a 20 20 20 20  ttern)))) {.    
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5630: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
5670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5680: 20 20 20 20 20 20 20 20 69 66 20 28 21 73 50 61          if (!sPa
5690: 74 74 65 72 6e 20 20 7c 7c 20 20 6c 4d 6f 72 70  ttern  ||  lMorp
56a0: 68 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20 20 3d  h.some(sMorph  =
56b0: 3e 20 20 28 73 4d 6f 72 70 68 2e 69 6e 63 6c 75  >  (sMorph.inclu
56c0: 64 65 73 28 73 50 61 74 74 65 72 6e 29 29 29 29  des(sPattern))))
56d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62             if (b
5700: 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20  Debug) {.       
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5730: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
5740: 28 22 20 20 4d 41 54 43 48 3a 20 24 22 20 2b 20  ("  MATCH: $" + 
5750: 73 53 65 61 72 63 68 29 3b 0a 20 20 20 20 20 20  sSearch);.      
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c              yiel
57b0: 64 20 7b 20 22 69 54 6f 6b 65 6e 31 22 3a 20 69  d { "iToken1": i
57c0: 54 6f 6b 65 6e 31 2c 20 22 69 4e 6f 64 65 22 3a  Token1, "iNode":
57d0: 20 6f 4e 6f 64 65 5b 22 3c 6d 6f 72 70 68 3e 22   oNode["<morph>"
57e0: 5d 5b 73 53 65 61 72 63 68 5d 20 7d 3b 0a 20 20  ][sSearch] };.  
57f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 20 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75 6e        bTokenFoun
5820: 64 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20  d = true;.      
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
5890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58d0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
58e0: 20 20 2f 2f 20 72 65 67 65 78 20 6d 6f 72 70 68    // regex morph
58f0: 20 61 72 63 73 0a 20 20 20 20 20 20 20 20 20 20   arcs.          
5900: 20 20 20 20 20 20 69 66 20 28 6f 4e 6f 64 65 2e        if (oNode.
5910: 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 22  hasOwnProperty("
5920: 3c 72 65 5f 6d 6f 72 70 68 3e 22 29 29 20 7b 0a  <re_morph>")) {.
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 20 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d      let lMorph =
5950: 20 28 6f 54 6f 6b 65 6e 2e 68 61 73 4f 77 6e 50   (oToken.hasOwnP
5960: 72 6f 70 65 72 74 79 28 22 6c 4d 6f 72 70 68 22  roperty("lMorph"
5970: 29 29 20 3f 20 6f 54 6f 6b 65 6e 5b 22 6c 4d 6f  )) ? oToken["lMo
5980: 72 70 68 22 5d 20 3a 20 67 63 5f 65 6e 67 69 6e  rph"] : gc_engin
5990: 65 2e 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e  e.oSpellChecker.
59a0: 67 65 74 4d 6f 72 70 68 28 6f 54 6f 6b 65 6e 5b  getMorph(oToken[
59b0: 22 73 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20  "sValue"]);.    
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59d0: 69 66 20 28 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74  if (lMorph.lengt
59e0: 68 20 3e 20 30 29 20 7b 0a 20 20 20 20 20 20 20  h > 0) {.       
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 20 66 6f 72 20 28 6c 65 74 20 73 52 65 67 65 78   for (let sRegex
5a10: 20 69 6e 20 6f 4e 6f 64 65 5b 22 3c 72 65 5f 6d   in oNode["<re_m
5a20: 6f 72 70 68 3e 22 5d 29 20 7b 0a 20 20 20 20 20  orph>"]) {.     
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a40: 20 20 20 20 20 20 20 69 66 20 28 21 73 52 65 67         if (!sReg
5a50: 65 78 2e 69 6e 63 6c 75 64 65 73 28 22 c2 ac 22  ex.includes(".."
5a60: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
5a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a80: 20 20 20 20 20 2f 2f 20 6e 6f 20 61 6e 74 69 2d       // no anti-
5a90: 70 61 74 74 65 72 6e 0a 20 20 20 20 20 20 20 20  pattern.        
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ab0: 20 20 20 20 20 20 20 20 69 66 20 28 6c 4d 6f 72          if (lMor
5ac0: 70 68 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20 20  ph.some(sMorph  
5ad0: 3d 3e 20 20 28 73 4d 6f 72 70 68 2e 73 65 61 72  =>  (sMorph.sear
5ae0: 63 68 28 73 52 65 67 65 78 29 20 21 3d 3d 20 2d  ch(sRegex) !== -
5af0: 31 29 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  1))) {.         
5b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b10: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62             if (b
5b20: 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20  Debug) {.       
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b50: 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20 20   console.log("  
5b60: 4d 41 54 43 48 3a 20 40 22 20 2b 20 73 52 65 67  MATCH: @" + sReg
5b70: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ex);.           
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 79                 y
5bc0: 69 65 6c 64 20 7b 20 22 69 54 6f 6b 65 6e 31 22  ield { "iToken1"
5bd0: 3a 20 69 54 6f 6b 65 6e 31 2c 20 22 69 4e 6f 64  : iToken1, "iNod
5be0: 65 22 3a 20 6f 4e 6f 64 65 5b 22 3c 72 65 5f 6d  e": oNode["<re_m
5bf0: 6f 72 70 68 3e 22 5d 5b 73 52 65 67 65 78 5d 20  orph>"][sRegex] 
5c00: 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  };.             
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c20: 20 20 20 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75         bTokenFou
5c30: 6e 64 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  nd = true;.     
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c50: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c70: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
5c80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ca0: 20 20 2f 2f 20 74 68 65 72 65 20 69 73 20 61 6e    // there is an
5cb0: 20 61 6e 74 69 2d 70 61 74 74 65 72 6e 0a 20 20   anti-pattern.  
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
5ce0: 74 20 5b 73 50 61 74 74 65 72 6e 2c 20 73 4e 65  t [sPattern, sNe
5cf0: 67 50 61 74 74 65 72 6e 5d 20 3d 20 73 52 65 67  gPattern] = sReg
5d00: 65 78 2e 73 70 6c 69 74 28 22 c2 ac 22 2c 20 32  ex.split("..", 2
5d10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d30: 20 20 20 69 66 20 28 73 4e 65 67 50 61 74 74 65     if (sNegPatte
5d40: 72 6e 20 3d 3d 20 22 2a 22 29 20 7b 0a 20 20 20  rn == "*") {.   
5d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d70: 20 2f 2f 20 61 6c 6c 20 6d 6f 72 70 68 6f 6c 6f   // all morpholo
5d80: 67 69 65 73 20 6d 75 73 74 20 6d 61 74 63 68 20  gies must match 
5d90: 77 69 74 68 20 3c 73 50 61 74 74 65 72 6e 3e 0a  with <sPattern>.
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dc0: 20 20 20 20 69 66 20 28 73 50 61 74 74 65 72 6e      if (sPattern
5dd0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
5e00: 6c 4d 6f 72 70 68 2e 65 76 65 72 79 28 73 4d 6f  lMorph.every(sMo
5e10: 72 70 68 20 20 3d 3e 20 20 28 73 4d 6f 72 70 68  rph  =>  (sMorph
5e20: 2e 73 65 61 72 63 68 28 73 50 61 74 74 65 72 6e  .search(sPattern
5e30: 29 20 21 3d 3d 20 2d 31 29 29 29 20 7b 0a 20 20  ) !== -1))) {.  
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62 44            if (bD
5e70: 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20  ebug) {.        
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ea0: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
5eb0: 6c 6f 67 28 22 20 20 4d 41 54 43 48 3a 20 40 22  log("  MATCH: @"
5ec0: 20 2b 20 73 52 65 67 65 78 29 3b 0a 20 20 20 20   + sRegex);.    
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ef0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f20: 20 20 20 20 20 20 79 69 65 6c 64 20 7b 20 22 69        yield { "i
5f30: 54 6f 6b 65 6e 31 22 3a 20 69 54 6f 6b 65 6e 31  Token1": iToken1
5f40: 2c 20 22 69 4e 6f 64 65 22 3a 20 6f 4e 6f 64 65  , "iNode": oNode
5f50: 5b 22 3c 72 65 5f 6d 6f 72 70 68 3e 22 5d 5b 73  ["<re_morph>"][s
5f60: 52 65 67 65 78 5d 20 7d 3b 0a 20 20 20 20 20 20  Regex] };.      
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f90: 20 20 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75 6e        bTokenFoun
5fa0: 64 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20  d = true;.      
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ff0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6010: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
6020: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
6030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6040: 20 20 20 20 20 20 20 69 66 20 28 73 4e 65 67 50         if (sNegP
6050: 61 74 74 65 72 6e 20 20 26 26 20 20 6c 4d 6f 72  attern  &&  lMor
6060: 70 68 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20 20  ph.some(sMorph  
6070: 3d 3e 20 20 28 73 4d 6f 72 70 68 2e 73 65 61 72  =>  (sMorph.sear
6080: 63 68 28 73 4e 65 67 50 61 74 74 65 72 6e 29 20  ch(sNegPattern) 
6090: 21 3d 3d 20 2d 31 29 29 29 20 7b 0a 20 20 20 20  !== -1))) {.    
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60c0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
6100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6110: 20 20 20 20 20 20 20 20 69 66 20 28 21 73 50 61          if (!sPa
6120: 74 74 65 72 6e 20 20 7c 7c 20 20 6c 4d 6f 72 70  ttern  ||  lMorp
6130: 68 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20 20 3d  h.some(sMorph  =
6140: 3e 20 20 28 73 4d 6f 72 70 68 2e 73 65 61 72 63  >  (sMorph.searc
6150: 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20  h(sPattern) !== 
6160: 2d 31 29 29 29 20 7b 0a 20 20 20 20 20 20 20 20  -1))) {.        
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6190: 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20  if (bDebug) {.  
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61c0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
61d0: 65 2e 6c 6f 67 28 22 20 20 4d 41 54 43 48 3a 20  e.log("  MATCH: 
61e0: 40 22 20 2b 20 73 52 65 67 65 78 29 3b 0a 20 20  @" + sRegex);.  
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6240: 79 69 65 6c 64 20 7b 20 22 69 54 6f 6b 65 6e 31  yield { "iToken1
6250: 22 3a 20 69 54 6f 6b 65 6e 31 2c 20 22 69 4e 6f  ": iToken1, "iNo
6260: 64 65 22 3a 20 6f 4e 6f 64 65 5b 22 3c 72 65 5f  de": oNode["<re_
6270: 6d 6f 72 70 68 3e 22 5d 5b 73 52 65 67 65 78 5d  morph>"][sRegex]
6280: 20 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   };.            
6290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 62 54 6f 6b              bTok
62b0: 65 6e 46 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0a  enFound = true;.
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6300: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6350: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6360: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6370: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6380: 20 20 2f 2f 20 74 6f 6b 65 6e 20 74 61 67 73 0a    // token tags.
6390: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
63a0: 6f 54 6f 6b 65 6e 2e 68 61 73 4f 77 6e 50 72 6f  oToken.hasOwnPro
63b0: 70 65 72 74 79 28 22 61 54 61 67 73 22 29 20 26  perty("aTags") &
63c0: 26 20 6f 4e 6f 64 65 2e 68 61 73 4f 77 6e 50 72  & oNode.hasOwnPr
63d0: 6f 70 65 72 74 79 28 22 3c 74 61 67 73 3e 22 29  operty("<tags>")
63e0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
63f0: 20 20 20 20 66 6f 72 20 28 6c 65 74 20 73 54 61      for (let sTa
6400: 67 20 6f 66 20 6f 54 6f 6b 65 6e 5b 22 61 54 61  g of oToken["aTa
6410: 67 73 22 5d 29 20 7b 0a 20 20 20 20 20 20 20 20  gs"]) {.        
6420: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
6430: 6f 4e 6f 64 65 5b 22 3c 74 61 67 73 3e 22 5d 2e  oNode["<tags>"].
6440: 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 73  hasOwnProperty(s
6450: 54 61 67 29 29 20 7b 0a 20 20 20 20 20 20 20 20  Tag)) {.        
6460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6470: 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20  if (bDebug) {.  
6480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6490: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
64a0: 65 2e 6c 6f 67 28 22 20 20 4d 41 54 43 48 3a 20  e.log("  MATCH: 
64b0: 2f 22 20 2b 20 73 54 61 67 29 3b 0a 20 20 20 20  /" + sTag);.    
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 79 69                yi
64f0: 65 6c 64 20 7b 20 22 69 54 6f 6b 65 6e 31 22 3a  eld { "iToken1":
6500: 20 69 54 6f 6b 65 6e 31 2c 20 22 69 4e 6f 64 65   iToken1, "iNode
6510: 22 3a 20 6f 4e 6f 64 65 5b 22 3c 74 61 67 73 3e  ": oNode["<tags>
6520: 22 5d 5b 73 54 61 67 5d 20 7d 3b 0a 20 20 20 20  "][sTag] };.    
6530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6540: 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75 6e 64 20      bTokenFound 
6550: 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20  = true;.        
6560: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
6580: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6590: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 6d 65 74            // met
65a0: 61 20 61 72 63 20 28 66 6f 72 20 74 6f 6b 65 6e  a arc (for token
65b0: 20 74 79 70 65 29 0a 20 20 20 20 20 20 20 20 20   type).         
65c0: 20 20 20 69 66 20 28 6f 4e 6f 64 65 2e 68 61 73     if (oNode.has
65d0: 4f 77 6e 50 72 6f 70 65 72 74 79 28 22 3c 6d 65  OwnProperty("<me
65e0: 74 61 3e 22 29 29 20 7b 0a 20 20 20 20 20 20 20  ta>")) {.       
65f0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65           for (le
6600: 74 20 73 4d 65 74 61 20 69 6e 20 6f 4e 6f 64 65  t sMeta in oNode
6610: 5b 22 3c 6d 65 74 61 3e 22 5d 29 20 7b 0a 20 20  ["<meta>"]) {.  
6620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6630: 20 20 2f 2f 20 6e 6f 20 72 65 67 65 78 20 68 65    // no regex he
6640: 72 65 2c 20 77 65 20 6a 75 73 74 20 73 65 61 72  re, we just sear
6650: 63 68 20 69 66 20 3c 6f 4e 6f 64 65 5b 22 73 54  ch if <oNode["sT
6660: 79 70 65 22 5d 3e 20 65 78 69 73 74 73 20 77 69  ype"]> exists wi
6670: 74 68 69 6e 20 3c 73 4d 65 74 61 3e 0a 20 20 20  thin <sMeta>.   
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6690: 20 69 66 20 28 73 4d 65 74 61 20 3d 3d 20 22 2a   if (sMeta == "*
66a0: 22 20 7c 7c 20 6f 54 6f 6b 65 6e 5b 22 73 54 79  " || oToken["sTy
66b0: 70 65 22 5d 20 3d 3d 20 73 4d 65 74 61 29 20 7b  pe"] == sMeta) {
66c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
66d0: 20 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65           if (bDe
66e0: 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20  bug) {.         
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6700: 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22     console.log("
6710: 20 20 4d 41 54 43 48 3a 20 2a 22 20 2b 20 73 4d    MATCH: *" + sM
6720: 65 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eta);.          
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
6740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6750: 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 7b 20          yield { 
6760: 22 69 54 6f 6b 65 6e 31 22 3a 20 69 54 6f 6b 65  "iToken1": iToke
6770: 6e 31 2c 20 22 69 4e 6f 64 65 22 3a 20 6f 4e 6f  n1, "iNode": oNo
6780: 64 65 5b 22 3c 6d 65 74 61 3e 22 5d 5b 73 4d 65  de["<meta>"][sMe
6790: 74 61 5d 20 7d 3b 0a 20 20 20 20 20 20 20 20 20  ta] };.         
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
67b0: 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20 74 72 75  TokenFound = tru
67c0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
67d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
67f0: 65 20 69 66 20 28 73 4d 65 74 61 2e 69 6e 63 6c  e if (sMeta.incl
6800: 75 64 65 73 28 22 c2 ac 22 29 29 20 7b 0a 20 20  udes("..")) {.  
6810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6820: 20 20 20 20 20 20 69 66 20 28 21 73 4d 65 74 61        if (!sMeta
6830: 2e 69 6e 63 6c 75 64 65 73 28 6f 54 6f 6b 65 6e  .includes(oToken
6840: 5b 22 73 54 79 70 65 22 5d 29 29 20 7b 0a 20 20  ["sType"])) {.  
6850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6860: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62 44            if (bD
6870: 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20  ebug) {.        
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6890: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
68a0: 6c 6f 67 28 22 20 20 4d 41 54 43 48 3a 20 2a 22  log("  MATCH: *"
68b0: 20 2b 20 73 4d 65 74 61 29 3b 0a 20 20 20 20 20   + sMeta);.     
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68f0: 20 20 20 20 20 79 69 65 6c 64 20 7b 20 22 69 54       yield { "iT
6900: 6f 6b 65 6e 31 22 3a 20 69 54 6f 6b 65 6e 31 2c  oken1": iToken1,
6910: 20 22 69 4e 6f 64 65 22 3a 20 6f 4e 6f 64 65 5b   "iNode": oNode[
6920: 22 3c 6d 65 74 61 3e 22 5d 5b 73 4d 65 74 61 5d  "<meta>"][sMeta]
6930: 20 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   };.            
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 62 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20 74 72  bTokenFound = tr
6960: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
6970: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6990: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
69a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
69b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
69c0: 69 66 20 28 21 62 54 6f 6b 65 6e 46 6f 75 6e 64  if (!bTokenFound
69d0: 20 20 26 26 20 20 6f 50 6f 69 6e 74 65 72 2e 68    &&  oPointer.h
69e0: 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 22 62  asOwnProperty("b
69f0: 4b 65 65 70 22 29 29 20 7b 0a 20 20 20 20 20 20  Keep")) {.      
6a00: 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
6a10: 6f 50 6f 69 6e 74 65 72 3b 0a 20 20 20 20 20 20  oPointer;.      
6a20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6a30: 20 20 20 20 2f 2f 20 4a 55 4d 50 0a 20 20 20 20      // JUMP.    
6a40: 20 20 20 20 20 20 20 20 2f 2f 20 57 61 72 6e 69          // Warni
6a50: 6e 67 21 20 52 65 63 75 72 73 73 69 6f 6e 21 0a  ng! Recurssion!.
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
6a70: 6f 4e 6f 64 65 2e 68 61 73 4f 77 6e 50 72 6f 70  oNode.hasOwnProp
6a80: 65 72 74 79 28 22 3c 3e 22 29 29 20 7b 0a 20 20  erty("<>")) {.  
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
6aa0: 74 20 6f 50 6f 69 6e 74 65 72 32 20 3d 20 7b 20  t oPointer2 = { 
6ab0: 22 69 54 6f 6b 65 6e 31 22 3a 20 69 54 6f 6b 65  "iToken1": iToke
6ac0: 6e 31 2c 20 22 69 4e 6f 64 65 22 3a 20 6f 4e 6f  n1, "iNode": oNo
6ad0: 64 65 5b 22 3c 3e 22 5d 2c 20 22 62 4b 65 65 70  de["<>"], "bKeep
6ae0: 22 3a 20 74 72 75 65 20 7d 3b 0a 20 20 20 20 20  ": true };.     
6af0: 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64             yield
6b00: 2a 20 74 68 69 73 2e 5f 67 65 74 4e 65 78 74 50  * this._getNextP
6b10: 6f 69 6e 74 65 72 73 28 6f 54 6f 6b 65 6e 2c 20  ointers(oToken, 
6b20: 6f 47 72 61 70 68 2c 20 6f 50 6f 69 6e 74 65 72  oGraph, oPointer
6b30: 32 2c 20 62 44 65 62 75 67 29 3b 0a 20 20 20 20  2, bDebug);.    
6b40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6b50: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 74 63    }.        catc
6b60: 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20  h (e) {.        
6b70: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f      console.erro
6b80: 72 28 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  r(e);.        }.
6b90: 20 20 20 20 7d 0a 0a 20 20 20 20 70 61 72 73 65      }..    parse
6ba0: 47 72 61 70 68 20 28 6f 47 72 61 70 68 2c 20 73  Graph (oGraph, s
6bb0: 43 6f 75 6e 74 72 79 3d 22 24 7b 63 6f 75 6e 74  Country="${count
6bc0: 72 79 5f 64 65 66 61 75 6c 74 7d 22 2c 20 64 4f  ry_default}", dO
6bd0: 70 74 69 6f 6e 73 3d 6e 75 6c 6c 2c 20 62 53 68  ptions=null, bSh
6be0: 6f 77 52 75 6c 65 49 64 3d 66 61 6c 73 65 2c 20  owRuleId=false, 
6bf0: 62 44 65 62 75 67 3d 66 61 6c 73 65 2c 20 62 43  bDebug=false, bC
6c00: 6f 6e 74 65 78 74 3d 66 61 6c 73 65 29 20 7b 0a  ontext=false) {.
6c10: 20 20 20 20 20 20 20 20 2f 2f 20 70 61 72 73 65          // parse
6c20: 20 67 72 61 70 68 20 77 69 74 68 20 74 6f 6b 65   graph with toke
6c30: 6e 73 20 66 72 6f 6d 20 74 68 65 20 74 65 78 74  ns from the text
6c40: 20 61 6e 64 20 65 78 65 63 75 74 65 20 61 63 74   and execute act
6c50: 69 6f 6e 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  ions encountered
6c60: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6c 50 6f  .        let lPo
6c70: 69 6e 74 65 72 20 3d 20 5b 5d 3b 0a 20 20 20 20  inter = [];.    
6c80: 20 20 20 20 6c 65 74 20 62 54 61 67 41 6e 64 52      let bTagAndR
6c90: 65 77 72 69 74 65 20 3d 20 66 61 6c 73 65 3b 0a  ewrite = false;.
6ca0: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
6cb0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c            for (l
6cc0: 65 74 20 5b 69 54 6f 6b 65 6e 2c 20 6f 54 6f 6b  et [iToken, oTok
6cd0: 65 6e 5d 20 6f 66 20 74 68 69 73 2e 6c 54 6f 6b  en] of this.lTok
6ce0: 65 6e 2e 65 6e 74 72 69 65 73 28 29 29 20 7b 0a  en.entries()) {.
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d00: 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20  if (bDebug) {.  
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d20: 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 54    console.log("T
6d30: 4f 4b 45 4e 3a 20 22 20 2b 20 6f 54 6f 6b 65 6e  OKEN: " + oToken
6d40: 5b 22 73 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20  ["sValue"]);.   
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6d70: 2f 20 63 68 65 63 6b 20 61 72 63 73 20 66 6f 72  / check arcs for
6d80: 20 65 61 63 68 20 65 78 69 73 74 69 6e 67 20 70   each existing p
6d90: 6f 69 6e 74 65 72 0a 20 20 20 20 20 20 20 20 20  ointer.         
6da0: 20 20 20 20 20 20 20 6c 65 74 20 6c 4e 65 78 74         let lNext
6db0: 50 6f 69 6e 74 65 72 20 3d 20 5b 5d 3b 0a 20 20  Pointer = [];.  
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
6dd0: 72 20 28 6c 65 74 20 6f 50 6f 69 6e 74 65 72 20  r (let oPointer 
6de0: 6f 66 20 6c 50 6f 69 6e 74 65 72 29 20 7b 0a 20  of lPointer) {. 
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e00: 20 20 20 6c 4e 65 78 74 50 6f 69 6e 74 65 72 2e     lNextPointer.
6e10: 70 75 73 68 28 2e 2e 2e 74 68 69 73 2e 5f 67 65  push(...this._ge
6e20: 74 4e 65 78 74 50 6f 69 6e 74 65 72 73 28 6f 54  tNextPointers(oT
6e30: 6f 6b 65 6e 2c 20 6f 47 72 61 70 68 2c 20 6f 50  oken, oGraph, oP
6e40: 6f 69 6e 74 65 72 2c 20 62 44 65 62 75 67 29 29  ointer, bDebug))
6e50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6e60: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
6e70: 20 20 20 20 6c 50 6f 69 6e 74 65 72 20 3d 20 6c      lPointer = l
6e80: 4e 65 78 74 50 6f 69 6e 74 65 72 3b 0a 20 20 20  NextPointer;.   
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
6ea0: 63 68 65 63 6b 20 61 72 63 73 20 6f 66 20 66 69  check arcs of fi
6eb0: 72 73 74 20 6e 6f 64 65 73 0a 20 20 20 20 20 20  rst nodes.      
6ec0: 20 20 20 20 20 20 20 20 20 20 6c 50 6f 69 6e 74            lPoint
6ed0: 65 72 2e 70 75 73 68 28 2e 2e 2e 74 68 69 73 2e  er.push(...this.
6ee0: 5f 67 65 74 4e 65 78 74 50 6f 69 6e 74 65 72 73  _getNextPointers
6ef0: 28 6f 54 6f 6b 65 6e 2c 20 6f 47 72 61 70 68 2c  (oToken, oGraph,
6f00: 20 7b 20 22 69 54 6f 6b 65 6e 31 22 3a 20 69 54   { "iToken1": iT
6f10: 6f 6b 65 6e 2c 20 22 69 4e 6f 64 65 22 3a 20 30  oken, "iNode": 0
6f20: 20 7d 2c 20 62 44 65 62 75 67 29 29 3b 0a 20 20   }, bDebug));.  
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
6f40: 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   check if there 
6f50: 69 73 20 72 75 6c 65 73 20 74 6f 20 63 68 65 63  is rules to chec
6f60: 6b 20 66 6f 72 20 65 61 63 68 20 70 6f 69 6e 74  k for each point
6f70: 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
6f80: 20 20 20 66 6f 72 20 28 6c 65 74 20 6f 50 6f 69     for (let oPoi
6f90: 6e 74 65 72 20 6f 66 20 6c 50 6f 69 6e 74 65 72  nter of lPointer
6fa0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
6fb0: 20 20 20 20 20 20 20 20 69 66 20 28 6f 47 72 61          if (oGra
6fc0: 70 68 5b 6f 50 6f 69 6e 74 65 72 5b 22 69 4e 6f  ph[oPointer["iNo
6fd0: 64 65 22 5d 5d 2e 68 61 73 4f 77 6e 50 72 6f 70  de"]].hasOwnProp
6fe0: 65 72 74 79 28 22 3c 72 75 6c 65 73 3e 22 29 29  erty("<rules>"))
6ff0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
7000: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 62             let b
7010: 43 68 61 6e 67 65 20 3d 20 74 68 69 73 2e 5f 65  Change = this._e
7020: 78 65 63 75 74 65 41 63 74 69 6f 6e 73 28 6f 47  xecuteActions(oG
7030: 72 61 70 68 2c 20 6f 47 72 61 70 68 5b 6f 50 6f  raph, oGraph[oPo
7040: 69 6e 74 65 72 5b 22 69 4e 6f 64 65 22 5d 5d 5b  inter["iNode"]][
7050: 22 3c 72 75 6c 65 73 3e 22 5d 2c 20 6f 50 6f 69  "<rules>"], oPoi
7060: 6e 74 65 72 5b 22 69 54 6f 6b 65 6e 31 22 5d 2d  nter["iToken1"]-
7070: 31 2c 20 69 54 6f 6b 65 6e 2c 20 64 4f 70 74 69  1, iToken, dOpti
7080: 6f 6e 73 2c 20 73 43 6f 75 6e 74 72 79 2c 20 62  ons, sCountry, b
7090: 53 68 6f 77 52 75 6c 65 49 64 2c 20 62 44 65 62  ShowRuleId, bDeb
70a0: 75 67 2c 20 62 43 6f 6e 74 65 78 74 29 3b 0a 20  ug, bContext);. 
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70c0: 20 20 20 20 20 20 20 69 66 20 28 62 43 68 61 6e         if (bChan
70d0: 67 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ge) {.          
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 62 54 61 67 41 6e 64 52 65 77 72 69 74 65    bTagAndRewrite
7100: 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20   = true;.       
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7120: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
7130: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7140: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7150: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7160: 20 7d 20 63 61 74 63 68 20 28 65 29 20 7b 0a 20   } catch (e) {. 
7170: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f             conso
7180: 6c 65 2e 65 72 72 6f 72 28 65 29 3b 0a 20 20 20  le.error(e);.   
7190: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
71a0: 66 20 28 62 54 61 67 41 6e 64 52 65 77 72 69 74  f (bTagAndRewrit
71b0: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
71c0: 20 74 68 69 73 2e 72 65 77 72 69 74 65 46 72 6f   this.rewriteFro
71d0: 6d 54 61 67 73 28 62 44 65 62 75 67 29 3b 0a 20  mTags(bDebug);. 
71e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
71f0: 20 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20   if (bDebug) {. 
7200: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f             conso
7210: 6c 65 2e 6c 6f 67 28 74 68 69 73 2e 61 73 53 74  le.log(this.asSt
7220: 72 69 6e 67 28 29 29 3b 0a 20 20 20 20 20 20 20  ring());.       
7230: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
7240: 6e 20 74 68 69 73 2e 73 53 65 6e 74 65 6e 63 65  n this.sSentence
7250: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 5f 65 78  ;.    }..    _ex
7260: 65 63 75 74 65 41 63 74 69 6f 6e 73 20 28 6f 47  ecuteActions (oG
7270: 72 61 70 68 2c 20 6f 4e 6f 64 65 2c 20 6e 54 6f  raph, oNode, nTo
7280: 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73 74  kenOffset, nLast
7290: 54 6f 6b 65 6e 2c 20 64 4f 70 74 69 6f 6e 73 2c  Token, dOptions,
72a0: 20 73 43 6f 75 6e 74 72 79 2c 20 62 53 68 6f 77   sCountry, bShow
72b0: 52 75 6c 65 49 64 2c 20 62 44 65 62 75 67 2c 20  RuleId, bDebug, 
72c0: 62 43 6f 6e 74 65 78 74 29 20 7b 0a 20 20 20 20  bContext) {.    
72d0: 20 20 20 20 2f 2f 20 65 78 65 63 75 74 65 20 61      // execute a
72e0: 63 74 69 6f 6e 73 20 66 6f 75 6e 64 20 69 6e 20  ctions found in 
72f0: 74 68 65 20 44 41 52 47 0a 20 20 20 20 20 20 20  the DARG.       
7300: 20 6c 65 74 20 62 43 68 61 6e 67 65 20 3d 20 66   let bChange = f
7310: 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 66 6f  alse;.        fo
7320: 72 20 28 6c 65 74 20 5b 73 4c 69 6e 65 49 64 2c  r (let [sLineId,
7330: 20 6e 65 78 74 4e 6f 64 65 4b 65 79 5d 20 6f 66   nextNodeKey] of
7340: 20 4f 62 6a 65 63 74 2e 65 6e 74 72 69 65 73 28   Object.entries(
7350: 6f 4e 6f 64 65 29 29 20 7b 0a 20 20 20 20 20 20  oNode)) {.      
7360: 20 20 20 20 20 20 6c 65 74 20 62 43 6f 6e 64 4d        let bCondM
7370: 65 6d 6f 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20  emo = null;.    
7380: 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74          for (let
7390: 20 73 52 75 6c 65 49 64 20 6f 66 20 6f 47 72 61   sRuleId of oGra
73a0: 70 68 5b 6e 65 78 74 4e 6f 64 65 4b 65 79 5d 29  ph[nextNodeKey])
73b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
73c0: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
73e0: 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20  (bDebug) {.     
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7400: 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22     console.log("
7410: 20 20 20 3e 54 52 59 3a 20 22 20 2b 20 73 52 75     >TRY: " + sRu
7420: 6c 65 49 64 20 2b 20 22 20 22 20 2b 20 73 4c 69  leId + " " + sLi
7430: 6e 65 49 64 29 3b 0a 20 20 20 20 20 20 20 20 20  neId);.         
7440: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7460: 20 6c 65 74 20 5b 5f 2c 20 73 4f 70 74 69 6f 6e   let [_, sOption
7470: 2c 20 73 46 75 6e 63 43 6f 6e 64 2c 20 63 41 63  , sFuncCond, cAc
7480: 74 69 6f 6e 54 79 70 65 2c 20 73 57 68 61 74 2c  tionType, sWhat,
7490: 20 2e 2e 2e 65 41 63 74 5d 20 3d 20 67 63 5f 72   ...eAct] = gc_r
74a0: 75 6c 65 73 5f 67 72 61 70 68 2e 64 52 75 6c 65  ules_graph.dRule
74b0: 5b 73 52 75 6c 65 49 64 5d 3b 0a 20 20 20 20 20  [sRuleId];.     
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74d0: 2f 20 53 75 67 67 65 73 74 69 6f 6e 20 20 20 20  / Suggestion    
74e0: 5b 20 6f 70 74 69 6f 6e 2c 20 63 6f 6e 64 69 74  [ option, condit
74f0: 69 6f 6e 2c 20 22 2d 22 2c 20 72 65 70 6c 61 63  ion, "-", replac
7500: 65 6d 65 6e 74 2f 73 75 67 67 65 73 74 69 6f 6e  ement/suggestion
7510: 2f 61 63 74 69 6f 6e 2c 20 69 54 6f 6b 65 6e 53  /action, iTokenS
7520: 74 61 72 74 2c 20 69 54 6f 6b 65 6e 45 6e 64 2c  tart, iTokenEnd,
7530: 20 63 53 74 61 72 74 4c 69 6d 69 74 2c 20 63 45   cStartLimit, cE
7540: 6e 64 4c 69 6d 69 74 2c 20 62 43 61 73 65 53 76  ndLimit, bCaseSv
7550: 74 79 2c 20 6e 50 72 69 6f 72 69 74 79 2c 20 73  ty, nPriority, s
7560: 4d 65 73 73 61 67 65 2c 20 73 55 52 4c 20 5d 0a  Message, sURL ].
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7580: 20 20 20 20 2f 2f 20 54 65 78 74 50 72 6f 63 65      // TextProce
7590: 73 73 6f 72 20 5b 20 6f 70 74 69 6f 6e 2c 20 63  ssor [ option, c
75a0: 6f 6e 64 69 74 69 6f 6e 2c 20 22 7e 22 2c 20 72  ondition, "~", r
75b0: 65 70 6c 61 63 65 6d 65 6e 74 2f 73 75 67 67 65  eplacement/sugge
75c0: 73 74 69 6f 6e 2f 61 63 74 69 6f 6e 2c 20 69 54  stion/action, iT
75d0: 6f 6b 65 6e 53 74 61 72 74 2c 20 69 54 6f 6b 65  okenStart, iToke
75e0: 6e 45 6e 64 2c 20 62 43 61 73 65 53 76 74 79 20  nEnd, bCaseSvty 
75f0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
7600: 20 20 20 20 20 20 2f 2f 20 44 69 73 61 6d 62 69        // Disambi
7610: 67 75 61 74 6f 72 20 5b 20 6f 70 74 69 6f 6e 2c  guator [ option,
7620: 20 63 6f 6e 64 69 74 69 6f 6e 2c 20 22 3d 22 2c   condition, "=",
7630: 20 72 65 70 6c 61 63 65 6d 65 6e 74 2f 73 75 67   replacement/sug
7640: 67 65 73 74 69 6f 6e 2f 61 63 74 69 6f 6e 20 5d  gestion/action ]
7650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7660: 20 20 20 20 20 2f 2f 20 54 61 67 20 20 20 20 20       // Tag     
7670: 20 20 20 20 20 20 5b 20 6f 70 74 69 6f 6e 2c 20        [ option, 
7680: 63 6f 6e 64 69 74 69 6f 6e 2c 20 22 2f 22 2c 20  condition, "/", 
7690: 72 65 70 6c 61 63 65 6d 65 6e 74 2f 73 75 67 67  replacement/sugg
76a0: 65 73 74 69 6f 6e 2f 61 63 74 69 6f 6e 2c 20 69  estion/action, i
76b0: 54 6f 6b 65 6e 53 74 61 72 74 2c 20 69 54 6f 6b  TokenStart, iTok
76c0: 65 6e 45 6e 64 20 5d 0a 20 20 20 20 20 20 20 20  enEnd ].        
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 49              // I
76e0: 6d 6d 75 6e 69 74 79 20 20 20 20 20 20 5b 20 6f  mmunity      [ o
76f0: 70 74 69 6f 6e 2c 20 63 6f 6e 64 69 74 69 6f 6e  ption, condition
7700: 2c 20 22 21 22 2c 20 22 22 2c 20 20 20 20 20 20  , "!", "",      
7710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7720: 20 20 20 20 20 20 69 54 6f 6b 65 6e 53 74 61 72        iTokenStar
7730: 74 2c 20 69 54 6f 6b 65 6e 45 6e 64 20 5d 0a 20  t, iTokenEnd ]. 
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7750: 20 20 20 2f 2f 20 54 65 73 74 20 20 20 20 20 20     // Test      
7760: 20 20 20 20 5b 20 6f 70 74 69 6f 6e 2c 20 63 6f      [ option, co
7770: 6e 64 69 74 69 6f 6e 2c 20 22 3e 22 2c 20 22 22  ndition, ">", ""
7780: 20 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ].             
7790: 20 20 20 20 20 20 20 69 66 20 28 21 73 4f 70 74         if (!sOpt
77a0: 69 6f 6e 20 7c 7c 20 64 4f 70 74 69 6f 6e 73 2e  ion || dOptions.
77b0: 67 6c 5f 67 65 74 28 73 4f 70 74 69 6f 6e 2c 20  gl_get(sOption, 
77c0: 66 61 6c 73 65 29 29 20 7b 0a 20 20 20 20 20 20  false)) {.      
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77e0: 20 20 62 43 6f 6e 64 4d 65 6d 6f 20 3d 20 21 73    bCondMemo = !s
77f0: 46 75 6e 63 43 6f 6e 64 20 7c 7c 20 67 63 5f 65  FuncCond || gc_e
7800: 6e 67 69 6e 65 5f 66 75 6e 63 5b 73 46 75 6e 63  ngine_func[sFunc
7810: 43 6f 6e 64 5d 28 74 68 69 73 2e 6c 54 6f 6b 65  Cond](this.lToke
7820: 6e 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c  n, nTokenOffset,
7830: 20 6e 4c 61 73 74 54 6f 6b 65 6e 2c 20 73 43 6f   nLastToken, sCo
7840: 75 6e 74 72 79 2c 20 62 43 6f 6e 64 4d 65 6d 6f  untry, bCondMemo
7850: 2c 20 74 68 69 73 2e 64 54 61 67 73 2c 20 74 68  , this.dTags, th
7860: 69 73 2e 73 53 65 6e 74 65 6e 63 65 2c 20 74 68  is.sSentence, th
7870: 69 73 2e 73 53 65 6e 74 65 6e 63 65 30 29 3b 0a  is.sSentence0);.
7880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7890: 20 20 20 20 20 20 20 20 69 66 20 28 62 43 6f 6e          if (bCon
78a0: 64 4d 65 6d 6f 29 20 7b 0a 20 20 20 20 20 20 20  dMemo) {.       
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 20 20 20 69 66 20 28 63 41 63 74 69 6f 6e       if (cAction
78d0: 54 79 70 65 20 3d 3d 20 22 2d 22 29 20 7b 0a 20  Type == "-") {. 
78e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7900: 2f 20 67 72 61 6d 6d 61 72 20 65 72 72 6f 72 0a  / grammar error.
7910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7930: 6c 65 74 20 5b 69 54 6f 6b 65 6e 53 74 61 72 74  let [iTokenStart
7940: 2c 20 69 54 6f 6b 65 6e 45 6e 64 2c 20 63 53 74  , iTokenEnd, cSt
7950: 61 72 74 4c 69 6d 69 74 2c 20 63 45 6e 64 4c 69  artLimit, cEndLi
7960: 6d 69 74 2c 20 62 43 61 73 65 53 76 74 79 2c 20  mit, bCaseSvty, 
7970: 6e 50 72 69 6f 72 69 74 79 2c 20 73 4d 65 73 73  nPriority, sMess
7980: 61 67 65 2c 20 73 55 52 4c 5d 20 3d 20 65 41 63  age, sURL] = eAc
7990: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79b0: 20 20 20 6c 65 74 20 6e 54 6f 6b 65 6e 45 72 72     let nTokenErr
79c0: 6f 72 53 74 61 72 74 20 3d 20 28 69 54 6f 6b 65  orStart = (iToke
79d0: 6e 53 74 61 72 74 20 3e 20 30 29 20 3f 20 6e 54  nStart > 0) ? nT
79e0: 6f 6b 65 6e 4f 66 66 73 65 74 20 2b 20 69 54 6f  okenOffset + iTo
79f0: 6b 65 6e 53 74 61 72 74 20 3a 20 6e 4c 61 73 74  kenStart : nLast
7a00: 54 6f 6b 65 6e 20 2b 20 69 54 6f 6b 65 6e 53 74  Token + iTokenSt
7a10: 61 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  art;.           
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a30: 20 20 20 20 20 69 66 20 28 21 74 68 69 73 2e 6c       if (!this.l
7a40: 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 45 72 72 6f  Token[nTokenErro
7a50: 72 53 74 61 72 74 5d 2e 68 61 73 4f 77 6e 50 72  rStart].hasOwnPr
7a60: 6f 70 65 72 74 79 28 22 62 49 6d 6d 75 6e 65 22  operty("bImmune"
7a70: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a90: 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e 54 6f           let nTo
7aa0: 6b 65 6e 45 72 72 6f 72 45 6e 64 20 3d 20 28 69  kenErrorEnd = (i
7ab0: 54 6f 6b 65 6e 45 6e 64 20 3e 20 30 29 20 3f 20  TokenEnd > 0) ? 
7ac0: 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 20 2b 20 69  nTokenOffset + i
7ad0: 54 6f 6b 65 6e 45 6e 64 20 3a 20 6e 4c 61 73 74  TokenEnd : nLast
7ae0: 54 6f 6b 65 6e 20 2b 20 69 54 6f 6b 65 6e 45 6e  Token + iTokenEn
7af0: 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d;.             
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b10: 20 20 20 20 20 20 20 6c 65 74 20 6e 45 72 72 6f         let nErro
7b20: 72 53 74 61 72 74 20 3d 20 74 68 69 73 2e 6e 4f  rStart = this.nO
7b30: 66 66 73 65 74 57 69 74 68 69 6e 50 61 72 61 67  ffsetWithinParag
7b40: 72 61 70 68 20 2b 20 28 28 63 53 74 61 72 74 4c  raph + ((cStartL
7b50: 69 6d 69 74 20 3d 3d 20 22 3c 22 29 20 3f 20 74  imit == "<") ? t
7b60: 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65  his.lToken[nToke
7b70: 6e 45 72 72 6f 72 53 74 61 72 74 5d 5b 22 6e 53  nErrorStart]["nS
7b80: 74 61 72 74 22 5d 20 3a 20 74 68 69 73 2e 6c 54  tart"] : this.lT
7b90: 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 45 72 72 6f 72  oken[nTokenError
7ba0: 53 74 61 72 74 5d 5b 22 6e 45 6e 64 22 5d 29 3b  Start]["nEnd"]);
7bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bd0: 20 20 20 20 20 6c 65 74 20 6e 45 72 72 6f 72 45       let nErrorE
7be0: 6e 64 20 3d 20 74 68 69 73 2e 6e 4f 66 66 73 65  nd = this.nOffse
7bf0: 74 57 69 74 68 69 6e 50 61 72 61 67 72 61 70 68  tWithinParagraph
7c00: 20 2b 20 28 28 63 45 6e 64 4c 69 6d 69 74 20 3d   + ((cEndLimit =
7c10: 3d 20 22 3e 22 29 20 3f 20 74 68 69 73 2e 6c 54  = ">") ? this.lT
7c20: 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 45 72 72 6f 72  oken[nTokenError
7c30: 45 6e 64 5d 5b 22 6e 45 6e 64 22 5d 20 3a 20 74  End]["nEnd"] : t
7c40: 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65  his.lToken[nToke
7c50: 6e 45 72 72 6f 72 45 6e 64 5d 5b 22 6e 53 74 61  nErrorEnd]["nSta
7c60: 72 74 22 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  rt"]);.         
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c80: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
7c90: 74 68 69 73 2e 64 45 72 72 6f 72 2e 68 61 73 28  this.dError.has(
7ca0: 6e 45 72 72 6f 72 53 74 61 72 74 29 20 7c 7c 20  nErrorStart) || 
7cb0: 6e 50 72 69 6f 72 69 74 79 20 3e 20 74 68 69 73  nPriority > this
7cc0: 2e 64 45 72 72 6f 72 50 72 69 6f 72 69 74 79 2e  .dErrorPriority.
7cd0: 67 6c 5f 67 65 74 28 6e 45 72 72 6f 72 53 74 61  gl_get(nErrorSta
7ce0: 72 74 2c 20 2d 31 29 29 20 7b 0a 20 20 20 20 20  rt, -1)) {.     
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 74 68 69 73 2e 64 45 72 72 6f 72 2e 73     this.dError.s
7d20: 65 74 28 6e 45 72 72 6f 72 53 74 61 72 74 2c 20  et(nErrorStart, 
7d30: 74 68 69 73 2e 5f 63 72 65 61 74 65 45 72 72 6f  this._createErro
7d40: 72 46 72 6f 6d 54 6f 6b 65 6e 73 28 73 57 68 61  rFromTokens(sWha
7d50: 74 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c  t, nTokenOffset,
7d60: 20 6e 4c 61 73 74 54 6f 6b 65 6e 2c 20 6e 54 6f   nLastToken, nTo
7d70: 6b 65 6e 45 72 72 6f 72 53 74 61 72 74 2c 20 6e  kenErrorStart, n
7d80: 45 72 72 6f 72 53 74 61 72 74 2c 20 6e 45 72 72  ErrorStart, nErr
7d90: 6f 72 45 6e 64 2c 20 73 4c 69 6e 65 49 64 2c 20  orEnd, sLineId, 
7da0: 73 52 75 6c 65 49 64 2c 20 62 43 61 73 65 53 76  sRuleId, bCaseSv
7db0: 74 79 2c 20 73 4d 65 73 73 61 67 65 2c 20 73 55  ty, sMessage, sU
7dc0: 52 4c 2c 20 62 53 68 6f 77 52 75 6c 65 49 64 2c  RL, bShowRuleId,
7dd0: 20 73 4f 70 74 69 6f 6e 2c 20 62 43 6f 6e 74 65   sOption, bConte
7de0: 78 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xt));.          
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
7e10: 69 73 2e 64 45 72 72 6f 72 50 72 69 6f 72 69 74  is.dErrorPriorit
7e20: 79 2e 73 65 74 28 6e 45 72 72 6f 72 53 74 61 72  y.set(nErrorStar
7e30: 74 2c 20 6e 50 72 69 6f 72 69 74 79 29 3b 0a 20  t, nPriority);. 
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e60: 20 20 20 20 20 20 20 74 68 69 73 2e 64 53 65 6e         this.dSen
7e70: 74 65 6e 63 65 45 72 72 6f 72 2e 73 65 74 28 6e  tenceError.set(n
7e80: 45 72 72 6f 72 53 74 61 72 74 2c 20 74 68 69 73  ErrorStart, this
7e90: 2e 64 45 72 72 6f 72 2e 67 65 74 28 6e 45 72 72  .dError.get(nErr
7ea0: 6f 72 53 74 61 72 74 29 29 3b 0a 20 20 20 20 20  orStart));.     
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ed0: 20 20 20 69 66 20 28 62 44 65 62 75 67 29 20 7b     if (bDebug) {
7ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
7f10: 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 20 20 4e 45  sole.log("    NE
7f20: 57 5f 45 52 52 4f 52 3a 20 22 2c 20 20 74 68 69  W_ERROR: ",  thi
7f30: 73 2e 64 45 72 72 6f 72 2e 67 65 74 28 6e 45 72  s.dError.get(nEr
7f40: 72 6f 72 53 74 61 72 74 29 29 3b 0a 20 20 20 20  rorStart));.    
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ff0: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20          else if 
8000: 28 63 41 63 74 69 6f 6e 54 79 70 65 20 3d 3d 20  (cActionType == 
8010: 22 7e 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20  "~") {.         
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 20 20 20 20 20 20 20 2f 2f 20 74 65 78 74 20 70         // text p
8040: 72 6f 63 65 73 73 6f 72 0a 20 20 20 20 20 20 20  rocessor.       
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e 54 6f           let nTo
8070: 6b 65 6e 53 74 61 72 74 20 3d 20 28 65 41 63 74  kenStart = (eAct
8080: 5b 30 5d 20 3e 20 30 29 20 3f 20 6e 54 6f 6b 65  [0] > 0) ? nToke
8090: 6e 4f 66 66 73 65 74 20 2b 20 65 41 63 74 5b 30  nOffset + eAct[0
80a0: 5d 20 3a 20 6e 4c 61 73 74 54 6f 6b 65 6e 20 2b  ] : nLastToken +
80b0: 20 65 41 63 74 5b 30 5d 3b 0a 20 20 20 20 20 20   eAct[0];.      
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80d0: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e 54            let nT
80e0: 6f 6b 65 6e 45 6e 64 20 3d 20 28 65 41 63 74 5b  okenEnd = (eAct[
80f0: 31 5d 20 3e 20 30 29 20 3f 20 6e 54 6f 6b 65 6e  1] > 0) ? nToken
8100: 4f 66 66 73 65 74 20 2b 20 65 41 63 74 5b 31 5d  Offset + eAct[1]
8110: 20 3a 20 6e 4c 61 73 74 54 6f 6b 65 6e 20 2b 20   : nLastToken + 
8120: 65 41 63 74 5b 31 5d 3b 0a 20 20 20 20 20 20 20  eAct[1];.       
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8140: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f 74           this._t
8150: 61 67 41 6e 64 50 72 65 70 61 72 65 54 6f 6b 65  agAndPrepareToke
8160: 6e 46 6f 72 52 65 77 72 69 74 69 6e 67 28 73 57  nForRewriting(sW
8170: 68 61 74 2c 20 6e 54 6f 6b 65 6e 53 74 61 72 74  hat, nTokenStart
8180: 2c 20 6e 54 6f 6b 65 6e 45 6e 64 2c 20 6e 54 6f  , nTokenEnd, nTo
8190: 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73 74  kenOffset, nLast
81a0: 54 6f 6b 65 6e 2c 20 65 41 63 74 5b 32 5d 2c 20  Token, eAct[2], 
81b0: 62 44 65 62 75 67 29 3b 0a 20 20 20 20 20 20 20  bDebug);.       
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81d0: 20 20 20 20 20 20 20 20 20 62 43 68 61 6e 67 65           bChange
81e0: 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20   = true;.       
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 20 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65           if (bDe
8210: 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20  bug) {.         
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8230: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f             conso
8240: 6c 65 2e 6c 6f 67 28 60 20 20 20 20 54 45 58 54  le.log(`    TEXT
8250: 5f 50 52 4f 43 45 53 53 4f 52 3a 20 5b 24 7b 74  _PROCESSOR: [${t
8260: 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65  his.lToken[nToke
8270: 6e 53 74 61 72 74 5d 5b 22 73 56 61 6c 75 65 22  nStart]["sValue"
8280: 5d 7d 3a 24 7b 74 68 69 73 2e 6c 54 6f 6b 65 6e  ]}:${this.lToken
8290: 5b 6e 54 6f 6b 65 6e 45 6e 64 5d 5b 22 73 56 61  [nTokenEnd]["sVa
82a0: 6c 75 65 22 5d 7d 5d 20 20 3e 20 24 7b 73 57 68  lue"]}]  > ${sWh
82b0: 61 74 7d 60 29 3b 0a 20 20 20 20 20 20 20 20 20  at}`);.         
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 20 20 20 65 6c 73 65 20 69 66 20 28 63 41 63 74     else if (cAct
8320: 69 6f 6e 54 79 70 65 20 3d 3d 20 22 3d 22 29 20  ionType == "=") 
8330: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8350: 20 20 2f 2f 20 64 69 73 61 6d 62 69 67 75 61 74    // disambiguat
8360: 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ion.            
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8380: 20 20 20 20 67 63 5f 65 6e 67 69 6e 65 5f 66 75      gc_engine_fu
8390: 6e 63 5b 73 57 68 61 74 5d 28 74 68 69 73 2e 6c  nc[sWhat](this.l
83a0: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 4f 66 66  Token, nTokenOff
83b0: 73 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 29  set, nLastToken)
83c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83e0: 20 20 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a    if (bDebug) {.
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8410: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28      console.log(
8420: 60 20 20 20 20 44 49 53 41 4d 42 49 47 55 41 54  `    DISAMBIGUAT
8430: 4f 52 3a 20 28 24 7b 73 57 68 61 74 7d 29 20 20  OR: (${sWhat})  
8440: 5b 24 7b 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e  [${this.lToken[n
8450: 54 6f 6b 65 6e 4f 66 66 73 65 74 2b 31 5d 5b 22  TokenOffset+1]["
8460: 73 56 61 6c 75 65 22 5d 7d 3a 24 7b 74 68 69 73  sValue"]}:${this
8470: 2e 6c 54 6f 6b 65 6e 5b 6e 4c 61 73 74 54 6f 6b  .lToken[nLastTok
8480: 65 6e 5d 5b 22 73 56 61 6c 75 65 22 5d 7d 5d 60  en]["sValue"]}]`
8490: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
84f0: 6c 73 65 20 69 66 20 28 63 41 63 74 69 6f 6e 54  lse if (cActionT
8500: 79 70 65 20 3d 3d 20 22 3e 22 29 20 7b 0a 20 20  ype == ">") {.  
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
8530: 20 77 65 20 64 6f 20 6e 6f 74 68 69 6e 67 2c 20   we do nothing, 
8540: 74 68 69 73 20 74 65 73 74 20 69 73 20 6a 75 73  this test is jus
8550: 74 20 61 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f  t a condition to
8560: 20 61 70 70 6c 79 20 61 6c 6c 20 66 6f 6c 6c 6f   apply all follo
8570: 77 69 6e 67 20 61 63 74 69 6f 6e 73 0a 20 20 20  wing actions.   
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
85a0: 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20  (bDebug) {.     
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
85d0: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 20 20  onsole.log("    
85e0: 43 4f 4e 44 5f 4f 4b 22 29 3b 0a 20 20 20 20 20  COND_OK");.     
85f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8600: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8620: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8640: 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28         else if (
8650: 63 41 63 74 69 6f 6e 54 79 70 65 20 3d 3d 20 22  cActionType == "
8660: 2f 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  /") {.          
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8680: 20 20 20 20 20 20 2f 2f 20 54 61 67 0a 20 20 20        // Tag.   
8690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
86b0: 20 6e 54 6f 6b 65 6e 53 74 61 72 74 20 3d 20 28   nTokenStart = (
86c0: 65 41 63 74 5b 30 5d 20 3e 20 30 29 20 3f 20 6e  eAct[0] > 0) ? n
86d0: 54 6f 6b 65 6e 4f 66 66 73 65 74 20 2b 20 65 41  TokenOffset + eA
86e0: 63 74 5b 30 5d 20 3a 20 6e 4c 61 73 74 54 6f 6b  ct[0] : nLastTok
86f0: 65 6e 20 2b 20 65 41 63 74 5b 30 5d 3b 0a 20 20  en + eAct[0];.  
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
8720: 74 20 6e 54 6f 6b 65 6e 45 6e 64 20 3d 20 28 65  t nTokenEnd = (e
8730: 41 63 74 5b 31 5d 20 3e 20 30 29 20 3f 20 6e 54  Act[1] > 0) ? nT
8740: 6f 6b 65 6e 4f 66 66 73 65 74 20 2b 20 65 41 63  okenOffset + eAc
8750: 74 5b 31 5d 20 3a 20 6e 4c 61 73 74 54 6f 6b 65  t[1] : nLastToke
8760: 6e 20 2b 20 65 41 63 74 5b 31 5d 3b 0a 20 20 20  n + eAct[1];.   
8770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
8790: 20 28 6c 65 74 20 69 20 3d 20 6e 54 6f 6b 65 6e   (let i = nToken
87a0: 53 74 61 72 74 3b 20 69 20 3c 3d 20 6e 54 6f 6b  Start; i <= nTok
87b0: 65 6e 45 6e 64 3b 20 69 2b 2b 29 20 7b 0a 20 20  enEnd; i++) {.  
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87e0: 20 20 69 66 20 28 74 68 69 73 2e 6c 54 6f 6b 65    if (this.lToke
87f0: 6e 5b 69 5d 2e 68 61 73 4f 77 6e 50 72 6f 70 65  n[i].hasOwnPrope
8800: 72 74 79 28 22 61 54 61 67 73 22 29 29 20 7b 0a  rty("aTags")) {.
8810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8830: 20 20 20 20 20 20 20 20 74 68 69 73 2e 6c 54 6f          this.lTo
8840: 6b 65 6e 5b 69 5d 5b 22 61 54 61 67 73 22 5d 2e  ken[i]["aTags"].
8850: 61 64 64 28 2e 2e 2e 73 57 68 61 74 2e 73 70 6c  add(...sWhat.spl
8860: 69 74 28 22 7c 22 29 29 0a 20 20 20 20 20 20 20  it("|")).       
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8880: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
8890: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
88c0: 69 73 2e 6c 54 6f 6b 65 6e 5b 69 5d 5b 22 61 54  is.lToken[i]["aT
88d0: 61 67 73 22 5d 20 3d 20 6e 65 77 20 53 65 74 28  ags"] = new Set(
88e0: 73 57 68 61 74 2e 73 70 6c 69 74 28 22 7c 22 29  sWhat.split("|")
88f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8910: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8950: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62             if (b
8960: 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20  Debug) {.       
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8980: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
8990: 73 6f 6c 65 2e 6c 6f 67 28 60 20 20 20 20 54 41  sole.log(`    TA
89a0: 47 3a 20 20 24 7b 73 57 68 61 74 7d 20 3e 20 5b  G:  ${sWhat} > [
89b0: 24 7b 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54  ${this.lToken[nT
89c0: 6f 6b 65 6e 53 74 61 72 74 5d 5b 22 73 56 61 6c  okenStart]["sVal
89d0: 75 65 22 5d 7d 3a 24 7b 74 68 69 73 2e 6c 54 6f  ue"]}:${this.lTo
89e0: 6b 65 6e 5b 6e 54 6f 6b 65 6e 45 6e 64 5d 5b 22  ken[nTokenEnd]["
89f0: 73 56 61 6c 75 65 22 5d 7d 5d 60 29 3b 0a 20 20  sValue"]}]`);.  
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a40: 66 6f 72 20 28 6c 65 74 20 73 54 61 67 20 6f 66  for (let sTag of
8a50: 20 73 57 68 61 74 2e 73 70 6c 69 74 28 22 7c 22   sWhat.split("|"
8a60: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a80: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 74 68           if (!th
8a90: 69 73 2e 64 54 61 67 73 2e 68 61 73 28 73 54 61  is.dTags.has(sTa
8aa0: 67 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  g)) {.          
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
8ad0: 69 73 2e 64 54 61 67 73 2e 73 65 74 28 73 54 61  is.dTags.set(sTa
8ae0: 67 2c 20 5b 6e 54 6f 6b 65 6e 53 74 61 72 74 2c  g, [nTokenStart,
8af0: 20 6e 54 6f 6b 65 6e 45 6e 64 5d 29 3b 0a 20 20   nTokenEnd]);.  
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b20: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b50: 20 20 20 74 68 69 73 2e 64 54 61 67 73 2e 73 65     this.dTags.se
8b60: 74 28 73 54 61 67 2c 20 5b 4d 61 74 68 2e 6d 69  t(sTag, [Math.mi
8b70: 6e 28 6e 54 6f 6b 65 6e 53 74 61 72 74 2c 20 74  n(nTokenStart, t
8b80: 68 69 73 2e 64 54 61 67 73 2e 67 65 74 28 73 54  his.dTags.get(sT
8b90: 61 67 29 5b 30 5d 29 2c 20 4d 61 74 68 2e 6d 61  ag)[0]), Math.ma
8ba0: 78 28 6e 54 6f 6b 65 6e 45 6e 64 2c 20 74 68 69  x(nTokenEnd, thi
8bb0: 73 2e 64 54 61 67 73 2e 67 65 74 28 73 54 61 67  s.dTags.get(sTag
8bc0: 29 5b 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20 20  )[1])]);.       
8bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c40: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
8c50: 69 66 20 28 63 41 63 74 69 6f 6e 54 79 70 65 20  if (cActionType 
8c60: 3d 3d 20 22 21 22 29 20 7b 0a 20 20 20 20 20 20  == "!") {.      
8c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c80: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69 6d 6d            // imm
8c90: 75 6e 69 74 79 0a 20 20 20 20 20 20 20 20 20 20  unity.          
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cb0: 20 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67        if (bDebug
8cc0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ce0: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
8cf0: 6c 6f 67 28 22 20 20 20 20 49 4d 4d 55 4e 49 54  log("    IMMUNIT
8d00: 59 3a 20 22 20 2b 20 73 4c 69 6e 65 49 64 20 2b  Y: " + sLineId +
8d10: 20 22 20 2f 20 22 20 2b 20 73 52 75 6c 65 49 64   " / " + sRuleId
8d20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
8d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d60: 20 20 20 20 20 6c 65 74 20 6e 54 6f 6b 65 6e 53       let nTokenS
8d70: 74 61 72 74 20 3d 20 28 65 41 63 74 5b 30 5d 20  tart = (eAct[0] 
8d80: 3e 20 30 29 20 3f 20 6e 54 6f 6b 65 6e 4f 66 66  > 0) ? nTokenOff
8d90: 73 65 74 20 2b 20 65 41 63 74 5b 30 5d 20 3a 20  set + eAct[0] : 
8da0: 6e 4c 61 73 74 54 6f 6b 65 6e 20 2b 20 65 41 63  nLastToken + eAc
8db0: 74 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  t[0];.          
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dd0: 20 20 20 20 20 20 6c 65 74 20 6e 54 6f 6b 65 6e        let nToken
8de0: 45 6e 64 20 3d 20 28 65 41 63 74 5b 31 5d 20 3e  End = (eAct[1] >
8df0: 20 30 29 20 3f 20 6e 54 6f 6b 65 6e 4f 66 66 73   0) ? nTokenOffs
8e00: 65 74 20 2b 20 65 41 63 74 5b 31 5d 20 3a 20 6e  et + eAct[1] : n
8e10: 4c 61 73 74 54 6f 6b 65 6e 20 2b 20 65 41 63 74  LastToken + eAct
8e20: 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [1];.           
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e40: 20 20 20 20 20 69 66 20 28 6e 54 6f 6b 65 6e 45       if (nTokenE
8e50: 6e 64 20 2d 20 6e 54 6f 6b 65 6e 53 74 61 72 74  nd - nTokenStart
8e60: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20   == 0) {.       
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
8e90: 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 53  s.lToken[nTokenS
8ea0: 74 61 72 74 5d 5b 22 62 49 6d 6d 75 6e 65 22 5d  tart]["bImmune"]
8eb0: 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20   = true;.       
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
8ee0: 20 6e 45 72 72 6f 72 53 74 61 72 74 20 3d 20 74   nErrorStart = t
8ef0: 68 69 73 2e 6e 4f 66 66 73 65 74 57 69 74 68 69  his.nOffsetWithi
8f00: 6e 50 61 72 61 67 72 61 70 68 20 2b 20 74 68 69  nParagraph + thi
8f10: 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 53  s.lToken[nTokenS
8f20: 74 61 72 74 5d 5b 22 6e 53 74 61 72 74 22 5d 3b  tart]["nStart"];
8f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f50: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 64 45       if (this.dE
8f60: 72 72 6f 72 2e 68 61 73 28 6e 45 72 72 6f 72 53  rror.has(nErrorS
8f70: 74 61 72 74 29 29 20 7b 0a 20 20 20 20 20 20 20  tart)) {.       
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fa0: 20 74 68 69 73 2e 64 45 72 72 6f 72 2e 64 65 6c   this.dError.del
8fb0: 65 74 65 28 6e 45 72 72 6f 72 53 74 61 72 74 29  ete(nErrorStart)
8fc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
9010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9030: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 69 20       for (let i 
9040: 3d 20 6e 54 6f 6b 65 6e 53 74 61 72 74 3b 20 20  = nTokenStart;  
9050: 69 20 3c 3d 20 6e 54 6f 6b 65 6e 45 6e 64 3b 20  i <= nTokenEnd; 
9060: 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20   i++) {.        
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9090: 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 69 5d 5b 22  this.lToken[i]["
90a0: 62 49 6d 6d 75 6e 65 22 5d 20 3d 20 74 72 75 65  bImmune"] = true
90b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
90c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90d0: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e 45            let nE
90e0: 72 72 6f 72 53 74 61 72 74 20 3d 20 74 68 69 73  rrorStart = this
90f0: 2e 6e 4f 66 66 73 65 74 57 69 74 68 69 6e 50 61  .nOffsetWithinPa
9100: 72 61 67 72 61 70 68 20 2b 20 74 68 69 73 2e 6c  ragraph + this.l
9110: 54 6f 6b 65 6e 5b 69 5d 5b 22 6e 53 74 61 72 74  Token[i]["nStart
9120: 22 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  "];.            
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9140: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
9150: 74 68 69 73 2e 64 45 72 72 6f 72 2e 68 61 73 28  this.dError.has(
9160: 6e 45 72 72 6f 72 53 74 61 72 74 29 29 20 7b 0a  nErrorStart)) {.
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9190: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
91a0: 2e 64 45 72 72 6f 72 2e 64 65 6c 65 74 65 28 6e  .dError.delete(n
91b0: 45 72 72 6f 72 53 74 61 72 74 29 3b 0a 20 20 20  ErrorStart);.   
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9240: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
9250: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9270: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28      console.log(
9280: 22 23 20 65 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77  "# error: unknow
9290: 6e 20 61 63 74 69 6f 6e 20 61 74 20 22 20 2b 20  n action at " + 
92a0: 73 4c 69 6e 65 49 64 29 3b 0a 20 20 20 20 20 20  sLineId);.      
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
92f0: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
9300: 66 20 28 63 41 63 74 69 6f 6e 54 79 70 65 20 3d  f (cActionType =
9310: 3d 20 22 3e 22 29 20 7b 0a 20 20 20 20 20 20 20  = ">") {.       
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9330: 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67 29       if (bDebug)
9340: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9360: 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22     console.log("
9370: 20 20 20 20 43 4f 4e 44 5f 42 52 45 41 4b 22 29      COND_BREAK")
9380: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
93c0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
93d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
9400: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
9410: 20 20 20 20 20 63 61 74 63 68 20 28 65 29 20 7b       catch (e) {
9420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9430: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
9440: 28 22 45 72 72 6f 72 3a 20 22 2c 20 73 4c 69 6e  ("Error: ", sLin
9450: 65 49 64 2c 20 73 52 75 6c 65 49 64 2c 20 74 68  eId, sRuleId, th
9460: 69 73 2e 73 53 65 6e 74 65 6e 63 65 29 3b 0a 20  is.sSentence);. 
9470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9480: 20 20 20 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72     console.error
9490: 28 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (e);.           
94a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
94b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
94c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 62 43         return bC
94d0: 68 61 6e 67 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  hange;.    }..  
94e0: 20 20 5f 63 72 65 61 74 65 45 72 72 6f 72 46 72    _createErrorFr
94f0: 6f 6d 52 65 67 65 78 20 28 73 54 65 78 74 2c 20  omRegex (sText, 
9500: 73 54 65 78 74 30 2c 20 73 53 75 67 67 2c 20 6e  sText0, sSugg, n
9510: 4f 66 66 73 65 74 2c 20 6d 2c 20 69 47 72 6f 75  Offset, m, iGrou
9520: 70 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c  p, sLineId, sRul
9530: 65 49 64 2c 20 62 55 70 70 65 72 63 61 73 65 2c  eId, bUppercase,
9540: 20 73 4d 73 67 2c 20 73 55 52 4c 2c 20 62 53 68   sMsg, sURL, bSh
9550: 6f 77 52 75 6c 65 49 64 2c 20 73 4f 70 74 69 6f  owRuleId, sOptio
9560: 6e 2c 20 62 43 6f 6e 74 65 78 74 29 20 7b 0a 20  n, bContext) {. 
9570: 20 20 20 20 20 20 20 6c 65 74 20 6e 53 74 61 72         let nStar
9580: 74 20 3d 20 6e 4f 66 66 73 65 74 20 2b 20 6d 2e  t = nOffset + m.
9590: 73 74 61 72 74 5b 69 47 72 6f 75 70 5d 3b 0a 20  start[iGroup];. 
95a0: 20 20 20 20 20 20 20 6c 65 74 20 6e 45 6e 64 20         let nEnd 
95b0: 3d 20 6e 4f 66 66 73 65 74 20 2b 20 6d 2e 65 6e  = nOffset + m.en
95c0: 64 5b 69 47 72 6f 75 70 5d 3b 0a 20 20 20 20 20  d[iGroup];.     
95d0: 20 20 20 2f 2f 20 73 75 67 67 65 73 74 69 6f 6e     // suggestion
95e0: 73 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6c 53  s.        let lS
95f0: 75 67 67 20 3d 20 5b 5d 3b 0a 20 20 20 20 20 20  ugg = [];.      
9600: 20 20 69 66 20 28 73 53 75 67 67 2e 73 74 61 72    if (sSugg.star
9610: 74 73 57 69 74 68 28 22 3d 22 29 29 20 7b 0a 20  tsWith("=")) {. 
9620: 20 20 20 20 20 20 20 20 20 20 20 73 53 75 67 67             sSugg
9630: 20 3d 20 67 63 5f 65 6e 67 69 6e 65 5f 66 75 6e   = gc_engine_fun
9640: 63 5b 73 53 75 67 67 2e 73 6c 69 63 65 28 31 29  c[sSugg.slice(1)
9650: 5d 28 73 54 65 78 74 2c 20 6d 29 3b 0a 20 20 20  ](sText, m);.   
9660: 20 20 20 20 20 20 20 20 20 6c 53 75 67 67 20 3d           lSugg =
9670: 20 28 73 53 75 67 67 29 20 3f 20 73 53 75 67 67   (sSugg) ? sSugg
9680: 2e 73 70 6c 69 74 28 22 7c 22 29 20 3a 20 5b 5d  .split("|") : []
9690: 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
96a0: 20 69 66 20 28 73 53 75 67 67 20 3d 3d 20 22 5f   if (sSugg == "_
96b0: 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ") {.           
96c0: 20 6c 53 75 67 67 20 3d 20 5b 5d 3b 0a 20 20 20   lSugg = [];.   
96d0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
96e0: 20 20 20 20 20 20 20 20 20 20 6c 53 75 67 67 20            lSugg 
96f0: 3d 20 73 53 75 67 67 2e 67 6c 5f 65 78 70 61 6e  = sSugg.gl_expan
9700: 64 28 6d 29 2e 73 70 6c 69 74 28 22 7c 22 29 3b  d(m).split("|");
9710: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9720: 20 20 20 69 66 20 28 62 55 70 70 65 72 63 61 73     if (bUppercas
9730: 65 20 26 26 20 6c 53 75 67 67 2e 6c 65 6e 67 74  e && lSugg.lengt
9740: 68 20 3e 20 30 20 26 26 20 6d 5b 69 47 72 6f 75  h > 0 && m[iGrou
9750: 70 5d 2e 73 6c 69 63 65 28 30 2c 31 29 2e 67 6c  p].slice(0,1).gl
9760: 5f 69 73 55 70 70 65 72 43 61 73 65 28 29 29 20  _isUpperCase()) 
9770: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 53  {.            lS
9780: 75 67 67 20 3d 20 63 61 70 69 74 61 6c 69 7a 65  ugg = capitalize
9790: 41 72 72 61 79 28 6c 53 75 67 67 29 3b 0a 20 20  Array(lSugg);.  
97a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
97b0: 2f 2f 20 4d 65 73 73 61 67 65 0a 20 20 20 20 20  // Message.     
97c0: 20 20 20 6c 65 74 20 73 4d 65 73 73 61 67 65 20     let sMessage 
97d0: 3d 20 28 73 4d 73 67 2e 73 74 61 72 74 73 57 69  = (sMsg.startsWi
97e0: 74 68 28 22 3d 22 29 29 20 3f 20 67 63 5f 65 6e  th("=")) ? gc_en
97f0: 67 69 6e 65 5f 66 75 6e 63 5b 73 4d 73 67 2e 73  gine_func[sMsg.s
9800: 6c 69 63 65 28 31 29 5d 28 73 54 65 78 74 2c 20  lice(1)](sText, 
9810: 6d 29 20 3a 20 73 4d 73 67 2e 67 6c 5f 65 78 70  m) : sMsg.gl_exp
9820: 61 6e 64 28 6d 29 3b 0a 20 20 20 20 20 20 20 20  and(m);.        
9830: 69 66 20 28 62 53 68 6f 77 52 75 6c 65 49 64 29  if (bShowRuleId)
9840: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
9850: 4d 65 73 73 61 67 65 20 2b 3d 20 22 20 20 23 22  Message += "  #"
9860: 20 2b 20 73 4c 69 6e 65 49 64 20 2b 20 22 20 2f   + sLineId + " /
9870: 20 22 20 2b 20 73 52 75 6c 65 49 64 3b 0a 20 20   " + sRuleId;.  
9880: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9890: 2f 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  //.        retur
98a0: 6e 20 74 68 69 73 2e 5f 63 72 65 61 74 65 45 72  n this._createEr
98b0: 72 6f 72 28 6e 53 74 61 72 74 2c 20 6e 45 6e 64  ror(nStart, nEnd
98c0: 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65  , sLineId, sRule
98d0: 49 64 2c 20 73 4f 70 74 69 6f 6e 2c 20 73 4d 65  Id, sOption, sMe
98e0: 73 73 61 67 65 2c 20 6c 53 75 67 67 2c 20 73 55  ssage, lSugg, sU
98f0: 52 4c 2c 20 62 43 6f 6e 74 65 78 74 29 3b 0a 20  RL, bContext);. 
9900: 20 20 20 7d 0a 0a 20 20 20 20 5f 63 72 65 61 74     }..    _creat
9910: 65 45 72 72 6f 72 46 72 6f 6d 54 6f 6b 65 6e 73  eErrorFromTokens
9920: 20 28 73 53 75 67 67 2c 20 6e 54 6f 6b 65 6e 4f   (sSugg, nTokenO
9930: 66 66 73 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65  ffset, nLastToke
9940: 6e 2c 20 69 46 69 72 73 74 54 6f 6b 65 6e 2c 20  n, iFirstToken, 
9950: 6e 53 74 61 72 74 2c 20 6e 45 6e 64 2c 20 73 4c  nStart, nEnd, sL
9960: 69 6e 65 49 64 2c 20 73 52 75 6c 65 49 64 2c 20  ineId, sRuleId, 
9970: 62 43 61 73 65 53 76 74 79 2c 20 73 4d 73 67 2c  bCaseSvty, sMsg,
9980: 20 73 55 52 4c 2c 20 62 53 68 6f 77 52 75 6c 65   sURL, bShowRule
9990: 49 64 2c 20 73 4f 70 74 69 6f 6e 2c 20 62 43 6f  Id, sOption, bCo
99a0: 6e 74 65 78 74 29 20 7b 0a 20 20 20 20 20 20 20  ntext) {.       
99b0: 20 2f 2f 20 73 75 67 67 65 73 74 69 6f 6e 73 0a   // suggestions.
99c0: 20 20 20 20 20 20 20 20 6c 65 74 20 6c 53 75 67          let lSug
99d0: 67 20 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20  g = [];.        
99e0: 69 66 20 28 73 53 75 67 67 2e 73 74 61 72 74 73  if (sSugg.starts
99f0: 57 69 74 68 28 22 3d 22 29 29 20 7b 0a 20 20 20  With("=")) {.   
9a00: 20 20 20 20 20 20 20 20 20 73 53 75 67 67 20 3d           sSugg =
9a10: 20 67 63 5f 65 6e 67 69 6e 65 5f 66 75 6e 63 5b   gc_engine_func[
9a20: 73 53 75 67 67 2e 73 6c 69 63 65 28 31 29 5d 28  sSugg.slice(1)](
9a30: 74 68 69 73 2e 6c 54 6f 6b 65 6e 2c 20 6e 54 6f  this.lToken, nTo
9a40: 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73 74  kenOffset, nLast
9a50: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
9a60: 20 20 20 20 6c 53 75 67 67 20 3d 20 28 73 53 75      lSugg = (sSu
9a70: 67 67 29 20 3f 20 73 53 75 67 67 2e 73 70 6c 69  gg) ? sSugg.spli
9a80: 74 28 22 7c 22 29 20 3a 20 5b 5d 3b 0a 20 20 20  t("|") : [];.   
9a90: 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28       } else if (
9aa0: 73 53 75 67 67 20 3d 3d 20 22 5f 22 29 20 7b 0a  sSugg == "_") {.
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 53 75 67              lSug
9ac0: 67 20 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20  g = [];.        
9ad0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
9ae0: 20 20 20 20 20 6c 53 75 67 67 20 3d 20 74 68 69       lSugg = thi
9af0: 73 2e 5f 65 78 70 61 6e 64 28 73 53 75 67 67 2c  s._expand(sSugg,
9b00: 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e   nTokenOffset, n
9b10: 4c 61 73 74 54 6f 6b 65 6e 29 2e 73 70 6c 69 74  LastToken).split
9b20: 28 22 7c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  ("|");.        }
9b30: 0a 20 20 20 20 20 20 20 20 69 66 20 28 62 43 61  .        if (bCa
9b40: 73 65 53 76 74 79 20 26 26 20 6c 53 75 67 67 2e  seSvty && lSugg.
9b50: 6c 65 6e 67 74 68 20 3e 20 30 20 26 26 20 74 68  length > 0 && th
9b60: 69 73 2e 6c 54 6f 6b 65 6e 5b 69 46 69 72 73 74  is.lToken[iFirst
9b70: 54 6f 6b 65 6e 5d 5b 22 73 56 61 6c 75 65 22 5d  Token]["sValue"]
9b80: 2e 73 6c 69 63 65 28 30 2c 31 29 2e 67 6c 5f 69  .slice(0,1).gl_i
9b90: 73 55 70 70 65 72 43 61 73 65 28 29 29 20 7b 0a  sUpperCase()) {.
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 53 75 67              lSug
9bb0: 67 20 3d 20 63 61 70 69 74 61 6c 69 7a 65 41 72  g = capitalizeAr
9bc0: 72 61 79 28 6c 53 75 67 67 29 3b 0a 20 20 20 20  ray(lSugg);.    
9bd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f      }.        //
9be0: 20 4d 65 73 73 61 67 65 0a 20 20 20 20 20 20 20   Message.       
9bf0: 20 6c 65 74 20 73 4d 65 73 73 61 67 65 20 3d 20   let sMessage = 
9c00: 28 73 4d 73 67 2e 73 74 61 72 74 73 57 69 74 68  (sMsg.startsWith
9c10: 28 22 3d 22 29 29 20 3f 20 67 63 5f 65 6e 67 69  ("=")) ? gc_engi
9c20: 6e 65 5f 66 75 6e 63 5b 73 4d 73 67 2e 73 6c 69  ne_func[sMsg.sli
9c30: 63 65 28 31 29 5d 28 74 68 69 73 2e 6c 54 6f 6b  ce(1)](this.lTok
9c40: 65 6e 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74  en, nTokenOffset
9c50: 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 29 20 3a 20  , nLastToken) : 
9c60: 74 68 69 73 2e 5f 65 78 70 61 6e 64 28 73 4d 73  this._expand(sMs
9c70: 67 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c  g, nTokenOffset,
9c80: 20 6e 4c 61 73 74 54 6f 6b 65 6e 29 3b 0a 20 20   nLastToken);.  
9c90: 20 20 20 20 20 20 69 66 20 28 62 53 68 6f 77 52        if (bShowR
9ca0: 75 6c 65 49 64 29 20 7b 0a 20 20 20 20 20 20 20  uleId) {.       
9cb0: 20 20 20 20 20 73 4d 65 73 73 61 67 65 20 2b 3d       sMessage +=
9cc0: 20 22 20 20 23 22 20 2b 20 73 4c 69 6e 65 49 64   "  #" + sLineId
9cd0: 20 2b 20 22 20 2f 20 22 20 2b 20 73 52 75 6c 65   + " / " + sRule
9ce0: 49 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  Id;.        }.  
9cf0: 20 20 20 20 20 20 2f 2f 0a 20 20 20 20 20 20 20        //.       
9d00: 20 72 65 74 75 72 6e 20 74 68 69 73 2e 5f 63 72   return this._cr
9d10: 65 61 74 65 45 72 72 6f 72 28 6e 53 74 61 72 74  eateError(nStart
9d20: 2c 20 6e 45 6e 64 2c 20 73 4c 69 6e 65 49 64 2c  , nEnd, sLineId,
9d30: 20 73 52 75 6c 65 49 64 2c 20 73 4f 70 74 69 6f   sRuleId, sOptio
9d40: 6e 2c 20 73 4d 65 73 73 61 67 65 2c 20 6c 53 75  n, sMessage, lSu
9d50: 67 67 2c 20 73 55 52 4c 2c 20 62 43 6f 6e 74 65  gg, sURL, bConte
9d60: 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  xt);.    }..    
9d70: 5f 63 72 65 61 74 65 45 72 72 6f 72 20 28 6e 53  _createError (nS
9d80: 74 61 72 74 2c 20 6e 45 6e 64 2c 20 73 4c 69 6e  tart, nEnd, sLin
9d90: 65 49 64 2c 20 73 52 75 6c 65 49 64 2c 20 73 4f  eId, sRuleId, sO
9da0: 70 74 69 6f 6e 2c 20 73 4d 65 73 73 61 67 65 2c  ption, sMessage,
9db0: 20 6c 53 75 67 67 2c 20 73 55 52 4c 2c 20 62 43   lSugg, sURL, bC
9dc0: 6f 6e 74 65 78 74 29 20 7b 0a 20 20 20 20 20 20  ontext) {.      
9dd0: 20 20 6c 65 74 20 6f 45 72 72 20 3d 20 7b 0a 20    let oErr = {. 
9de0: 20 20 20 20 20 20 20 20 20 20 20 22 6e 53 74 61             "nSta
9df0: 72 74 22 3a 20 6e 53 74 61 72 74 2c 0a 20 20 20  rt": nStart,.   
9e00: 20 20 20 20 20 20 20 20 20 22 6e 45 6e 64 22 3a           "nEnd":
9e10: 20 6e 45 6e 64 2c 0a 20 20 20 20 20 20 20 20 20   nEnd,.         
9e20: 20 20 20 22 73 4c 69 6e 65 49 64 22 3a 20 73 4c     "sLineId": sL
9e30: 69 6e 65 49 64 2c 0a 20 20 20 20 20 20 20 20 20  ineId,.         
9e40: 20 20 20 22 73 52 75 6c 65 49 64 22 3a 20 73 52     "sRuleId": sR
9e50: 75 6c 65 49 64 2c 0a 20 20 20 20 20 20 20 20 20  uleId,.         
9e60: 20 20 20 22 73 54 79 70 65 22 3a 20 73 4f 70 74     "sType": sOpt
9e70: 69 6f 6e 20 7c 7c 20 22 6e 6f 74 79 70 65 22 2c  ion || "notype",
9e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61 43  .            "aC
9e90: 6f 6c 6f 72 22 3a 20 67 63 5f 65 6e 67 69 6e 65  olor": gc_engine
9ea0: 2e 6f 4f 70 74 69 6f 6e 73 43 6f 6c 6f 72 73 5b  .oOptionsColors[
9eb0: 73 4f 70 74 69 6f 6e 5d 2c 0a 20 20 20 20 20 20  sOption],.      
9ec0: 20 20 20 20 20 20 22 73 4d 65 73 73 61 67 65 22        "sMessage"
9ed0: 3a 20 73 4d 65 73 73 61 67 65 2c 0a 20 20 20 20  : sMessage,.    
9ee0: 20 20 20 20 20 20 20 20 22 61 53 75 67 67 65 73          "aSugges
9ef0: 74 69 6f 6e 73 22 3a 20 6c 53 75 67 67 2c 0a 20  tions": lSugg,. 
9f00: 20 20 20 20 20 20 20 20 20 20 20 22 55 52 4c 22             "URL"
9f10: 3a 20 73 55 52 4c 0a 20 20 20 20 20 20 20 20 7d  : sURL.        }
9f20: 0a 20 20 20 20 20 20 20 20 69 66 20 28 62 43 6f  .        if (bCo
9f30: 6e 74 65 78 74 29 20 7b 0a 20 20 20 20 20 20 20  ntext) {.       
9f40: 20 20 20 20 20 6f 45 72 72 5b 27 73 55 6e 64 65       oErr['sUnde
9f50: 72 6c 69 6e 65 64 27 5d 20 3d 20 74 68 69 73 2e  rlined'] = this.
9f60: 73 54 65 78 74 30 2e 73 6c 69 63 65 28 6e 53 74  sText0.slice(nSt
9f70: 61 72 74 2c 20 6e 45 6e 64 29 3b 0a 20 20 20 20  art, nEnd);.    
9f80: 20 20 20 20 20 20 20 20 6f 45 72 72 5b 27 73 42          oErr['sB
9f90: 65 66 6f 72 65 27 5d 20 3d 20 74 68 69 73 2e 73  efore'] = this.s
9fa0: 54 65 78 74 30 2e 73 6c 69 63 65 28 4d 61 74 68  Text0.slice(Math
9fb0: 2e 6d 61 78 28 30 2c 6e 53 74 61 72 74 2d 38 30  .max(0,nStart-80
9fc0: 29 2c 20 6e 53 74 61 72 74 29 3b 0a 20 20 20 20  ), nStart);.    
9fd0: 20 20 20 20 20 20 20 20 6f 45 72 72 5b 27 73 41          oErr['sA
9fe0: 66 74 65 72 27 5d 20 3d 20 74 68 69 73 2e 73 54  fter'] = this.sT
9ff0: 65 78 74 30 2e 73 6c 69 63 65 28 6e 45 6e 64 2c  ext0.slice(nEnd,
a000: 20 6e 45 6e 64 2b 38 30 29 3b 0a 20 20 20 20 20   nEnd+80);.     
a010: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
a020: 75 72 6e 20 6f 45 72 72 3b 0a 20 20 20 20 7d 0a  urn oErr;.    }.
a030: 0a 20 20 20 20 5f 65 78 70 61 6e 64 20 28 73 54  .    _expand (sT
a040: 65 78 74 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65  ext, nTokenOffse
a050: 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 29 20 7b  t, nLastToken) {
a060: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d 3b 0a  .        let m;.
a070: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 28          while ((
a080: 6d 20 3d 20 2f 5c 5c 28 2d 3f 5b 30 2d 39 5d 2b  m = /\\(-?[0-9]+
a090: 29 2f 2e 65 78 65 63 28 73 54 65 78 74 29 29 20  )/.exec(sText)) 
a0a0: 21 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20  !== null) {.    
a0b0: 20 20 20 20 20 20 20 20 69 66 20 28 6d 5b 31 5d          if (m[1]
a0c0: 2e 73 6c 69 63 65 28 30 2c 31 29 20 3d 3d 20 22  .slice(0,1) == "
a0d0: 2d 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  -") {.          
a0e0: 20 20 20 20 20 20 73 54 65 78 74 20 3d 20 73 54        sText = sT
a0f0: 65 78 74 2e 72 65 70 6c 61 63 65 28 6d 5b 30 5d  ext.replace(m[0]
a100: 2c 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 4c  , this.lToken[nL
a110: 61 73 74 54 6f 6b 65 6e 2b 70 61 72 73 65 49 6e  astToken+parseIn
a120: 74 28 6d 5b 31 5d 2c 31 30 29 2b 31 5d 5b 22 73  t(m[1],10)+1]["s
a130: 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20 20 20  Value"]);.      
a140: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
a160: 54 65 78 74 20 3d 20 73 54 65 78 74 2e 72 65 70  Text = sText.rep
a170: 6c 61 63 65 28 6d 5b 30 5d 2c 20 74 68 69 73 2e  lace(m[0], this.
a180: 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 4f 66 66  lToken[nTokenOff
a190: 73 65 74 2b 70 61 72 73 65 49 6e 74 28 6d 5b 31  set+parseInt(m[1
a1a0: 5d 2c 31 30 29 5d 5b 22 73 56 61 6c 75 65 22 5d  ],10)]["sValue"]
a1b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
a1c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a1d0: 20 20 20 72 65 74 75 72 6e 20 73 54 65 78 74 3b     return sText;
a1e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 77 72  .    }..    rewr
a1f0: 69 74 65 54 65 78 74 20 28 73 54 65 78 74 2c 20  iteText (sText, 
a200: 73 52 65 70 6c 2c 20 69 47 72 6f 75 70 2c 20 6d  sRepl, iGroup, m
a210: 2c 20 62 55 70 70 65 72 63 61 73 65 29 20 7b 0a  , bUppercase) {.
a220: 20 20 20 20 20 20 20 20 2f 2f 20 74 65 78 74 20          // text 
a230: 70 72 6f 63 65 73 73 6f 72 3a 20 77 72 69 74 65  processor: write
a240: 20 73 52 65 70 6c 20 69 6e 20 73 54 65 78 74 20   sRepl in sText 
a250: 61 74 20 69 47 72 6f 75 70 20 70 6f 73 69 74 69  at iGroup positi
a260: 6f 6e 22 0a 20 20 20 20 20 20 20 20 6c 65 74 20  on".        let 
a270: 6c 6e 20 3d 20 6d 2e 65 6e 64 5b 69 47 72 6f 75  ln = m.end[iGrou
a280: 70 5d 20 2d 20 6d 2e 73 74 61 72 74 5b 69 47 72  p] - m.start[iGr
a290: 6f 75 70 5d 3b 0a 20 20 20 20 20 20 20 20 6c 65  oup];.        le
a2a0: 74 20 73 4e 65 77 20 3d 20 22 22 3b 0a 20 20 20  t sNew = "";.   
a2b0: 20 20 20 20 20 69 66 20 28 73 52 65 70 6c 20 3d       if (sRepl =
a2c0: 3d 3d 20 22 2a 22 29 20 7b 0a 20 20 20 20 20 20  == "*") {.      
a2d0: 20 20 20 20 20 20 73 4e 65 77 20 3d 20 22 20 22        sNew = " "
a2e0: 2e 72 65 70 65 61 74 28 6c 6e 29 3b 0a 20 20 20  .repeat(ln);.   
a2f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65       }.        e
a300: 6c 73 65 20 69 66 20 28 73 52 65 70 6c 20 3d 3d  lse if (sRepl ==
a310: 3d 20 22 5f 22 29 20 7b 0a 20 20 20 20 20 20 20  = "_") {.       
a320: 20 20 20 20 20 73 4e 65 77 20 3d 20 22 5f 22 2e       sNew = "_".
a330: 72 65 70 65 61 74 28 6c 6e 29 3b 0a 20 20 20 20  repeat(ln);.    
a340: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c      }.        el
a350: 73 65 20 69 66 20 28 73 52 65 70 6c 20 3d 3d 3d  se if (sRepl ===
a360: 20 22 40 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "@") {.        
a370: 20 20 20 20 73 4e 65 77 20 3d 20 22 40 22 2e 72      sNew = "@".r
a380: 65 70 65 61 74 28 6c 6e 29 3b 0a 20 20 20 20 20  epeat(ln);.     
a390: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73     }.        els
a3a0: 65 20 69 66 20 28 73 52 65 70 6c 2e 73 6c 69 63  e if (sRepl.slic
a3b0: 65 28 30 2c 31 29 20 3d 3d 3d 20 22 3d 22 29 20  e(0,1) === "=") 
a3c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 4e  {.            sN
a3d0: 65 77 20 3d 20 67 63 5f 65 6e 67 69 6e 65 5f 66  ew = gc_engine_f
a3e0: 75 6e 63 5b 73 52 65 70 6c 2e 73 6c 69 63 65 28  unc[sRepl.slice(
a3f0: 31 29 5d 28 73 54 65 78 74 2c 20 6d 29 3b 0a 20  1)](sText, m);. 
a400: 20 20 20 20 20 20 20 20 20 20 20 73 4e 65 77 20             sNew 
a410: 3d 20 73 4e 65 77 20 2b 20 22 20 22 2e 72 65 70  = sNew + " ".rep
a420: 65 61 74 28 6c 6e 2d 73 4e 65 77 2e 6c 65 6e 67  eat(ln-sNew.leng
a430: 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  th);.           
a440: 20 69 66 20 28 62 55 70 70 65 72 63 61 73 65 20   if (bUppercase 
a450: 26 26 20 6d 5b 69 47 72 6f 75 70 5d 2e 73 6c 69  && m[iGroup].sli
a460: 63 65 28 30 2c 31 29 2e 67 6c 5f 69 73 55 70 70  ce(0,1).gl_isUpp
a470: 65 72 43 61 73 65 28 29 29 20 7b 0a 20 20 20 20  erCase()) {.    
a480: 20 20 20 20 20 20 20 20 20 20 20 20 73 4e 65 77              sNew
a490: 20 3d 20 73 4e 65 77 2e 67 6c 5f 74 6f 43 61 70   = sNew.gl_toCap
a4a0: 69 74 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20 20  italize();.     
a4b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a4c0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
a4d0: 20 20 20 20 20 20 73 4e 65 77 20 3d 20 73 52 65        sNew = sRe
a4e0: 70 6c 2e 67 6c 5f 65 78 70 61 6e 64 28 6d 29 3b  pl.gl_expand(m);
a4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 4e 65  .            sNe
a500: 77 20 3d 20 73 4e 65 77 20 2b 20 22 20 22 2e 72  w = sNew + " ".r
a510: 65 70 65 61 74 28 6c 6e 2d 73 4e 65 77 2e 6c 65  epeat(ln-sNew.le
a520: 6e 67 74 68 29 3b 0a 20 20 20 20 20 20 20 20 7d  ngth);.        }
a530: 0a 20 20 20 20 20 20 20 20 2f 2f 63 6f 6e 73 6f  .        //conso
a540: 6c 65 2e 6c 6f 67 28 73 54 65 78 74 2b 22 5c 6e  le.log(sText+"\n
a550: 73 74 61 72 74 3a 20 22 2b 6d 2e 73 74 61 72 74  start: "+m.start
a560: 5b 69 47 72 6f 75 70 5d 2b 22 20 65 6e 64 3a 22  [iGroup]+" end:"
a570: 2b 6d 2e 65 6e 64 5b 69 47 72 6f 75 70 5d 29 3b  +m.end[iGroup]);
a580: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
a590: 73 54 65 78 74 2e 73 6c 69 63 65 28 30 2c 20 6d  sText.slice(0, m
a5a0: 2e 73 74 61 72 74 5b 69 47 72 6f 75 70 5d 29 20  .start[iGroup]) 
a5b0: 2b 20 73 4e 65 77 20 2b 20 73 54 65 78 74 2e 73  + sNew + sText.s
a5c0: 6c 69 63 65 28 6d 2e 65 6e 64 5b 69 47 72 6f 75  lice(m.end[iGrou
a5d0: 70 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  p]);.    }..    
a5e0: 5f 74 61 67 41 6e 64 50 72 65 70 61 72 65 54 6f  _tagAndPrepareTo
a5f0: 6b 65 6e 46 6f 72 52 65 77 72 69 74 69 6e 67 20  kenForRewriting 
a600: 28 73 57 68 61 74 2c 20 6e 54 6f 6b 65 6e 52 65  (sWhat, nTokenRe
a610: 77 72 69 74 65 53 74 61 72 74 2c 20 6e 54 6f 6b  writeStart, nTok
a620: 65 6e 52 65 77 72 69 74 65 45 6e 64 2c 20 6e 54  enRewriteEnd, nT
a630: 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73  okenOffset, nLas
a640: 74 54 6f 6b 65 6e 2c 20 62 43 61 73 65 53 76 74  tToken, bCaseSvt
a650: 79 2c 20 62 44 65 62 75 67 29 20 7b 0a 20 20 20  y, bDebug) {.   
a660: 20 20 20 20 20 2f 2f 20 74 65 78 74 20 70 72 6f       // text pro
a670: 63 65 73 73 6f 72 3a 20 72 65 77 72 69 74 65 20  cessor: rewrite 
a680: 74 6f 6b 65 6e 73 20 62 65 74 77 65 65 6e 20 3c  tokens between <
a690: 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 53 74 61  nTokenRewriteSta
a6a0: 72 74 3e 20 61 6e 64 20 3c 6e 54 6f 6b 65 6e 52  rt> and <nTokenR
a6b0: 65 77 72 69 74 65 45 6e 64 3e 20 70 6f 73 69 74  ewriteEnd> posit
a6c0: 69 6f 6e 0a 20 20 20 20 20 20 20 20 69 66 20 28  ion.        if (
a6d0: 73 57 68 61 74 20 3d 3d 3d 20 22 2a 22 29 20 7b  sWhat === "*") {
a6e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
a6f0: 70 75 72 67 65 20 74 65 78 74 0a 20 20 20 20 20  purge text.     
a700: 20 20 20 20 20 20 20 69 66 20 28 6e 54 6f 6b 65         if (nToke
a710: 6e 52 65 77 72 69 74 65 45 6e 64 20 2d 20 6e 54  nRewriteEnd - nT
a720: 6f 6b 65 6e 52 65 77 72 69 74 65 53 74 61 72 74  okenRewriteStart
a730: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20   == 0) {.       
a740: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6c 54           this.lT
a750: 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 52 65 77 72 69  oken[nTokenRewri
a760: 74 65 53 74 61 72 74 5d 5b 22 62 54 6f 52 65 6d  teStart]["bToRem
a770: 6f 76 65 22 5d 20 3d 20 74 72 75 65 3b 0a 20 20  ove"] = true;.  
a780: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
a790: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
a7a0: 20 20 20 66 6f 72 20 28 6c 65 74 20 69 20 3d 20     for (let i = 
a7b0: 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 53 74 61  nTokenRewriteSta
a7c0: 72 74 3b 20 20 69 20 3c 3d 20 6e 54 6f 6b 65 6e  rt;  i <= nToken
a7d0: 52 65 77 72 69 74 65 45 6e 64 3b 20 20 69 2b 2b  RewriteEnd;  i++
a7e0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
a7f0: 20 20 20 20 20 20 20 20 74 68 69 73 2e 6c 54 6f          this.lTo
a800: 6b 65 6e 5b 69 5d 5b 22 62 54 6f 52 65 6d 6f 76  ken[i]["bToRemov
a810: 65 22 5d 20 3d 20 74 72 75 65 3b 0a 20 20 20 20  e"] = true;.    
a820: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
a830: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a840: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c      }.        el
a850: 73 65 20 69 66 20 28 73 57 68 61 74 20 3d 3d 3d  se if (sWhat ===
a860: 20 22 e2 90 a3 22 29 20 7b 0a 20 20 20 20 20 20   "...") {.      
a870: 20 20 20 20 20 20 2f 2f 20 6d 65 72 67 65 20 74        // merge t
a880: 6f 6b 65 6e 73 0a 20 20 20 20 20 20 20 20 20 20  okens.          
a890: 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54    this.lToken[nT
a8a0: 6f 6b 65 6e 52 65 77 72 69 74 65 53 74 61 72 74  okenRewriteStart
a8b0: 5d 5b 22 6e 4d 65 72 67 65 55 6e 74 69 6c 22 5d  ]["nMergeUntil"]
a8c0: 20 3d 20 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65   = nTokenRewrite
a8d0: 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  End;.        }. 
a8e0: 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28         else if (
a8f0: 73 57 68 61 74 20 3d 3d 3d 20 22 5f 22 29 20 7b  sWhat === "_") {
a900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
a910: 6e 65 75 74 72 61 6c 69 7a 65 64 20 74 6f 6b 65  neutralized toke
a920: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  n.            if
a930: 20 28 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 45   (nTokenRewriteE
a940: 6e 64 20 2d 20 6e 54 6f 6b 65 6e 52 65 77 72 69  nd - nTokenRewri
a950: 74 65 53 74 61 72 74 20 3d 3d 20 30 29 20 7b 0a  teStart == 0) {.
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b  this.lToken[nTok
a980: 65 6e 52 65 77 72 69 74 65 53 74 61 72 74 5d 5b  enRewriteStart][
a990: 22 73 4e 65 77 56 61 6c 75 65 22 5d 20 3d 20 22  "sNewValue"] = "
a9a0: 5f 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  _";.            
a9b0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
a9c0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65           for (le
a9d0: 74 20 69 20 3d 20 6e 54 6f 6b 65 6e 52 65 77 72  t i = nTokenRewr
a9e0: 69 74 65 53 74 61 72 74 3b 20 20 69 20 3c 3d 20  iteStart;  i <= 
a9f0: 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 45 6e 64  nTokenRewriteEnd
aa00: 3b 20 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20  ;  i++) {.      
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
aa20: 69 73 2e 6c 54 6f 6b 65 6e 5b 69 5d 5b 22 73 4e  is.lToken[i]["sN
aa30: 65 77 56 61 6c 75 65 22 5d 20 3d 20 22 5f 22 3b  ewValue"] = "_";
aa40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aa50: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
aa60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
aa70: 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
aa80: 20 20 20 20 20 20 69 66 20 28 73 57 68 61 74 2e        if (sWhat.
aa90: 73 74 61 72 74 73 57 69 74 68 28 22 3d 22 29 29  startsWith("="))
aaa0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
aab0: 20 20 20 73 57 68 61 74 20 3d 20 67 63 5f 65 6e     sWhat = gc_en
aac0: 67 69 6e 65 5f 66 75 6e 63 5b 73 57 68 61 74 2e  gine_func[sWhat.
aad0: 73 6c 69 63 65 28 31 29 5d 28 74 68 69 73 2e 6c  slice(1)](this.l
aae0: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 4f 66 66  Token, nTokenOff
aaf0: 73 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 29  set, nLastToken)
ab00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ;.            } 
ab10: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
ab20: 20 20 20 20 20 20 20 73 57 68 61 74 20 3d 20 74         sWhat = t
ab30: 68 69 73 2e 5f 65 78 70 61 6e 64 28 73 57 68 61  his._expand(sWha
ab40: 74 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c  t, nTokenOffset,
ab50: 20 6e 4c 61 73 74 54 6f 6b 65 6e 29 3b 0a 20 20   nLastToken);.  
ab60: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ab70: 20 20 20 20 20 20 20 20 6c 65 74 20 62 55 70 70          let bUpp
ab80: 65 72 63 61 73 65 20 3d 20 62 43 61 73 65 53 76  ercase = bCaseSv
ab90: 74 79 20 26 26 20 74 68 69 73 2e 6c 54 6f 6b 65  ty && this.lToke
aba0: 6e 5b 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 53  n[nTokenRewriteS
abb0: 74 61 72 74 5d 5b 22 73 56 61 6c 75 65 22 5d 2e  tart]["sValue"].
abc0: 73 6c 69 63 65 28 30 2c 31 29 2e 67 6c 5f 69 73  slice(0,1).gl_is
abd0: 55 70 70 65 72 43 61 73 65 28 29 3b 0a 20 20 20  UpperCase();.   
abe0: 20 20 20 20 20 20 20 20 20 69 66 20 28 6e 54 6f           if (nTo
abf0: 6b 65 6e 52 65 77 72 69 74 65 45 6e 64 20 2d 20  kenRewriteEnd - 
ac00: 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 53 74 61  nTokenRewriteSta
ac10: 72 74 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  rt == 0) {.     
ac20: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 6f 6e             // on
ac30: 65 20 74 6f 6b 65 6e 0a 20 20 20 20 20 20 20 20  e token.        
ac40: 20 20 20 20 20 20 20 20 69 66 20 28 62 55 70 70          if (bUpp
ac50: 65 72 63 61 73 65 29 20 7b 0a 20 20 20 20 20 20  ercase) {.      
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 57                sW
ac70: 68 61 74 20 3d 20 73 57 68 61 74 2e 67 6c 5f 74  hat = sWhat.gl_t
ac80: 6f 43 61 70 69 74 61 6c 69 7a 65 28 29 3b 0a 20  oCapitalize();. 
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
aca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
acb0: 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f   this.lToken[nTo
acc0: 6b 65 6e 52 65 77 72 69 74 65 53 74 61 72 74 5d  kenRewriteStart]
acd0: 5b 22 73 4e 65 77 56 61 6c 75 65 22 5d 20 3d 20  ["sNewValue"] = 
ace0: 73 57 68 61 74 3b 0a 20 20 20 20 20 20 20 20 20  sWhat;.         
acf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
ad00: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
ad10: 20 20 20 20 20 20 20 20 2f 2f 20 73 65 76 65 72          // sever
ad20: 61 6c 20 74 6f 6b 65 6e 73 0a 20 20 20 20 20 20  al tokens.      
ad30: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6c 54            let lT
ad40: 6f 6b 65 6e 56 61 6c 75 65 20 3d 20 73 57 68 61  okenValue = sWha
ad50: 74 2e 73 70 6c 69 74 28 22 7c 22 29 3b 0a 20 20  t.split("|");.  
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
ad70: 20 28 6c 54 6f 6b 65 6e 56 61 6c 75 65 2e 6c 65   (lTokenValue.le
ad80: 6e 67 74 68 20 21 3d 20 28 6e 54 6f 6b 65 6e 52  ngth != (nTokenR
ad90: 65 77 72 69 74 65 45 6e 64 20 2d 20 6e 54 6f 6b  ewriteEnd - nTok
ada0: 65 6e 52 65 77 72 69 74 65 53 74 61 72 74 20 2b  enRewriteStart +
adb0: 20 31 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20   1)) {.         
adc0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62             if (b
add0: 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20  Debug) {.       
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 45 72   console.log("Er
ae00: 72 6f 72 2e 20 54 65 78 74 20 70 72 6f 63 65 73  ror. Text proces
ae10: 73 6f 72 3a 20 6e 75 6d 62 65 72 20 6f 66 20 72  sor: number of r
ae20: 65 70 6c 61 63 65 6d 65 6e 74 73 20 21 3d 20 6e  eplacements != n
ae30: 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 2e  umber of tokens.
ae40: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
ae50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
ae70: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  turn;.          
ae80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ae90: 20 20 20 20 20 20 20 20 6c 65 74 20 6a 20 3d 20          let j = 
aea0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
aeb0: 20 20 20 66 6f 72 20 28 6c 65 74 20 69 20 3d 20     for (let i = 
aec0: 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 53 74 61  nTokenRewriteSta
aed0: 72 74 3b 20 20 69 20 3c 3d 20 6e 54 6f 6b 65 6e  rt;  i <= nToken
aee0: 52 65 77 72 69 74 65 45 6e 64 3b 20 20 69 2b 2b  RewriteEnd;  i++
aef0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
af00: 20 20 20 20 20 20 20 20 6c 65 74 20 73 56 61 6c          let sVal
af10: 75 65 20 3d 20 6c 54 6f 6b 65 6e 56 61 6c 75 65  ue = lTokenValue
af20: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [j];.           
af30: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73 56           if (!sV
af40: 61 6c 75 65 20 7c 7c 20 73 56 61 6c 75 65 20 3d  alue || sValue =
af50: 3d 3d 20 22 2a 22 29 20 7b 0a 20 20 20 20 20 20  == "*") {.      
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 69 5d    this.lToken[i]
af80: 5b 22 62 54 6f 52 65 6d 6f 76 65 22 5d 20 3d 20  ["bToRemove"] = 
af90: 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  true;.          
afa0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
afb0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
afc0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62             if (b
afd0: 55 70 70 65 72 63 61 73 65 29 20 7b 0a 20 20 20  Uppercase) {.   
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aff0: 20 20 20 20 20 20 20 20 20 73 56 61 6c 75 65 20           sValue 
b000: 3d 20 73 56 61 6c 75 65 2e 67 6c 5f 74 6f 43 61  = sValue.gl_toCa
b010: 70 69 74 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  pitalize();.    
b020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b030: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
b050: 69 73 2e 6c 54 6f 6b 65 6e 5b 69 5d 5b 22 73 4e  is.lToken[i]["sN
b060: 65 77 56 61 6c 75 65 22 5d 20 3d 20 73 56 61 6c  ewValue"] = sVal
b070: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
b080: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b                j+
b0a0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
b0b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
b0c0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
b0d0: 20 7d 0a 0a 20 20 20 20 72 65 77 72 69 74 65 46   }..    rewriteF
b0e0: 72 6f 6d 54 61 67 73 20 28 62 44 65 62 75 67 3d  romTags (bDebug=
b0f0: 66 61 6c 73 65 29 20 7b 0a 20 20 20 20 20 20 20  false) {.       
b100: 20 2f 2f 20 72 65 77 72 69 74 65 20 74 68 65 20   // rewrite the 
b110: 73 65 6e 74 65 6e 63 65 2c 20 6d 6f 64 69 66 79  sentence, modify
b120: 20 74 6f 6b 65 6e 73 2c 20 70 75 72 67 65 20 74   tokens, purge t
b130: 68 65 20 74 6f 6b 65 6e 20 6c 69 73 74 0a 20 20  he token list.  
b140: 20 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67        if (bDebug
b150: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
b160: 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 52 45 57  console.log("REW
b170: 52 49 54 45 22 29 3b 0a 20 20 20 20 20 20 20 20  RITE");.        
b180: 7d 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6c 4e  }.        let lN
b190: 65 77 54 6f 6b 65 6e 20 3d 20 5b 5d 3b 0a 20 20  ewToken = [];.  
b1a0: 20 20 20 20 20 20 6c 65 74 20 6e 4d 65 72 67 65        let nMerge
b1b0: 55 6e 74 69 6c 20 3d 20 30 3b 0a 20 20 20 20 20  Until = 0;.     
b1c0: 20 20 20 6c 65 74 20 6f 4d 65 72 67 69 6e 67 54     let oMergingT
b1d0: 6f 6b 65 6e 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20  oken = null;.   
b1e0: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 69       for (let [i
b1f0: 54 6f 6b 65 6e 2c 20 6f 54 6f 6b 65 6e 5d 20 6f  Token, oToken] o
b200: 66 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 2e 65 6e  f this.lToken.en
b210: 74 72 69 65 73 28 29 29 20 7b 0a 20 20 20 20 20  tries()) {.     
b220: 20 20 20 20 20 20 20 6c 65 74 20 62 4b 65 65 70         let bKeep
b230: 54 6f 6b 65 6e 20 3d 20 74 72 75 65 3b 0a 20 20  Token = true;.  
b240: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6f 54            if (oT
b250: 6f 6b 65 6e 5b 22 73 54 79 70 65 22 5d 20 21 3d  oken["sType"] !=
b260: 20 22 49 4e 46 4f 22 29 20 7b 0a 20 20 20 20 20   "INFO") {.     
b270: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6e             if (n
b280: 4d 65 72 67 65 55 6e 74 69 6c 20 26 26 20 69 54  MergeUntil && iT
b290: 6f 6b 65 6e 20 3c 3d 20 6e 4d 65 72 67 65 55 6e  oken <= nMergeUn
b2a0: 74 69 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20  til) {.         
b2b0: 20 20 20 20 20 20 20 20 20 20 20 6f 4d 65 72 67             oMerg
b2c0: 69 6e 67 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65  ingToken["sValue
b2d0: 22 5d 20 2b 3d 20 22 20 22 2e 72 65 70 65 61 74  "] += " ".repeat
b2e0: 28 6f 54 6f 6b 65 6e 5b 22 6e 53 74 61 72 74 22  (oToken["nStart"
b2f0: 5d 20 2d 20 6f 4d 65 72 67 69 6e 67 54 6f 6b 65  ] - oMergingToke
b300: 6e 5b 22 6e 45 6e 64 22 5d 29 20 2b 20 6f 54 6f  n["nEnd"]) + oTo
b310: 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 3b 0a 20  ken["sValue"];. 
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b330: 20 20 20 6f 4d 65 72 67 69 6e 67 54 6f 6b 65 6e     oMergingToken
b340: 5b 22 6e 45 6e 64 22 5d 20 3d 20 6f 54 6f 6b 65  ["nEnd"] = oToke
b350: 6e 5b 22 6e 45 6e 64 22 5d 3b 0a 20 20 20 20 20  n["nEnd"];.     
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
b370: 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20  f (bDebug) {.   
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
b3a0: 28 22 20 20 4d 45 52 47 45 44 20 54 4f 4b 45 4e  ("  MERGED TOKEN
b3b0: 3a 20 22 20 2b 20 6f 4d 65 72 67 69 6e 67 54 6f  : " + oMergingTo
b3c0: 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 29 3b 0a  ken["sValue"]);.
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b3f0: 20 20 20 20 20 20 20 20 20 20 62 4b 65 65 70 54            bKeepT
b400: 6f 6b 65 6e 20 3d 20 66 61 6c 73 65 3b 0a 20 20  oken = false;.  
b410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b430: 69 66 20 28 6f 54 6f 6b 65 6e 2e 68 61 73 4f 77  if (oToken.hasOw
b440: 6e 50 72 6f 70 65 72 74 79 28 22 6e 4d 65 72 67  nProperty("nMerg
b450: 65 55 6e 74 69 6c 22 29 29 20 7b 0a 20 20 20 20  eUntil")) {.    
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 69 66 20 28 69 54 6f 6b 65 6e 20 3e 20 6e 4d 65  if (iToken > nMe
b480: 72 67 65 55 6e 74 69 6c 29 20 7b 20 2f 2f 20 74  rgeUntil) { // t
b490: 68 69 73 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74  his token is not
b4a0: 20 61 6c 72 65 61 64 79 20 6d 65 72 67 65 64 20   already merged 
b4b0: 77 69 74 68 20 61 20 70 72 65 76 69 6f 75 73 20  with a previous 
b4c0: 74 6f 6b 65 6e 0a 20 20 20 20 20 20 20 20 20 20  token.          
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 4d                oM
b4e0: 65 72 67 69 6e 67 54 6f 6b 65 6e 20 3d 20 6f 54  ergingToken = oT
b4f0: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  oken;.          
b500: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b520: 69 66 20 28 6f 54 6f 6b 65 6e 5b 22 6e 4d 65 72  if (oToken["nMer
b530: 67 65 55 6e 74 69 6c 22 5d 20 3e 20 6e 4d 65 72  geUntil"] > nMer
b540: 67 65 55 6e 74 69 6c 29 20 7b 0a 20 20 20 20 20  geUntil) {.     
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 20 20 6e 4d 65 72 67 65 55 6e 74 69 6c 20 3d     nMergeUntil =
b570: 20 6f 54 6f 6b 65 6e 5b 22 6e 4d 65 72 67 65 55   oToken["nMergeU
b580: 6e 74 69 6c 22 5d 3b 0a 20 20 20 20 20 20 20 20  ntil"];.        
b590: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 20 20 64 65 6c 65 74 65 20 6f 54 6f 6b 65 6e 5b    delete oToken[
b5c0: 22 6e 4d 65 72 67 65 55 6e 74 69 6c 22 5d 3b 0a  "nMergeUntil"];.
b5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
b5f0: 20 20 65 6c 73 65 20 69 66 20 28 6f 54 6f 6b 65    else if (oToke
b600: 6e 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79  n.hasOwnProperty
b610: 28 22 62 54 6f 52 65 6d 6f 76 65 22 29 29 20 7b  ("bToRemove")) {
b620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b630: 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67 29       if (bDebug)
b640: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
b650: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f             conso
b660: 6c 65 2e 6c 6f 67 28 22 20 20 52 45 4d 4f 56 45  le.log("  REMOVE
b670: 44 3a 20 22 20 2b 20 6f 54 6f 6b 65 6e 5b 22 73  D: " + oToken["s
b680: 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20 20 20  Value"]);.      
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6b0: 20 20 20 20 74 68 69 73 2e 73 53 65 6e 74 65 6e      this.sSenten
b6c0: 63 65 20 3d 20 74 68 69 73 2e 73 53 65 6e 74 65  ce = this.sSente
b6d0: 6e 63 65 2e 73 6c 69 63 65 28 30 2c 20 6f 54 6f  nce.slice(0, oTo
b6e0: 6b 65 6e 5b 22 6e 53 74 61 72 74 22 5d 29 20 2b  ken["nStart"]) +
b6f0: 20 22 20 22 2e 72 65 70 65 61 74 28 6f 54 6f 6b   " ".repeat(oTok
b700: 65 6e 5b 22 6e 45 6e 64 22 5d 20 2d 20 6f 54 6f  en["nEnd"] - oTo
b710: 6b 65 6e 5b 22 6e 53 74 61 72 74 22 5d 29 20 2b  ken["nStart"]) +
b720: 20 74 68 69 73 2e 73 53 65 6e 74 65 6e 63 65 2e   this.sSentence.
b730: 73 6c 69 63 65 28 6f 54 6f 6b 65 6e 5b 22 6e 45  slice(oToken["nE
b740: 6e 64 22 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  nd"]);.         
b750: 20 20 20 20 20 20 20 20 20 20 20 62 4b 65 65 70             bKeep
b760: 54 6f 6b 65 6e 20 3d 20 66 61 6c 73 65 3b 0a 20  Token = false;. 
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
b780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
b790: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0a 20 20             //.  
b7a0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62 4b            if (bK
b7b0: 65 65 70 54 6f 6b 65 6e 29 20 7b 0a 20 20 20 20  eepToken) {.    
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 4e 65 77              lNew
b7d0: 54 6f 6b 65 6e 2e 70 75 73 68 28 6f 54 6f 6b 65  Token.push(oToke
b7e0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
b7f0: 20 20 20 20 69 66 20 28 6f 54 6f 6b 65 6e 2e 68      if (oToken.h
b800: 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 22 73  asOwnProperty("s
b810: 4e 65 77 56 61 6c 75 65 22 29 29 20 7b 0a 20 20  NewValue")) {.  
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b830: 20 20 2f 2f 20 72 65 77 72 69 74 65 20 74 6f 6b    // rewrite tok
b840: 65 6e 20 61 6e 64 20 73 65 6e 74 65 6e 63 65 0a  en and sentence.
b850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b860: 20 20 20 20 69 66 20 28 62 44 65 62 75 67 29 20      if (bDebug) 
b870: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b880: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
b890: 65 2e 6c 6f 67 28 6f 54 6f 6b 65 6e 5b 22 73 56  e.log(oToken["sV
b8a0: 61 6c 75 65 22 5d 20 2b 20 22 20 2d 3e 20 22 20  alue"] + " -> " 
b8b0: 2b 20 6f 54 6f 6b 65 6e 5b 22 73 4e 65 77 56 61  + oToken["sNewVa
b8c0: 6c 75 65 22 5d 29 3b 0a 20 20 20 20 20 20 20 20  lue"]);.        
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8f0: 20 20 6f 54 6f 6b 65 6e 5b 22 73 52 65 61 6c 56    oToken["sRealV
b900: 61 6c 75 65 22 5d 20 3d 20 6f 54 6f 6b 65 6e 5b  alue"] = oToken[
b910: 22 73 56 61 6c 75 65 22 5d 3b 0a 20 20 20 20 20  "sValue"];.     
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
b930: 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 20  Token["sValue"] 
b940: 3d 20 6f 54 6f 6b 65 6e 5b 22 73 4e 65 77 56 61  = oToken["sNewVa
b950: 6c 75 65 22 5d 3b 0a 20 20 20 20 20 20 20 20 20  lue"];.         
b960: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e             let n
b970: 44 69 66 66 4c 65 6e 20 3d 20 6f 54 6f 6b 65 6e  DiffLen = oToken
b980: 5b 22 73 52 65 61 6c 56 61 6c 75 65 22 5d 2e 6c  ["sRealValue"].l
b990: 65 6e 67 74 68 20 2d 20 6f 54 6f 6b 65 6e 5b 22  ength - oToken["
b9a0: 73 4e 65 77 56 61 6c 75 65 22 5d 2e 6c 65 6e 67  sNewValue"].leng
b9b0: 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  th;.            
b9c0: 20 20 20 20 20 20 20 20 6c 65 74 20 73 4e 65 77          let sNew
b9d0: 52 65 70 6c 20 3d 20 28 6e 44 69 66 66 4c 65 6e  Repl = (nDiffLen
b9e0: 20 3e 3d 20 30 29 20 3f 20 6f 54 6f 6b 65 6e 5b   >= 0) ? oToken[
b9f0: 22 73 4e 65 77 56 61 6c 75 65 22 5d 20 2b 20 22  "sNewValue"] + "
ba00: 20 22 2e 72 65 70 65 61 74 28 6e 44 69 66 66 4c   ".repeat(nDiffL
ba10: 65 6e 29 20 3a 20 6f 54 6f 6b 65 6e 5b 22 73 4e  en) : oToken["sN
ba20: 65 77 56 61 6c 75 65 22 5d 2e 73 6c 69 63 65 28  ewValue"].slice(
ba30: 30 2c 20 6f 54 6f 6b 65 6e 5b 22 73 52 65 61 6c  0, oToken["sReal
ba40: 56 61 6c 75 65 22 5d 2e 6c 65 6e 67 74 68 29 3b  Value"].length);
ba50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ba60: 20 20 20 20 20 74 68 69 73 2e 73 53 65 6e 74 65       this.sSente
ba70: 6e 63 65 20 3d 20 74 68 69 73 2e 73 53 65 6e 74  nce = this.sSent
ba80: 65 6e 63 65 2e 73 6c 69 63 65 28 30 2c 6f 54 6f  ence.slice(0,oTo
ba90: 6b 65 6e 5b 22 6e 53 74 61 72 74 22 5d 29 20 2b  ken["nStart"]) +
baa0: 20 73 4e 65 77 52 65 70 6c 20 2b 20 74 68 69 73   sNewRepl + this
bab0: 2e 73 53 65 6e 74 65 6e 63 65 2e 73 6c 69 63 65  .sSentence.slice
bac0: 28 6f 54 6f 6b 65 6e 5b 22 6e 45 6e 64 22 5d 29  (oToken["nEnd"])
bad0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
bae0: 20 20 20 20 20 20 64 65 6c 65 74 65 20 6f 54 6f        delete oTo
baf0: 6b 65 6e 5b 22 73 4e 65 77 56 61 6c 75 65 22 5d  ken["sNewValue"]
bb00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
bb10: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
bb20: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  }.            el
bb30: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
bb40: 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20       try {.     
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
bb60: 68 69 73 2e 64 54 6f 6b 65 6e 50 6f 73 2e 64 65  his.dTokenPos.de
bb70: 6c 65 74 65 28 6f 54 6f 6b 65 6e 5b 22 6e 53 74  lete(oToken["nSt
bb80: 61 72 74 22 5d 29 3b 0a 20 20 20 20 20 20 20 20  art"]);.        
bb90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bba0: 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
bbb0: 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  (e) {.          
bbc0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
bbd0: 65 2e 6c 6f 67 28 74 68 69 73 2e 61 73 53 74 72  e.log(this.asStr
bbe0: 69 6e 67 28 29 29 3b 0a 20 20 20 20 20 20 20 20  ing());.        
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
bc00: 6f 6c 65 2e 6c 6f 67 28 6f 54 6f 6b 65 6e 29 3b  ole.log(oToken);
bc10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bc20: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
bc30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bc40: 20 20 20 69 66 20 28 62 44 65 62 75 67 29 20 7b     if (bDebug) {
bc50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
bc60: 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 54 45 58 54  sole.log("  TEXT
bc70: 20 52 45 57 52 49 54 45 44 3a 20 22 20 2b 20 74   REWRITED: " + t
bc80: 68 69 73 2e 73 53 65 6e 74 65 6e 63 65 29 3b 0a  his.sSentence);.
bc90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bca0: 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 2e 6c 65    this.lToken.le
bcb0: 6e 67 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  ngth = 0;.      
bcc0: 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 20 3d 20    this.lToken = 
bcd0: 6c 4e 65 77 54 6f 6b 65 6e 3b 0a 20 20 20 20 7d  lNewToken;.    }
bce0: 0a 7d 3b 0a 0a 0a 69 66 20 28 74 79 70 65 6f 66  .};...if (typeof
bcf0: 28 65 78 70 6f 72 74 73 29 20 21 3d 3d 20 27 75  (exports) !== 'u
bd00: 6e 64 65 66 69 6e 65 64 27 29 20 7b 0a 20 20 20  ndefined') {.   
bd10: 20 65 78 70 6f 72 74 73 2e 6c 61 6e 67 20 3d 20   exports.lang = 
bd20: 67 63 5f 65 6e 67 69 6e 65 2e 6c 61 6e 67 3b 0a  gc_engine.lang;.
bd30: 20 20 20 20 65 78 70 6f 72 74 73 2e 6c 6f 63 61      exports.loca
bd40: 6c 65 73 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e  les = gc_engine.
bd50: 6c 6f 63 61 6c 65 73 3b 0a 20 20 20 20 65 78 70  locales;.    exp
bd60: 6f 72 74 73 2e 70 6b 67 20 3d 20 67 63 5f 65 6e  orts.pkg = gc_en
bd70: 67 69 6e 65 2e 70 6b 67 3b 0a 20 20 20 20 65 78  gine.pkg;.    ex
bd80: 70 6f 72 74 73 2e 6e 61 6d 65 20 3d 20 67 63 5f  ports.name = gc_
bd90: 65 6e 67 69 6e 65 2e 6e 61 6d 65 3b 0a 20 20 20  engine.name;.   
bda0: 20 65 78 70 6f 72 74 73 2e 76 65 72 73 69 6f 6e   exports.version
bdb0: 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 76 65 72   = gc_engine.ver
bdc0: 73 69 6f 6e 3b 0a 20 20 20 20 65 78 70 6f 72 74  sion;.    export
bdd0: 73 2e 61 75 74 68 6f 72 20 3d 20 67 63 5f 65 6e  s.author = gc_en
bde0: 67 69 6e 65 2e 61 75 74 68 6f 72 3b 0a 20 20 20  gine.author;.   
bdf0: 20 2f 2f 20 6f 62 6a 65 63 74 73 0a 20 20 20 20   // objects.    
be00: 65 78 70 6f 72 74 73 2e 6f 53 70 65 6c 6c 43 68  exports.oSpellCh
be10: 65 63 6b 65 72 20 3d 20 67 63 5f 65 6e 67 69 6e  ecker = gc_engin
be20: 65 2e 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72 3b  e.oSpellChecker;
be30: 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 6f 54 6f  .    exports.oTo
be40: 6b 65 6e 69 7a 65 72 20 3d 20 67 63 5f 65 6e 67  kenizer = gc_eng
be50: 69 6e 65 2e 6f 54 6f 6b 65 6e 69 7a 65 72 3b 0a  ine.oTokenizer;.
be60: 20 20 20 20 65 78 70 6f 72 74 73 2e 61 49 67 6e      exports.aIgn
be70: 6f 72 65 64 52 75 6c 65 73 20 3d 20 67 63 5f 65  oredRules = gc_e
be80: 6e 67 69 6e 65 2e 61 49 67 6e 6f 72 65 64 52 75  ngine.aIgnoredRu
be90: 6c 65 73 3b 0a 20 20 20 20 65 78 70 6f 72 74 73  les;.    exports
bea0: 2e 6f 4f 70 74 69 6f 6e 73 43 6f 6c 6f 72 73 20  .oOptionsColors 
beb0: 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 6f 4f 70 74  = gc_engine.oOpt
bec0: 69 6f 6e 73 43 6f 6c 6f 72 73 3b 0a 20 20 20 20  ionsColors;.    
bed0: 2f 2f 20 69 6e 69 74 0a 20 20 20 20 65 78 70 6f  // init.    expo
bee0: 72 74 73 2e 6c 6f 61 64 20 3d 20 67 63 5f 65 6e  rts.load = gc_en
bef0: 67 69 6e 65 2e 6c 6f 61 64 3b 0a 20 20 20 20 65  gine.load;.    e
bf00: 78 70 6f 72 74 73 2e 70 61 72 73 65 20 3d 20 67  xports.parse = g
bf10: 63 5f 65 6e 67 69 6e 65 2e 70 61 72 73 65 3b 0a  c_engine.parse;.
bf20: 20 20 20 20 65 78 70 6f 72 74 73 2e 67 65 74 53      exports.getS
bf30: 70 65 6c 6c 43 68 65 63 6b 65 72 20 3d 20 67 63  pellChecker = gc
bf40: 5f 65 6e 67 69 6e 65 2e 67 65 74 53 70 65 6c 6c  _engine.getSpell
bf50: 43 68 65 63 6b 65 72 3b 0a 20 20 20 20 2f 2f 20  Checker;.    // 
bf60: 72 75 6c 65 73 0a 20 20 20 20 65 78 70 6f 72 74  rules.    export
bf70: 73 2e 69 67 6e 6f 72 65 52 75 6c 65 20 3d 20 67  s.ignoreRule = g
bf80: 63 5f 65 6e 67 69 6e 65 2e 69 67 6e 6f 72 65 52  c_engine.ignoreR
bf90: 75 6c 65 3b 0a 20 20 20 20 65 78 70 6f 72 74 73  ule;.    exports
bfa0: 2e 72 65 73 65 74 49 67 6e 6f 72 65 52 75 6c 65  .resetIgnoreRule
bfb0: 73 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 72 65  s = gc_engine.re
bfc0: 73 65 74 49 67 6e 6f 72 65 52 75 6c 65 73 3b 0a  setIgnoreRules;.
bfd0: 20 20 20 20 65 78 70 6f 72 74 73 2e 72 65 61 63      exports.reac
bfe0: 74 69 76 61 74 65 52 75 6c 65 20 3d 20 67 63 5f  tivateRule = gc_
bff0: 65 6e 67 69 6e 65 2e 72 65 61 63 74 69 76 61 74  engine.reactivat
c000: 65 52 75 6c 65 3b 0a 20 20 20 20 65 78 70 6f 72  eRule;.    expor
c010: 74 73 2e 6c 69 73 74 52 75 6c 65 73 20 3d 20 67  ts.listRules = g
c020: 63 5f 65 6e 67 69 6e 65 2e 6c 69 73 74 52 75 6c  c_engine.listRul
c030: 65 73 3b 0a 20 20 20 20 65 78 70 6f 72 74 73 2e  es;.    exports.
c040: 67 65 74 52 75 6c 65 73 20 3d 20 67 63 5f 65 6e  getRules = gc_en
c050: 67 69 6e 65 2e 67 65 74 52 75 6c 65 73 3b 0a 20  gine.getRules;. 
c060: 20 20 20 2f 2f 20 6f 74 68 65 72 0a 20 20 20 20     // other.    
c070: 65 78 70 6f 72 74 73 2e 54 65 78 74 50 61 72 73  exports.TextPars
c080: 65 72 20 3d 20 54 65 78 74 50 61 72 73 65 72 3b  er = TextParser;
c090: 0a 7d 0a                                         .}.