Grammalecte  Hex Artifact Content

Artifact 3be7b763d3431abf48e8e213eff197b4a9e19c20e3a35429acaaa27eb538577e:


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 28 74 79 70 65 6f 66  map}...if(typeof
00b0: 28 70 72 6f 63 65 73 73 29 20 21 3d 3d 20 27 75  (process) !== 'u
00c0: 6e 64 65 66 69 6e 65 64 27 29 20 7b 0a 20 20 20  ndefined') {.   
00d0: 20 76 61 72 20 67 63 5f 6f 70 74 69 6f 6e 73 20   var gc_options 
00e0: 3d 20 72 65 71 75 69 72 65 28 22 2e 2f 67 63 5f  = require("./gc_
00f0: 6f 70 74 69 6f 6e 73 2e 6a 73 22 29 3b 0a 20 20  options.js");.  
0100: 20 20 76 61 72 20 67 63 5f 72 75 6c 65 73 20 3d    var gc_rules =
0110: 20 72 65 71 75 69 72 65 28 22 2e 2f 67 63 5f 72   require("./gc_r
0120: 75 6c 65 73 2e 6a 73 22 29 3b 0a 20 20 20 20 76  ules.js");.    v
0130: 61 72 20 67 63 5f 72 75 6c 65 73 5f 67 72 61 70  ar gc_rules_grap
0140: 68 20 3d 20 72 65 71 75 69 72 65 28 22 2e 2f 67  h = require("./g
0150: 63 5f 72 75 6c 65 73 5f 67 72 61 70 68 2e 6a 73  c_rules_graph.js
0160: 22 29 3b 0a 20 20 20 20 76 61 72 20 63 72 65 67  ");.    var creg
0170: 65 78 20 3d 20 72 65 71 75 69 72 65 28 22 2e 2f  ex = require("./
0180: 63 72 65 67 65 78 2e 6a 73 22 29 3b 0a 20 20 20  cregex.js");.   
0190: 20 76 61 72 20 74 65 78 74 20 3d 20 72 65 71 75   var text = requ
01a0: 69 72 65 28 22 2e 2e 2f 74 65 78 74 2e 6a 73 22  ire("../text.js"
01b0: 29 3b 0a 7d 20 65 6c 73 65 20 69 66 20 28 74 79  );.} else if (ty
01c0: 70 65 6f 66 28 72 65 71 75 69 72 65 29 20 21 3d  peof(require) !=
01d0: 3d 20 27 75 6e 64 65 66 69 6e 65 64 27 29 20 7b  = 'undefined') {
01e0: 0a 20 20 20 20 76 61 72 20 67 63 5f 6f 70 74 69  .    var gc_opti
01f0: 6f 6e 73 20 3d 20 72 65 71 75 69 72 65 28 22 72  ons = require("r
0200: 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d 61  esource://gramma
0210: 6c 65 63 74 65 2f 24 7b 6c 61 6e 67 7d 2f 67 63  lecte/${lang}/gc
0220: 5f 6f 70 74 69 6f 6e 73 2e 6a 73 22 29 3b 0a 20  _options.js");. 
0230: 20 20 20 76 61 72 20 67 63 5f 72 75 6c 65 73 20     var gc_rules 
0240: 3d 20 72 65 71 75 69 72 65 28 22 72 65 73 6f 75  = require("resou
0250: 72 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74  rce://grammalect
0260: 65 2f 24 7b 6c 61 6e 67 7d 2f 67 63 5f 72 75 6c  e/${lang}/gc_rul
0270: 65 73 2e 6a 73 22 29 3b 0a 20 20 20 20 76 61 72  es.js");.    var
0280: 20 67 63 5f 72 75 6c 65 73 5f 67 72 61 70 68 20   gc_rules_graph 
0290: 3d 20 72 65 71 75 69 72 65 28 22 72 65 73 6f 75  = require("resou
02a0: 72 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74  rce://grammalect
02b0: 65 2f 24 7b 6c 61 6e 67 7d 2f 67 63 5f 72 75 6c  e/${lang}/gc_rul
02c0: 65 73 5f 67 72 61 70 68 2e 6a 73 22 29 3b 0a 20  es_graph.js");. 
02d0: 20 20 20 76 61 72 20 63 72 65 67 65 78 20 3d 20     var cregex = 
02e0: 72 65 71 75 69 72 65 28 22 72 65 73 6f 75 72 63  require("resourc
02f0: 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74 65 2f  e://grammalecte/
0300: 24 7b 6c 61 6e 67 7d 2f 63 72 65 67 65 78 2e 6a  ${lang}/cregex.j
0310: 73 22 29 3b 0a 20 20 20 20 76 61 72 20 74 65 78  s");.    var tex
0320: 74 20 3d 20 72 65 71 75 69 72 65 28 22 72 65 73  t = require("res
0330: 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65  ource://grammale
0340: 63 74 65 2f 74 65 78 74 2e 6a 73 22 29 3b 0a 7d  cte/text.js");.}
0350: 0a 0a 0a 66 75 6e 63 74 69 6f 6e 20 63 61 70 69  ...function capi
0360: 74 61 6c 69 7a 65 41 72 72 61 79 20 28 61 41 72  talizeArray (aAr
0370: 72 61 79 29 20 7b 0a 20 20 20 20 2f 2f 20 63 61  ray) {.    // ca
0380: 6e e2 80 99 74 20 6d 61 70 20 6f 6e 20 75 73 65  n...t map on use
0390: 72 20 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r defined functi
03a0: 6f 6e 3f 3f 0a 20 20 20 20 6c 65 74 20 61 4e 65  on??.    let aNe
03b0: 77 20 3d 20 5b 5d 3b 0a 20 20 20 20 66 6f 72 20  w = [];.    for 
03c0: 28 6c 65 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (let i = 0; i < 
03d0: 61 41 72 72 61 79 2e 6c 65 6e 67 74 68 3b 20 69  aArray.length; i
03e0: 20 3d 20 69 20 2b 20 31 29 20 7b 0a 20 20 20 20   = i + 1) {.    
03f0: 20 20 20 20 61 4e 65 77 5b 69 5d 20 3d 20 61 41      aNew[i] = aA
0400: 72 72 61 79 5b 69 5d 2e 73 6c 69 63 65 28 30 2c  rray[i].slice(0,
0410: 31 29 2e 74 6f 55 70 70 65 72 43 61 73 65 28 29  1).toUpperCase()
0420: 20 2b 20 61 41 72 72 61 79 5b 69 5d 2e 73 6c 69   + aArray[i].sli
0430: 63 65 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ce(1);.    }.   
0440: 20 72 65 74 75 72 6e 20 61 4e 65 77 3b 0a 7d 0a   return aNew;.}.
0450: 0a 0a 2f 2f 20 64 61 74 61 0a 6c 65 74 20 5f 73  ..// data.let _s
0460: 41 70 70 43 6f 6e 74 65 78 74 20 3d 20 22 22 3b  AppContext = "";
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0490: 20 20 2f 2f 20 77 68 61 74 20 73 6f 66 74 77 61    // what softwa
04a0: 72 65 20 69 73 20 72 75 6e 6e 69 6e 67 0a 6c 65  re is running.le
04b0: 74 20 5f 64 4f 70 74 69 6f 6e 73 20 3d 20 6e 75  t _dOptions = nu
04c0: 6c 6c 3b 0a 6c 65 74 20 5f 64 4f 70 74 69 6f 6e  ll;.let _dOption
04d0: 73 43 6f 6c 6f 72 73 20 3d 20 6e 75 6c 6c 3b 0a  sColors = null;.
04e0: 6c 65 74 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b  let _oSpellCheck
04f0: 65 72 20 3d 20 6e 75 6c 6c 3b 0a 6c 65 74 20 5f  er = null;.let _
0500: 6f 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 6e 75 6c  oTokenizer = nul
0510: 6c 3b 0a 6c 65 74 20 5f 61 49 67 6e 6f 72 65 64  l;.let _aIgnored
0520: 52 75 6c 65 73 20 3d 20 6e 65 77 20 53 65 74 28  Rules = new Set(
0530: 29 3b 0a 0a 0a 66 75 6e 63 74 69 6f 6e 20 65 63  );...function ec
0540: 68 6f 20 28 78 29 20 7b 0a 20 20 20 20 63 6f 6e  ho (x) {.    con
0550: 73 6f 6c 65 2e 6c 6f 67 28 78 29 3b 0a 20 20 20  sole.log(x);.   
0560: 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 7d 0a   return true;.}.
0570: 0a 0a 76 61 72 20 67 63 5f 65 6e 67 69 6e 65 20  ..var gc_engine 
0580: 3d 20 7b 0a 0a 20 20 20 20 2f 2f 2f 2f 20 49 6e  = {..    //// In
0590: 66 6f 72 6d 61 74 69 6f 6e 73 0a 0a 20 20 20 20  formations..    
05a0: 6c 61 6e 67 3a 20 22 24 7b 6c 61 6e 67 7d 22 2c  lang: "${lang}",
05b0: 0a 20 20 20 20 6c 6f 63 61 6c 65 73 3a 20 24 7b  .    locales: ${
05c0: 6c 6f 63 7d 2c 0a 20 20 20 20 70 6b 67 3a 20 22  loc},.    pkg: "
05d0: 24 7b 69 6d 70 6c 6e 61 6d 65 7d 22 2c 0a 20 20  ${implname}",.  
05e0: 20 20 6e 61 6d 65 3a 20 22 24 7b 6e 61 6d 65 7d    name: "${name}
05f0: 22 2c 0a 20 20 20 20 76 65 72 73 69 6f 6e 3a 20  ",.    version: 
0600: 22 24 7b 76 65 72 73 69 6f 6e 7d 22 2c 0a 20 20  "${version}",.  
0610: 20 20 61 75 74 68 6f 72 3a 20 22 24 7b 61 75 74    author: "${aut
0620: 68 6f 72 7d 22 2c 0a 0a 20 20 20 20 2f 2f 2f 2f  hor}",..    ////
0630: 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   Initialization.
0640: 0a 20 20 20 20 6c 6f 61 64 3a 20 66 75 6e 63 74  .    load: funct
0650: 69 6f 6e 20 28 73 43 6f 6e 74 65 78 74 3d 22 4a  ion (sContext="J
0660: 61 76 61 53 63 72 69 70 74 22 2c 20 73 43 6f 6c  avaScript", sCol
0670: 6f 72 54 79 70 65 3d 22 61 52 47 42 22 2c 20 73  orType="aRGB", s
0680: 50 61 74 68 3d 22 22 29 20 7b 0a 20 20 20 20 20  Path="") {.     
0690: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
06a0: 20 20 20 20 20 69 66 28 74 79 70 65 6f 66 28 70       if(typeof(p
06b0: 72 6f 63 65 73 73 29 20 21 3d 3d 20 27 75 6e 64  rocess) !== 'und
06c0: 65 66 69 6e 65 64 27 29 20 7b 0a 20 20 20 20 20  efined') {.     
06d0: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 20 73             var s
06e0: 70 65 6c 6c 63 68 65 63 6b 65 72 20 3d 20 72 65  pellchecker = re
06f0: 71 75 69 72 65 28 22 2e 2e 2f 67 72 61 70 68 73  quire("../graphs
0700: 70 65 6c 6c 2f 73 70 65 6c 6c 63 68 65 63 6b 65  pell/spellchecke
0710: 72 2e 6a 73 22 29 3b 0a 20 20 20 20 20 20 20 20  r.js");.        
0720: 20 20 20 20 20 20 20 20 5f 6f 53 70 65 6c 6c 43          _oSpellC
0730: 68 65 63 6b 65 72 20 3d 20 6e 65 77 20 73 70 65  hecker = new spe
0740: 6c 6c 63 68 65 63 6b 65 72 2e 53 70 65 6c 6c 43  llchecker.SpellC
0750: 68 65 63 6b 65 72 28 22 24 7b 6c 61 6e 67 7d 22  hecker("${lang}"
0760: 2c 20 22 22 2c 20 22 24 7b 64 69 63 5f 6d 61 69  , "", "${dic_mai
0770: 6e 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 7d 22 2c  n_filename_js}",
0780: 20 22 24 7b 64 69 63 5f 63 6f 6d 6d 75 6e 69 74   "${dic_communit
0790: 79 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 7d 22 2c  y_filename_js}",
07a0: 20 22 24 7b 64 69 63 5f 70 65 72 73 6f 6e 61 6c   "${dic_personal
07b0: 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 7d 22 29 3b  _filename_js}");
07c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
07d0: 6c 73 65 20 69 66 20 28 74 79 70 65 6f 66 28 72  lse if (typeof(r
07e0: 65 71 75 69 72 65 29 20 21 3d 3d 20 27 75 6e 64  equire) !== 'und
07f0: 65 66 69 6e 65 64 27 29 20 7b 0a 20 20 20 20 20  efined') {.     
0800: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 20 73             var s
0810: 70 65 6c 6c 63 68 65 63 6b 65 72 20 3d 20 72 65  pellchecker = re
0820: 71 75 69 72 65 28 22 72 65 73 6f 75 72 63 65 3a  quire("resource:
0830: 2f 2f 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67 72  //grammalecte/gr
0840: 61 70 68 73 70 65 6c 6c 2f 73 70 65 6c 6c 63 68  aphspell/spellch
0850: 65 63 6b 65 72 2e 6a 73 22 29 3b 0a 20 20 20 20  ecker.js");.    
0860: 20 20 20 20 20 20 20 20 20 20 20 20 5f 6f 53 70              _oSp
0870: 65 6c 6c 43 68 65 63 6b 65 72 20 3d 20 6e 65 77  ellChecker = new
0880: 20 73 70 65 6c 6c 63 68 65 63 6b 65 72 2e 53 70   spellchecker.Sp
0890: 65 6c 6c 43 68 65 63 6b 65 72 28 22 24 7b 6c 61  ellChecker("${la
08a0: 6e 67 7d 22 2c 20 22 22 2c 20 22 24 7b 64 69 63  ng}", "", "${dic
08b0: 5f 6d 61 69 6e 5f 66 69 6c 65 6e 61 6d 65 5f 6a  _main_filename_j
08c0: 73 7d 22 2c 20 22 24 7b 64 69 63 5f 63 6f 6d 6d  s}", "${dic_comm
08d0: 75 6e 69 74 79 5f 66 69 6c 65 6e 61 6d 65 5f 6a  unity_filename_j
08e0: 73 7d 22 2c 20 22 24 7b 64 69 63 5f 70 65 72 73  s}", "${dic_pers
08f0: 6f 6e 61 6c 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73  onal_filename_js
0900: 7d 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  }");.           
0910: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
0920: 20 20 20 20 20 20 20 20 20 20 5f 6f 53 70 65 6c            _oSpel
0930: 6c 43 68 65 63 6b 65 72 20 3d 20 6e 65 77 20 53  lChecker = new S
0940: 70 65 6c 6c 43 68 65 63 6b 65 72 28 22 24 7b 6c  pellChecker("${l
0950: 61 6e 67 7d 22 2c 20 73 50 61 74 68 2c 20 22 24  ang}", sPath, "$
0960: 7b 64 69 63 5f 6d 61 69 6e 5f 66 69 6c 65 6e 61  {dic_main_filena
0970: 6d 65 5f 6a 73 7d 22 2c 20 22 24 7b 64 69 63 5f  me_js}", "${dic_
0980: 63 6f 6d 6d 75 6e 69 74 79 5f 66 69 6c 65 6e 61  community_filena
0990: 6d 65 5f 6a 73 7d 22 2c 20 22 24 7b 64 69 63 5f  me_js}", "${dic_
09a0: 70 65 72 73 6f 6e 61 6c 5f 66 69 6c 65 6e 61 6d  personal_filenam
09b0: 65 5f 6a 73 7d 22 29 3b 0a 20 20 20 20 20 20 20  e_js}");.       
09c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
09d0: 20 20 20 5f 73 41 70 70 43 6f 6e 74 65 78 74 20     _sAppContext 
09e0: 3d 20 73 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  = sContext;.    
09f0: 20 20 20 20 20 20 20 20 5f 64 4f 70 74 69 6f 6e          _dOption
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 28 73 43 6f 6e 74 65  etOptions(sConte
0a20: 78 74 29 2e 67 6c 5f 73 68 61 6c 6c 6f 77 43 6f  xt).gl_shallowCo
0a30: 70 79 28 29 3b 20 20 20 20 20 2f 2f 20 64 75 70  py();     // dup
0a40: 6c 69 63 61 74 69 6f 6e 20 6e 65 63 65 73 73 61  lication necessa
0a50: 72 79 2c 20 74 6f 20 62 65 20 61 62 6c 65 20 74  ry, to be able t
0a60: 6f 20 72 65 73 65 74 20 74 6f 20 64 65 66 61 75  o reset to defau
0a70: 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 5f  lt.            _
0a80: 64 4f 70 74 69 6f 6e 73 43 6f 6c 6f 72 73 20 3d  dOptionsColors =
0a90: 20 67 63 5f 6f 70 74 69 6f 6e 73 2e 67 65 74 4f   gc_options.getO
0aa0: 70 74 69 6f 6e 73 43 6f 6c 6f 72 73 28 73 43 6f  ptionsColors(sCo
0ab0: 6e 74 65 78 74 2c 20 73 43 6f 6c 6f 72 54 79 70  ntext, sColorTyp
0ac0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
0ad0: 5f 6f 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 5f 6f  _oTokenizer = _o
0ae0: 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74  SpellChecker.get
0af0: 54 6f 6b 65 6e 69 7a 65 72 28 29 3b 0a 20 20 20  Tokenizer();.   
0b00: 20 20 20 20 20 20 20 20 20 5f 6f 53 70 65 6c 6c           _oSpell
0b10: 43 68 65 63 6b 65 72 2e 61 63 74 69 76 61 74 65  Checker.activate
0b20: 53 74 6f 72 61 67 65 28 29 3b 0a 20 20 20 20 20  Storage();.     
0b30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 74     }.        cat
0b40: 63 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20  ch (e) {.       
0b50: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 65 72 72       console.err
0b60: 6f 72 28 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  or(e);.        }
0b70: 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 67 65 74  .    },..    get
0b80: 53 70 65 6c 6c 43 68 65 63 6b 65 72 3a 20 66 75  SpellChecker: fu
0b90: 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20  nction () {.    
0ba0: 20 20 20 20 72 65 74 75 72 6e 20 5f 6f 53 70 65      return _oSpe
0bb0: 6c 6c 43 68 65 63 6b 65 72 3b 0a 20 20 20 20 7d  llChecker;.    }
0bc0: 2c 0a 0a 20 20 20 20 2f 2f 2f 2f 20 52 75 6c 65  ,..    //// Rule
0bd0: 73 0a 0a 20 20 20 20 67 65 74 52 75 6c 65 73 3a  s..    getRules:
0be0: 20 66 75 6e 63 74 69 6f 6e 20 28 62 50 61 72 61   function (bPara
0bf0: 67 72 61 70 68 29 20 7b 0a 20 20 20 20 20 20 20  graph) {.       
0c00: 20 69 66 20 28 21 62 50 61 72 61 67 72 61 70 68   if (!bParagraph
0c10: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0c20: 72 65 74 75 72 6e 20 67 63 5f 72 75 6c 65 73 2e  return gc_rules.
0c30: 6c 53 65 6e 74 65 6e 63 65 52 75 6c 65 73 3b 0a  lSentenceRules;.
0c40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0c50: 20 20 72 65 74 75 72 6e 20 67 63 5f 72 75 6c 65    return gc_rule
0c60: 73 2e 6c 50 61 72 61 67 72 61 70 68 52 75 6c 65  s.lParagraphRule
0c70: 73 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 69  s;.    },..    i
0c80: 67 6e 6f 72 65 52 75 6c 65 3a 20 66 75 6e 63 74  gnoreRule: funct
0c90: 69 6f 6e 20 28 73 52 75 6c 65 49 64 29 20 7b 0a  ion (sRuleId) {.
0ca0: 20 20 20 20 20 20 20 20 5f 61 49 67 6e 6f 72 65          _aIgnore
0cb0: 64 52 75 6c 65 73 2e 61 64 64 28 73 52 75 6c 65  dRules.add(sRule
0cc0: 49 64 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20  Id);.    },..   
0cd0: 20 72 65 73 65 74 49 67 6e 6f 72 65 52 75 6c 65   resetIgnoreRule
0ce0: 73 3a 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b  s: function () {
0cf0: 0a 20 20 20 20 20 20 20 20 5f 61 49 67 6e 6f 72  .        _aIgnor
0d00: 65 64 52 75 6c 65 73 2e 63 6c 65 61 72 28 29 3b  edRules.clear();
0d10: 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 72 65 61  .    },..    rea
0d20: 63 74 69 76 61 74 65 52 75 6c 65 3a 20 66 75 6e  ctivateRule: fun
0d30: 63 74 69 6f 6e 20 28 73 52 75 6c 65 49 64 29 20  ction (sRuleId) 
0d40: 7b 0a 20 20 20 20 20 20 20 20 5f 61 49 67 6e 6f  {.        _aIgno
0d50: 72 65 64 52 75 6c 65 73 2e 64 65 6c 65 74 65 28  redRules.delete(
0d60: 73 52 75 6c 65 49 64 29 3b 0a 20 20 20 20 7d 2c  sRuleId);.    },
0d70: 0a 0a 20 20 20 20 6c 69 73 74 52 75 6c 65 73 3a  ..    listRules:
0d80: 20 66 75 6e 63 74 69 6f 6e 2a 20 28 73 46 69 6c   function* (sFil
0d90: 74 65 72 3d 6e 75 6c 6c 29 20 7b 0a 20 20 20 20  ter=null) {.    
0da0: 20 20 20 20 2f 2f 20 67 65 6e 65 72 61 74 6f 72      // generator
0db0: 3a 20 72 65 74 75 72 6e 73 20 74 75 70 6c 65 20  : returns tuple 
0dc0: 28 73 4f 70 74 69 6f 6e 2c 20 73 4c 69 6e 65 49  (sOption, sLineI
0dd0: 64 2c 20 73 52 75 6c 65 49 64 29 0a 20 20 20 20  d, sRuleId).    
0de0: 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20      try {.      
0df0: 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b        for (let [
0e00: 73 4f 70 74 69 6f 6e 2c 20 6c 52 75 6c 65 47 72  sOption, lRuleGr
0e10: 6f 75 70 5d 20 6f 66 20 74 68 69 73 2e 67 65 74  oup] of this.get
0e20: 52 75 6c 65 73 28 74 72 75 65 29 29 20 7b 0a 20  Rules(true)) {. 
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
0e40: 6f 72 20 28 6c 65 74 20 5b 2c 2c 20 73 4c 69 6e  or (let [,, sLin
0e50: 65 49 64 2c 20 73 52 75 6c 65 49 64 2c 2c 5d 20  eId, sRuleId,,] 
0e60: 6f 66 20 6c 52 75 6c 65 47 72 6f 75 70 29 20 7b  of lRuleGroup) {
0e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0e80: 20 20 20 20 20 69 66 20 28 21 73 46 69 6c 74 65       if (!sFilte
0e90: 72 20 7c 7c 20 73 52 75 6c 65 49 64 2e 74 65 73  r || sRuleId.tes
0ea0: 74 28 73 46 69 6c 74 65 72 29 29 20 7b 0a 20 20  t(sFilter)) {.  
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ec0: 20 20 20 20 20 20 79 69 65 6c 64 20 5b 73 4f 70        yield [sOp
0ed0: 74 69 6f 6e 2c 20 73 4c 69 6e 65 49 64 2c 20 73  tion, sLineId, s
0ee0: 52 75 6c 65 49 64 5d 3b 0a 20 20 20 20 20 20 20  RuleId];.       
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
0f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
0f20: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
0f30: 6c 65 74 20 5b 73 4f 70 74 69 6f 6e 2c 20 6c 52  let [sOption, lR
0f40: 75 6c 65 47 72 6f 75 70 5d 20 6f 66 20 74 68 69  uleGroup] of thi
0f50: 73 2e 67 65 74 52 75 6c 65 73 28 66 61 6c 73 65  s.getRules(false
0f60: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
0f70: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 2c       for (let [,
0f80: 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65  , sLineId, sRule
0f90: 49 64 2c 2c 5d 20 6f 66 20 6c 52 75 6c 65 47 72  Id,,] of lRuleGr
0fa0: 6f 75 70 29 20 7b 0a 20 20 20 20 20 20 20 20 20  oup) {.         
0fb0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
0fc0: 73 46 69 6c 74 65 72 20 7c 7c 20 73 52 75 6c 65  sFilter || sRule
0fd0: 49 64 2e 74 65 73 74 28 73 46 69 6c 74 65 72 29  Id.test(sFilter)
0fe0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c              yiel
1000: 64 20 5b 73 4f 70 74 69 6f 6e 2c 20 73 4c 69 6e  d [sOption, sLin
1010: 65 49 64 2c 20 73 52 75 6c 65 49 64 5d 3b 0a 20  eId, sRuleId];. 
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1050: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1060: 20 20 20 20 20 20 20 63 61 74 63 68 20 28 65 29         catch (e)
1070: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   {.            c
1080: 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72 28 65 29 3b  onsole.error(e);
1090: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
10a0: 2c 0a 0a 20 20 20 20 2f 2f 2f 2f 20 4f 70 74 69  ,..    //// Opti
10b0: 6f 6e 73 0a 0a 20 20 20 20 73 65 74 4f 70 74 69  ons..    setOpti
10c0: 6f 6e 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73 4f  on: function (sO
10d0: 70 74 2c 20 62 56 61 6c 29 20 7b 0a 20 20 20 20  pt, bVal) {.    
10e0: 20 20 20 20 69 66 20 28 5f 64 4f 70 74 69 6f 6e      if (_dOption
10f0: 73 2e 68 61 73 28 73 4f 70 74 29 29 20 7b 0a 20  s.has(sOpt)) {. 
1100: 20 20 20 20 20 20 20 20 20 20 20 5f 64 4f 70 74             _dOpt
1110: 69 6f 6e 73 2e 73 65 74 28 73 4f 70 74 2c 20 62  ions.set(sOpt, b
1120: 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Val);.        }.
1130: 20 20 20 20 7d 2c 0a 0a 20 20 20 20 73 65 74 4f      },..    setO
1140: 70 74 69 6f 6e 73 3a 20 66 75 6e 63 74 69 6f 6e  ptions: function
1150: 20 28 64 4f 70 74 29 20 7b 0a 20 20 20 20 20 20   (dOpt) {.      
1160: 20 20 5f 64 4f 70 74 69 6f 6e 73 2e 67 6c 5f 75    _dOptions.gl_u
1170: 70 64 61 74 65 4f 6e 6c 79 45 78 69 73 74 69 6e  pdateOnlyExistin
1180: 67 4b 65 79 73 28 64 4f 70 74 29 3b 0a 20 20 20  gKeys(dOpt);.   
1190: 20 7d 2c 0a 0a 20 20 20 20 67 65 74 4f 70 74 69   },..    getOpti
11a0: 6f 6e 73 3a 20 66 75 6e 63 74 69 6f 6e 20 28 29  ons: function ()
11b0: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
11c0: 6e 20 5f 64 4f 70 74 69 6f 6e 73 3b 0a 20 20 20  n _dOptions;.   
11d0: 20 7d 2c 0a 0a 20 20 20 20 67 65 74 44 65 66 61   },..    getDefa
11e0: 75 6c 74 4f 70 74 69 6f 6e 73 3a 20 66 75 6e 63  ultOptions: func
11f0: 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20  tion () {.      
1200: 20 20 72 65 74 75 72 6e 20 67 63 5f 6f 70 74 69    return gc_opti
1210: 6f 6e 73 2e 67 65 74 4f 70 74 69 6f 6e 73 28 5f  ons.getOptions(_
1220: 73 41 70 70 43 6f 6e 74 65 78 74 29 2e 67 6c 5f  sAppContext).gl_
1230: 73 68 61 6c 6c 6f 77 43 6f 70 79 28 29 3b 0a 20  shallowCopy();. 
1240: 20 20 20 7d 2c 0a 0a 20 20 20 20 72 65 73 65 74     },..    reset
1250: 4f 70 74 69 6f 6e 73 3a 20 66 75 6e 63 74 69 6f  Options: functio
1260: 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20 5f  n () {.        _
1270: 64 4f 70 74 69 6f 6e 73 20 3d 20 67 63 5f 6f 70  dOptions = gc_op
1280: 74 69 6f 6e 73 2e 67 65 74 4f 70 74 69 6f 6e 73  tions.getOptions
1290: 28 5f 73 41 70 70 43 6f 6e 74 65 78 74 29 2e 67  (_sAppContext).g
12a0: 6c 5f 73 68 61 6c 6c 6f 77 43 6f 70 79 28 29 3b  l_shallowCopy();
12b0: 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 2f 2f 2f  .    },..    ///
12c0: 2f 20 50 61 72 73 69 6e 67 0a 0a 20 20 20 20 70  / Parsing..    p
12d0: 61 72 73 65 3a 20 66 75 6e 63 74 69 6f 6e 20 28  arse: function (
12e0: 73 54 65 78 74 2c 20 73 43 6f 75 6e 74 72 79 3d  sText, sCountry=
12f0: 22 24 7b 63 6f 75 6e 74 72 79 5f 64 65 66 61 75  "${country_defau
1300: 6c 74 7d 22 2c 20 62 44 65 62 75 67 3d 66 61 6c  lt}", bDebug=fal
1310: 73 65 2c 20 64 4f 70 74 69 6f 6e 73 3d 6e 75 6c  se, dOptions=nul
1320: 6c 2c 20 62 43 6f 6e 74 65 78 74 3d 66 61 6c 73  l, bContext=fals
1330: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74  e) {.        let
1340: 20 6f 54 65 78 74 20 3d 20 6e 65 77 20 54 65 78   oText = new Tex
1350: 74 50 61 72 73 65 72 28 73 54 65 78 74 29 3b 0a  tParser(sText);.
1360: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6f          return o
1370: 54 65 78 74 2e 70 61 72 73 65 28 73 43 6f 75 6e  Text.parse(sCoun
1380: 74 72 79 2c 20 62 44 65 62 75 67 2c 20 64 4f 70  try, bDebug, dOp
1390: 74 69 6f 6e 73 2c 20 62 43 6f 6e 74 65 78 74 29  tions, bContext)
13a0: 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 5f 7a  ;.    },..    _z
13b0: 45 6e 64 4f 66 53 65 6e 74 65 6e 63 65 3a 20 6e  EndOfSentence: n
13c0: 65 77 20 52 65 67 45 78 70 20 28 27 28 5b 2e 3f  ew RegExp ('([.?
13d0: 21 3a 3b e2 80 a6 5d 5b 20 c2 a0 e2 80 af 2e 3f  !:;...][ ......?
13e0: 21 e2 80 a6 c2 bb c2 ab e2 80 9c e2 80 9d 22 e2  !.............".
13f0: 80 98 e2 80 99 29 e2 80 93 e2 80 94 5d 2b 28 3f  .....)......]+(?
1400: 3d 5b 41 2d 5a c3 89 c3 88 c3 8e c3 94 5d 29 7c  =[A-Z........])|
1410: 2e 24 29 27 2c 20 22 67 22 29 2c 0a 20 20 20 20  .$)', "g"),.    
1420: 5f 7a 42 65 67 69 6e 4f 66 50 61 72 61 67 72 61  _zBeginOfParagra
1430: 70 68 3a 20 6e 65 77 20 52 65 67 45 78 70 20 28  ph: new RegExp (
1440: 22 5e 5b 2d 20 c2 a0 e2 80 93 e2 80 94 2e 2c 3b  "^[- .........,;
1450: 3f 21 e2 80 a6 5d 2a 22 2c 20 22 69 67 22 29 2c  ?!...]*", "ig"),
1460: 0a 20 20 20 20 5f 7a 45 6e 64 4f 66 50 61 72 61  .    _zEndOfPara
1470: 67 72 61 70 68 3a 20 6e 65 77 20 52 65 67 45 78  graph: new RegEx
1480: 70 20 28 22 5b 2d 20 c2 a0 2e 2c 3b 3f 21 e2 80  p ("[- ...,;?!..
1490: a6 e2 80 93 e2 80 94 5d 2a 24 22 2c 20 22 69 67  .......]*$", "ig
14a0: 22 29 2c 0a 0a 20 20 20 20 67 65 74 53 65 6e 74  "),..    getSent
14b0: 65 6e 63 65 42 6f 75 6e 64 61 72 69 65 73 3a 20  enceBoundaries: 
14c0: 66 75 6e 63 74 69 6f 6e 2a 20 28 73 54 65 78 74  function* (sText
14d0: 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ) {.        let 
14e0: 6d 42 65 67 69 6e 4f 66 53 65 6e 74 65 6e 63 65  mBeginOfSentence
14f0: 20 3d 20 74 68 69 73 2e 5f 7a 42 65 67 69 6e 4f   = this._zBeginO
1500: 66 50 61 72 61 67 72 61 70 68 2e 65 78 65 63 28  fParagraph.exec(
1510: 73 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  sText);.        
1520: 6c 65 74 20 69 53 74 61 72 74 20 3d 20 74 68 69  let iStart = thi
1530: 73 2e 5f 7a 42 65 67 69 6e 4f 66 50 61 72 61 67  s._zBeginOfParag
1540: 72 61 70 68 2e 6c 61 73 74 49 6e 64 65 78 3b 0a  raph.lastIndex;.
1550: 20 20 20 20 20 20 20 20 6c 65 74 20 6d 3b 0a 20          let m;. 
1560: 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 28 6d         while ((m
1570: 20 3d 20 74 68 69 73 2e 5f 7a 45 6e 64 4f 66 53   = this._zEndOfS
1580: 65 6e 74 65 6e 63 65 2e 65 78 65 63 28 73 54 65  entence.exec(sTe
1590: 78 74 29 29 20 21 3d 3d 20 6e 75 6c 6c 29 20 7b  xt)) !== null) {
15a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65  .            yie
15b0: 6c 64 20 5b 69 53 74 61 72 74 2c 20 74 68 69 73  ld [iStart, this
15c0: 2e 5f 7a 45 6e 64 4f 66 53 65 6e 74 65 6e 63 65  ._zEndOfSentence
15d0: 2e 6c 61 73 74 49 6e 64 65 78 5d 3b 0a 20 20 20  .lastIndex];.   
15e0: 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20           iStart 
15f0: 3d 20 74 68 69 73 2e 5f 7a 45 6e 64 4f 66 53 65  = this._zEndOfSe
1600: 6e 74 65 6e 63 65 2e 6c 61 73 74 49 6e 64 65 78  ntence.lastIndex
1610: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1620: 7d 0a 7d 3b 0a 0a 0a 63 6c 61 73 73 20 54 65 78  }.};...class Tex
1630: 74 50 61 72 73 65 72 20 7b 0a 0a 20 20 20 20 63  tParser {..    c
1640: 6f 6e 73 74 72 75 63 74 6f 72 20 28 73 54 65 78  onstructor (sTex
1650: 74 29 20 7b 0a 20 20 20 20 20 20 20 20 74 68 69  t) {.        thi
1660: 73 2e 73 54 65 78 74 20 3d 20 73 54 65 78 74 3b  s.sText = sText;
1670: 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 73 54  .        this.sT
1680: 65 78 74 30 20 3d 20 73 54 65 78 74 3b 0a 20 20  ext0 = sText;.  
1690: 20 20 20 20 20 20 74 68 69 73 2e 73 53 65 6e 74        this.sSent
16a0: 65 6e 63 65 20 3d 20 22 22 3b 0a 20 20 20 20 20  ence = "";.     
16b0: 20 20 20 74 68 69 73 2e 73 53 65 6e 74 65 6e 63     this.sSentenc
16c0: 65 30 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20  e0 = "";.       
16d0: 20 74 68 69 73 2e 6e 4f 66 66 73 65 74 57 69 74   this.nOffsetWit
16e0: 68 69 6e 50 61 72 61 67 72 61 70 68 20 3d 20 30  hinParagraph = 0
16f0: 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 6c  ;.        this.l
1700: 54 6f 6b 65 6e 20 3d 20 5b 5d 3b 0a 20 20 20 20  Token = [];.    
1710: 20 20 20 20 74 68 69 73 2e 64 54 6f 6b 65 6e 50      this.dTokenP
1720: 6f 73 20 3d 20 6e 65 77 20 4d 61 70 28 29 3b 0a  os = new Map();.
1730: 20 20 20 20 20 20 20 20 74 68 69 73 2e 64 54 61          this.dTa
1740: 67 73 20 3d 20 6e 65 77 20 4d 61 70 28 29 3b 0a  gs = new Map();.
1750: 20 20 20 20 20 20 20 20 74 68 69 73 2e 64 45 72          this.dEr
1760: 72 6f 72 20 3d 20 6e 65 77 20 4d 61 70 28 29 3b  ror = new Map();
1770: 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 64 45  .        this.dE
1780: 72 72 6f 72 50 72 69 6f 72 69 74 79 20 3d 20 6e  rrorPriority = n
1790: 65 77 20 4d 61 70 28 29 3b 20 20 2f 2f 20 4b 65  ew Map();  // Ke
17a0: 79 20 3d 20 70 6f 73 69 74 69 6f 6e 3b 20 76 61  y = position; va
17b0: 6c 75 65 20 3d 20 70 72 69 6f 72 69 74 79 0a 20  lue = priority. 
17c0: 20 20 20 7d 0a 0a 20 20 20 20 61 73 53 74 72 69     }..    asStri
17d0: 6e 67 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20  ng () {.        
17e0: 6c 65 74 20 73 20 3d 20 22 3d 3d 3d 3d 3d 20 54  let s = "===== T
17f0: 45 58 54 20 3d 3d 3d 3d 3d 5c 6e 22 3b 0a 20 20  EXT =====\n";.  
1800: 20 20 20 20 20 20 73 20 2b 3d 20 22 73 65 6e 74        s += "sent
1810: 65 6e 63 65 3a 20 22 20 2b 20 74 68 69 73 2e 73  ence: " + this.s
1820: 53 65 6e 74 65 6e 63 65 30 20 2b 20 22 5c 6e 22  Sentence0 + "\n"
1830: 3b 0a 20 20 20 20 20 20 20 20 73 20 2b 3d 20 22  ;.        s += "
1840: 6e 6f 77 3a 20 20 20 20 20 20 22 20 2b 20 74 68  now:      " + th
1850: 69 73 2e 73 53 65 6e 74 65 6e 63 65 20 20 2b 20  is.sSentence  + 
1860: 22 5c 6e 22 3b 0a 20 20 20 20 20 20 20 20 66 6f  "\n";.        fo
1870: 72 20 28 6c 65 74 20 64 54 6f 6b 65 6e 20 6f 66  r (let dToken of
1880: 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 29 20 7b 0a   this.lToken) {.
1890: 20 20 20 20 20 20 20 20 20 20 20 20 73 20 2b 3d              s +=
18a0: 20 60 23 24 7b 64 54 6f 6b 65 6e 5b 22 69 22 5d   `#${dToken["i"]
18b0: 7d 5c 74 24 7b 64 54 6f 6b 65 6e 5b 22 6e 53 74  }\t${dToken["nSt
18c0: 61 72 74 22 5d 7d 3a 24 7b 64 54 6f 6b 65 6e 5b  art"]}:${dToken[
18d0: 22 6e 45 6e 64 22 5d 7d 5c 74 24 7b 64 54 6f 6b  "nEnd"]}\t${dTok
18e0: 65 6e 5b 22 73 56 61 6c 75 65 22 5d 7d 5c 74 24  en["sValue"]}\t$
18f0: 7b 64 54 6f 6b 65 6e 5b 22 73 54 79 70 65 22 5d  {dToken["sType"]
1900: 7d 60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  }`;.            
1910: 69 66 20 28 64 54 6f 6b 65 6e 2e 68 61 73 4f 77  if (dToken.hasOw
1920: 6e 50 72 6f 70 65 72 74 79 28 22 6c 4d 6f 72 70  nProperty("lMorp
1930: 68 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  h")) {.         
1940: 20 20 20 20 20 20 20 73 20 2b 3d 20 22 5c 74 22         s += "\t"
1950: 20 2b 20 64 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70   + dToken["lMorp
1960: 68 22 5d 2e 74 6f 53 74 72 69 6e 67 28 29 3b 0a  h"].toString();.
1970: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1980: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64 54            if (dT
1990: 6f 6b 65 6e 2e 68 61 73 4f 77 6e 50 72 6f 70 65  oken.hasOwnPrope
19a0: 72 74 79 28 22 61 54 61 67 73 22 29 29 20 7b 0a  rty("aTags")) {.
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 73 20 2b 3d 20 22 5c 74 22 20 2b 20 64 54 6f 6b  s += "\t" + dTok
19d0: 65 6e 5b 22 61 54 61 67 73 22 5d 2e 74 6f 53 74  en["aTags"].toSt
19e0: 72 69 6e 67 28 29 3b 0a 20 20 20 20 20 20 20 20  ring();.        
19f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1a00: 20 20 73 20 2b 3d 20 22 5c 6e 22 3b 0a 20 20 20    s += "\n";.   
1a10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1a20: 65 74 75 72 6e 20 73 3b 0a 20 20 20 20 7d 0a 0a  eturn s;.    }..
1a30: 20 20 20 20 70 61 72 73 65 20 28 73 43 6f 75 6e      parse (sCoun
1a40: 74 72 79 3d 22 24 7b 63 6f 75 6e 74 72 79 5f 64  try="${country_d
1a50: 65 66 61 75 6c 74 7d 22 2c 20 62 44 65 62 75 67  efault}", bDebug
1a60: 3d 66 61 6c 73 65 2c 20 64 4f 70 74 69 6f 6e 73  =false, dOptions
1a70: 3d 6e 75 6c 6c 2c 20 62 43 6f 6e 74 65 78 74 3d  =null, bContext=
1a80: 66 61 6c 73 65 29 20 7b 0a 20 20 20 20 20 20 20  false) {.       
1a90: 20 2f 2f 20 61 6e 61 6c 79 73 65 73 20 74 68 65   // analyses the
1aa0: 20 70 61 72 61 67 72 61 70 68 20 73 54 65 78 74   paragraph sText
1ab0: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 6c 69 73   and returns lis
1ac0: 74 20 6f 66 20 65 72 72 6f 72 73 0a 20 20 20 20  t of errors.    
1ad0: 20 20 20 20 6c 65 74 20 64 4f 70 74 20 3d 20 64      let dOpt = d
1ae0: 4f 70 74 69 6f 6e 73 20 7c 7c 20 5f 64 4f 70 74  Options || _dOpt
1af0: 69 6f 6e 73 3b 0a 20 20 20 20 20 20 20 20 6c 65  ions;.        le
1b00: 74 20 62 53 68 6f 77 52 75 6c 65 49 64 20 3d 20  t bShowRuleId = 
1b10: 6f 70 74 69 6f 6e 28 27 69 64 72 75 6c 65 27 29  option('idrule')
1b20: 3b 0a 20 20 20 20 20 20 20 20 2f 2f 20 70 61 72  ;.        // par
1b30: 73 65 20 70 61 72 61 67 72 61 70 68 0a 20 20 20  se paragraph.   
1b40: 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20       try {.     
1b50: 20 20 20 20 20 20 20 74 68 69 73 2e 70 61 72 73         this.pars
1b60: 65 54 65 78 74 28 74 68 69 73 2e 73 54 65 78 74  eText(this.sText
1b70: 2c 20 74 68 69 73 2e 73 54 65 78 74 30 2c 20 74  , this.sText0, t
1b80: 72 75 65 2c 20 30 2c 20 73 43 6f 75 6e 74 72 79  rue, 0, sCountry
1b90: 2c 20 64 4f 70 74 2c 20 62 53 68 6f 77 52 75 6c  , dOpt, bShowRul
1ba0: 65 49 64 2c 20 62 44 65 62 75 67 2c 20 62 43 6f  eId, bDebug, bCo
1bb0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
1bc0: 7d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  }.        catch 
1bd0: 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  (e) {.          
1be0: 20 20 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72 28    console.error(
1bf0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  e);.        }.. 
1c00: 20 20 20 20 20 20 20 2f 2f 20 63 6c 65 61 6e 75         // cleanu
1c10: 70 0a 20 20 20 20 20 20 20 20 69 66 20 28 74 68  p.        if (th
1c20: 69 73 2e 73 54 65 78 74 2e 69 6e 63 6c 75 64 65  is.sText.include
1c30: 73 28 22 c2 a0 22 29 29 20 7b 0a 20 20 20 20 20  s("..")) {.     
1c40: 20 20 20 20 20 20 20 74 68 69 73 2e 73 54 65 78         this.sTex
1c50: 74 20 3d 20 74 68 69 73 2e 73 54 65 78 74 2e 72  t = this.sText.r
1c60: 65 70 6c 61 63 65 28 2f c2 a0 2f 67 2c 20 27 20  eplace(/../g, ' 
1c70: 27 29 3b 20 2f 2f 20 6e 62 73 70 0a 20 20 20 20  '); // nbsp.    
1c80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1c90: 20 28 74 68 69 73 2e 73 54 65 78 74 2e 69 6e 63   (this.sText.inc
1ca0: 6c 75 64 65 73 28 22 e2 80 af 22 29 29 20 7b 0a  ludes("...")) {.
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
1cc0: 2e 73 54 65 78 74 20 3d 20 74 68 69 73 2e 73 54  .sText = this.sT
1cd0: 65 78 74 2e 72 65 70 6c 61 63 65 28 2f e2 80 af  ext.replace(/...
1ce0: 2f 67 2c 20 27 20 27 29 3b 20 2f 2f 20 73 6e 62  /g, ' '); // snb
1cf0: 73 70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  sp.        }.   
1d00: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 73 54       if (this.sT
1d10: 65 78 74 2e 69 6e 63 6c 75 64 65 73 28 22 27 22  ext.includes("'"
1d20: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
1d30: 20 74 68 69 73 2e 73 54 65 78 74 20 3d 20 74 68   this.sText = th
1d40: 69 73 2e 73 54 65 78 74 2e 72 65 70 6c 61 63 65  is.sText.replace
1d50: 28 2f 27 2f 67 2c 20 22 e2 80 99 22 29 3b 0a 20  (/'/g, "...");. 
1d60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d70: 20 69 66 20 28 74 68 69 73 2e 73 54 65 78 74 2e   if (this.sText.
1d80: 69 6e 63 6c 75 64 65 73 28 22 e2 80 91 22 29 29  includes("..."))
1d90: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   {.            t
1da0: 68 69 73 2e 73 54 65 78 74 20 3d 20 74 68 69 73  his.sText = this
1db0: 2e 73 54 65 78 74 2e 72 65 70 6c 61 63 65 28 2f  .sText.replace(/
1dc0: e2 80 91 2f 67 2c 20 22 2d 22 29 3b 20 2f 2f 20  .../g, "-"); // 
1dd0: 6e 6f 62 72 65 61 6b 64 61 73 68 0a 20 20 20 20  nobreakdash.    
1de0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1df0: 20 28 74 68 69 73 2e 73 54 65 78 74 2e 69 6e 63   (this.sText.inc
1e00: 6c 75 64 65 73 28 22 40 40 22 29 29 20 7b 0a 20  ludes("@@")) {. 
1e10: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
1e20: 73 54 65 78 74 20 3d 20 74 68 69 73 2e 73 54 65  sText = this.sTe
1e30: 78 74 2e 72 65 70 6c 61 63 65 28 2f 40 40 2b 2f  xt.replace(/@@+/
1e40: 67 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20  g, "");.        
1e50: 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 70 61  }..        // pa
1e60: 72 73 65 20 73 65 6e 74 65 6e 63 65 0a 20 20 20  rse sentence.   
1e70: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 69       for (let [i
1e80: 53 74 61 72 74 2c 20 69 45 6e 64 5d 20 6f 66 20  Start, iEnd] of 
1e90: 67 63 5f 65 6e 67 69 6e 65 2e 67 65 74 53 65 6e  gc_engine.getSen
1ea0: 74 65 6e 63 65 42 6f 75 6e 64 61 72 69 65 73 28  tenceBoundaries(
1eb0: 74 68 69 73 2e 73 54 65 78 74 29 29 20 7b 0a 20  this.sText)) {. 
1ec0: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 20 7b             try {
1ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ee0: 20 74 68 69 73 2e 73 53 65 6e 74 65 6e 63 65 20   this.sSentence 
1ef0: 3d 20 74 68 69 73 2e 73 54 65 78 74 2e 73 6c 69  = this.sText.sli
1f00: 63 65 28 69 53 74 61 72 74 2c 20 69 45 6e 64 29  ce(iStart, iEnd)
1f10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1f20: 20 20 74 68 69 73 2e 73 53 65 6e 74 65 6e 63 65    this.sSentence
1f30: 30 20 3d 20 74 68 69 73 2e 73 54 65 78 74 30 2e  0 = this.sText0.
1f40: 73 6c 69 63 65 28 69 53 74 61 72 74 2c 20 69 45  slice(iStart, iE
1f50: 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nd);.           
1f60: 20 20 20 20 20 74 68 69 73 2e 6e 4f 66 66 73 65       this.nOffse
1f70: 74 57 69 74 68 69 6e 50 61 72 61 67 72 61 70 68  tWithinParagraph
1f80: 20 3d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20   = iStart;.     
1f90: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
1fa0: 6c 54 6f 6b 65 6e 20 3d 20 41 72 72 61 79 2e 66  lToken = Array.f
1fb0: 72 6f 6d 28 5f 6f 54 6f 6b 65 6e 69 7a 65 72 2e  rom(_oTokenizer.
1fc0: 67 65 6e 54 6f 6b 65 6e 73 28 74 68 69 73 2e 73  genTokens(this.s
1fd0: 53 65 6e 74 65 6e 63 65 2c 20 74 72 75 65 29 29  Sentence, true))
1fe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ff0: 20 20 74 68 69 73 2e 64 54 6f 6b 65 6e 50 6f 73    this.dTokenPos
2000: 2e 63 6c 65 61 72 28 29 3b 0a 20 20 20 20 20 20  .clear();.      
2010: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c            for (l
2020: 65 74 20 64 54 6f 6b 65 6e 20 6f 66 20 74 68 69  et dToken of thi
2030: 73 2e 6c 54 6f 6b 65 6e 29 20 7b 0a 20 20 20 20  s.lToken) {.    
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 69 66 20 28 64 54 6f 6b 65 6e 5b 22 73 54 79 70  if (dToken["sTyp
2060: 65 22 5d 20 21 3d 20 22 49 4e 46 4f 22 29 20 7b  e"] != "INFO") {
2070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2080: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 64 54           this.dT
2090: 6f 6b 65 6e 50 6f 73 2e 73 65 74 28 64 54 6f 6b  okenPos.set(dTok
20a0: 65 6e 5b 22 6e 53 74 61 72 74 22 5d 2c 20 64 54  en["nStart"], dT
20b0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  oken);.         
20c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
20f0: 68 69 73 2e 70 61 72 73 65 54 65 78 74 28 74 68  his.parseText(th
2100: 69 73 2e 73 53 65 6e 74 65 6e 63 65 2c 20 74 68  is.sSentence, th
2110: 69 73 2e 73 53 65 6e 74 65 6e 63 65 30 2c 20 66  is.sSentence0, f
2120: 61 6c 73 65 2c 20 69 53 74 61 72 74 2c 20 73 43  alse, iStart, sC
2130: 6f 75 6e 74 72 79 2c 20 64 4f 70 74 2c 20 62 53  ountry, dOpt, bS
2140: 68 6f 77 52 75 6c 65 49 64 2c 20 62 44 65 62 75  howRuleId, bDebu
2150: 67 2c 20 62 43 6f 6e 74 65 78 74 29 3b 0a 20 20  g, bContext);.  
2160: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2170: 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28 65          catch (e
2180: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2190: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f      console.erro
21a0: 72 28 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r(e);.          
21b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
21c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 41 72 72        return Arr
21d0: 61 79 2e 66 72 6f 6d 28 74 68 69 73 2e 64 45 72  ay.from(this.dEr
21e0: 72 6f 72 2e 76 61 6c 75 65 73 28 29 29 3b 0a 20  ror.values());. 
21f0: 20 20 20 7d 0a 0a 20 20 20 20 70 61 72 73 65 54     }..    parseT
2200: 65 78 74 20 28 73 54 65 78 74 2c 20 73 54 65 78  ext (sText, sTex
2210: 74 30 2c 20 62 50 61 72 61 67 72 61 70 68 2c 20  t0, bParagraph, 
2220: 6e 4f 66 66 73 65 74 2c 20 73 43 6f 75 6e 74 72  nOffset, sCountr
2230: 79 2c 20 64 4f 70 74 69 6f 6e 73 2c 20 62 53 68  y, dOptions, bSh
2240: 6f 77 52 75 6c 65 49 64 2c 20 62 44 65 62 75 67  owRuleId, bDebug
2250: 2c 20 62 43 6f 6e 74 65 78 74 29 20 7b 0a 20 20  , bContext) {.  
2260: 20 20 20 20 20 20 6c 65 74 20 62 43 68 61 6e 67        let bChang
2270: 65 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20  e = false;.     
2280: 20 20 20 6c 65 74 20 6d 3b 0a 0a 20 20 20 20 20     let m;..     
2290: 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 73 4f 70     for (let [sOp
22a0: 74 69 6f 6e 2c 20 6c 52 75 6c 65 47 72 6f 75 70  tion, lRuleGroup
22b0: 5d 20 6f 66 20 67 63 5f 65 6e 67 69 6e 65 2e 67  ] of gc_engine.g
22c0: 65 74 52 75 6c 65 73 28 62 50 61 72 61 67 72 61  etRules(bParagra
22d0: 70 68 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ph)) {.         
22e0: 20 20 20 69 66 20 28 73 4f 70 74 69 6f 6e 20 3d     if (sOption =
22f0: 3d 20 22 40 40 40 40 22 29 20 7b 0a 20 20 20 20  = "@@@@") {.    
2300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 67              // g
2310: 72 61 70 68 20 72 75 6c 65 73 0a 20 20 20 20 20  raph rules.     
2320: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
2330: 62 50 61 72 61 67 72 61 70 68 20 26 26 20 62 43  bParagraph && bC
2340: 68 61 6e 67 65 29 20 7b 0a 20 20 20 20 20 20 20  hange) {.       
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
2360: 73 2e 75 70 64 61 74 65 28 73 54 65 78 74 2c 20  s.update(sText, 
2370: 62 44 65 62 75 67 29 3b 0a 20 20 20 20 20 20 20  bDebug);.       
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 43 68               bCh
2390: 61 6e 67 65 20 3d 20 66 61 6c 73 65 3b 0a 20 20  ange = false;.  
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 66 6f 72 20 28 6c 65 74 20 5b 73 47 72 61 70 68  for (let [sGraph
23d0: 4e 61 6d 65 2c 20 73 4c 69 6e 65 49 64 5d 20 6f  Name, sLineId] o
23e0: 66 20 6c 52 75 6c 65 47 72 6f 75 70 29 20 7b 0a  f lRuleGroup) {.
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 20 20 69 66 20 28 21 64 4f 70 74 69 6f 6e      if (!dOption
2410: 73 2e 68 61 73 28 73 47 72 61 70 68 4e 61 6d 65  s.has(sGraphName
2420: 29 20 7c 7c 20 64 4f 70 74 69 6f 6e 73 2e 67 65  ) || dOptions.ge
2430: 74 28 73 47 72 61 70 68 4e 61 6d 65 29 29 20 7b  t(sGraphName)) {
2440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2450: 20 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65           if (bDe
2460: 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20  bug) {.         
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22     console.log("
2490: 3e 3e 3e 3e 20 47 52 41 50 48 3a 20 22 20 2b 20  >>>> GRAPH: " + 
24a0: 73 47 72 61 70 68 4e 61 6d 65 20 2b 20 22 20 22  sGraphName + " "
24b0: 20 2b 20 73 4c 69 6e 65 49 64 29 3b 0a 20 20 20   + sLineId);.   
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
24f0: 54 65 78 74 20 3d 20 74 68 69 73 2e 70 61 72 73  Text = this.pars
2500: 65 47 72 61 70 68 28 67 63 5f 72 75 6c 65 73 5f  eGraph(gc_rules_
2510: 67 72 61 70 68 2e 64 41 6c 6c 47 72 61 70 68 5b  graph.dAllGraph[
2520: 73 47 72 61 70 68 4e 61 6d 65 5d 2c 20 73 43 6f  sGraphName], sCo
2530: 75 6e 74 72 79 2c 20 64 4f 70 74 69 6f 6e 73 2c  untry, dOptions,
2540: 20 62 53 68 6f 77 52 75 6c 65 49 64 2c 20 62 44   bShowRuleId, bD
2550: 65 62 75 67 2c 20 62 43 6f 6e 74 65 78 74 29 3b  ebug, bContext);
2560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2570: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2580: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2590: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25a0: 20 20 20 65 6c 73 65 20 69 66 20 28 21 73 4f 70     else if (!sOp
25b0: 74 69 6f 6e 20 7c 7c 20 6f 70 74 69 6f 6e 28 73  tion || option(s
25c0: 4f 70 74 69 6f 6e 29 29 20 7b 0a 20 20 20 20 20  Option)) {.     
25d0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
25e0: 6c 65 74 20 5b 7a 52 65 67 65 78 2c 20 62 55 70  let [zRegex, bUp
25f0: 70 65 72 63 61 73 65 2c 20 73 4c 69 6e 65 49 64  percase, sLineId
2600: 2c 20 73 52 75 6c 65 49 64 2c 20 6e 50 72 69 6f  , sRuleId, nPrio
2610: 72 69 74 79 2c 20 6c 41 63 74 69 6f 6e 73 2c 20  rity, lActions, 
2620: 6c 47 72 6f 75 70 73 2c 20 6c 4e 65 67 4c 6f 6f  lGroups, lNegLoo
2630: 6b 42 65 66 6f 72 65 5d 20 6f 66 20 6c 52 75 6c  kBefore] of lRul
2640: 65 47 72 6f 75 70 29 20 7b 0a 20 20 20 20 20 20  eGroup) {.      
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2660: 20 28 21 5f 61 49 67 6e 6f 72 65 64 52 75 6c 65   (!_aIgnoredRule
2670: 73 2e 68 61 73 28 73 52 75 6c 65 49 64 29 29 20  s.has(sRuleId)) 
2680: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2690: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 20            while 
26a0: 28 28 6d 20 3d 20 7a 52 65 67 65 78 2e 67 6c 5f  ((m = zRegex.gl_
26b0: 65 78 65 63 32 28 73 54 65 78 74 2c 20 6c 47 72  exec2(sText, lGr
26c0: 6f 75 70 73 2c 20 6c 4e 65 67 4c 6f 6f 6b 42 65  oups, lNegLookBe
26d0: 66 6f 72 65 29 29 20 21 3d 3d 20 6e 75 6c 6c 29  fore)) !== null)
26e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
2700: 65 74 20 62 43 6f 6e 64 4d 65 6d 6f 20 3d 20 6e  et bCondMemo = n
2710: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ull;.           
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 20 66 6f 72 20 28 6c 65 74 20 5b 73 46 75 6e 63   for (let [sFunc
2740: 43 6f 6e 64 2c 20 63 41 63 74 69 6f 6e 54 79 70  Cond, cActionTyp
2750: 65 2c 20 73 57 68 61 74 2c 20 2e 2e 2e 65 41 63  e, sWhat, ...eAc
2760: 74 5d 20 6f 66 20 6c 41 63 74 69 6f 6e 73 29 20  t] of lActions) 
2770: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2790: 20 20 2f 2f 20 61 63 74 69 6f 6e 20 69 6e 20 6c    // action in l
27a0: 41 63 74 69 6f 6e 73 3a 20 5b 20 63 6f 6e 64 69  Actions: [ condi
27b0: 74 69 6f 6e 2c 20 61 63 74 69 6f 6e 20 74 79 70  tion, action typ
27c0: 65 2c 20 72 65 70 6c 61 63 65 6d 65 6e 74 2f 73  e, replacement/s
27d0: 75 67 67 65 73 74 69 6f 6e 2f 61 63 74 69 6f 6e  uggestion/action
27e0: 5b 2c 20 69 47 72 6f 75 70 5b 2c 20 6d 65 73 73  [, iGroup[, mess
27f0: 61 67 65 2c 20 55 52 4c 5d 5d 20 5d 0a 20 20 20  age, URL]] ].   
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
2820: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2840: 20 20 20 20 20 20 20 62 43 6f 6e 64 4d 65 6d 6f         bCondMemo
2850: 20 3d 20 28 21 73 46 75 6e 63 43 6f 6e 64 20 7c   = (!sFuncCond |
2860: 7c 20 6f 45 76 61 6c 46 75 6e 63 5b 73 46 75 6e  | oEvalFunc[sFun
2870: 63 43 6f 6e 64 5d 28 73 54 65 78 74 2c 20 73 54  cCond](sText, sT
2880: 65 78 74 30 2c 20 6d 2c 20 74 68 69 73 2e 64 54  ext0, m, this.dT
2890: 6f 6b 65 6e 50 6f 73 2c 20 73 43 6f 75 6e 74 72  okenPos, sCountr
28a0: 79 2c 20 62 43 6f 6e 64 4d 65 6d 6f 29 29 3b 0a  y, bCondMemo));.
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 20 69 66 20 28 62 43 6f 6e 64 4d 65 6d      if (bCondMem
28e0: 6f 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  o) {.           
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69               swi
2910: 74 63 68 20 28 63 41 63 74 69 6f 6e 54 79 70 65  tch (cActionType
2920: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 63 61 73 65 20 22 2d 22 3a 0a 20 20 20 20 20 20  case "-":.      
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 67 72 61            // gra
2990: 6d 6d 61 72 20 65 72 72 6f 72 0a 20 20 20 20 20  mmar error.     
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 63 6f 6e             //con
29d0: 73 6f 6c 65 2e 6c 6f 67 28 22 2d 3e 20 65 72 72  sole.log("-> err
29e0: 6f 72 20 64 65 74 65 63 74 65 64 20 69 6e 20 22  or detected in "
29f0: 20 2b 20 73 4c 69 6e 65 49 64 20 2b 20 22 5c 6e   + sLineId + "\n
2a00: 7a 52 65 67 65 78 3a 20 22 20 2b 20 7a 52 65 67  zRegex: " + zReg
2a10: 65 78 2e 73 6f 75 72 63 65 29 3b 0a 20 20 20 20  ex.source);.    
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
2a50: 6e 45 72 72 6f 72 53 74 61 72 74 20 3d 20 6e 4f  nErrorStart = nO
2a60: 66 66 73 65 74 20 2b 20 6d 2e 73 74 61 72 74 5b  ffset + m.start[
2a70: 65 41 63 74 5b 30 5d 5d 3b 0a 20 20 20 20 20 20  eAct[0]];.      
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 69 66 20 28 21 74            if (!t
2ab0: 68 69 73 2e 64 45 72 72 6f 72 2e 68 61 73 28 6e  his.dError.has(n
2ac0: 45 72 72 6f 72 53 74 61 72 74 29 20 7c 7c 20 6e  ErrorStart) || n
2ad0: 50 72 69 6f 72 69 74 79 20 3e 20 74 68 69 73 2e  Priority > this.
2ae0: 64 45 72 72 6f 72 50 72 69 6f 72 69 74 79 2e 67  dErrorPriority.g
2af0: 65 74 28 6e 45 72 72 6f 72 53 74 61 72 74 29 29  et(nErrorStart))
2b00: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 20 20 20 20 74 68 69 73 2e 64 45 72 72         this.dErr
2b40: 6f 72 2e 73 65 74 28 6e 45 72 72 6f 72 53 74 61  or.set(nErrorSta
2b50: 72 74 2c 20 74 68 69 73 2e 5f 63 72 65 61 74 65  rt, this._create
2b60: 45 72 72 6f 72 46 72 6f 6d 52 65 67 65 78 28 73  ErrorFromRegex(s
2b70: 54 65 78 74 2c 20 73 54 65 78 74 30 2c 20 73 57  Text, sText0, sW
2b80: 68 61 74 2c 20 6e 4f 66 66 73 65 74 2c 20 6d 2c  hat, nOffset, m,
2b90: 20 65 41 63 74 5b 30 5d 2c 20 73 4c 69 6e 65 49   eAct[0], sLineI
2ba0: 64 2c 20 73 52 75 6c 65 49 64 2c 20 62 55 70 70  d, sRuleId, bUpp
2bb0: 65 72 63 61 73 65 2c 20 65 41 63 74 5b 31 5d 2c  ercase, eAct[1],
2bc0: 20 65 41 63 74 5b 32 5d 2c 20 62 53 68 6f 77 52   eAct[2], bShowR
2bd0: 75 6c 65 49 64 2c 20 73 4f 70 74 69 6f 6e 2c 20  uleId, sOption, 
2be0: 62 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20  bContext));.    
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c20: 74 68 69 73 2e 64 45 72 72 6f 72 50 72 69 6f 72  this.dErrorPrior
2c30: 69 74 79 2e 73 65 74 28 6e 45 72 72 6f 72 53 74  ity.set(nErrorSt
2c40: 61 72 74 2c 20 6e 50 72 69 6f 72 69 74 79 29 3b  art, nPriority);
2c50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c80: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
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 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce0: 20 20 20 20 20 20 63 61 73 65 20 22 7e 22 3a 0a        case "~":.
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 20 20 20 20 20                  
2d20: 2f 2f 20 74 65 78 74 20 70 72 6f 63 65 73 73 6f  // text processo
2d30: 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r.              
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 20 20 2f 2f 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28    //console.log(
2d70: 22 2d 3e 20 74 65 78 74 20 70 72 6f 63 65 73 73  "-> text process
2d80: 6f 72 20 62 79 20 22 20 2b 20 73 4c 69 6e 65 49  or by " + sLineI
2d90: 64 20 2b 20 22 5c 6e 7a 52 65 67 65 78 3a 20 22  d + "\nzRegex: "
2da0: 20 2b 20 7a 52 65 67 65 78 2e 73 6f 75 72 63 65   + zRegex.source
2db0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 20 20 20 73 54 65 78 74 20 3d 20 74 68 69 73 2e     sText = this.
2df0: 72 65 77 72 69 74 65 54 65 78 74 28 73 54 65 78  rewriteText(sTex
2e00: 74 2c 20 73 57 68 61 74 2c 20 65 41 63 74 5b 30  t, sWhat, eAct[0
2e10: 5d 2c 20 6d 2c 20 62 55 70 70 65 72 63 61 73 65  ], m, bUppercase
2e20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 20 20 62 43 68 61 6e 67 65 20 3d 20 74 72 75     bChange = tru
2e60: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
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 20 20 69 66 20 28 62 44 65 62 75 67 29 20 7b     if (bDebug) {
2ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
2ee0: 28 22 7e 20 22 20 2b 20 73 54 65 78 74 20 2b 20  ("~ " + sText + 
2ef0: 22 20 20 2d 2d 20 22 20 2b 20 6d 5b 65 41 63 74  "  -- " + m[eAct
2f00: 5b 30 5d 5d 20 2b 20 22 20 20 23 20 22 20 2b 20  [0]] + "  # " + 
2f10: 73 4c 69 6e 65 49 64 29 3b 0a 20 20 20 20 20 20  sLineId);.      
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 20 20 20 20 20 20 20 20 20 20 7d 0a 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 20 20 20 20 20 20                  
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2f80: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2fb0: 61 73 65 20 22 3d 22 3a 0a 20 20 20 20 20 20 20  ase "=":.       
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 20 20 20 20 20 20 20 2f 2f 20 64 69 73 61           // disa
2ff0: 6d 62 69 67 75 61 74 69 6f 6e 0a 20 20 20 20 20  mbiguation.     
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3020: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 63 6f 6e             //con
3030: 73 6f 6c 65 2e 6c 6f 67 28 22 2d 3e 20 64 69 73  sole.log("-> dis
3040: 61 6d 62 69 67 75 61 74 69 6f 6e 20 62 79 20 22  ambiguation by "
3050: 20 2b 20 73 4c 69 6e 65 49 64 20 2b 20 22 5c 6e   + sLineId + "\n
3060: 7a 52 65 67 65 78 3a 20 22 20 2b 20 7a 52 65 67  zRegex: " + zReg
3070: 65 78 2e 73 6f 75 72 63 65 29 3b 0a 20 20 20 20  ex.source);.    
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 45 76 61              oEva
30b0: 6c 46 75 6e 63 5b 73 57 68 61 74 5d 28 73 54 65  lFunc[sWhat](sTe
30c0: 78 74 2c 20 6d 2c 20 74 68 69 73 2e 64 54 6f 6b  xt, m, this.dTok
30d0: 65 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  enPos);.        
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65 62          if (bDeb
3110: 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ug) {.          
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 20 20 20 20                  
3140: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
3150: 65 2e 6c 6f 67 28 22 3d 20 22 20 2b 20 6d 5b 30  e.log("= " + m[0
3160: 5d 20 2b 20 22 20 20 23 20 22 20 2b 20 73 4c 69  ] + "  # " + sLi
3170: 6e 65 49 64 2c 20 22 5c 6e 44 41 3a 22 2c 20 74  neId, "\nDA:", t
3180: 68 69 73 2e 64 54 6f 6b 65 6e 50 6f 73 29 3b 0a  his.dTokenPos);.
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 20 20                  
31c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
3200: 20 20 20 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 63 61 73 65 20 22 3e 22 3a 0a 20       case ">":. 
3230: 20 20 20 20 20 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 2f                 /
3260: 2f 20 77 65 20 64 6f 20 6e 6f 74 68 69 6e 67 2c  / we do nothing,
3270: 20 74 68 69 73 20 74 65 73 74 20 69 73 20 6a 75   this test is ju
3280: 73 74 20 61 20 63 6f 6e 64 69 74 69 6f 6e 20 74  st a condition t
3290: 6f 20 61 70 70 6c 79 20 61 6c 6c 20 66 6f 6c 6c  o apply all foll
32a0: 6f 77 69 6e 67 20 61 63 74 69 6f 6e 73 0a 20 20  owing actions.  
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 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
32e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
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 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
3320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3340: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
3350: 65 2e 6c 6f 67 28 22 23 20 65 72 72 6f 72 3a 20  e.log("# error: 
3360: 75 6e 6b 6e 6f 77 6e 20 61 63 74 69 6f 6e 20 61  unknown action a
3370: 74 20 22 20 2b 20 73 4c 69 6e 65 49 64 29 3b 0a  t " + sLineId);.
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
33d0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3400: 66 20 28 63 41 63 74 69 6f 6e 54 79 70 65 20 3d  f (cActionType =
3410: 3d 20 22 3e 22 29 20 7b 0a 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 20 20 20 20 20 20 20 20                  
3440: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
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 7d 0a 20 20 20 20            }.    
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 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 63 61                ca
34e0: 74 63 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20  tch (e) {.      
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 63 6f                co
3510: 6e 73 6f 6c 65 2e 6c 6f 67 28 73 54 65 78 74 29  nsole.log(sText)
3520: 3b 0a 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 63 6f 6e 73 6f 6c 65 2e 6c 6f        console.lo
3550: 67 28 22 23 20 6c 69 6e 65 20 69 64 3a 20 22 20  g("# line id: " 
3560: 2b 20 73 4c 69 6e 65 49 64 20 2b 20 22 5c 6e 23  + sLineId + "\n#
3570: 20 72 75 6c 65 20 69 64 3a 20 22 20 2b 20 73 52   rule id: " + sR
3580: 75 6c 65 49 64 29 3b 0a 20 20 20 20 20 20 20 20  uleId);.        
3590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
35b0: 6f 6c 65 2e 65 72 72 6f 72 28 65 29 3b 0a 20 20  ole.error(e);.  
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
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 7d 0a 20 20              }.  
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3620: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
3640: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3650: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3660: 69 66 20 28 62 43 68 61 6e 67 65 29 20 7b 0a 20  if (bChange) {. 
3670: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62             if (b
3680: 50 61 72 61 67 72 61 70 68 29 20 7b 0a 20 20 20  Paragraph) {.   
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
36a0: 73 2e 73 54 65 78 74 20 3d 20 73 54 65 78 74 3b  s.sText = sText;
36b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
36c0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
36d0: 20 20 20 20 20 20 74 68 69 73 2e 73 53 65 6e 74        this.sSent
36e0: 65 6e 63 65 20 3d 20 73 54 65 78 74 3b 0a 20 20  ence = sText;.  
36f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3700: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
3710: 20 75 70 64 61 74 65 20 28 73 53 65 6e 74 65 6e   update (sSenten
3720: 63 65 2c 20 62 44 65 62 75 67 3d 66 61 6c 73 65  ce, bDebug=false
3730: 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 75  ) {.        // u
3740: 70 64 61 74 65 20 3c 73 53 65 6e 74 65 6e 63 65  pdate <sSentence
3750: 3e 20 61 6e 64 20 72 65 74 6f 6b 65 6e 69 7a 65  > and retokenize
3760: 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 73 53  .        this.sS
3770: 65 6e 74 65 6e 63 65 20 3d 20 73 53 65 6e 74 65  entence = sSente
3780: 6e 63 65 3b 0a 20 20 20 20 20 20 20 20 6c 65 74  nce;.        let
3790: 20 6c 4e 65 77 54 6f 6b 65 6e 20 3d 20 41 72 72   lNewToken = Arr
37a0: 61 79 2e 66 72 6f 6d 28 5f 6f 54 6f 6b 65 6e 69  ay.from(_oTokeni
37b0: 7a 65 72 2e 67 65 6e 54 6f 6b 65 6e 73 28 73 53  zer.genTokens(sS
37c0: 65 6e 74 65 6e 63 65 2c 20 74 72 75 65 29 29 3b  entence, true));
37d0: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65  .        for (le
37e0: 74 20 64 54 6f 6b 65 6e 20 6f 66 20 6c 4e 65 77  t dToken of lNew
37f0: 54 6f 6b 65 6e 29 20 7b 0a 20 20 20 20 20 20 20  Token) {.       
3800: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 64 54       if (this.dT
3810: 6f 6b 65 6e 50 6f 73 2e 67 6c 5f 67 65 74 28 64  okenPos.gl_get(d
3820: 54 6f 6b 65 6e 5b 22 6e 53 74 61 72 74 22 5d 2c  Token["nStart"],
3830: 20 7b 7d 29 2e 68 61 73 4f 77 6e 50 72 6f 70 65   {}).hasOwnPrope
3840: 72 74 79 28 22 6c 4d 6f 72 70 68 22 29 29 20 7b  rty("lMorph")) {
3850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3860: 20 64 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22   dToken["lMorph"
3870: 5d 20 3d 20 74 68 69 73 2e 64 54 6f 6b 65 6e 50  ] = this.dTokenP
3880: 6f 73 2e 67 65 74 28 64 54 6f 6b 65 6e 5b 22 6e  os.get(dToken["n
3890: 53 74 61 72 74 22 5d 29 5b 22 6c 4d 6f 72 70 68  Start"])["lMorph
38a0: 22 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  "];.            
38b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
38c0: 20 28 74 68 69 73 2e 64 54 6f 6b 65 6e 50 6f 73   (this.dTokenPos
38d0: 2e 67 6c 5f 67 65 74 28 64 54 6f 6b 65 6e 5b 22  .gl_get(dToken["
38e0: 6e 53 74 61 72 74 22 5d 2c 20 7b 7d 29 2e 68 61  nStart"], {}).ha
38f0: 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 22 61 54  sOwnProperty("aT
3900: 61 67 73 22 29 29 20 7b 0a 20 20 20 20 20 20 20  ags")) {.       
3910: 20 20 20 20 20 20 20 20 20 64 54 6f 6b 65 6e 5b           dToken[
3920: 22 61 54 61 67 73 22 5d 20 3d 20 74 68 69 73 2e  "aTags"] = this.
3930: 64 54 6f 6b 65 6e 50 6f 73 2e 67 65 74 28 64 54  dTokenPos.get(dT
3940: 6f 6b 65 6e 5b 22 6e 53 74 61 72 74 22 5d 29 5b  oken["nStart"])[
3950: 22 61 54 61 67 73 22 5d 3b 0a 20 20 20 20 20 20  "aTags"];.      
3960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3970: 7d 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 6c  }.        this.l
3980: 54 6f 6b 65 6e 20 3d 20 6c 4e 65 77 54 6f 6b 65  Token = lNewToke
3990: 6e 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e  n;.        this.
39a0: 64 54 6f 6b 65 6e 50 6f 73 2e 63 6c 65 61 72 28  dTokenPos.clear(
39b0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28  );.        for (
39c0: 6c 65 74 20 64 54 6f 6b 65 6e 20 6f 66 20 74 68  let dToken of th
39d0: 69 73 2e 6c 54 6f 6b 65 6e 29 20 7b 0a 20 20 20  is.lToken) {.   
39e0: 20 20 20 20 20 20 20 20 20 69 66 20 28 64 54 6f           if (dTo
39f0: 6b 65 6e 5b 22 73 54 79 70 65 22 5d 20 21 3d 20  ken["sType"] != 
3a00: 22 49 4e 46 4f 22 29 20 7b 0a 20 20 20 20 20 20  "INFO") {.      
3a10: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 64            this.d
3a20: 54 6f 6b 65 6e 50 6f 73 2e 73 65 74 28 64 54 6f  TokenPos.set(dTo
3a30: 6b 65 6e 5b 22 6e 53 74 61 72 74 22 5d 2c 20 64  ken["nStart"], d
3a40: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
3a50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
3a60: 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65 62          if (bDeb
3a70: 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ug) {.          
3a80: 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 55    console.log("U
3a90: 50 44 41 54 45 3a 22 29 3b 0a 20 20 20 20 20 20  PDATE:");.      
3aa0: 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f        console.lo
3ab0: 67 28 74 68 69 73 2e 61 73 53 74 72 69 6e 67 28  g(this.asString(
3ac0: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
3ad0: 20 20 7d 0a 0a 20 20 20 20 2a 20 5f 67 65 74 4e    }..    * _getN
3ae0: 65 78 74 50 6f 69 6e 74 65 72 73 20 28 64 54 6f  extPointers (dTo
3af0: 6b 65 6e 2c 20 64 47 72 61 70 68 2c 20 64 50 6f  ken, dGraph, dPo
3b00: 69 6e 74 65 72 2c 20 62 44 65 62 75 67 3d 66 61  inter, bDebug=fa
3b10: 6c 73 65 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  lse) {.        /
3b20: 2f 20 67 65 6e 65 72 61 74 6f 72 3a 20 72 65 74  / generator: ret
3b30: 75 72 6e 20 6e 6f 64 65 73 20 77 68 65 72 65 20  urn nodes where 
3b40: 3c 64 54 6f 6b 65 6e 3e 20 e2 80 9c 76 61 6c 75  <dToken> ...valu
3b50: 65 73 e2 80 9d 20 6d 61 74 63 68 20 3c 64 4e 6f  es... match <dNo
3b60: 64 65 3e 20 61 72 63 73 0a 20 20 20 20 20 20 20  de> arcs.       
3b70: 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20   try {.         
3b80: 20 20 20 6c 65 74 20 64 4e 6f 64 65 20 3d 20 64     let dNode = d
3b90: 50 6f 69 6e 74 65 72 5b 22 64 4e 6f 64 65 22 5d  Pointer["dNode"]
3ba0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  ;.            le
3bb0: 74 20 69 4e 6f 64 65 31 20 3d 20 64 50 6f 69 6e  t iNode1 = dPoin
3bc0: 74 65 72 5b 22 69 4e 6f 64 65 31 22 5d 3b 0a 20  ter["iNode1"];. 
3bd0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 62             let b
3be0: 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20 66 61 6c  TokenFound = fal
3bf0: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
3c00: 2f 2f 20 74 6f 6b 65 6e 20 76 61 6c 75 65 0a 20  // token value. 
3c10: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64             if (d
3c20: 4e 6f 64 65 2e 68 61 73 4f 77 6e 50 72 6f 70 65  Node.hasOwnPrope
3c30: 72 74 79 28 64 54 6f 6b 65 6e 5b 22 73 56 61 6c  rty(dToken["sVal
3c40: 75 65 22 5d 29 29 20 7b 0a 20 20 20 20 20 20 20  ue"])) {.       
3c50: 20 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65           if (bDe
3c60: 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20  bug) {.         
3c70: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f             conso
3c80: 6c 65 2e 6c 6f 67 28 22 20 20 4d 41 54 43 48 3a  le.log("  MATCH:
3c90: 20 22 20 2b 20 64 54 6f 6b 65 6e 5b 22 73 56 61   " + dToken["sVa
3ca0: 6c 75 65 22 5d 29 3b 0a 20 20 20 20 20 20 20 20  lue"]);.        
3cb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3cc0: 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
3cd0: 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69 4e 6f 64  { "iNode1": iNod
3ce0: 65 31 2c 20 22 64 4e 6f 64 65 22 3a 20 64 47 72  e1, "dNode": dGr
3cf0: 61 70 68 5b 64 4e 6f 64 65 5b 64 54 6f 6b 65 6e  aph[dNode[dToken
3d00: 5b 22 73 56 61 6c 75 65 22 5d 5d 5d 20 7d 3b 0a  ["sValue"]]] };.
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d20: 62 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20 74 72  bTokenFound = tr
3d30: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
3d40: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
3d50: 20 28 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65   (dToken["sValue
3d60: 22 5d 2e 73 6c 69 63 65 28 30 2c 32 29 2e 67 6c  "].slice(0,2).gl
3d70: 5f 69 73 54 69 74 6c 65 28 29 29 20 7b 20 2f 2f  _isTitle()) { //
3d80: 20 77 65 20 74 65 73 74 20 6f 6e 6c 79 20 32 20   we test only 2 
3d90: 66 69 72 73 74 20 63 68 61 72 73 2c 20 74 6f 20  first chars, to 
3da0: 6d 61 6b 65 20 76 61 6c 69 64 20 77 6f 72 64 73  make valid words
3db0: 20 73 75 63 68 20 61 73 20 22 4c 61 69 73 73 65   such as "Laisse
3dc0: 7a 2d 6c 65 73 22 2c 20 22 50 61 73 73 65 2d 70  z-les", "Passe-p
3dd0: 61 72 74 6f 75 74 22 2e 0a 20 20 20 20 20 20 20  artout"..       
3de0: 20 20 20 20 20 20 20 20 20 6c 65 74 20 73 56 61           let sVa
3df0: 6c 75 65 20 3d 20 64 54 6f 6b 65 6e 5b 22 73 56  lue = dToken["sV
3e00: 61 6c 75 65 22 5d 2e 74 6f 4c 6f 77 65 72 43 61  alue"].toLowerCa
3e10: 73 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  se();.          
3e20: 20 20 20 20 20 20 69 66 20 28 64 4e 6f 64 65 2e        if (dNode.
3e30: 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 73  hasOwnProperty(s
3e40: 56 61 6c 75 65 29 29 20 7b 0a 20 20 20 20 20 20  Value)) {.      
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
3e60: 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20   (bDebug) {.    
3e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e80: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28      console.log(
3e90: 22 20 20 4d 41 54 43 48 3a 20 22 20 2b 20 73 56  "  MATCH: " + sV
3ea0: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20  alue);.         
3eb0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 20 79 69 65 6c 64 20 7b 20 22 69 4e 6f 64 65 31   yield { "iNode1
3ee0: 22 3a 20 69 4e 6f 64 65 31 2c 20 22 64 4e 6f 64  ": iNode1, "dNod
3ef0: 65 22 3a 20 64 47 72 61 70 68 5b 64 4e 6f 64 65  e": dGraph[dNode
3f00: 5b 73 56 61 6c 75 65 5d 5d 20 7d 3b 0a 20 20 20  [sValue]] };.   
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f20: 20 62 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20 74   bTokenFound = t
3f30: 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rue;.           
3f40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3f50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
3f60: 20 65 6c 73 65 20 69 66 20 28 64 54 6f 6b 65 6e   else if (dToken
3f70: 5b 22 73 56 61 6c 75 65 22 5d 2e 67 6c 5f 69 73  ["sValue"].gl_is
3f80: 55 70 70 65 72 43 61 73 65 28 29 29 20 7b 0a 20  UpperCase()) {. 
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
3fa0: 65 74 20 73 56 61 6c 75 65 20 3d 20 64 54 6f 6b  et sValue = dTok
3fb0: 65 6e 5b 22 73 56 61 6c 75 65 22 5d 2e 74 6f 4c  en["sValue"].toL
3fc0: 6f 77 65 72 43 61 73 65 28 29 3b 0a 20 20 20 20  owerCase();.    
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
3fe0: 64 4e 6f 64 65 2e 68 61 73 4f 77 6e 50 72 6f 70  dNode.hasOwnProp
3ff0: 65 72 74 79 28 73 56 61 6c 75 65 29 29 20 7b 0a  erty(sValue)) {.
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 20 20 20 69 66 20 28 62 44 65 62 75 67 29 20      if (bDebug) 
4020: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4030: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
4040: 65 2e 6c 6f 67 28 22 20 20 4d 41 54 43 48 3a 20  e.log("  MATCH: 
4050: 22 20 2b 20 73 56 61 6c 75 65 29 3b 0a 20 20 20  " + sValue);.   
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4070: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
4080: 20 20 20 20 20 20 20 79 69 65 6c 64 20 7b 20 22         yield { "
4090: 69 4e 6f 64 65 31 22 3a 20 69 4e 6f 64 65 31 2c  iNode1": iNode1,
40a0: 20 22 64 4e 6f 64 65 22 3a 20 64 47 72 61 70 68   "dNode": dGraph
40b0: 5b 64 4e 6f 64 65 5b 73 56 61 6c 75 65 5d 5d 20  [dNode[sValue]] 
40c0: 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  };.             
40d0: 20 20 20 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75         bTokenFou
40e0: 6e 64 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  nd = true;.     
40f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 56 61               sVa
4110: 6c 75 65 20 3d 20 64 54 6f 6b 65 6e 5b 22 73 56  lue = dToken["sV
4120: 61 6c 75 65 22 5d 2e 67 6c 5f 74 6f 43 61 70 69  alue"].gl_toCapi
4130: 74 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20 20 20  talize();.      
4140: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64 4e            if (dN
4150: 6f 64 65 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72  ode.hasOwnProper
4160: 74 79 28 73 56 61 6c 75 65 29 29 20 7b 0a 20 20  ty(sValue)) {.  
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 20 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a    if (bDebug) {.
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41a0: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
41b0: 6c 6f 67 28 22 20 20 4d 41 54 43 48 3a 20 22 20  log("  MATCH: " 
41c0: 2b 20 73 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  + sValue);.     
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
41e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
41f0: 20 20 20 20 20 79 69 65 6c 64 20 7b 20 22 69 4e       yield { "iN
4200: 6f 64 65 31 22 3a 20 69 4e 6f 64 65 31 2c 20 22  ode1": iNode1, "
4210: 64 4e 6f 64 65 22 3a 20 64 47 72 61 70 68 5b 64  dNode": dGraph[d
4220: 4e 6f 64 65 5b 73 56 61 6c 75 65 5d 5d 20 7d 3b  Node[sValue]] };
4230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4240: 20 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75 6e 64       bTokenFound
4250: 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20   = true;.       
4260: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4270: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4280: 20 20 20 20 20 2f 2f 20 72 65 67 65 78 20 76 61       // regex va
4290: 6c 75 65 20 61 72 63 73 0a 20 20 20 20 20 20 20  lue arcs.       
42a0: 20 20 20 20 20 69 66 20 28 64 54 6f 6b 65 6e 5b       if (dToken[
42b0: 22 73 54 79 70 65 22 5d 20 21 3d 20 22 49 4e 46  "sType"] != "INF
42c0: 4f 22 20 20 26 26 20 20 64 54 6f 6b 65 6e 5b 22  O"  &&  dToken["
42d0: 73 54 79 70 65 22 5d 20 21 3d 20 22 50 55 4e 43  sType"] != "PUNC
42e0: 22 20 20 26 26 20 20 64 54 6f 6b 65 6e 5b 22 73  "  &&  dToken["s
42f0: 54 79 70 65 22 5d 20 21 3d 20 22 53 49 47 4e 22  Type"] != "SIGN"
4300: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
4310: 20 20 20 20 69 66 20 28 64 4e 6f 64 65 2e 68 61      if (dNode.ha
4320: 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 22 3c 72  sOwnProperty("<r
4330: 65 5f 76 61 6c 75 65 3e 22 29 29 20 7b 0a 20 20  e_value>")) {.  
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4350: 20 20 66 6f 72 20 28 6c 65 74 20 73 52 65 67 65    for (let sRege
4360: 78 20 69 6e 20 64 4e 6f 64 65 5b 22 3c 72 65 5f  x in dNode["<re_
4370: 76 61 6c 75 65 3e 22 5d 29 20 7b 0a 20 20 20 20  value>"]) {.    
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4390: 20 20 20 20 69 66 20 28 21 73 52 65 67 65 78 2e      if (!sRegex.
43a0: 69 6e 63 6c 75 64 65 73 28 22 c2 ac 22 29 29 20  includes("..")) 
43b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
43d0: 20 6e 6f 20 61 6e 74 69 2d 70 61 74 74 65 72 6e   no anti-pattern
43e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
4400: 28 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22  (dToken["sValue"
4410: 5d 2e 73 65 61 72 63 68 28 73 52 65 67 65 78 29  ].search(sRegex)
4420: 20 21 3d 3d 20 2d 31 29 20 7b 0a 20 20 20 20 20   !== -1) {.     
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62             if (b
4450: 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20  Debug) {.       
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4470: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
4480: 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 4d 41 54 43  sole.log("  MATC
4490: 48 3a 20 7e 22 20 2b 20 73 52 65 67 65 78 29 3b  H: ~" + sRegex);
44a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44c0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 79 69 65 6c 64 20 7b 20 22 69 4e 6f 64     yield { "iNod
44f0: 65 31 22 3a 20 69 4e 6f 64 65 31 2c 20 22 64 4e  e1": iNode1, "dN
4500: 6f 64 65 22 3a 20 64 47 72 61 70 68 5b 64 4e 6f  ode": dGraph[dNo
4510: 64 65 5b 22 3c 72 65 5f 76 61 6c 75 65 3e 22 5d  de["<re_value>"]
4520: 5b 73 52 65 67 65 78 5d 5d 20 7d 3b 0a 20 20 20  [sRegex]] };.   
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 54 6f               bTo
4550: 6b 65 6e 46 6f 75 6e 64 20 3d 20 74 72 75 65 3b  kenFound = true;
4560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74              // t
45c0: 68 65 72 65 20 69 73 20 61 6e 20 61 6e 74 69 2d  here is an anti-
45d0: 70 61 74 74 65 72 6e 0a 20 20 20 20 20 20 20 20  pattern.        
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 20 20 6c 65 74 20 5b 73 50 61 74 74 65 72      let [sPatter
4600: 6e 2c 20 73 4e 65 67 50 61 74 74 65 72 6e 5d 20  n, sNegPattern] 
4610: 3d 20 73 52 65 67 65 78 2e 73 70 6c 69 74 28 22  = sRegex.split("
4620: c2 ac 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  ..", 2);.       
4630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4640: 20 20 20 20 20 69 66 20 28 73 4e 65 67 50 61 74       if (sNegPat
4650: 74 65 72 6e 20 26 26 20 64 54 6f 6b 65 6e 5b 22  tern && dToken["
4660: 73 56 61 6c 75 65 22 5d 2e 73 65 61 72 63 68 28  sValue"].search(
4670: 73 4e 65 67 50 61 74 74 65 72 6e 29 20 21 3d 3d  sNegPattern) !==
4680: 20 2d 31 29 20 7b 0a 20 20 20 20 20 20 20 20 20   -1) {.         
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46a0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
46b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
46f0: 73 50 61 74 74 65 72 6e 20 7c 7c 20 64 54 6f 6b  sPattern || dTok
4700: 65 6e 5b 22 73 56 61 6c 75 65 22 5d 2e 73 65 61  en["sValue"].sea
4710: 72 63 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d  rch(sPattern) !=
4720: 3d 20 2d 31 29 20 7b 0a 20 20 20 20 20 20 20 20  = -1) {.        
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4740: 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65 62          if (bDeb
4750: 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ug) {.          
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4770: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
4780: 65 2e 6c 6f 67 28 22 20 20 4d 41 54 43 48 3a 20  e.log("  MATCH: 
4790: 7e 22 20 2b 20 73 52 65 67 65 78 29 3b 0a 20 20  ~" + sRegex);.  
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 79 69 65 6c 64 20 7b 20 22 69 4e 6f 64 65 31 22  yield { "iNode1"
47f0: 3a 20 69 4e 6f 64 65 31 2c 20 22 64 4e 6f 64 65  : iNode1, "dNode
4800: 22 3a 20 64 47 72 61 70 68 5b 64 4e 6f 64 65 5b  ": dGraph[dNode[
4810: 22 3c 72 65 5f 76 61 6c 75 65 3e 22 5d 5b 73 52  "<re_value>"][sR
4820: 65 67 65 78 5d 5d 20 7d 3b 0a 20 20 20 20 20 20  egex]] };.      
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4840: 20 20 20 20 20 20 20 20 20 20 62 54 6f 6b 65 6e            bToken
4850: 46 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0a 20 20  Found = true;.  
4860: 20 20 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 0a 20 20 20 20            }.    
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
48a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
48c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
48d0: 20 20 20 20 20 20 20 20 2f 2f 20 61 6e 61 6c 79          // analy
48e0: 73 61 62 6c 65 20 74 6f 6b 65 6e 73 0a 20 20 20  sable tokens.   
48f0: 20 20 20 20 20 20 20 20 20 69 66 20 28 64 54 6f           if (dTo
4900: 6b 65 6e 5b 22 73 54 79 70 65 22 5d 2e 73 6c 69  ken["sType"].sli
4910: 63 65 28 30 2c 34 29 20 3d 3d 20 22 57 4f 52 44  ce(0,4) == "WORD
4920: 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ") {.           
4930: 20 20 20 20 20 2f 2f 20 74 6f 6b 65 6e 20 6c 65       // token le
4940: 6d 6d 61 73 0a 20 20 20 20 20 20 20 20 20 20 20  mmas.           
4950: 20 20 20 20 20 69 66 20 28 64 4e 6f 64 65 2e 68       if (dNode.h
4960: 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 22 3c  asOwnProperty("<
4970: 6c 65 6d 6d 61 73 3e 22 29 29 20 7b 0a 20 20 20  lemmas>")) {.   
4980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4990: 20 66 6f 72 20 28 6c 65 74 20 73 4c 65 6d 6d 61   for (let sLemma
49a0: 20 6f 66 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b   of _oSpellCheck
49b0: 65 72 2e 67 65 74 4c 65 6d 6d 61 28 64 54 6f 6b  er.getLemma(dTok
49c0: 65 6e 5b 22 73 56 61 6c 75 65 22 5d 29 29 20 7b  en["sValue"])) {
49d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
49e0: 20 20 20 20 20 20 20 20 20 69 66 20 28 64 4e 6f           if (dNo
49f0: 64 65 5b 22 3c 6c 65 6d 6d 61 73 3e 22 5d 2e 68  de["<lemmas>"].h
4a00: 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 73 4c  asOwnProperty(sL
4a10: 65 6d 6d 61 29 29 20 7b 0a 20 20 20 20 20 20 20  emma)) {.       
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67 29       if (bDebug)
4a40: 20 7b 0a 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 20 20 20                  
4a60: 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22     console.log("
4a70: 20 20 4d 41 54 43 48 3a 20 3e 22 20 2b 20 73 4c    MATCH: >" + sL
4a80: 65 6d 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  emma);.         
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4aa0: 20 20 20 7d 0a 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 79 69 65 6c 64 20 7b 20 22 69 4e 6f 64 65 31   yield { "iNode1
4ad0: 22 3a 20 69 4e 6f 64 65 31 2c 20 22 64 4e 6f 64  ": iNode1, "dNod
4ae0: 65 22 3a 20 64 47 72 61 70 68 5b 64 4e 6f 64 65  e": dGraph[dNode
4af0: 5b 22 3c 6c 65 6d 6d 61 73 3e 22 5d 5b 73 4c 65  ["<lemmas>"][sLe
4b00: 6d 6d 61 5d 5d 20 7d 3b 0a 20 20 20 20 20 20 20  mma]] };.       
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b20: 20 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75 6e 64       bTokenFound
4b30: 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20   = true;.       
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b50: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
4b60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4b70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 72 65             // re
4b90: 67 65 78 20 6d 6f 72 70 68 20 61 72 63 73 0a 20  gex morph arcs. 
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4bb0: 66 20 28 64 4e 6f 64 65 2e 68 61 73 4f 77 6e 50  f (dNode.hasOwnP
4bc0: 72 6f 70 65 72 74 79 28 22 3c 72 65 5f 6d 6f 72  roperty("<re_mor
4bd0: 70 68 3e 22 29 29 20 7b 0a 20 20 20 20 20 20 20  ph>")) {.       
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
4bf0: 20 6c 4d 6f 72 70 68 20 3d 20 28 64 54 6f 6b 65   lMorph = (dToke
4c00: 6e 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79  n.hasOwnProperty
4c10: 28 22 6c 4d 6f 72 70 68 22 29 29 20 3f 20 64 54  ("lMorph")) ? dT
4c20: 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 20 3a  oken["lMorph"] :
4c30: 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e   _oSpellChecker.
4c40: 67 65 74 4d 6f 72 70 68 28 64 54 6f 6b 65 6e 5b  getMorph(dToken[
4c50: 22 73 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20  "sValue"]);.    
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 66 6f 72 20 28 6c 65 74 20 73 52 65 67 65 78 20  for (let sRegex 
4c80: 69 6e 20 64 4e 6f 64 65 5b 22 3c 72 65 5f 6d 6f  in dNode["<re_mo
4c90: 72 70 68 3e 22 5d 29 20 7b 0a 20 20 20 20 20 20  rph>"]) {.      
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 20 69 66 20 28 21 73 52 65 67 65 78 2e 69 6e    if (!sRegex.in
4cc0: 63 6c 75 64 65 73 28 22 c2 ac 22 29 29 20 7b 0a  cludes("..")) {.
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 6e              // n
4cf0: 6f 20 61 6e 74 69 2d 70 61 74 74 65 72 6e 0a 20  o anti-pattern. 
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 6c             if (l
4d20: 4d 6f 72 70 68 2e 73 6f 6d 65 28 73 4d 6f 72 70  Morph.some(sMorp
4d30: 68 20 20 3d 3e 20 20 28 73 4d 6f 72 70 68 2e 73  h  =>  (sMorph.s
4d40: 65 61 72 63 68 28 73 52 65 67 65 78 29 20 21 3d  earch(sRegex) !=
4d50: 3d 20 2d 31 29 29 29 20 7b 0a 20 20 20 20 20 20  = -1))) {.      
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d70: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62 44            if (bD
4d80: 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20  ebug) {.        
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 20 20 20 20 20 63 6f 6e 73              cons
4db0: 6f 6c 65 2e 6c 6f 67 28 22 20 20 4d 41 54 43 48  ole.log("  MATCH
4dc0: 3a 20 40 22 20 2b 20 73 52 65 67 65 78 29 3b 0a  : @" + sRegex);.
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 79 69 65 6c 64 20 7b 20 22 69 4e 6f 64 65    yield { "iNode
4e20: 31 22 3a 20 69 4e 6f 64 65 31 2c 20 22 64 4e 6f  1": iNode1, "dNo
4e30: 64 65 22 3a 20 64 47 72 61 70 68 5b 64 4e 6f 64  de": dGraph[dNod
4e40: 65 5b 22 3c 72 65 5f 6d 6f 72 70 68 3e 22 5d 5b  e["<re_morph>"][
4e50: 73 52 65 67 65 78 5d 5d 20 7d 3b 0a 20 20 20 20  sRegex]] };.    
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 62 54 6f 6b              bTok
4e80: 65 6e 46 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0a  enFound = true;.
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74 68             // th
4ef0: 65 72 65 20 69 73 20 61 6e 20 61 6e 74 69 2d 70  ere is an anti-p
4f00: 61 74 74 65 72 6e 0a 20 20 20 20 20 20 20 20 20  attern.         
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f20: 20 20 20 6c 65 74 20 5b 73 50 61 74 74 65 72 6e     let [sPattern
4f30: 2c 20 73 4e 65 67 50 61 74 74 65 72 6e 5d 20 3d  , sNegPattern] =
4f40: 20 73 52 65 67 65 78 2e 73 70 6c 69 74 28 22 c2   sRegex.split(".
4f50: ac 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  .", 2);.        
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f70: 20 20 20 20 69 66 20 28 73 4e 65 67 50 61 74 74      if (sNegPatt
4f80: 65 72 6e 20 3d 3d 20 22 2a 22 29 20 7b 0a 20 20  ern == "*") {.  
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
4fb0: 20 61 6c 6c 20 6d 6f 72 70 68 6f 6c 6f 67 69 65   all morphologie
4fc0: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 77 69 74  s must match wit
4fd0: 68 20 3c 73 50 61 74 74 65 72 6e 3e 0a 20 20 20  h <sPattern>.   
4fe0: 20 20 20 20 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 69 66 20               if 
5000: 28 73 50 61 74 74 65 72 6e 29 20 7b 0a 20 20 20  (sPattern) {.   
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5030: 20 69 66 20 28 6c 4d 6f 72 70 68 2e 6c 65 6e 67   if (lMorph.leng
5040: 74 68 20 3e 20 30 20 20 26 26 20 20 6c 4d 6f 72  th > 0  &&  lMor
5050: 70 68 2e 65 76 65 72 79 28 73 4d 6f 72 70 68 20  ph.every(sMorph 
5060: 20 3d 3e 20 20 28 73 4d 6f 72 70 68 2e 73 65 61   =>  (sMorph.sea
5070: 72 63 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d  rch(sPattern) !=
5080: 3d 20 2d 31 29 29 29 20 7b 0a 20 20 20 20 20 20  = -1))) {.      
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a    if (bDebug) {.
50c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
50f0: 6f 6c 65 2e 6c 6f 67 28 22 20 20 4d 41 54 43 48  ole.log("  MATCH
5100: 3a 20 40 22 20 2b 20 73 52 65 67 65 78 29 3b 0a  : @" + sRegex);.
5110: 20 20 20 20 20 20 20 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 7d 0a 20 20 20 20 20 20          }.      
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5160: 20 20 79 69 65 6c 64 20 7b 20 22 69 4e 6f 64 65    yield { "iNode
5170: 31 22 3a 20 69 4e 6f 64 65 31 2c 20 22 64 4e 6f  1": iNode1, "dNo
5180: 64 65 22 3a 20 64 47 72 61 70 68 5b 64 4e 6f 64  de": dGraph[dNod
5190: 65 5b 22 3c 72 65 5f 6d 6f 72 70 68 3e 22 5d 5b  e["<re_morph>"][
51a0: 73 52 65 67 65 78 5d 5d 20 7d 3b 0a 20 20 20 20  sRegex]] };.    
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75 6e 64 20      bTokenFound 
51e0: 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20  = true;.        
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5200: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
5250: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5270: 20 20 20 20 20 69 66 20 28 73 4e 65 67 50 61 74       if (sNegPat
5280: 74 65 72 6e 20 20 26 26 20 20 6c 4d 6f 72 70 68  tern  &&  lMorph
5290: 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20 20 3d 3e  .some(sMorph  =>
52a0: 20 20 28 73 4d 6f 72 70 68 2e 73 65 61 72 63 68    (sMorph.search
52b0: 28 73 4e 65 67 50 61 74 74 65 72 6e 29 20 21 3d  (sNegPattern) !=
52c0: 3d 20 2d 31 29 29 29 20 7b 0a 20 20 20 20 20 20  = -1))) {.      
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 20 20 63 6f                co
52f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5310: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
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 69 66 20 28 21 73            if (!s
5340: 50 61 74 74 65 72 6e 20 20 7c 7c 20 20 6c 4d 6f  Pattern  ||  lMo
5350: 72 70 68 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20  rph.some(sMorph 
5360: 20 3d 3e 20 20 28 73 4d 6f 72 70 68 2e 73 65 61   =>  (sMorph.sea
5370: 72 63 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d  rch(sPattern) !=
5380: 3d 20 2d 31 29 29 29 20 7b 0a 20 20 20 20 20 20  = -1))) {.      
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
53b0: 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20   (bDebug) {.    
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: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28      console.log(
53f0: 22 20 20 4d 41 54 43 48 3a 20 40 22 20 2b 20 73  "  MATCH: @" + s
5400: 52 65 67 65 78 29 3b 0a 20 20 20 20 20 20 20 20  Regex);.        
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5450: 20 20 79 69 65 6c 64 20 7b 20 22 69 4e 6f 64 65    yield { "iNode
5460: 31 22 3a 20 69 4e 6f 64 65 31 2c 20 22 64 4e 6f  1": iNode1, "dNo
5470: 64 65 22 3a 20 64 47 72 61 70 68 5b 64 4e 6f 64  de": dGraph[dNod
5480: 65 5b 22 3c 72 65 5f 6d 6f 72 70 68 3e 22 5d 5b  e["<re_morph>"][
5490: 73 52 65 67 65 78 5d 5d 20 7d 3b 0a 20 20 20 20  sRegex]] };.    
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54c0: 62 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20 74 72  bTokenFound = tr
54d0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5510: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
5520: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
5550: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5560: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
5570: 2f 2f 20 74 6f 6b 65 6e 20 74 61 67 73 0a 20 20  // token tags.  
5580: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64 54            if (dT
5590: 6f 6b 65 6e 2e 68 61 73 4f 77 6e 50 72 6f 70 65  oken.hasOwnPrope
55a0: 72 74 79 28 22 61 54 61 67 73 22 29 20 26 26 20  rty("aTags") && 
55b0: 64 4e 6f 64 65 2e 68 61 73 4f 77 6e 50 72 6f 70  dNode.hasOwnProp
55c0: 65 72 74 79 28 22 3c 74 61 67 73 3e 22 29 29 20  erty("<tags>")) 
55d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
55e0: 20 20 66 6f 72 20 28 6c 65 74 20 73 54 61 67 20    for (let sTag 
55f0: 6f 66 20 64 54 6f 6b 65 6e 5b 22 61 54 61 67 73  of dToken["aTags
5600: 22 5d 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  "]) {.          
5610: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64 4e            if (dN
5620: 6f 64 65 5b 22 3c 74 61 67 73 3e 22 5d 2e 68 61  ode["<tags>"].ha
5630: 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 73 54 61  sOwnProperty(sTa
5640: 67 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  g)) {.          
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
5660: 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20   (bDebug) {.    
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 63 6f 6e 73 6f 6c 65 2e          console.
5690: 6c 6f 67 28 22 20 20 4d 41 54 43 48 3a 20 2f 22  log("  MATCH: /"
56a0: 20 2b 20 73 54 61 67 29 3b 0a 20 20 20 20 20 20   + sTag);.      
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c              yiel
56e0: 64 20 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69 4e  d { "iNode1": iN
56f0: 6f 64 65 31 2c 20 22 64 4e 6f 64 65 22 3a 20 64  ode1, "dNode": d
5700: 47 72 61 70 68 5b 64 4e 6f 64 65 5b 22 3c 74 61  Graph[dNode["<ta
5710: 67 73 3e 22 5d 5b 73 54 61 67 5d 5d 20 7d 3b 0a  gs>"][sTag]] };.
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5730: 20 20 20 20 20 20 20 20 62 54 6f 6b 65 6e 46 6f          bTokenFo
5740: 75 6e 64 20 3d 20 74 72 75 65 3b 0a 20 20 20 20  und = true;.    
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
5770: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
5780: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  }.            //
5790: 20 6d 65 74 61 20 61 72 63 20 28 66 6f 72 20 74   meta arc (for t
57a0: 6f 6b 65 6e 20 74 79 70 65 29 0a 20 20 20 20 20  oken type).     
57b0: 20 20 20 20 20 20 20 69 66 20 28 64 4e 6f 64 65         if (dNode
57c0: 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28  .hasOwnProperty(
57d0: 22 3c 6d 65 74 61 3e 22 29 29 20 7b 0a 20 20 20  "<meta>")) {.   
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
57f0: 20 28 6c 65 74 20 73 4d 65 74 61 20 69 6e 20 64   (let sMeta in d
5800: 4e 6f 64 65 5b 22 3c 6d 65 74 61 3e 22 5d 29 20  Node["<meta>"]) 
5810: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5820: 20 20 20 20 20 20 2f 2f 20 6e 6f 20 72 65 67 65        // no rege
5830: 78 20 68 65 72 65 2c 20 77 65 20 6a 75 73 74 20  x here, we just 
5840: 73 65 61 72 63 68 20 69 66 20 3c 64 4e 6f 64 65  search if <dNode
5850: 5b 22 73 54 79 70 65 22 5d 3e 20 65 78 69 73 74  ["sType"]> exist
5860: 73 20 77 69 74 68 69 6e 20 3c 73 4d 65 74 61 3e  s within <sMeta>
5870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5880: 20 20 20 20 20 69 66 20 28 73 4d 65 74 61 20 3d       if (sMeta =
5890: 3d 20 22 2a 22 20 7c 7c 20 64 54 6f 6b 65 6e 5b  = "*" || dToken[
58a0: 22 73 54 79 70 65 22 5d 20 3d 3d 20 73 4d 65 74  "sType"] == sMet
58b0: 61 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  a) {.           
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
58d0: 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20  (bDebug) {.     
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58f0: 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c         console.l
5900: 6f 67 28 22 20 20 4d 41 54 43 48 3a 20 2a 22 20  og("  MATCH: *" 
5910: 2b 20 73 4d 65 74 61 29 3b 0a 20 20 20 20 20 20  + sMeta);.      
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5930: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
5940: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c              yiel
5950: 64 20 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69 4e  d { "iNode1": iN
5960: 6f 64 65 31 2c 20 22 64 4e 6f 64 65 22 3a 20 64  ode1, "dNode": d
5970: 47 72 61 70 68 5b 64 4e 6f 64 65 5b 22 3c 6d 65  Graph[dNode["<me
5980: 74 61 3e 22 5d 5b 73 4d 65 74 61 5d 5d 20 7d 3b  ta>"][sMeta]] };
5990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
59a0: 20 20 20 20 20 20 20 20 20 62 54 6f 6b 65 6e 46           bTokenF
59b0: 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0a 20 20 20  ound = true;.   
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
59e0: 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28         else if (
59f0: 73 4d 65 74 61 2e 69 6e 63 6c 75 64 65 73 28 22  sMeta.includes("
5a00: c2 ac 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ..")) {.        
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 69 66 20 28 21 73 4d 65 74 61 2e 69 6e 63 6c 75  if (!sMeta.inclu
5a30: 64 65 73 28 64 54 6f 6b 65 6e 5b 22 73 54 79 70  des(dToken["sTyp
5a40: 65 22 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 20  e"])) {.        
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 20 20 20 20 69 66 20 28 62 44 65 62 75 67 29 20      if (bDebug) 
5a70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a90: 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20    console.log(" 
5aa0: 20 4d 41 54 43 48 3a 20 2a 22 20 2b 20 73 4d 65   MATCH: *" + sMe
5ab0: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ta);.           
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ad0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 79                 y
5af0: 69 65 6c 64 20 7b 20 22 69 4e 6f 64 65 31 22 3a  ield { "iNode1":
5b00: 20 69 4e 6f 64 65 31 2c 20 22 64 4e 6f 64 65 22   iNode1, "dNode"
5b10: 3a 20 64 47 72 61 70 68 5b 64 4e 6f 64 65 5b 22  : dGraph[dNode["
5b20: 3c 6d 65 74 61 3e 22 5d 5b 73 4d 65 74 61 5d 5d  <meta>"][sMeta]]
5b30: 20 7d 3b 0a 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: 62 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20 74 72  bTokenFound = tr
5b60: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b90: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
5ba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5bb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
5bc0: 69 66 20 28 21 62 54 6f 6b 65 6e 46 6f 75 6e 64  if (!bTokenFound
5bd0: 20 20 26 26 20 20 64 50 6f 69 6e 74 65 72 2e 68    &&  dPointer.h
5be0: 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 22 62  asOwnProperty("b
5bf0: 4b 65 65 70 22 29 29 20 7b 0a 20 20 20 20 20 20  Keep")) {.      
5c00: 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
5c10: 64 50 6f 69 6e 74 65 72 3b 0a 20 20 20 20 20 20  dPointer;.      
5c20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5c30: 20 20 20 20 2f 2f 20 4a 55 4d 50 0a 20 20 20 20      // JUMP.    
5c40: 20 20 20 20 20 20 20 20 2f 2f 20 57 61 72 6e 69          // Warni
5c50: 6e 67 21 20 52 65 63 75 72 73 73 69 6f 6e 21 0a  ng! Recurssion!.
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
5c70: 64 4e 6f 64 65 2e 68 61 73 4f 77 6e 50 72 6f 70  dNode.hasOwnProp
5c80: 65 72 74 79 28 22 3c 3e 22 29 29 20 7b 0a 20 20  erty("<>")) {.  
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
5ca0: 74 20 64 50 6f 69 6e 74 65 72 32 20 3d 20 7b 20  t dPointer2 = { 
5cb0: 22 69 4e 6f 64 65 31 22 3a 20 69 4e 6f 64 65 31  "iNode1": iNode1
5cc0: 2c 20 22 64 4e 6f 64 65 22 3a 20 64 47 72 61 70  , "dNode": dGrap
5cd0: 68 5b 64 4e 6f 64 65 5b 22 3c 3e 22 5d 5d 2c 20  h[dNode["<>"]], 
5ce0: 22 62 4b 65 65 70 22 3a 20 74 72 75 65 20 7d 3b  "bKeep": true };
5cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5d00: 20 79 69 65 6c 64 2a 20 74 68 69 73 2e 5f 67 65   yield* this._ge
5d10: 74 4e 65 78 74 50 6f 69 6e 74 65 72 73 28 64 54  tNextPointers(dT
5d20: 6f 6b 65 6e 2c 20 64 47 72 61 70 68 2c 20 64 50  oken, dGraph, dP
5d30: 6f 69 6e 74 65 72 32 2c 20 62 44 65 62 75 67 29  ointer2, bDebug)
5d40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
5d50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5d60: 20 20 63 61 74 63 68 20 28 65 29 20 7b 0a 20 20    catch (e) {.  
5d70: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
5d80: 65 2e 65 72 72 6f 72 28 65 29 3b 0a 20 20 20 20  e.error(e);.    
5d90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
5da0: 20 70 61 72 73 65 47 72 61 70 68 20 28 64 47 72   parseGraph (dGr
5db0: 61 70 68 2c 20 73 43 6f 75 6e 74 72 79 3d 22 24  aph, sCountry="$
5dc0: 7b 63 6f 75 6e 74 72 79 5f 64 65 66 61 75 6c 74  {country_default
5dd0: 7d 22 2c 20 64 4f 70 74 69 6f 6e 73 3d 6e 75 6c  }", dOptions=nul
5de0: 6c 2c 20 62 53 68 6f 77 52 75 6c 65 49 64 3d 66  l, bShowRuleId=f
5df0: 61 6c 73 65 2c 20 62 44 65 62 75 67 3d 66 61 6c  alse, bDebug=fal
5e00: 73 65 2c 20 62 43 6f 6e 74 65 78 74 3d 66 61 6c  se, bContext=fal
5e10: 73 65 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f  se) {.        //
5e20: 20 70 61 72 73 65 20 67 72 61 70 68 20 77 69 74   parse graph wit
5e30: 68 20 74 6f 6b 65 6e 73 20 66 72 6f 6d 20 74 68  h tokens from th
5e40: 65 20 74 65 78 74 20 61 6e 64 20 65 78 65 63 75  e text and execu
5e50: 74 65 20 61 63 74 69 6f 6e 73 20 65 6e 63 6f 75  te actions encou
5e60: 6e 74 65 72 65 64 0a 20 20 20 20 20 20 20 20 6c  ntered.        l
5e70: 65 74 20 6c 50 6f 69 6e 74 65 72 20 3d 20 5b 5d  et lPointer = []
5e80: 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 62 54  ;.        let bT
5e90: 61 67 41 6e 64 52 65 77 72 69 74 65 20 3d 20 66  agAndRewrite = f
5ea0: 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 74 72  alse;.        tr
5eb0: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
5ec0: 66 6f 72 20 28 6c 65 74 20 5b 69 54 6f 6b 65 6e  for (let [iToken
5ed0: 2c 20 64 54 6f 6b 65 6e 5d 20 6f 66 20 74 68 69  , dToken] of thi
5ee0: 73 2e 6c 54 6f 6b 65 6e 2e 65 6e 74 72 69 65 73  s.lToken.entries
5ef0: 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ()) {.          
5f00: 20 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67        if (bDebug
5f10: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
5f20: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
5f30: 6c 6f 67 28 22 54 4f 4b 45 4e 3a 20 22 20 2b 20  log("TOKEN: " + 
5f40: 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d  dToken["sValue"]
5f50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
5f60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
5f70: 20 20 20 20 20 2f 2f 20 63 68 65 63 6b 20 61 72       // check ar
5f80: 63 73 20 66 6f 72 20 65 61 63 68 20 65 78 69 73  cs for each exis
5f90: 74 69 6e 67 20 70 6f 69 6e 74 65 72 0a 20 20 20  ting pointer.   
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
5fb0: 20 6c 4e 65 78 74 50 6f 69 6e 74 65 72 20 3d 20   lNextPointer = 
5fc0: 5b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  [];.            
5fd0: 20 20 20 20 66 6f 72 20 28 6c 65 74 20 64 50 6f      for (let dPo
5fe0: 69 6e 74 65 72 20 6f 66 20 6c 50 6f 69 6e 74 65  inter of lPointe
5ff0: 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r) {.           
6000: 20 20 20 20 20 20 20 20 20 6c 4e 65 78 74 50 6f           lNextPo
6010: 69 6e 74 65 72 2e 70 75 73 68 28 2e 2e 2e 74 68  inter.push(...th
6020: 69 73 2e 5f 67 65 74 4e 65 78 74 50 6f 69 6e 74  is._getNextPoint
6030: 65 72 73 28 64 54 6f 6b 65 6e 2c 20 64 47 72 61  ers(dToken, dGra
6040: 70 68 2c 20 64 50 6f 69 6e 74 65 72 2c 20 62 44  ph, dPointer, bD
6050: 65 62 75 67 29 29 3b 0a 20 20 20 20 20 20 20 20  ebug));.        
6060: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6070: 20 20 20 20 20 20 20 20 20 20 6c 50 6f 69 6e 74            lPoint
6080: 65 72 20 3d 20 6c 4e 65 78 74 50 6f 69 6e 74 65  er = lNextPointe
6090: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
60a0: 20 20 20 2f 2f 20 63 68 65 63 6b 20 61 72 63 73     // check arcs
60b0: 20 6f 66 20 66 69 72 73 74 20 6e 6f 64 65 73 0a   of first nodes.
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60d0: 6c 50 6f 69 6e 74 65 72 2e 70 75 73 68 28 2e 2e  lPointer.push(..
60e0: 2e 74 68 69 73 2e 5f 67 65 74 4e 65 78 74 50 6f  .this._getNextPo
60f0: 69 6e 74 65 72 73 28 64 54 6f 6b 65 6e 2c 20 64  inters(dToken, d
6100: 47 72 61 70 68 2c 20 7b 20 22 69 4e 6f 64 65 31  Graph, { "iNode1
6110: 22 3a 20 69 54 6f 6b 65 6e 2c 20 22 64 4e 6f 64  ": iToken, "dNod
6120: 65 22 3a 20 64 47 72 61 70 68 5b 30 5d 20 7d 2c  e": dGraph[0] },
6130: 20 62 44 65 62 75 67 29 29 3b 0a 20 20 20 20 20   bDebug));.     
6140: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63 68             // ch
6150: 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  eck if there is 
6160: 72 75 6c 65 73 20 74 6f 20 63 68 65 63 6b 20 66  rules to check f
6170: 6f 72 20 65 61 63 68 20 70 6f 69 6e 74 65 72 0a  or each pointer.
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6190: 66 6f 72 20 28 6c 65 74 20 64 50 6f 69 6e 74 65  for (let dPointe
61a0: 72 20 6f 66 20 6c 50 6f 69 6e 74 65 72 29 20 7b  r of lPointer) {
61b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
61c0: 20 20 20 20 20 69 66 20 28 64 50 6f 69 6e 74 65       if (dPointe
61d0: 72 5b 22 64 4e 6f 64 65 22 5d 2e 68 61 73 4f 77  r["dNode"].hasOw
61e0: 6e 50 72 6f 70 65 72 74 79 28 22 3c 72 75 6c 65  nProperty("<rule
61f0: 73 3e 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20  s>")) {.        
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 6c 65 74 20 62 43 68 61 6e 67 65 20 3d 20 74 68  let bChange = th
6220: 69 73 2e 5f 65 78 65 63 75 74 65 41 63 74 69 6f  is._executeActio
6230: 6e 73 28 64 47 72 61 70 68 2c 20 64 50 6f 69 6e  ns(dGraph, dPoin
6240: 74 65 72 5b 22 64 4e 6f 64 65 22 5d 5b 22 3c 72  ter["dNode"]["<r
6250: 75 6c 65 73 3e 22 5d 2c 20 64 50 6f 69 6e 74 65  ules>"], dPointe
6260: 72 5b 22 69 4e 6f 64 65 31 22 5d 2d 31 2c 20 69  r["iNode1"]-1, i
6270: 54 6f 6b 65 6e 2c 20 64 4f 70 74 69 6f 6e 73 2c  Token, dOptions,
6280: 20 73 43 6f 75 6e 74 72 79 2c 20 62 53 68 6f 77   sCountry, bShow
6290: 52 75 6c 65 49 64 2c 20 62 44 65 62 75 67 2c 20  RuleId, bDebug, 
62a0: 62 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  bContext);.     
62b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62c0: 20 20 20 69 66 20 28 62 43 68 61 6e 67 65 29 20     if (bChange) 
62d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
62e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 54                bT
62f0: 61 67 41 6e 64 52 65 77 72 69 74 65 20 3d 20 74  agAndRewrite = t
6300: 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rue;.           
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
6320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6330: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
6340: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6350: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 63     }.        } c
6360: 61 74 63 68 20 28 65 29 20 7b 0a 20 20 20 20 20  atch (e) {.     
6370: 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 65         console.e
6380: 72 72 6f 72 28 65 29 3b 0a 20 20 20 20 20 20 20  rror(e);.       
6390: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 62   }.        if (b
63a0: 54 61 67 41 6e 64 52 65 77 72 69 74 65 29 20 7b  TagAndRewrite) {
63b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69  .            thi
63c0: 73 2e 72 65 77 72 69 74 65 46 72 6f 6d 54 61 67  s.rewriteFromTag
63d0: 73 28 62 44 65 62 75 67 29 3b 0a 20 20 20 20 20  s(bDebug);.     
63e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20     }.        if 
63f0: 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20  (bDebug) {.     
6400: 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c         console.l
6410: 6f 67 28 74 68 69 73 2e 61 73 53 74 72 69 6e 67  og(this.asString
6420: 28 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ());.        }. 
6430: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68         return th
6440: 69 73 2e 73 53 65 6e 74 65 6e 63 65 3b 0a 20 20  is.sSentence;.  
6450: 20 20 7d 0a 0a 20 20 20 20 5f 65 78 65 63 75 74    }..    _execut
6460: 65 41 63 74 69 6f 6e 73 20 28 64 47 72 61 70 68  eActions (dGraph
6470: 2c 20 64 4e 6f 64 65 2c 20 6e 54 6f 6b 65 6e 4f  , dNode, nTokenO
6480: 66 66 73 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65  ffset, nLastToke
6490: 6e 2c 20 64 4f 70 74 69 6f 6e 73 2c 20 73 43 6f  n, dOptions, sCo
64a0: 75 6e 74 72 79 2c 20 62 53 68 6f 77 52 75 6c 65  untry, bShowRule
64b0: 49 64 2c 20 62 44 65 62 75 67 2c 20 62 43 6f 6e  Id, bDebug, bCon
64c0: 74 65 78 74 29 20 7b 0a 20 20 20 20 20 20 20 20  text) {.        
64d0: 2f 2f 20 65 78 65 63 75 74 65 20 61 63 74 69 6f  // execute actio
64e0: 6e 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  ns found in the 
64f0: 44 41 52 47 0a 20 20 20 20 20 20 20 20 6c 65 74  DARG.        let
6500: 20 62 43 68 61 6e 67 65 20 3d 20 66 61 6c 73 65   bChange = false
6510: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c  ;.        for (l
6520: 65 74 20 5b 73 4c 69 6e 65 49 64 2c 20 6e 65 78  et [sLineId, nex
6530: 74 4e 6f 64 65 4b 65 79 5d 20 6f 66 20 4f 62 6a  tNodeKey] of Obj
6540: 65 63 74 2e 65 6e 74 72 69 65 73 28 64 4e 6f 64  ect.entries(dNod
6550: 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  e)) {.          
6560: 20 20 6c 65 74 20 62 43 6f 6e 64 4d 65 6d 6f 20    let bCondMemo 
6570: 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  = null;.        
6580: 20 20 20 20 66 6f 72 20 28 6c 65 74 20 73 52 75      for (let sRu
6590: 6c 65 49 64 20 6f 66 20 64 47 72 61 70 68 5b 6e  leId of dGraph[n
65a0: 65 78 74 4e 6f 64 65 4b 65 79 5d 29 20 7b 0a 20  extNodeKey]) {. 
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
65c0: 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ry {.           
65d0: 20 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65           if (bDe
65e0: 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20  bug) {.         
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
6600: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 20 3e  onsole.log("   >
6610: 54 52 59 3a 20 22 20 2b 20 73 52 75 6c 65 49 64  TRY: " + sRuleId
6620: 20 2b 20 22 20 22 20 2b 20 73 4c 69 6e 65 49 64   + " " + sLineId
6630: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
6640: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
6660: 20 5b 73 4f 70 74 69 6f 6e 2c 20 73 46 75 6e 63   [sOption, sFunc
6670: 43 6f 6e 64 2c 20 63 41 63 74 69 6f 6e 54 79 70  Cond, cActionTyp
6680: 65 2c 20 73 57 68 61 74 2c 20 2e 2e 2e 65 41 63  e, sWhat, ...eAc
6690: 74 5d 20 3d 20 67 63 5f 72 75 6c 65 73 5f 67 72  t] = gc_rules_gr
66a0: 61 70 68 2e 64 52 75 6c 65 5b 73 52 75 6c 65 49  aph.dRule[sRuleI
66b0: 64 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d];.            
66c0: 20 20 20 20 20 20 20 20 2f 2f 20 53 75 67 67 65          // Sugge
66d0: 73 74 69 6f 6e 20 20 20 20 5b 20 6f 70 74 69 6f  stion    [ optio
66e0: 6e 2c 20 63 6f 6e 64 69 74 69 6f 6e 2c 20 22 2d  n, condition, "-
66f0: 22 2c 20 72 65 70 6c 61 63 65 6d 65 6e 74 2f 73  ", replacement/s
6700: 75 67 67 65 73 74 69 6f 6e 2f 61 63 74 69 6f 6e  uggestion/action
6710: 2c 20 69 54 6f 6b 65 6e 53 74 61 72 74 2c 20 69  , iTokenStart, i
6720: 54 6f 6b 65 6e 45 6e 64 2c 20 63 53 74 61 72 74  TokenEnd, cStart
6730: 4c 69 6d 69 74 2c 20 63 45 6e 64 4c 69 6d 69 74  Limit, cEndLimit
6740: 2c 20 62 43 61 73 65 53 76 74 79 2c 20 6e 50 72  , bCaseSvty, nPr
6750: 69 6f 72 69 74 79 2c 20 73 4d 65 73 73 61 67 65  iority, sMessage
6760: 2c 20 73 55 52 4c 20 5d 0a 20 20 20 20 20 20 20  , sURL ].       
6770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
6780: 54 65 78 74 50 72 6f 63 65 73 73 6f 72 20 5b 20  TextProcessor [ 
6790: 6f 70 74 69 6f 6e 2c 20 63 6f 6e 64 69 74 69 6f  option, conditio
67a0: 6e 2c 20 22 7e 22 2c 20 72 65 70 6c 61 63 65 6d  n, "~", replacem
67b0: 65 6e 74 2f 73 75 67 67 65 73 74 69 6f 6e 2f 61  ent/suggestion/a
67c0: 63 74 69 6f 6e 2c 20 69 54 6f 6b 65 6e 53 74 61  ction, iTokenSta
67d0: 72 74 2c 20 69 54 6f 6b 65 6e 45 6e 64 2c 20 62  rt, iTokenEnd, b
67e0: 43 61 73 65 53 76 74 79 20 5d 0a 20 20 20 20 20  CaseSvty ].     
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6800: 2f 20 44 69 73 61 6d 62 69 67 75 61 74 6f 72 20  / Disambiguator 
6810: 5b 20 6f 70 74 69 6f 6e 2c 20 63 6f 6e 64 69 74  [ option, condit
6820: 69 6f 6e 2c 20 22 3d 22 2c 20 72 65 70 6c 61 63  ion, "=", replac
6830: 65 6d 65 6e 74 2f 73 75 67 67 65 73 74 69 6f 6e  ement/suggestion
6840: 2f 61 63 74 69 6f 6e 20 5d 0a 20 20 20 20 20 20  /action ].      
6850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
6860: 20 54 61 67 20 20 20 20 20 20 20 20 20 20 20 5b   Tag           [
6870: 20 6f 70 74 69 6f 6e 2c 20 63 6f 6e 64 69 74 69   option, conditi
6880: 6f 6e 2c 20 22 2f 22 2c 20 72 65 70 6c 61 63 65  on, "/", replace
6890: 6d 65 6e 74 2f 73 75 67 67 65 73 74 69 6f 6e 2f  ment/suggestion/
68a0: 61 63 74 69 6f 6e 2c 20 69 54 6f 6b 65 6e 53 74  action, iTokenSt
68b0: 61 72 74 2c 20 69 54 6f 6b 65 6e 45 6e 64 20 5d  art, iTokenEnd ]
68c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
68d0: 20 20 20 20 20 2f 2f 20 49 6d 6d 75 6e 69 74 79       // Immunity
68e0: 20 20 20 20 20 20 5b 20 6f 70 74 69 6f 6e 2c 20        [ option, 
68f0: 63 6f 6e 64 69 74 69 6f 6e 2c 20 22 25 22 2c 20  condition, "%", 
6900: 22 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  "",             
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
6920: 54 6f 6b 65 6e 53 74 61 72 74 2c 20 69 54 6f 6b  TokenStart, iTok
6930: 65 6e 45 6e 64 20 5d 0a 20 20 20 20 20 20 20 20  enEnd ].        
6940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 54              // T
6950: 65 73 74 20 20 20 20 20 20 20 20 20 20 5b 20 6f  est          [ o
6960: 70 74 69 6f 6e 2c 20 63 6f 6e 64 69 74 69 6f 6e  ption, condition
6970: 2c 20 22 3e 22 2c 20 22 22 20 5d 0a 20 20 20 20  , ">", "" ].    
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6990: 69 66 20 28 21 73 4f 70 74 69 6f 6e 20 7c 7c 20  if (!sOption || 
69a0: 64 4f 70 74 69 6f 6e 73 2e 67 6c 5f 67 65 74 28  dOptions.gl_get(
69b0: 73 4f 70 74 69 6f 6e 2c 20 66 61 6c 73 65 29 29  sOption, false))
69c0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
69d0: 20 20 20 20 20 20 20 20 20 20 20 62 43 6f 6e 64             bCond
69e0: 4d 65 6d 6f 20 3d 20 21 73 46 75 6e 63 43 6f 6e  Memo = !sFuncCon
69f0: 64 20 7c 7c 20 6f 45 76 61 6c 46 75 6e 63 5b 73  d || oEvalFunc[s
6a00: 46 75 6e 63 43 6f 6e 64 5d 28 74 68 69 73 2e 6c  FuncCond](this.l
6a10: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 4f 66 66  Token, nTokenOff
6a20: 73 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 2c  set, nLastToken,
6a30: 20 73 43 6f 75 6e 74 72 79 2c 20 62 43 6f 6e 64   sCountry, bCond
6a40: 4d 65 6d 6f 2c 20 74 68 69 73 2e 64 54 61 67 73  Memo, this.dTags
6a50: 2c 20 74 68 69 73 2e 73 53 65 6e 74 65 6e 63 65  , this.sSentence
6a60: 2c 20 74 68 69 73 2e 73 53 65 6e 74 65 6e 63 65  , this.sSentence
6a70: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
6a90: 62 43 6f 6e 64 4d 65 6d 6f 29 20 7b 0a 20 20 20  bCondMemo) {.   
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ab0: 20 20 20 20 20 20 20 20 20 69 66 20 28 63 41 63           if (cAc
6ac0: 74 69 6f 6e 54 79 70 65 20 3d 3d 20 22 2d 22 29  tionType == "-")
6ad0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6af0: 20 20 20 2f 2f 20 67 72 61 6d 6d 61 72 20 65 72     // grammar er
6b00: 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ror.            
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b20: 20 20 20 20 6c 65 74 20 5b 69 54 6f 6b 65 6e 53      let [iTokenS
6b30: 74 61 72 74 2c 20 69 54 6f 6b 65 6e 45 6e 64 2c  tart, iTokenEnd,
6b40: 20 63 53 74 61 72 74 4c 69 6d 69 74 2c 20 63 45   cStartLimit, cE
6b50: 6e 64 4c 69 6d 69 74 2c 20 62 43 61 73 65 53 76  ndLimit, bCaseSv
6b60: 74 79 2c 20 6e 50 72 69 6f 72 69 74 79 2c 20 73  ty, nPriority, s
6b70: 4d 65 73 73 61 67 65 2c 20 73 55 52 4c 5d 20 3d  Message, sURL] =
6b80: 20 65 41 63 74 3b 0a 20 20 20 20 20 20 20 20 20   eAct;.         
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ba0: 20 20 20 20 20 20 20 6c 65 74 20 6e 54 6f 6b 65         let nToke
6bb0: 6e 45 72 72 6f 72 53 74 61 72 74 20 3d 20 28 69  nErrorStart = (i
6bc0: 54 6f 6b 65 6e 53 74 61 72 74 20 3e 20 30 29 20  TokenStart > 0) 
6bd0: 3f 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 20 2b  ? nTokenOffset +
6be0: 20 69 54 6f 6b 65 6e 53 74 61 72 74 20 3a 20 6e   iTokenStart : n
6bf0: 4c 61 73 74 54 6f 6b 65 6e 20 2b 20 69 54 6f 6b  LastToken + iTok
6c00: 65 6e 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20  enStart;.       
6c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c20: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 74 68           if (!th
6c30: 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e  is.lToken[nToken
6c40: 45 72 72 6f 72 53 74 61 72 74 5d 2e 68 61 73 4f  ErrorStart].hasO
6c50: 77 6e 50 72 6f 70 65 72 74 79 28 22 62 49 6d 6d  wnProperty("bImm
6c60: 75 6e 65 22 29 29 20 7b 0a 20 20 20 20 20 20 20  une")) {.       
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
6c90: 20 6e 54 6f 6b 65 6e 45 72 72 6f 72 45 6e 64 20   nTokenErrorEnd 
6ca0: 3d 20 28 69 54 6f 6b 65 6e 45 6e 64 20 3e 20 30  = (iTokenEnd > 0
6cb0: 29 20 3f 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74  ) ? nTokenOffset
6cc0: 20 2b 20 69 54 6f 6b 65 6e 45 6e 64 20 3a 20 6e   + iTokenEnd : n
6cd0: 4c 61 73 74 54 6f 6b 65 6e 20 2b 20 69 54 6f 6b  LastToken + iTok
6ce0: 65 6e 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20  enEnd;.         
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d00: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e             let n
6d10: 45 72 72 6f 72 53 74 61 72 74 20 3d 20 74 68 69  ErrorStart = thi
6d20: 73 2e 6e 4f 66 66 73 65 74 57 69 74 68 69 6e 50  s.nOffsetWithinP
6d30: 61 72 61 67 72 61 70 68 20 2b 20 28 28 63 53 74  aragraph + ((cSt
6d40: 61 72 74 4c 69 6d 69 74 20 3d 3d 20 22 3c 22 29  artLimit == "<")
6d50: 20 3f 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e   ? this.lToken[n
6d60: 54 6f 6b 65 6e 45 72 72 6f 72 53 74 61 72 74 5d  TokenErrorStart]
6d70: 5b 22 6e 53 74 61 72 74 22 5d 20 3a 20 74 68 69  ["nStart"] : thi
6d80: 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 45  s.lToken[nTokenE
6d90: 72 72 6f 72 53 74 61 72 74 5d 5b 22 6e 45 6e 64  rrorStart]["nEnd
6da0: 22 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  "]);.           
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dc0: 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e 45 72           let nEr
6dd0: 72 6f 72 45 6e 64 20 3d 20 74 68 69 73 2e 6e 4f  rorEnd = this.nO
6de0: 66 66 73 65 74 57 69 74 68 69 6e 50 61 72 61 67  ffsetWithinParag
6df0: 72 61 70 68 20 2b 20 28 28 63 45 6e 64 4c 69 6d  raph + ((cEndLim
6e00: 69 74 20 3d 3d 20 22 3e 22 29 20 3f 20 74 68 69  it == ">") ? thi
6e10: 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 45  s.lToken[nTokenE
6e20: 72 72 6f 72 45 6e 64 5d 5b 22 6e 45 6e 64 22 5d  rrorEnd]["nEnd"]
6e30: 20 3a 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e   : this.lToken[n
6e40: 54 6f 6b 65 6e 45 72 72 6f 72 45 6e 64 5d 5b 22  TokenErrorEnd]["
6e50: 6e 53 74 61 72 74 22 5d 29 3b 0a 20 20 20 20 20  nStart"]);.     
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
6e80: 66 20 28 21 74 68 69 73 2e 64 45 72 72 6f 72 2e  f (!this.dError.
6e90: 68 61 73 28 6e 45 72 72 6f 72 53 74 61 72 74 29  has(nErrorStart)
6ea0: 20 7c 7c 20 6e 50 72 69 6f 72 69 74 79 20 3e 20   || nPriority > 
6eb0: 74 68 69 73 2e 64 45 72 72 6f 72 50 72 69 6f 72  this.dErrorPrior
6ec0: 69 74 79 2e 67 6c 5f 67 65 74 28 6e 45 72 72 6f  ity.gl_get(nErro
6ed0: 72 53 74 61 72 74 2c 20 2d 31 29 29 20 7b 0a 20  rStart, -1)) {. 
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f00: 20 20 20 20 20 20 20 74 68 69 73 2e 64 45 72 72         this.dErr
6f10: 6f 72 2e 73 65 74 28 6e 45 72 72 6f 72 53 74 61  or.set(nErrorSta
6f20: 72 74 2c 20 74 68 69 73 2e 5f 63 72 65 61 74 65  rt, this._create
6f30: 45 72 72 6f 72 46 72 6f 6d 54 6f 6b 65 6e 73 28  ErrorFromTokens(
6f40: 73 57 68 61 74 2c 20 6e 54 6f 6b 65 6e 4f 66 66  sWhat, nTokenOff
6f50: 73 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 2c  set, nLastToken,
6f60: 20 6e 54 6f 6b 65 6e 45 72 72 6f 72 53 74 61 72   nTokenErrorStar
6f70: 74 2c 20 6e 45 72 72 6f 72 53 74 61 72 74 2c 20  t, nErrorStart, 
6f80: 6e 45 72 72 6f 72 45 6e 64 2c 20 73 4c 69 6e 65  nErrorEnd, sLine
6f90: 49 64 2c 20 73 52 75 6c 65 49 64 2c 20 62 43 61  Id, sRuleId, bCa
6fa0: 73 65 53 76 74 79 2c 20 73 4d 65 73 73 61 67 65  seSvty, sMessage
6fb0: 2c 20 73 55 52 4c 2c 20 62 53 68 6f 77 52 75 6c  , sURL, bShowRul
6fc0: 65 49 64 2c 20 73 4f 70 74 69 6f 6e 2c 20 62 43  eId, sOption, bC
6fd0: 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 20 20  ontext));.      
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7000: 20 20 74 68 69 73 2e 64 45 72 72 6f 72 50 72 69    this.dErrorPri
7010: 6f 72 69 74 79 2e 73 65 74 28 6e 45 72 72 6f 72  ority.set(nError
7020: 53 74 61 72 74 2c 20 6e 50 72 69 6f 72 69 74 79  Start, nPriority
7030: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7050: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62             if (b
7060: 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20  Debug) {.       
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
70a0: 28 22 20 20 20 20 4e 45 57 5f 45 52 52 4f 52 3a  ("    NEW_ERROR:
70b0: 20 22 2c 20 20 74 68 69 73 2e 64 45 72 72 6f 72   ",  this.dError
70c0: 2e 67 65 74 28 6e 45 72 72 6f 72 53 74 61 72 74  .get(nErrorStart
70d0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7120: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7140: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7160: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7180: 65 6c 73 65 20 69 66 20 28 63 41 63 74 69 6f 6e  else if (cAction
7190: 54 79 70 65 20 3d 3d 20 22 7e 22 29 20 7b 0a 20  Type == "~") {. 
71a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
71c0: 2f 20 74 65 78 74 20 70 72 6f 63 65 73 73 6f 72  / text processor
71d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71f0: 20 6c 65 74 20 6e 54 6f 6b 65 6e 53 74 61 72 74   let nTokenStart
7200: 20 3d 20 28 65 41 63 74 5b 30 5d 20 3e 20 30 29   = (eAct[0] > 0)
7210: 20 3f 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 20   ? nTokenOffset 
7220: 2b 20 65 41 63 74 5b 30 5d 20 3a 20 6e 4c 61 73  + eAct[0] : nLas
7230: 74 54 6f 6b 65 6e 20 2b 20 65 41 63 74 5b 30 5d  tToken + eAct[0]
7240: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 20 20 6c 65 74 20 6e 54 6f 6b 65 6e 45 6e 64 20    let nTokenEnd 
7270: 3d 20 28 65 41 63 74 5b 31 5d 20 3e 20 30 29 20  = (eAct[1] > 0) 
7280: 3f 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 20 2b  ? nTokenOffset +
7290: 20 65 41 63 74 5b 31 5d 20 3a 20 6e 4c 61 73 74   eAct[1] : nLast
72a0: 54 6f 6b 65 6e 20 2b 20 65 41 63 74 5b 31 5d 3b  Token + eAct[1];
72b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72d0: 20 74 68 69 73 2e 5f 74 61 67 41 6e 64 50 72 65   this._tagAndPre
72e0: 70 61 72 65 54 6f 6b 65 6e 46 6f 72 52 65 77 72  pareTokenForRewr
72f0: 69 74 69 6e 67 28 73 57 68 61 74 2c 20 6e 54 6f  iting(sWhat, nTo
7300: 6b 65 6e 53 74 61 72 74 2c 20 6e 54 6f 6b 65 6e  kenStart, nToken
7310: 45 6e 64 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65  End, nTokenOffse
7320: 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 2c 20 65  t, nLastToken, e
7330: 41 63 74 5b 32 5d 2c 20 62 44 65 62 75 67 29 3b  Act[2], bDebug);
7340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 20 62 43 68 61 6e 67 65 20 3d 20 74 72 75 65 3b   bChange = true;
7370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7390: 20 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20   if (bDebug) {. 
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73c0: 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 60     console.log(`
73d0: 20 20 20 20 54 45 58 54 5f 50 52 4f 43 45 53 53      TEXT_PROCESS
73e0: 4f 52 3a 20 5b 24 7b 74 68 69 73 2e 6c 54 6f 6b  OR: [${this.lTok
73f0: 65 6e 5b 6e 54 6f 6b 65 6e 53 74 61 72 74 5d 5b  en[nTokenStart][
7400: 22 73 56 61 6c 75 65 22 5d 7d 3a 24 7b 74 68 69  "sValue"]}:${thi
7410: 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 45  s.lToken[nTokenE
7420: 6e 64 5d 5b 22 73 56 61 6c 75 65 22 5d 7d 5d 20  nd]["sValue"]}] 
7430: 20 3e 20 24 7b 73 57 68 61 74 7d 60 29 3b 0a 20   > ${sWhat}`);. 
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7490: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
74a0: 69 66 20 28 63 41 63 74 69 6f 6e 54 79 70 65 20  if (cActionType 
74b0: 3d 3d 20 22 3d 22 29 20 7b 0a 20 20 20 20 20 20  == "=") {.      
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74d0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 64 69 73            // dis
74e0: 61 6d 62 69 67 75 61 74 69 6f 6e 0a 20 20 20 20  ambiguation.    
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7500: 20 20 20 20 20 20 20 20 20 20 20 20 6f 45 76 61              oEva
7510: 6c 46 75 6e 63 5b 73 57 68 61 74 5d 28 74 68 69  lFunc[sWhat](thi
7520: 73 2e 6c 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  s.lToken, nToken
7530: 4f 66 66 73 65 74 2c 20 6e 4c 61 73 74 54 6f 6b  Offset, nLastTok
7540: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
7550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7560: 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67 29       if (bDebug)
7570: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7590: 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c         console.l
75a0: 6f 67 28 60 20 20 20 20 44 49 53 41 4d 42 49 47  og(`    DISAMBIG
75b0: 55 41 54 4f 52 3a 20 28 24 7b 73 57 68 61 74 7d  UATOR: (${sWhat}
75c0: 29 20 20 5b 24 7b 74 68 69 73 2e 6c 54 6f 6b 65  )  [${this.lToke
75d0: 6e 5b 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2b 31  n[nTokenOffset+1
75e0: 5d 5b 22 73 56 61 6c 75 65 22 5d 7d 3a 24 7b 74  ]["sValue"]}:${t
75f0: 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 4c 61 73 74  his.lToken[nLast
7600: 54 6f 6b 65 6e 5d 5b 22 73 56 61 6c 75 65 22 5d  Token]["sValue"]
7610: 7d 5d 60 29 3b 0a 20 20 20 20 20 20 20 20 20 20  }]`);.          
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7650: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 20 20 65 6c 73 65 20 69 66 20 28 63 41 63 74 69    else if (cActi
7680: 6f 6e 54 79 70 65 20 3d 3d 20 22 3e 22 29 20 7b  onType == ">") {
7690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76b0: 20 2f 2f 20 77 65 20 64 6f 20 6e 6f 74 68 69 6e   // we do nothin
76c0: 67 2c 20 74 68 69 73 20 74 65 73 74 20 69 73 20  g, this test is 
76d0: 6a 75 73 74 20 61 20 63 6f 6e 64 69 74 69 6f 6e  just a condition
76e0: 20 74 6f 20 61 70 70 6c 79 20 61 6c 6c 20 66 6f   to apply all fo
76f0: 6c 6c 6f 77 69 6e 67 20 61 63 74 69 6f 6e 73 0a  llowing actions.
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7720: 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20  if (bDebug) {.  
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7750: 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20    console.log(" 
7760: 20 20 20 43 4f 4e 44 5f 4f 4b 22 29 3b 0a 20 20     COND_OK");.  
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77c0: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
77d0: 66 20 28 63 41 63 74 69 6f 6e 54 79 70 65 20 3d  f (cActionType =
77e0: 3d 20 22 2f 22 29 20 7b 0a 20 20 20 20 20 20 20  = "/") {.       
77f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7800: 20 20 20 20 20 20 20 20 20 2f 2f 20 54 61 67 0a           // Tag.
7810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7830: 6c 65 74 20 6e 54 6f 6b 65 6e 53 74 61 72 74 20  let nTokenStart 
7840: 3d 20 28 65 41 63 74 5b 30 5d 20 3e 20 30 29 20  = (eAct[0] > 0) 
7850: 3f 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 20 2b  ? nTokenOffset +
7860: 20 65 41 63 74 5b 30 5d 20 3a 20 6e 4c 61 73 74   eAct[0] : nLast
7870: 54 6f 6b 65 6e 20 2b 20 65 41 63 74 5b 30 5d 3b  Token + eAct[0];
7880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78a0: 20 6c 65 74 20 6e 54 6f 6b 65 6e 45 6e 64 20 3d   let nTokenEnd =
78b0: 20 28 65 41 63 74 5b 31 5d 20 3e 20 30 29 20 3f   (eAct[1] > 0) ?
78c0: 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 20 2b 20   nTokenOffset + 
78d0: 65 41 63 74 5b 31 5d 20 3a 20 6e 4c 61 73 74 54  eAct[1] : nLastT
78e0: 6f 6b 65 6e 20 2b 20 65 41 63 74 5b 31 5d 3b 0a  oken + eAct[1];.
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 66 6f 72 20 28 6c 65 74 20 69 20 3d 20 6e 54 6f  for (let i = nTo
7920: 6b 65 6e 53 74 61 72 74 3b 20 69 20 3c 3d 20 6e  kenStart; i <= n
7930: 54 6f 6b 65 6e 45 6e 64 3b 20 69 2b 2b 29 20 7b  TokenEnd; i++) {
7940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 6c 54       if (this.lT
7970: 6f 6b 65 6e 5b 69 5d 2e 68 61 73 4f 77 6e 50 72  oken[i].hasOwnPr
7980: 6f 70 65 72 74 79 28 22 61 54 61 67 73 22 29 29  operty("aTags"))
7990: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79b0: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
79c0: 6c 54 6f 6b 65 6e 5b 69 5d 5b 22 61 54 61 67 73  lToken[i]["aTags
79d0: 22 5d 2e 61 64 64 28 2e 2e 2e 73 57 68 61 74 2e  "].add(...sWhat.
79e0: 73 70 6c 69 74 28 22 7c 22 29 29 0a 20 20 20 20  split("|")).    
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a40: 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 69 5d 5b   this.lToken[i][
7a50: 22 61 54 61 67 73 22 5d 20 3d 20 6e 65 77 20 53  "aTags"] = new S
7a60: 65 74 28 73 57 68 61 74 2e 73 70 6c 69 74 28 22  et(sWhat.split("
7a70: 7c 22 29 29 3b 0a 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 20 7d 0a 20 20 20 20            }.    
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ab0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
7ae0: 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20   (bDebug) {.    
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b10: 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 60 20 20 20  console.log(`   
7b20: 20 54 41 47 3a 20 20 24 7b 73 57 68 61 74 7d 20   TAG:  ${sWhat} 
7b30: 3e 20 5b 24 7b 74 68 69 73 2e 6c 54 6f 6b 65 6e  > [${this.lToken
7b40: 5b 6e 54 6f 6b 65 6e 53 74 61 72 74 5d 5b 22 73  [nTokenStart]["s
7b50: 56 61 6c 75 65 22 5d 7d 3a 24 7b 74 68 69 73 2e  Value"]}:${this.
7b60: 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 45 6e 64  lToken[nTokenEnd
7b70: 5d 5b 22 73 56 61 6c 75 65 22 5d 7d 5d 60 29 3b  ]["sValue"]}]`);
7b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ba0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bc0: 20 20 20 69 66 20 28 21 74 68 69 73 2e 64 54 61     if (!this.dTa
7bd0: 67 73 2e 68 61 73 28 73 57 68 61 74 29 29 20 7b  gs.has(sWhat)) {
7be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 20 20 20 20 20 74 68 69 73 2e 64 54 61 67 73 2e       this.dTags.
7c10: 73 65 74 28 73 57 68 61 74 2c 20 5b 6e 54 6f 6b  set(sWhat, [nTok
7c20: 65 6e 53 74 61 72 74 2c 20 6e 54 6f 6b 65 6e 53  enStart, nTokenS
7c30: 74 61 72 74 5d 29 3b 0a 20 20 20 20 20 20 20 20  tart]);.        
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c50: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
7c60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c80: 20 20 20 20 20 74 68 69 73 2e 64 54 61 67 73 2e       this.dTags.
7c90: 73 65 74 28 73 57 68 61 74 2c 20 5b 4d 61 74 68  set(sWhat, [Math
7ca0: 2e 6d 69 6e 28 6e 54 6f 6b 65 6e 53 74 61 72 74  .min(nTokenStart
7cb0: 2c 20 74 68 69 73 2e 64 54 61 67 73 2e 67 65 74  , this.dTags.get
7cc0: 28 73 57 68 61 74 29 5b 30 5d 29 2c 20 4d 61 74  (sWhat)[0]), Mat
7cd0: 68 2e 6d 61 78 28 6e 54 6f 6b 65 6e 45 6e 64 2c  h.max(nTokenEnd,
7ce0: 20 74 68 69 73 2e 64 54 61 67 73 2e 67 65 74 28   this.dTags.get(
7cf0: 73 57 68 61 74 29 5b 31 5d 29 5d 29 3b 0a 20 20  sWhat)[1])]);.  
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
7d60: 66 20 28 63 41 63 74 69 6f 6e 54 79 70 65 20 3d  f (cActionType =
7d70: 3d 20 22 25 22 29 20 7b 0a 20 20 20 20 20 20 20  = "%") {.       
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d90: 20 20 20 20 20 20 20 20 20 2f 2f 20 69 6d 6d 75           // immu
7da0: 6e 69 74 79 0a 20 20 20 20 20 20 20 20 20 20 20  nity.           
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67 29       if (bDebug)
7dd0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7df0: 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c         console.l
7e00: 6f 67 28 22 20 20 20 20 49 4d 4d 55 4e 49 54 59  og("    IMMUNITY
7e10: 3a 20 22 20 2b 20 5f 72 75 6c 65 73 5f 67 72 61  : " + _rules_gra
7e20: 70 68 2e 64 52 75 6c 65 5b 73 52 75 6c 65 49 64  ph.dRule[sRuleId
7e30: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 20 20 20 20 20 20 6c 65 74 20 6e 54 6f 6b 65 6e        let nToken
7e80: 53 74 61 72 74 20 3d 20 28 65 41 63 74 5b 30 5d  Start = (eAct[0]
7e90: 20 3e 20 30 29 20 3f 20 6e 54 6f 6b 65 6e 4f 66   > 0) ? nTokenOf
7ea0: 66 73 65 74 20 2b 20 65 41 63 74 5b 30 5d 20 3a  fset + eAct[0] :
7eb0: 20 6e 4c 61 73 74 54 6f 6b 65 6e 20 2b 20 65 41   nLastToken + eA
7ec0: 63 74 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 20  ct[0];.         
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 20 20 20 20 20 20 20 6c 65 74 20 6e 54 6f 6b 65         let nToke
7ef0: 6e 45 6e 64 20 3d 20 28 65 41 63 74 5b 31 5d 20  nEnd = (eAct[1] 
7f00: 3e 20 30 29 20 3f 20 6e 54 6f 6b 65 6e 4f 66 66  > 0) ? nTokenOff
7f10: 73 65 74 20 2b 20 65 41 63 74 5b 31 5d 20 3a 20  set + eAct[1] : 
7f20: 6e 4c 61 73 74 54 6f 6b 65 6e 20 2b 20 65 41 63  nLastToken + eAc
7f30: 74 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  t[1];.          
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f50: 20 20 20 20 20 20 69 66 20 28 6e 54 6f 6b 65 6e        if (nToken
7f60: 45 6e 64 20 2d 20 6e 54 6f 6b 65 6e 53 74 61 72  End - nTokenStar
7f70: 74 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  t == 0) {.      
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 20 20 20 20 74 68                th
7fa0: 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e  is.lToken[nToken
7fb0: 53 74 61 72 74 5d 5b 22 62 49 6d 6d 75 6e 65 22  Start]["bImmune"
7fc0: 5d 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20  ] = true;.      
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
7ff0: 74 20 6e 45 72 72 6f 72 53 74 61 72 74 20 3d 20  t nErrorStart = 
8000: 74 68 69 73 2e 6e 4f 66 66 73 65 74 57 69 74 68  this.nOffsetWith
8010: 69 6e 50 61 72 61 67 72 61 70 68 20 2b 20 74 68  inParagraph + th
8020: 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e  is.lToken[nToken
8030: 53 74 61 72 74 5d 5b 22 6e 53 74 61 72 74 22 5d  Start]["nStart"]
8040: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 64        if (this.d
8070: 45 72 72 6f 72 2e 68 61 73 28 6e 45 72 72 6f 72  Error.has(nError
8080: 53 74 61 72 74 29 29 20 7b 0a 20 20 20 20 20 20  Start)) {.      
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80b0: 20 20 74 68 69 73 2e 64 45 72 72 6f 72 2e 64 65    this.dError.de
80c0: 6c 65 74 65 28 6e 45 72 72 6f 72 53 74 61 72 74  lete(nErrorStart
80d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
80e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8110: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
8120: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8140: 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 69        for (let i
8150: 20 3d 20 6e 54 6f 6b 65 6e 53 74 61 72 74 3b 20   = nTokenStart; 
8160: 20 69 20 3c 3d 20 6e 54 6f 6b 65 6e 45 6e 64 3b   i <= nTokenEnd;
8170: 20 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20    i++) {.       
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81a0: 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 69 5d 5b   this.lToken[i][
81b0: 22 62 49 6d 6d 75 6e 65 22 5d 20 3d 20 74 72 75  "bImmune"] = tru
81c0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81e0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e             let n
81f0: 45 72 72 6f 72 53 74 61 72 74 20 3d 20 74 68 69  ErrorStart = thi
8200: 73 2e 6e 4f 66 66 73 65 74 57 69 74 68 69 6e 50  s.nOffsetWithinP
8210: 61 72 61 67 72 61 70 68 20 2b 20 74 68 69 73 2e  aragraph + this.
8220: 6c 54 6f 6b 65 6e 5b 69 5d 5b 22 6e 53 74 61 72  lToken[i]["nStar
8230: 74 22 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t"];.           
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
8260: 28 74 68 69 73 2e 64 45 72 72 6f 72 2e 68 61 73  (this.dError.has
8270: 28 6e 45 72 72 6f 72 53 74 61 72 74 29 29 20 7b  (nErrorStart)) {
8280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
82b0: 73 2e 64 45 72 72 6f 72 2e 64 65 6c 65 74 65 28  s.dError.delete(
82c0: 6e 45 72 72 6f 72 53 74 61 72 74 29 3b 0a 20 20  nErrorStart);.  
82d0: 20 20 20 20 20 20 20 20 20 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 20 7d 0a 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 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8350: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
8360: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8380: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
8390: 28 22 23 20 65 72 72 6f 72 3a 20 75 6e 6b 6e 6f  ("# error: unkno
83a0: 77 6e 20 61 63 74 69 6f 6e 20 61 74 20 22 20 2b  wn action at " +
83b0: 20 73 4c 69 6e 65 49 64 29 3b 0a 20 20 20 20 20   sLineId);.     
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83f0: 20 7d 0a 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 65 6c 73 65 20             else 
8410: 69 66 20 28 63 41 63 74 69 6f 6e 54 79 70 65 20  if (cActionType 
8420: 3d 3d 20 22 3e 22 29 20 7b 0a 20 20 20 20 20 20  == ">") {.      
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8440: 20 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67        if (bDebug
8450: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8470: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28      console.log(
8480: 22 20 20 20 20 43 4f 4e 44 5f 42 52 45 41 4b 22  "    COND_BREAK"
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 7d                 }
84b0: 0a 20 20 20 20 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 62 72 65               bre
84d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8500: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
8510: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8520: 20 20 20 20 20 20 63 61 74 63 68 20 28 65 29 20        catch (e) 
8530: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8540: 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f        console.lo
8550: 67 28 22 45 72 72 6f 72 3a 20 22 2c 20 73 4c 69  g("Error: ", sLi
8560: 6e 65 49 64 2c 20 73 52 75 6c 65 49 64 2c 20 74  neId, sRuleId, t
8570: 68 69 73 2e 73 53 65 6e 74 65 6e 63 65 29 3b 0a  his.sSentence);.
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8590: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f      console.erro
85a0: 72 28 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r(e);.          
85b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
85c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
85d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 62          return b
85e0: 43 68 61 6e 67 65 3b 0a 20 20 20 20 7d 0a 0a 20  Change;.    }.. 
85f0: 20 20 20 5f 63 72 65 61 74 65 45 72 72 6f 72 46     _createErrorF
8600: 72 6f 6d 52 65 67 65 78 20 28 73 54 65 78 74 2c  romRegex (sText,
8610: 20 73 54 65 78 74 30 2c 20 73 53 75 67 67 2c 20   sText0, sSugg, 
8620: 6e 4f 66 66 73 65 74 2c 20 6d 2c 20 69 47 72 6f  nOffset, m, iGro
8630: 75 70 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75  up, sLineId, sRu
8640: 6c 65 49 64 2c 20 62 55 70 70 65 72 63 61 73 65  leId, bUppercase
8650: 2c 20 73 4d 73 67 2c 20 73 55 52 4c 2c 20 62 53  , sMsg, sURL, bS
8660: 68 6f 77 52 75 6c 65 49 64 2c 20 73 4f 70 74 69  howRuleId, sOpti
8670: 6f 6e 2c 20 62 43 6f 6e 74 65 78 74 29 20 7b 0a  on, bContext) {.
8680: 20 20 20 20 20 20 20 20 6c 65 74 20 6e 53 74 61          let nSta
8690: 72 74 20 3d 20 6e 4f 66 66 73 65 74 20 2b 20 6d  rt = nOffset + m
86a0: 2e 73 74 61 72 74 5b 69 47 72 6f 75 70 5d 3b 0a  .start[iGroup];.
86b0: 20 20 20 20 20 20 20 20 6c 65 74 20 6e 45 6e 64          let nEnd
86c0: 20 3d 20 6e 4f 66 66 73 65 74 20 2b 20 6d 2e 65   = nOffset + m.e
86d0: 6e 64 5b 69 47 72 6f 75 70 5d 3b 0a 20 20 20 20  nd[iGroup];.    
86e0: 20 20 20 20 2f 2f 20 73 75 67 67 65 73 74 69 6f      // suggestio
86f0: 6e 73 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6c  ns.        let l
8700: 53 75 67 67 20 3d 20 5b 5d 3b 0a 20 20 20 20 20  Sugg = [];.     
8710: 20 20 20 69 66 20 28 73 53 75 67 67 2e 73 74 61     if (sSugg.sta
8720: 72 74 73 57 69 74 68 28 22 3d 22 29 29 20 7b 0a  rtsWith("=")) {.
8730: 20 20 20 20 20 20 20 20 20 20 20 20 73 53 75 67              sSug
8740: 67 20 3d 20 6f 45 76 61 6c 46 75 6e 63 5b 73 53  g = oEvalFunc[sS
8750: 75 67 67 2e 73 6c 69 63 65 28 31 29 5d 28 73 54  ugg.slice(1)](sT
8760: 65 78 74 2c 20 6d 29 3b 0a 20 20 20 20 20 20 20  ext, m);.       
8770: 20 20 20 20 20 6c 53 75 67 67 20 3d 20 28 73 53       lSugg = (sS
8780: 75 67 67 29 20 3f 20 73 53 75 67 67 2e 73 70 6c  ugg) ? sSugg.spl
8790: 69 74 28 22 7c 22 29 20 3a 20 5b 5d 3b 0a 20 20  it("|") : [];.  
87a0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20        } else if 
87b0: 28 73 53 75 67 67 20 3d 3d 20 22 5f 22 29 20 7b  (sSugg == "_") {
87c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 53 75  .            lSu
87d0: 67 67 20 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20  gg = [];.       
87e0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
87f0: 20 20 20 20 20 20 6c 53 75 67 67 20 3d 20 73 53        lSugg = sS
8800: 75 67 67 2e 67 6c 5f 65 78 70 61 6e 64 28 6d 29  ugg.gl_expand(m)
8810: 2e 73 70 6c 69 74 28 22 7c 22 29 3b 0a 20 20 20  .split("|");.   
8820: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
8830: 66 20 28 62 55 70 70 65 72 63 61 73 65 20 26 26  f (bUppercase &&
8840: 20 6c 53 75 67 67 2e 6c 65 6e 67 74 68 20 3e 20   lSugg.length > 
8850: 30 20 26 26 20 6d 5b 69 47 72 6f 75 70 5d 2e 73  0 && m[iGroup].s
8860: 6c 69 63 65 28 30 2c 31 29 2e 67 6c 5f 69 73 55  lice(0,1).gl_isU
8870: 70 70 65 72 43 61 73 65 28 29 29 20 7b 0a 20 20  pperCase()) {.  
8880: 20 20 20 20 20 20 20 20 20 20 6c 53 75 67 67 20            lSugg 
8890: 3d 20 63 61 70 69 74 61 6c 69 7a 65 41 72 72 61  = capitalizeArra
88a0: 79 28 6c 53 75 67 67 29 3b 0a 20 20 20 20 20 20  y(lSugg);.      
88b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f 20 4d    }.        // M
88c0: 65 73 73 61 67 65 0a 20 20 20 20 20 20 20 20 6c  essage.        l
88d0: 65 74 20 73 4d 65 73 73 61 67 65 20 3d 20 28 73  et sMessage = (s
88e0: 4d 73 67 2e 73 74 61 72 74 73 57 69 74 68 28 22  Msg.startsWith("
88f0: 3d 22 29 29 20 3f 20 6f 45 76 61 6c 46 75 6e 63  =")) ? oEvalFunc
8900: 5b 73 4d 73 67 2e 73 6c 69 63 65 28 31 29 5d 28  [sMsg.slice(1)](
8910: 73 54 65 78 74 2c 20 6d 29 20 3a 20 73 4d 73 67  sText, m) : sMsg
8920: 2e 67 6c 5f 65 78 70 61 6e 64 28 6d 29 3b 0a 20  .gl_expand(m);. 
8930: 20 20 20 20 20 20 20 69 66 20 28 62 53 68 6f 77         if (bShow
8940: 52 75 6c 65 49 64 29 20 7b 0a 20 20 20 20 20 20  RuleId) {.      
8950: 20 20 20 20 20 20 73 4d 65 73 73 61 67 65 20 2b        sMessage +
8960: 3d 20 22 20 20 23 23 20 22 20 2b 20 73 4c 69 6e  = "  ## " + sLin
8970: 65 49 64 20 2b 20 22 20 23 20 22 20 2b 20 73 52  eId + " # " + sR
8980: 75 6c 65 49 64 3b 0a 20 20 20 20 20 20 20 20 7d  uleId;.        }
8990: 0a 20 20 20 20 20 20 20 20 2f 2f 0a 20 20 20 20  .        //.    
89a0: 20 20 20 20 72 65 74 75 72 6e 20 74 68 69 73 2e      return this.
89b0: 5f 63 72 65 61 74 65 45 72 72 6f 72 28 6e 53 74  _createError(nSt
89c0: 61 72 74 2c 20 6e 45 6e 64 2c 20 73 4c 69 6e 65  art, nEnd, sLine
89d0: 49 64 2c 20 73 52 75 6c 65 49 64 2c 20 73 4f 70  Id, sRuleId, sOp
89e0: 74 69 6f 6e 2c 20 73 4d 65 73 73 61 67 65 2c 20  tion, sMessage, 
89f0: 6c 53 75 67 67 2c 20 73 55 52 4c 2c 20 62 43 6f  lSugg, sURL, bCo
8a00: 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  ntext);.    }.. 
8a10: 20 20 20 5f 63 72 65 61 74 65 45 72 72 6f 72 46     _createErrorF
8a20: 72 6f 6d 54 6f 6b 65 6e 73 20 28 73 53 75 67 67  romTokens (sSugg
8a30: 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20  , nTokenOffset, 
8a40: 6e 4c 61 73 74 54 6f 6b 65 6e 2c 20 69 46 69 72  nLastToken, iFir
8a50: 73 74 54 6f 6b 65 6e 2c 20 6e 53 74 61 72 74 2c  stToken, nStart,
8a60: 20 6e 45 6e 64 2c 20 73 4c 69 6e 65 49 64 2c 20   nEnd, sLineId, 
8a70: 73 52 75 6c 65 49 64 2c 20 62 43 61 73 65 53 76  sRuleId, bCaseSv
8a80: 74 79 2c 20 73 4d 73 67 2c 20 73 55 52 4c 2c 20  ty, sMsg, sURL, 
8a90: 62 53 68 6f 77 52 75 6c 65 49 64 2c 20 73 4f 70  bShowRuleId, sOp
8aa0: 74 69 6f 6e 2c 20 62 43 6f 6e 74 65 78 74 29 20  tion, bContext) 
8ab0: 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 73 75 67  {.        // sug
8ac0: 67 65 73 74 69 6f 6e 73 0a 20 20 20 20 20 20 20  gestions.       
8ad0: 20 6c 65 74 20 6c 53 75 67 67 20 3d 20 5b 5d 3b   let lSugg = [];
8ae0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 53 75  .        if (sSu
8af0: 67 67 2e 73 74 61 72 74 73 57 69 74 68 28 22 3d  gg.startsWith("=
8b00: 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ")) {.          
8b10: 20 20 73 53 75 67 67 20 3d 20 6f 45 76 61 6c 46    sSugg = oEvalF
8b20: 75 6e 63 5b 73 53 75 67 67 2e 73 6c 69 63 65 28  unc[sSugg.slice(
8b30: 31 29 5d 28 74 68 69 73 2e 6c 54 6f 6b 65 6e 2c  1)](this.lToken,
8b40: 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e   nTokenOffset, n
8b50: 4c 61 73 74 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  LastToken);.    
8b60: 20 20 20 20 20 20 20 20 6c 53 75 67 67 20 3d 20          lSugg = 
8b70: 28 73 53 75 67 67 29 20 3f 20 73 53 75 67 67 2e  (sSugg) ? sSugg.
8b80: 73 70 6c 69 74 28 22 7c 22 29 20 3a 20 5b 5d 3b  split("|") : [];
8b90: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
8ba0: 69 66 20 28 73 53 75 67 67 20 3d 3d 20 22 5f 22  if (sSugg == "_"
8bb0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
8bc0: 6c 53 75 67 67 20 3d 20 5b 5d 3b 0a 20 20 20 20  lSugg = [];.    
8bd0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
8be0: 20 20 20 20 20 20 20 20 20 6c 53 75 67 67 20 3d           lSugg =
8bf0: 20 74 68 69 73 2e 5f 65 78 70 61 6e 64 28 73 53   this._expand(sS
8c00: 75 67 67 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65  ugg, nTokenOffse
8c10: 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 29 2e 73  t, nLastToken).s
8c20: 70 6c 69 74 28 22 7c 22 29 3b 0a 20 20 20 20 20  plit("|");.     
8c30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20     }.        if 
8c40: 28 62 43 61 73 65 53 76 74 79 20 26 26 20 6c 53  (bCaseSvty && lS
8c50: 75 67 67 2e 6c 65 6e 67 74 68 20 3e 20 30 20 26  ugg.length > 0 &
8c60: 26 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 69 46  & this.lToken[iF
8c70: 69 72 73 74 54 6f 6b 65 6e 5d 5b 22 73 56 61 6c  irstToken]["sVal
8c80: 75 65 22 5d 2e 73 6c 69 63 65 28 30 2c 31 29 2e  ue"].slice(0,1).
8c90: 67 6c 5f 69 73 55 70 70 65 72 43 61 73 65 28 29  gl_isUpperCase()
8ca0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
8cb0: 6c 53 75 67 67 20 3d 20 63 61 70 69 74 61 6c 69  lSugg = capitali
8cc0: 7a 65 41 72 72 61 79 28 6c 53 75 67 67 29 3b 0a  zeArray(lSugg);.
8cd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8ce0: 20 20 2f 2f 20 4d 65 73 73 61 67 65 0a 20 20 20    // Message.   
8cf0: 20 20 20 20 20 6c 65 74 20 73 4d 65 73 73 61 67       let sMessag
8d00: 65 20 3d 20 28 73 4d 73 67 2e 73 74 61 72 74 73  e = (sMsg.starts
8d10: 57 69 74 68 28 22 3d 22 29 29 20 3f 20 6f 45 76  With("=")) ? oEv
8d20: 61 6c 46 75 6e 63 5b 73 4d 73 67 2e 73 6c 69 63  alFunc[sMsg.slic
8d30: 65 28 31 29 5d 28 74 68 69 73 2e 6c 54 6f 6b 65  e(1)](this.lToke
8d40: 6e 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c  n, nTokenOffset,
8d50: 20 6e 4c 61 73 74 54 6f 6b 65 6e 29 20 3a 20 74   nLastToken) : t
8d60: 68 69 73 2e 5f 65 78 70 61 6e 64 28 73 4d 73 67  his._expand(sMsg
8d70: 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20  , nTokenOffset, 
8d80: 6e 4c 61 73 74 54 6f 6b 65 6e 29 3b 0a 20 20 20  nLastToken);.   
8d90: 20 20 20 20 20 69 66 20 28 62 53 68 6f 77 52 75       if (bShowRu
8da0: 6c 65 49 64 29 20 7b 0a 20 20 20 20 20 20 20 20  leId) {.        
8db0: 20 20 20 20 73 4d 65 73 73 61 67 65 20 2b 3d 20      sMessage += 
8dc0: 22 20 23 23 20 22 20 2b 20 73 4c 69 6e 65 49 64  " ## " + sLineId
8dd0: 20 2b 20 22 20 23 20 22 20 2b 20 73 52 75 6c 65   + " # " + sRule
8de0: 49 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  Id;.        }.  
8df0: 20 20 20 20 20 20 2f 2f 0a 20 20 20 20 20 20 20        //.       
8e00: 20 72 65 74 75 72 6e 20 74 68 69 73 2e 5f 63 72   return this._cr
8e10: 65 61 74 65 45 72 72 6f 72 28 6e 53 74 61 72 74  eateError(nStart
8e20: 2c 20 6e 45 6e 64 2c 20 73 4c 69 6e 65 49 64 2c  , nEnd, sLineId,
8e30: 20 73 52 75 6c 65 49 64 2c 20 73 4f 70 74 69 6f   sRuleId, sOptio
8e40: 6e 2c 20 73 4d 65 73 73 61 67 65 2c 20 6c 53 75  n, sMessage, lSu
8e50: 67 67 2c 20 73 55 52 4c 2c 20 62 43 6f 6e 74 65  gg, sURL, bConte
8e60: 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  xt);.    }..    
8e70: 5f 63 72 65 61 74 65 45 72 72 6f 72 20 28 6e 53  _createError (nS
8e80: 74 61 72 74 2c 20 6e 45 6e 64 2c 20 73 4c 69 6e  tart, nEnd, sLin
8e90: 65 49 64 2c 20 73 52 75 6c 65 49 64 2c 20 73 4f  eId, sRuleId, sO
8ea0: 70 74 69 6f 6e 2c 20 73 4d 65 73 73 61 67 65 2c  ption, sMessage,
8eb0: 20 6c 53 75 67 67 2c 20 73 55 52 4c 2c 20 62 43   lSugg, sURL, bC
8ec0: 6f 6e 74 65 78 74 29 20 7b 0a 20 20 20 20 20 20  ontext) {.      
8ed0: 20 20 6c 65 74 20 6f 45 72 72 20 3d 20 7b 0a 20    let oErr = {. 
8ee0: 20 20 20 20 20 20 20 20 20 20 20 22 6e 53 74 61             "nSta
8ef0: 72 74 22 3a 20 6e 53 74 61 72 74 2c 0a 20 20 20  rt": nStart,.   
8f00: 20 20 20 20 20 20 20 20 20 22 6e 45 6e 64 22 3a           "nEnd":
8f10: 20 6e 45 6e 64 2c 0a 20 20 20 20 20 20 20 20 20   nEnd,.         
8f20: 20 20 20 22 73 4c 69 6e 65 49 64 22 3a 20 73 4c     "sLineId": sL
8f30: 69 6e 65 49 64 2c 0a 20 20 20 20 20 20 20 20 20  ineId,.         
8f40: 20 20 20 22 73 52 75 6c 65 49 64 22 3a 20 73 52     "sRuleId": sR
8f50: 75 6c 65 49 64 2c 0a 20 20 20 20 20 20 20 20 20  uleId,.         
8f60: 20 20 20 22 73 54 79 70 65 22 3a 20 73 4f 70 74     "sType": sOpt
8f70: 69 6f 6e 20 7c 7c 20 22 6e 6f 74 79 70 65 22 2c  ion || "notype",
8f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 61 43  .            "aC
8f90: 6f 6c 6f 72 22 3a 20 5f 64 4f 70 74 69 6f 6e 73  olor": _dOptions
8fa0: 43 6f 6c 6f 72 73 5b 73 4f 70 74 69 6f 6e 5d 2c  Colors[sOption],
8fb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73 4d  .            "sM
8fc0: 65 73 73 61 67 65 22 3a 20 73 4d 65 73 73 61 67  essage": sMessag
8fd0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  e,.            "
8fe0: 61 53 75 67 67 65 73 74 69 6f 6e 73 22 3a 20 6c  aSuggestions": l
8ff0: 53 75 67 67 2c 0a 20 20 20 20 20 20 20 20 20 20  Sugg,.          
9000: 20 20 22 55 52 4c 22 3a 20 73 55 52 4c 0a 20 20    "URL": sURL.  
9010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9020: 69 66 20 28 62 43 6f 6e 74 65 78 74 29 20 7b 0a  if (bContext) {.
9030: 20 20 20 20 20 20 20 20 20 20 20 20 6f 45 72 72              oErr
9040: 5b 27 73 55 6e 64 65 72 6c 69 6e 65 64 27 5d 20  ['sUnderlined'] 
9050: 3d 20 74 68 69 73 2e 73 54 65 78 74 30 2e 73 6c  = this.sText0.sl
9060: 69 63 65 28 6e 53 74 61 72 74 2c 20 6e 45 6e 64  ice(nStart, nEnd
9070: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  );.            o
9080: 45 72 72 5b 27 73 42 65 66 6f 72 65 27 5d 20 3d  Err['sBefore'] =
9090: 20 74 68 69 73 2e 73 54 65 78 74 30 2e 73 6c 69   this.sText0.sli
90a0: 63 65 28 4d 61 74 68 2e 6d 61 78 28 30 2c 6e 53  ce(Math.max(0,nS
90b0: 74 61 72 74 2d 38 30 29 2c 20 6e 53 74 61 72 74  tart-80), nStart
90c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  );.            o
90d0: 45 72 72 5b 27 73 41 66 74 65 72 27 5d 20 3d 20  Err['sAfter'] = 
90e0: 74 68 69 73 2e 73 54 65 78 74 30 2e 73 6c 69 63  this.sText0.slic
90f0: 65 28 6e 45 6e 64 2c 20 6e 45 6e 64 2b 38 30 29  e(nEnd, nEnd+80)
9100: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9110: 20 20 20 20 72 65 74 75 72 6e 20 6f 45 72 72 3b      return oErr;
9120: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 5f 65 78 70  .    }..    _exp
9130: 61 6e 64 20 28 73 54 65 78 74 2c 20 6e 54 6f 6b  and (sText, nTok
9140: 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73 74 54  enOffset, nLastT
9150: 6f 6b 65 6e 29 20 7b 0a 20 20 20 20 20 20 20 20  oken) {.        
9160: 6c 65 74 20 6d 3b 0a 20 20 20 20 20 20 20 20 77  let m;.        w
9170: 68 69 6c 65 20 28 28 6d 20 3d 20 2f 5c 5c 28 2d  hile ((m = /\\(-
9180: 3f 5b 30 2d 39 5d 2b 29 2f 2e 65 78 65 63 28 73  ?[0-9]+)/.exec(s
9190: 54 65 78 74 29 29 20 21 3d 3d 20 6e 75 6c 6c 29  Text)) !== null)
91a0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
91b0: 66 20 28 6d 5b 31 5d 2e 73 6c 69 63 65 28 30 2c  f (m[1].slice(0,
91c0: 31 29 20 3d 3d 20 22 2d 22 29 20 7b 0a 20 20 20  1) == "-") {.   
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 54 65               sTe
91e0: 78 74 20 3d 20 73 54 65 78 74 2e 72 65 70 6c 61  xt = sText.repla
91f0: 63 65 28 6d 5b 30 5d 2c 20 74 68 69 73 2e 6c 54  ce(m[0], this.lT
9200: 6f 6b 65 6e 5b 6e 4c 61 73 74 54 6f 6b 65 6e 2b  oken[nLastToken+
9210: 70 61 72 73 65 49 6e 74 28 6d 5b 31 5d 2c 31 30  parseInt(m[1],10
9220: 29 2b 31 5d 5b 22 73 56 61 6c 75 65 22 5d 29 3b  )+1]["sValue"]);
9230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
9240: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
9250: 20 20 20 20 20 20 73 54 65 78 74 20 3d 20 73 54        sText = sT
9260: 65 78 74 2e 72 65 70 6c 61 63 65 28 6d 5b 30 5d  ext.replace(m[0]
9270: 2c 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54  , this.lToken[nT
9280: 6f 6b 65 6e 4f 66 66 73 65 74 2b 70 61 72 73 65  okenOffset+parse
9290: 49 6e 74 28 6d 5b 31 5d 2c 31 30 29 5d 5b 22 73  Int(m[1],10)]["s
92a0: 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20 20 20  Value"]);.      
92b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
92c0: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
92d0: 20 73 54 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20   sText;.    }.. 
92e0: 20 20 20 72 65 77 72 69 74 65 54 65 78 74 20 28     rewriteText (
92f0: 73 54 65 78 74 2c 20 73 52 65 70 6c 2c 20 69 47  sText, sRepl, iG
9300: 72 6f 75 70 2c 20 6d 2c 20 62 55 70 70 65 72 63  roup, m, bUpperc
9310: 61 73 65 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  ase) {.        /
9320: 2f 20 74 65 78 74 20 70 72 6f 63 65 73 73 6f 72  / text processor
9330: 3a 20 77 72 69 74 65 20 73 52 65 70 6c 20 69 6e  : write sRepl in
9340: 20 73 54 65 78 74 20 61 74 20 69 47 72 6f 75 70   sText at iGroup
9350: 20 70 6f 73 69 74 69 6f 6e 22 0a 20 20 20 20 20   position".     
9360: 20 20 20 6c 65 74 20 6c 6e 20 3d 20 6d 2e 65 6e     let ln = m.en
9370: 64 5b 69 47 72 6f 75 70 5d 20 2d 20 6d 2e 73 74  d[iGroup] - m.st
9380: 61 72 74 5b 69 47 72 6f 75 70 5d 3b 0a 20 20 20  art[iGroup];.   
9390: 20 20 20 20 20 6c 65 74 20 73 4e 65 77 20 3d 20       let sNew = 
93a0: 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  "";.        if (
93b0: 73 52 65 70 6c 20 3d 3d 3d 20 22 2a 22 29 20 7b  sRepl === "*") {
93c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 4e 65  .            sNe
93d0: 77 20 3d 20 22 20 22 2e 72 65 70 65 61 74 28 6c  w = " ".repeat(l
93e0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n);.        }.  
93f0: 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 73        else if (s
9400: 52 65 70 6c 20 3d 3d 3d 20 22 5f 22 29 20 7b 0a  Repl === "_") {.
9410: 20 20 20 20 20 20 20 20 20 20 20 20 73 4e 65 77              sNew
9420: 20 3d 20 22 5f 22 2e 72 65 70 65 61 74 28 6c 6e   = "_".repeat(ln
9430: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9440: 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 52       else if (sR
9450: 65 70 6c 20 3d 3d 3d 20 22 40 22 29 20 7b 0a 20  epl === "@") {. 
9460: 20 20 20 20 20 20 20 20 20 20 20 73 4e 65 77 20             sNew 
9470: 3d 20 22 40 22 2e 72 65 70 65 61 74 28 6c 6e 29  = "@".repeat(ln)
9480: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9490: 20 20 20 20 65 6c 73 65 20 69 66 20 28 73 52 65      else if (sRe
94a0: 70 6c 2e 73 6c 69 63 65 28 30 2c 31 29 20 3d 3d  pl.slice(0,1) ==
94b0: 3d 20 22 3d 22 29 20 7b 0a 20 20 20 20 20 20 20  = "=") {.       
94c0: 20 20 20 20 20 73 4e 65 77 20 3d 20 6f 45 76 61       sNew = oEva
94d0: 6c 46 75 6e 63 5b 73 52 65 70 6c 2e 73 6c 69 63  lFunc[sRepl.slic
94e0: 65 28 31 29 5d 28 73 54 65 78 74 2c 20 6d 29 3b  e(1)](sText, m);
94f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 4e 65  .            sNe
9500: 77 20 3d 20 73 4e 65 77 20 2b 20 22 20 22 2e 72  w = sNew + " ".r
9510: 65 70 65 61 74 28 6c 6e 2d 73 4e 65 77 2e 6c 65  epeat(ln-sNew.le
9520: 6e 67 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20  ngth);.         
9530: 20 20 20 69 66 20 28 62 55 70 70 65 72 63 61 73     if (bUppercas
9540: 65 20 26 26 20 6d 5b 69 47 72 6f 75 70 5d 2e 73  e && m[iGroup].s
9550: 6c 69 63 65 28 30 2c 31 29 2e 67 6c 5f 69 73 55  lice(0,1).gl_isU
9560: 70 70 65 72 43 61 73 65 28 29 29 20 7b 0a 20 20  pperCase()) {.  
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 4e                sN
9580: 65 77 20 3d 20 73 4e 65 77 2e 67 6c 5f 74 6f 43  ew = sNew.gl_toC
9590: 61 70 69 74 61 6c 69 7a 65 28 29 3b 0a 20 20 20  apitalize();.   
95a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
95b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
95c0: 20 20 20 20 20 20 20 20 73 4e 65 77 20 3d 20 73          sNew = s
95d0: 52 65 70 6c 2e 67 6c 5f 65 78 70 61 6e 64 28 6d  Repl.gl_expand(m
95e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
95f0: 4e 65 77 20 3d 20 73 4e 65 77 20 2b 20 22 20 22  New = sNew + " "
9600: 2e 72 65 70 65 61 74 28 6c 6e 2d 73 4e 65 77 2e  .repeat(ln-sNew.
9610: 6c 65 6e 67 74 68 29 3b 0a 20 20 20 20 20 20 20  length);.       
9620: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f 63 6f 6e   }.        //con
9630: 73 6f 6c 65 2e 6c 6f 67 28 73 54 65 78 74 2b 22  sole.log(sText+"
9640: 5c 6e 73 74 61 72 74 3a 20 22 2b 6d 2e 73 74 61  \nstart: "+m.sta
9650: 72 74 5b 69 47 72 6f 75 70 5d 2b 22 20 65 6e 64  rt[iGroup]+" end
9660: 3a 22 2b 6d 2e 65 6e 64 5b 69 47 72 6f 75 70 5d  :"+m.end[iGroup]
9670: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
9680: 6e 20 73 54 65 78 74 2e 73 6c 69 63 65 28 30 2c  n sText.slice(0,
9690: 20 6d 2e 73 74 61 72 74 5b 69 47 72 6f 75 70 5d   m.start[iGroup]
96a0: 29 20 2b 20 73 4e 65 77 20 2b 20 73 54 65 78 74  ) + sNew + sText
96b0: 2e 73 6c 69 63 65 28 6d 2e 65 6e 64 5b 69 47 72  .slice(m.end[iGr
96c0: 6f 75 70 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  oup]);.    }..  
96d0: 20 20 5f 74 61 67 41 6e 64 50 72 65 70 61 72 65    _tagAndPrepare
96e0: 54 6f 6b 65 6e 46 6f 72 52 65 77 72 69 74 69 6e  TokenForRewritin
96f0: 67 20 28 73 57 68 61 74 2c 20 6e 54 6f 6b 65 6e  g (sWhat, nToken
9700: 52 65 77 72 69 74 65 53 74 61 72 74 2c 20 6e 54  RewriteStart, nT
9710: 6f 6b 65 6e 52 65 77 72 69 74 65 45 6e 64 2c 20  okenRewriteEnd, 
9720: 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c  nTokenOffset, nL
9730: 61 73 74 54 6f 6b 65 6e 2c 20 62 43 61 73 65 53  astToken, bCaseS
9740: 76 74 79 2c 20 62 44 65 62 75 67 29 20 7b 0a 20  vty, bDebug) {. 
9750: 20 20 20 20 20 20 20 2f 2f 20 74 65 78 74 20 70         // text p
9760: 72 6f 63 65 73 73 6f 72 3a 20 72 65 77 72 69 74  rocessor: rewrit
9770: 65 20 74 6f 6b 65 6e 73 20 62 65 74 77 65 65 6e  e tokens between
9780: 20 3c 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 53   <nTokenRewriteS
9790: 74 61 72 74 3e 20 61 6e 64 20 3c 6e 54 6f 6b 65  tart> and <nToke
97a0: 6e 52 65 77 72 69 74 65 45 6e 64 3e 20 70 6f 73  nRewriteEnd> pos
97b0: 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 69 66  ition.        if
97c0: 20 28 73 57 68 61 74 20 3d 3d 3d 20 22 2a 22 29   (sWhat === "*")
97d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   {.            /
97e0: 2f 20 70 75 72 67 65 20 74 65 78 74 0a 20 20 20  / purge text.   
97f0: 20 20 20 20 20 20 20 20 20 69 66 20 28 6e 54 6f           if (nTo
9800: 6b 65 6e 52 65 77 72 69 74 65 45 6e 64 20 2d 20  kenRewriteEnd - 
9810: 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 53 74 61  nTokenRewriteSta
9820: 72 74 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  rt == 0) {.     
9830: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
9840: 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 52 65 77  lToken[nTokenRew
9850: 72 69 74 65 53 74 61 72 74 5d 5b 22 62 54 6f 52  riteStart]["bToR
9860: 65 6d 6f 76 65 22 5d 20 3d 20 74 72 75 65 3b 0a  emove"] = true;.
9870: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
9880: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
9890: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 69 20       for (let i 
98a0: 3d 20 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 53  = nTokenRewriteS
98b0: 74 61 72 74 3b 20 20 69 20 3c 3d 20 6e 54 6f 6b  tart;  i <= nTok
98c0: 65 6e 52 65 77 72 69 74 65 45 6e 64 3b 20 20 69  enRewriteEnd;  i
98d0: 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ++) {.          
98e0: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6c            this.l
98f0: 54 6f 6b 65 6e 5b 69 5d 5b 22 62 54 6f 52 65 6d  Token[i]["bToRem
9900: 6f 76 65 22 5d 20 3d 20 74 72 75 65 3b 0a 20 20  ove"] = true;.  
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
9920: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
9930: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9940: 65 6c 73 65 20 69 66 20 28 73 57 68 61 74 20 3d  else if (sWhat =
9950: 3d 3d 20 22 e2 90 a3 22 29 20 7b 0a 20 20 20 20  == "...") {.    
9960: 20 20 20 20 20 20 20 20 2f 2f 20 6d 65 72 67 65          // merge
9970: 20 74 6f 6b 65 6e 73 0a 20 20 20 20 20 20 20 20   tokens.        
9980: 20 20 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b      this.lToken[
9990: 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 53 74 61  nTokenRewriteSta
99a0: 72 74 5d 5b 22 6e 4d 65 72 67 65 55 6e 74 69 6c  rt]["nMergeUntil
99b0: 22 5d 20 3d 20 6e 54 6f 6b 65 6e 52 65 77 72 69  "] = nTokenRewri
99c0: 74 65 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  teEnd;.        }
99d0: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
99e0: 20 28 73 57 68 61 74 20 3d 3d 3d 20 22 5f 22 29   (sWhat === "_")
99f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   {.            /
9a00: 2f 20 6e 65 75 74 72 61 6c 69 7a 65 64 20 74 6f  / neutralized to
9a10: 6b 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ken.            
9a20: 69 66 20 28 6e 54 6f 6b 65 6e 52 65 77 72 69 74  if (nTokenRewrit
9a30: 65 45 6e 64 20 2d 20 6e 54 6f 6b 65 6e 52 65 77  eEnd - nTokenRew
9a40: 72 69 74 65 53 74 61 72 74 20 3d 3d 20 30 29 20  riteStart == 0) 
9a50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9a60: 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54    this.lToken[nT
9a70: 6f 6b 65 6e 52 65 77 72 69 74 65 53 74 61 72 74  okenRewriteStart
9a80: 5d 5b 22 73 4e 65 77 56 61 6c 75 65 22 5d 20 3d  ]["sNewValue"] =
9a90: 20 22 5f 22 3b 0a 20 20 20 20 20 20 20 20 20 20   "_";.          
9aa0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
9ab0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
9ac0: 6c 65 74 20 69 20 3d 20 6e 54 6f 6b 65 6e 52 65  let i = nTokenRe
9ad0: 77 72 69 74 65 53 74 61 72 74 3b 20 20 69 20 3c  writeStart;  i <
9ae0: 3d 20 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 45  = nTokenRewriteE
9af0: 6e 64 3b 20 20 69 2b 2b 29 20 7b 0a 20 20 20 20  nd;  i++) {.    
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 69 5d 5b 22  this.lToken[i]["
9b20: 73 4e 65 77 56 61 6c 75 65 22 5d 20 3d 20 22 5f  sNewValue"] = "_
9b30: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ";.             
9b40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
9b50: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
9b60: 20 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20       else {.    
9b70: 20 20 20 20 20 20 20 20 69 66 20 28 73 57 68 61          if (sWha
9b80: 74 2e 73 74 61 72 74 73 57 69 74 68 28 22 3d 22  t.startsWith("="
9b90: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
9ba0: 20 20 20 20 20 73 57 68 61 74 20 3d 20 6f 45 76       sWhat = oEv
9bb0: 61 6c 46 75 6e 63 5b 73 57 68 61 74 2e 73 6c 69  alFunc[sWhat.sli
9bc0: 63 65 28 31 29 5d 28 74 68 69 73 2e 6c 54 6f 6b  ce(1)](this.lTok
9bd0: 65 6e 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74  en, nTokenOffset
9be0: 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 29 3b 0a 20  , nLastToken);. 
9bf0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
9c00: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
9c10: 20 20 20 20 73 57 68 61 74 20 3d 20 74 68 69 73      sWhat = this
9c20: 2e 5f 65 78 70 61 6e 64 28 73 57 68 61 74 2c 20  ._expand(sWhat, 
9c30: 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c  nTokenOffset, nL
9c40: 61 73 74 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  astToken);.     
9c50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9c60: 20 20 20 20 20 6c 65 74 20 62 55 70 70 65 72 63       let bUpperc
9c70: 61 73 65 20 3d 20 62 43 61 73 65 53 76 74 79 20  ase = bCaseSvty 
9c80: 26 26 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e  && this.lToken[n
9c90: 54 6f 6b 65 6e 52 65 77 72 69 74 65 53 74 61 72  TokenRewriteStar
9ca0: 74 5d 5b 22 73 56 61 6c 75 65 22 5d 2e 73 6c 69  t]["sValue"].sli
9cb0: 63 65 28 30 2c 31 29 2e 67 6c 5f 69 73 55 70 70  ce(0,1).gl_isUpp
9cc0: 65 72 43 61 73 65 28 29 3b 0a 20 20 20 20 20 20  erCase();.      
9cd0: 20 20 20 20 20 20 69 66 20 28 6e 54 6f 6b 65 6e        if (nToken
9ce0: 52 65 77 72 69 74 65 45 6e 64 20 2d 20 6e 54 6f  RewriteEnd - nTo
9cf0: 6b 65 6e 52 65 77 72 69 74 65 53 74 61 72 74 20  kenRewriteStart 
9d00: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20  == 0) {.        
9d10: 20 20 20 20 20 20 20 20 2f 2f 20 6f 6e 65 20 74          // one t
9d20: 6f 6b 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  oken.           
9d30: 20 20 20 20 20 69 66 20 28 62 55 70 70 65 72 63       if (bUpperc
9d40: 61 73 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ase) {.         
9d50: 20 20 20 20 20 20 20 20 20 20 20 73 57 68 61 74             sWhat
9d60: 20 3d 20 73 57 68 61 74 2e 67 6c 5f 74 6f 43 61   = sWhat.gl_toCa
9d70: 70 69 74 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  pitalize();.    
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
9da0: 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e  is.lToken[nToken
9db0: 52 65 77 72 69 74 65 53 74 61 72 74 5d 5b 22 73  RewriteStart]["s
9dc0: 4e 65 77 56 61 6c 75 65 22 5d 20 3d 20 73 57 68  NewValue"] = sWh
9dd0: 61 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  at;.            
9de0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  }.            el
9df0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
9e00: 20 20 20 20 20 2f 2f 20 73 65 76 65 72 61 6c 20       // several 
9e10: 74 6f 6b 65 6e 73 0a 20 20 20 20 20 20 20 20 20  tokens.         
9e20: 20 20 20 20 20 20 20 6c 65 74 20 6c 54 6f 6b 65         let lToke
9e30: 6e 56 61 6c 75 65 20 3d 20 73 57 68 61 74 2e 73  nValue = sWhat.s
9e40: 70 6c 69 74 28 22 7c 22 29 3b 0a 20 20 20 20 20  plit("|");.     
9e50: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6c             if (l
9e60: 54 6f 6b 65 6e 56 61 6c 75 65 2e 6c 65 6e 67 74  TokenValue.lengt
9e70: 68 20 21 3d 20 28 6e 54 6f 6b 65 6e 52 65 77 72  h != (nTokenRewr
9e80: 69 74 65 45 6e 64 20 2d 20 6e 54 6f 6b 65 6e 52  iteEnd - nTokenR
9e90: 65 77 72 69 74 65 53 74 61 72 74 20 2b 20 31 29  ewriteStart + 1)
9ea0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
9eb0: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
9ec0: 6c 6f 67 28 22 45 72 72 6f 72 2e 20 54 65 78 74  log("Error. Text
9ed0: 20 70 72 6f 63 65 73 73 6f 72 3a 20 6e 75 6d 62   processor: numb
9ee0: 65 72 20 6f 66 20 72 65 70 6c 61 63 65 6d 65 6e  er of replacemen
9ef0: 74 73 20 21 3d 20 6e 75 6d 62 65 72 20 6f 66 20  ts != number of 
9f00: 74 6f 6b 65 6e 73 2e 22 29 3b 0a 20 20 20 20 20  tokens.");.     
9f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
9f20: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20  eturn;.         
9f30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9f40: 20 20 20 20 20 20 20 20 20 6c 65 74 20 6a 20 3d           let j =
9f50: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
9f60: 20 20 20 20 66 6f 72 20 28 6c 65 74 20 69 20 3d      for (let i =
9f70: 20 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 53 74   nTokenRewriteSt
9f80: 61 72 74 3b 20 20 69 20 3c 3d 20 6e 54 6f 6b 65  art;  i <= nToke
9f90: 6e 52 65 77 72 69 74 65 45 6e 64 3b 20 20 69 2b  nRewriteEnd;  i+
9fa0: 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  +) {.           
9fb0: 20 20 20 20 20 20 20 20 20 6c 65 74 20 73 56 61           let sVa
9fc0: 6c 75 65 20 3d 20 6c 54 6f 6b 65 6e 56 61 6c 75  lue = lTokenValu
9fd0: 65 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[j];.          
9fe0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73            if (!s
9ff0: 56 61 6c 75 65 20 7c 7c 20 73 56 61 6c 75 65 20  Value || sValue 
a000: 3d 3d 3d 20 22 2a 22 29 20 7b 0a 20 20 20 20 20  === "*") {.     
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a020: 20 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 69     this.lToken[i
a030: 5d 5b 22 62 54 6f 52 65 6d 6f 76 65 22 5d 20 3d  ]["bToRemove"] =
a040: 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20   true;.         
a050: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
a060: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
a070: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
a080: 62 55 70 70 65 72 63 61 73 65 29 20 7b 0a 20 20  bUppercase) {.  
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0a0: 20 20 20 20 20 20 20 20 20 20 73 56 61 6c 75 65            sValue
a0b0: 20 3d 20 73 56 61 6c 75 65 2e 67 6c 5f 74 6f 43   = sValue.gl_toC
a0c0: 61 70 69 74 61 6c 69 7a 65 28 29 3b 0a 20 20 20  apitalize();.   
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
a100: 68 69 73 2e 6c 54 6f 6b 65 6e 5b 69 5d 5b 22 73  his.lToken[i]["s
a110: 4e 65 77 56 61 6c 75 65 22 5d 20 3d 20 73 56 61  NewValue"] = sVa
a120: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  lue;.           
a130: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
a150: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
a160: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a170: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
a180: 20 20 7d 0a 0a 20 20 20 20 72 65 77 72 69 74 65    }..    rewrite
a190: 46 72 6f 6d 54 61 67 73 20 28 62 44 65 62 75 67  FromTags (bDebug
a1a0: 3d 66 61 6c 73 65 29 20 7b 0a 20 20 20 20 20 20  =false) {.      
a1b0: 20 20 2f 2f 20 72 65 77 72 69 74 65 20 74 68 65    // rewrite the
a1c0: 20 73 65 6e 74 65 6e 63 65 2c 20 6d 6f 64 69 66   sentence, modif
a1d0: 79 20 74 6f 6b 65 6e 73 2c 20 70 75 72 67 65 20  y tokens, purge 
a1e0: 74 68 65 20 74 6f 6b 65 6e 20 6c 69 73 74 0a 20  the token list. 
a1f0: 20 20 20 20 20 20 20 69 66 20 28 62 44 65 62 75         if (bDebu
a200: 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g) {.           
a210: 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 52 45   console.log("RE
a220: 57 52 49 54 45 22 29 3b 0a 20 20 20 20 20 20 20  WRITE");.       
a230: 20 7d 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6c   }.        let l
a240: 4e 65 77 54 6f 6b 65 6e 20 3d 20 5b 5d 3b 0a 20  NewToken = [];. 
a250: 20 20 20 20 20 20 20 6c 65 74 20 6e 4d 65 72 67         let nMerg
a260: 65 55 6e 74 69 6c 20 3d 20 30 3b 0a 20 20 20 20  eUntil = 0;.    
a270: 20 20 20 20 6c 65 74 20 64 54 6f 6b 65 6e 4d 65      let dTokenMe
a280: 72 67 65 72 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20  rger = null;.   
a290: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 69       for (let [i
a2a0: 54 6f 6b 65 6e 2c 20 64 54 6f 6b 65 6e 5d 20 6f  Token, dToken] o
a2b0: 66 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 2e 65 6e  f this.lToken.en
a2c0: 74 72 69 65 73 28 29 29 20 7b 0a 20 20 20 20 20  tries()) {.     
a2d0: 20 20 20 20 20 20 20 6c 65 74 20 62 4b 65 65 70         let bKeep
a2e0: 54 6f 6b 65 6e 20 3d 20 74 72 75 65 3b 0a 20 20  Token = true;.  
a2f0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64 54            if (dT
a300: 6f 6b 65 6e 5b 22 73 54 79 70 65 22 5d 20 21 3d  oken["sType"] !=
a310: 20 22 49 4e 46 4f 22 29 20 7b 0a 20 20 20 20 20   "INFO") {.     
a320: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6e             if (n
a330: 4d 65 72 67 65 55 6e 74 69 6c 20 26 26 20 69 54  MergeUntil && iT
a340: 6f 6b 65 6e 20 3c 3d 20 6e 4d 65 72 67 65 55 6e  oken <= nMergeUn
a350: 74 69 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20  til) {.         
a360: 20 20 20 20 20 20 20 20 20 20 20 64 54 6f 6b 65             dToke
a370: 6e 4d 65 72 67 65 72 5b 22 73 56 61 6c 75 65 22  nMerger["sValue"
a380: 5d 20 2b 3d 20 22 20 22 2e 72 65 70 65 61 74 28  ] += " ".repeat(
a390: 64 54 6f 6b 65 6e 5b 22 6e 53 74 61 72 74 22 5d  dToken["nStart"]
a3a0: 20 2d 20 64 54 6f 6b 65 6e 4d 65 72 67 65 72 5b   - dTokenMerger[
a3b0: 22 6e 45 6e 64 22 5d 29 20 2b 20 64 54 6f 6b 65  "nEnd"]) + dToke
a3c0: 6e 5b 22 73 56 61 6c 75 65 22 5d 3b 0a 20 20 20  n["sValue"];.   
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3e0: 20 64 54 6f 6b 65 6e 4d 65 72 67 65 72 5b 22 6e   dTokenMerger["n
a3f0: 45 6e 64 22 5d 20 3d 20 64 54 6f 6b 65 6e 5b 22  End"] = dToken["
a400: 6e 45 6e 64 22 5d 3b 0a 20 20 20 20 20 20 20 20  nEnd"];.        
a410: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
a420: 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20  bDebug) {.      
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a440: 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20    console.log(" 
a450: 20 4d 45 52 47 45 44 20 54 4f 4b 45 4e 3a 20 22   MERGED TOKEN: "
a460: 20 2b 20 64 54 6f 6b 65 6e 4d 65 72 67 65 72 5b   + dTokenMerger[
a470: 22 73 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20  "sValue"]);.    
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a490: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
a4a0: 20 20 20 20 20 20 62 4b 65 65 70 54 6f 6b 65 6e        bKeepToken
a4b0: 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20   = false;.      
a4c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a4d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
a4e0: 64 54 6f 6b 65 6e 2e 68 61 73 4f 77 6e 50 72 6f  dToken.hasOwnPro
a4f0: 70 65 72 74 79 28 22 6e 4d 65 72 67 65 55 6e 74  perty("nMergeUnt
a500: 69 6c 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20  il")) {.        
a510: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
a520: 69 54 6f 6b 65 6e 20 3e 20 6e 4d 65 72 67 65 55  iToken > nMergeU
a530: 6e 74 69 6c 29 20 7b 20 2f 2f 20 74 68 69 73 20  ntil) { // this 
a540: 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 20 61 6c 72  token is not alr
a550: 65 61 64 79 20 6d 65 72 67 65 64 20 77 69 74 68  eady merged with
a560: 20 61 20 70 72 65 76 69 6f 75 73 20 74 6f 6b 65   a previous toke
a570: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
a580: 20 20 20 20 20 20 20 20 20 20 64 54 6f 6b 65 6e            dToken
a590: 4d 65 72 67 65 72 20 3d 20 64 54 6f 6b 65 6e 3b  Merger = dToken;
a5a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a5b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a5c0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64             if (d
a5d0: 54 6f 6b 65 6e 5b 22 6e 4d 65 72 67 65 55 6e 74  Token["nMergeUnt
a5e0: 69 6c 22 5d 20 3e 20 6e 4d 65 72 67 65 55 6e 74  il"] > nMergeUnt
a5f0: 69 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  il) {.          
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4d                nM
a610: 65 72 67 65 55 6e 74 69 6c 20 3d 20 64 54 6f 6b  ergeUntil = dTok
a620: 65 6e 5b 22 6e 4d 65 72 67 65 55 6e 74 69 6c 22  en["nMergeUntil"
a630: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
a640: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a650: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 6c               del
a660: 65 74 65 20 64 54 6f 6b 65 6e 5b 22 6e 4d 65 72  ete dToken["nMer
a670: 67 65 55 6e 74 69 6c 22 5d 3b 0a 20 20 20 20 20  geUntil"];.     
a680: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
a6a0: 65 20 69 66 20 28 64 54 6f 6b 65 6e 2e 68 61 73  e if (dToken.has
a6b0: 4f 77 6e 50 72 6f 70 65 72 74 79 28 22 62 54 6f  OwnProperty("bTo
a6c0: 52 65 6d 6f 76 65 22 29 29 20 7b 0a 20 20 20 20  Remove")) {.    
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6e0: 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20  if (bDebug) {.  
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a700: 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f        console.lo
a710: 67 28 22 20 20 52 45 4d 4f 56 45 44 3a 20 22 20  g("  REMOVED: " 
a720: 2b 20 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65  + dToken["sValue
a730: 22 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  "]);.           
a740: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
a760: 68 69 73 2e 73 53 65 6e 74 65 6e 63 65 20 3d 20  his.sSentence = 
a770: 74 68 69 73 2e 73 53 65 6e 74 65 6e 63 65 2e 73  this.sSentence.s
a780: 6c 69 63 65 28 30 2c 20 64 54 6f 6b 65 6e 5b 22  lice(0, dToken["
a790: 6e 53 74 61 72 74 22 5d 29 20 2b 20 22 20 22 2e  nStart"]) + " ".
a7a0: 72 65 70 65 61 74 28 64 54 6f 6b 65 6e 5b 22 6e  repeat(dToken["n
a7b0: 45 6e 64 22 5d 20 2d 20 64 54 6f 6b 65 6e 5b 22  End"] - dToken["
a7c0: 6e 53 74 61 72 74 22 5d 29 20 2b 20 74 68 69 73  nStart"]) + this
a7d0: 2e 73 53 65 6e 74 65 6e 63 65 2e 73 6c 69 63 65  .sSentence.slice
a7e0: 28 64 54 6f 6b 65 6e 5b 22 6e 45 6e 64 22 5d 29  (dToken["nEnd"])
a7f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a800: 20 20 20 20 20 20 62 4b 65 65 70 54 6f 6b 65 6e        bKeepToken
a810: 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20   = false;.      
a820: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a830: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a840: 20 20 20 20 20 20 2f 2f 0a 20 20 20 20 20 20 20        //.       
a850: 20 20 20 20 20 69 66 20 28 62 4b 65 65 70 54 6f       if (bKeepTo
a860: 6b 65 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ken) {.         
a870: 20 20 20 20 20 20 20 6c 4e 65 77 54 6f 6b 65 6e         lNewToken
a880: 2e 70 75 73 68 28 64 54 6f 6b 65 6e 29 3b 0a 20  .push(dToken);. 
a890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
a8a0: 66 20 28 64 54 6f 6b 65 6e 2e 68 61 73 4f 77 6e  f (dToken.hasOwn
a8b0: 50 72 6f 70 65 72 74 79 28 22 73 4e 65 77 56 61  Property("sNewVa
a8c0: 6c 75 65 22 29 29 20 7b 0a 20 20 20 20 20 20 20  lue")) {.       
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
a8e0: 72 65 77 72 69 74 65 20 74 6f 6b 65 6e 20 61 6e  rewrite token an
a8f0: 64 20 73 65 6e 74 65 6e 63 65 0a 20 20 20 20 20  d sentence.     
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
a910: 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20  f (bDebug) {.   
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a930: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
a940: 28 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22  (dToken["sValue"
a950: 5d 20 2b 20 22 20 2d 3e 20 22 20 2b 20 64 54 6f  ] + " -> " + dTo
a960: 6b 65 6e 5b 22 73 4e 65 77 56 61 6c 75 65 22 5d  ken["sNewValue"]
a970: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
a980: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 54 6f               dTo
a9a0: 6b 65 6e 5b 22 73 52 65 61 6c 56 61 6c 75 65 22  ken["sRealValue"
a9b0: 5d 20 3d 20 64 54 6f 6b 65 6e 5b 22 73 56 61 6c  ] = dToken["sVal
a9c0: 75 65 22 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  ue"];.          
a9d0: 20 20 20 20 20 20 20 20 20 20 64 54 6f 6b 65 6e            dToken
a9e0: 5b 22 73 56 61 6c 75 65 22 5d 20 3d 20 64 54 6f  ["sValue"] = dTo
a9f0: 6b 65 6e 5b 22 73 4e 65 77 56 61 6c 75 65 22 5d  ken["sNewValue"]
aa00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
aa10: 20 20 20 20 20 20 6c 65 74 20 6e 44 69 66 66 4c        let nDiffL
aa20: 65 6e 20 3d 20 64 54 6f 6b 65 6e 5b 22 73 52 65  en = dToken["sRe
aa30: 61 6c 56 61 6c 75 65 22 5d 2e 6c 65 6e 67 74 68  alValue"].length
aa40: 20 2d 20 64 54 6f 6b 65 6e 5b 22 73 4e 65 77 56   - dToken["sNewV
aa50: 61 6c 75 65 22 5d 2e 6c 65 6e 67 74 68 3b 0a 20  alue"].length;. 
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa70: 20 20 20 6c 65 74 20 73 4e 65 77 52 65 70 6c 20     let sNewRepl 
aa80: 3d 20 28 6e 44 69 66 66 4c 65 6e 20 3e 3d 20 30  = (nDiffLen >= 0
aa90: 29 20 3f 20 64 54 6f 6b 65 6e 5b 22 73 4e 65 77  ) ? dToken["sNew
aaa0: 56 61 6c 75 65 22 5d 20 2b 20 22 20 22 2e 72 65  Value"] + " ".re
aab0: 70 65 61 74 28 6e 44 69 66 66 4c 65 6e 29 20 3a  peat(nDiffLen) :
aac0: 20 64 54 6f 6b 65 6e 5b 22 73 4e 65 77 56 61 6c   dToken["sNewVal
aad0: 75 65 22 5d 2e 73 6c 69 63 65 28 30 2c 20 64 54  ue"].slice(0, dT
aae0: 6f 6b 65 6e 5b 22 73 52 65 61 6c 56 61 6c 75 65  oken["sRealValue
aaf0: 22 5d 2e 6c 65 6e 67 74 68 29 3b 0a 20 20 20 20  "].length);.    
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 74 68 69 73 2e 73 53 65 6e 74 65 6e 63 65 20 3d  this.sSentence =
ab20: 20 74 68 69 73 2e 73 53 65 6e 74 65 6e 63 65 2e   this.sSentence.
ab30: 73 6c 69 63 65 28 30 2c 64 54 6f 6b 65 6e 5b 22  slice(0,dToken["
ab40: 6e 53 74 61 72 74 22 5d 29 20 2b 20 73 4e 65 77  nStart"]) + sNew
ab50: 52 65 70 6c 20 2b 20 74 68 69 73 2e 73 53 65 6e  Repl + this.sSen
ab60: 74 65 6e 63 65 2e 73 6c 69 63 65 28 64 54 6f 6b  tence.slice(dTok
ab70: 65 6e 5b 22 6e 45 6e 64 22 5d 29 3b 0a 20 20 20  en["nEnd"]);.   
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab90: 20 64 65 6c 65 74 65 20 64 54 6f 6b 65 6e 5b 22   delete dToken["
aba0: 73 4e 65 77 56 61 6c 75 65 22 5d 3b 0a 20 20 20  sNewValue"];.   
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
abc0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
abd0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 7b 0a           else {.
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  try {.          
ac00: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 64            this.d
ac10: 54 6f 6b 65 6e 50 6f 73 2e 64 65 6c 65 74 65 28  TokenPos.delete(
ac20: 64 54 6f 6b 65 6e 5b 22 6e 53 74 61 72 74 22 5d  dToken["nStart"]
ac30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ac40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
ac50: 20 20 20 20 20 63 61 74 63 68 20 28 65 29 20 7b       catch (e) {
ac60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ac70: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
ac80: 28 74 68 69 73 2e 61 73 53 74 72 69 6e 67 28 29  (this.asString()
ac90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
aca0: 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c         console.l
acb0: 6f 67 28 64 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  og(dToken);.    
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
acd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ace0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
acf0: 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20   (bDebug) {.    
ad00: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
ad10: 6c 6f 67 28 22 20 20 54 45 58 54 20 52 45 57 52  log("  TEXT REWR
ad20: 49 54 45 44 3a 20 22 20 2b 20 74 68 69 73 2e 73  ITED: " + this.s
ad30: 53 65 6e 74 65 6e 63 65 29 3b 0a 20 20 20 20 20  Sentence);.     
ad40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 68 69     }.        thi
ad50: 73 2e 6c 54 6f 6b 65 6e 2e 6c 65 6e 67 74 68 20  s.lToken.length 
ad60: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 74 68 69  = 0;.        thi
ad70: 73 2e 6c 54 6f 6b 65 6e 20 3d 20 6c 4e 65 77 54  s.lToken = lNewT
ad80: 6f 6b 65 6e 3b 0a 20 20 20 20 7d 0a 7d 3b 0a 0a  oken;.    }.};..
ad90: 0a 2f 2f 2f 2f 2f 2f 2f 2f 20 43 6f 6d 6d 6f 6e  .//////// Common
ada0: 20 66 75 6e 63 74 69 6f 6e 73 0a 0a 66 75 6e 63   functions..func
adb0: 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 28 73 4f 70  tion option (sOp
adc0: 74 29 20 7b 0a 20 20 20 20 2f 2f 20 72 65 74 75  t) {.    // retu
add0: 72 6e 20 74 72 75 65 20 69 66 20 6f 70 74 69 6f  rn true if optio
ade0: 6e 20 73 4f 70 74 20 69 73 20 61 63 74 69 76 65  n sOpt is active
adf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 5f 64 4f 70  .    return _dOp
ae00: 74 69 6f 6e 73 2e 67 65 74 28 73 4f 70 74 29 3b  tions.get(sOpt);
ae10: 0a 7d 0a 0a 76 61 72 20 72 65 20 3d 20 7b 0a 20  .}..var re = {. 
ae20: 20 20 20 73 65 61 72 63 68 3a 20 66 75 6e 63 74     search: funct
ae30: 69 6f 6e 20 28 73 52 65 67 65 78 2c 20 73 54 65  ion (sRegex, sTe
ae40: 78 74 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66  xt) {.        if
ae50: 20 28 73 52 65 67 65 78 2e 73 74 61 72 74 73 57   (sRegex.startsW
ae60: 69 74 68 28 22 28 3f 69 29 22 29 29 20 7b 0a 20  ith("(?i)")) {. 
ae70: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
ae80: 6e 20 73 54 65 78 74 2e 73 65 61 72 63 68 28 6e  n sText.search(n
ae90: 65 77 20 52 65 67 45 78 70 28 73 52 65 67 65 78  ew RegExp(sRegex
aea0: 2e 73 6c 69 63 65 28 34 29 2c 20 22 69 22 29 29  .slice(4), "i"))
aeb0: 20 21 3d 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   !== -1;.       
aec0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
aed0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 54 65        return sTe
aee0: 78 74 2e 73 65 61 72 63 68 28 73 52 65 67 65 78  xt.search(sRegex
aef0: 29 20 21 3d 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ) !== -1;.      
af00: 20 20 7d 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20    }.    },..    
af10: 63 72 65 61 74 65 52 65 67 45 78 70 3a 20 66 75  createRegExp: fu
af20: 6e 63 74 69 6f 6e 20 28 73 52 65 67 65 78 29 20  nction (sRegex) 
af30: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 52  {.        if (sR
af40: 65 67 65 78 2e 73 74 61 72 74 73 57 69 74 68 28  egex.startsWith(
af50: 22 28 3f 69 29 22 29 29 20 7b 0a 20 20 20 20 20  "(?i)")) {.     
af60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65         return ne
af70: 77 20 52 65 67 45 78 70 28 73 52 65 67 65 78 2e  w RegExp(sRegex.
af80: 73 6c 69 63 65 28 34 29 2c 20 22 69 22 29 3b 0a  slice(4), "i");.
af90: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
afa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
afb0: 75 72 6e 20 6e 65 77 20 52 65 67 45 78 70 28 73  urn new RegExp(s
afc0: 52 65 67 65 78 29 3b 0a 20 20 20 20 20 20 20 20  Regex);.        
afd0: 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 2f 2f 2f 2f  }.    }.}...////
afe0: 2f 2f 2f 2f 20 66 75 6e 63 74 69 6f 6e 73 20 74  //// functions t
aff0: 6f 20 67 65 74 20 74 65 78 74 20 6f 75 74 73 69  o get text outsi
b000: 64 65 20 70 61 74 74 65 72 6e 20 73 63 6f 70 65  de pattern scope
b010: 0a 0a 2f 2f 20 77 61 72 6e 69 6e 67 3a 20 63 68  ..// warning: ch
b020: 65 63 6b 20 63 6f 6d 70 69 6c 65 5f 72 75 6c 65  eck compile_rule
b030: 73 2e 70 79 20 74 6f 20 75 6e 64 65 72 73 74 61  s.py to understa
b040: 6e 64 20 68 6f 77 20 69 74 20 77 6f 72 6b 73 0a  nd how it works.
b050: 0a 66 75 6e 63 74 69 6f 6e 20 6e 65 78 74 77 6f  .function nextwo
b060: 72 64 20 28 73 2c 20 69 53 74 61 72 74 2c 20 6e  rd (s, iStart, n
b070: 29 20 7b 0a 20 20 20 20 2f 2f 20 67 65 74 20 74  ) {.    // get t
b080: 68 65 20 6e 74 68 20 77 6f 72 64 20 6f 66 20 74  he nth word of t
b090: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
b0a0: 6f 72 20 65 6d 70 74 79 20 73 74 72 69 6e 67 0a  or empty string.
b0b0: 20 20 20 20 6c 65 74 20 7a 20 3d 20 6e 65 77 20      let z = new 
b0c0: 52 65 67 45 78 70 28 22 5e 28 3f 3a 20 2b 5b 61  RegExp("^(?: +[a
b0d0: 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf c3  -z..-..A-Z..-...
b0e0: 80 2d c3 96 30 2d 39 c3 98 2d c3 9f c4 80 2d ca  .-..0-9..-....-.
b0f0: af ef ac 81 2d ef ac 86 e1 b4 80 2d e1 b6 bf 25  ....-......-...%
b100: 5f 2d 5d 2b 29 7b 22 20 2b 20 28 6e 2d 31 29 2e  _-]+){" + (n-1).
b110: 74 6f 53 74 72 69 6e 67 28 29 20 2b 20 22 7d 20  toString() + "} 
b120: 2b 28 5b 61 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8  +([a-z..-..A-Z..
b130: 2d c3 bf c3 80 2d c3 96 30 2d 39 c3 98 2d c3 9f  -....-..0-9..-..
b140: c4 80 2d ca af ef ac 81 2d ef ac 86 e1 b4 80 2d  ..-.....-......-
b150: e1 b6 bf 25 5f 2d 5d 2b 29 22 2c 20 22 69 67 22  ...%_-]+)", "ig"
b160: 29 3b 0a 20 20 20 20 6c 65 74 20 6d 20 3d 20 7a  );.    let m = z
b170: 2e 65 78 65 63 28 73 2e 73 6c 69 63 65 28 69 53  .exec(s.slice(iS
b180: 74 61 72 74 29 29 3b 0a 20 20 20 20 69 66 20 28  tart));.    if (
b190: 21 6d 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  !m) {.        re
b1a0: 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20 20 7d  turn null;.    }
b1b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 69 53 74  .    return [iSt
b1c0: 61 72 74 20 2b 20 7a 2e 6c 61 73 74 49 6e 64 65  art + z.lastInde
b1d0: 78 20 2d 20 6d 5b 31 5d 2e 6c 65 6e 67 74 68 2c  x - m[1].length,
b1e0: 20 6d 5b 31 5d 5d 3b 0a 7d 0a 0a 66 75 6e 63 74   m[1]];.}..funct
b1f0: 69 6f 6e 20 70 72 65 76 77 6f 72 64 20 28 73 2c  ion prevword (s,
b200: 20 69 45 6e 64 2c 20 6e 29 20 7b 0a 20 20 20 20   iEnd, n) {.    
b210: 2f 2f 20 67 65 74 20 74 68 65 20 28 2d 29 6e 74  // get the (-)nt
b220: 68 20 77 6f 72 64 20 6f 66 20 74 68 65 20 69 6e  h word of the in
b230: 70 75 74 20 73 74 72 69 6e 67 20 6f 72 20 65 6d  put string or em
b240: 70 74 79 20 73 74 72 69 6e 67 0a 20 20 20 20 6c  pty string.    l
b250: 65 74 20 7a 20 3d 20 6e 65 77 20 52 65 67 45 78  et z = new RegEx
b260: 70 28 22 28 5b 61 2d 7a c3 a0 2d c3 b6 41 2d 5a  p("([a-z..-..A-Z
b270: c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39 c3 98 2d  ..-....-..0-9..-
b280: c3 9f c4 80 2d ca af ef ac 81 2d ef ac 86 e1 b4  ....-.....-.....
b290: 80 2d e1 b6 bf 25 5f 2d 5d 2b 29 20 2b 28 3f 3a  .-...%_-]+) +(?:
b2a0: 5b 61 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8 2d c3  [a-z..-..A-Z..-.
b2b0: bf c3 80 2d c3 96 30 2d 39 c3 98 2d c3 9f c4 80  ...-..0-9..-....
b2c0: 2d ca af ef ac 81 2d ef ac 86 e1 b4 80 2d e1 b6  -.....-......-..
b2d0: bf 25 5f 2d 5d 2b 20 2b 29 7b 22 20 2b 20 28 6e  .%_-]+ +){" + (n
b2e0: 2d 31 29 2e 74 6f 53 74 72 69 6e 67 28 29 20 2b  -1).toString() +
b2f0: 20 22 7d 24 22 2c 20 22 69 22 29 3b 0a 20 20 20   "}$", "i");.   
b300: 20 6c 65 74 20 6d 20 3d 20 7a 2e 65 78 65 63 28   let m = z.exec(
b310: 73 2e 73 6c 69 63 65 28 30 2c 20 69 45 6e 64 29  s.slice(0, iEnd)
b320: 29 3b 0a 20 20 20 20 69 66 20 28 21 6d 29 20 7b  );.    if (!m) {
b330: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b340: 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  null;.    }.    
b350: 72 65 74 75 72 6e 20 5b 6d 2e 69 6e 64 65 78 2c  return [m.index,
b360: 20 6d 5b 31 5d 5d 3b 0a 7d 0a 0a 66 75 6e 63 74   m[1]];.}..funct
b370: 69 6f 6e 20 6e 65 78 74 77 6f 72 64 31 20 28 73  ion nextword1 (s
b380: 2c 20 69 53 74 61 72 74 29 20 7b 0a 20 20 20 20  , iStart) {.    
b390: 2f 2f 20 67 65 74 20 6e 65 78 74 20 77 6f 72 64  // get next word
b3a0: 20 28 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 29 0a   (optimization).
b3b0: 20 20 20 20 6c 65 74 20 5f 7a 4e 65 78 74 57 6f      let _zNextWo
b3c0: 72 64 20 3d 20 6e 65 77 20 52 65 67 45 78 70 20  rd = new RegExp 
b3d0: 28 22 5e 20 2b 28 5b 61 2d 7a c3 a0 2d c3 b6 41  ("^ +([a-z..-..A
b3e0: 2d 5a c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39 c3  -Z..-....-..0-9.
b3f0: 98 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac 86  .-....-.....-...
b400: e1 b4 80 2d e1 b6 bf 5f 5d 5b 61 2d 7a c3 a0 2d  ...-..._][a-z..-
b410: c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3 96 30  ..A-Z..-....-..0
b420: 2d 39 c3 98 2d c3 9f c4 80 2d ca af ef ac 81 2d  -9..-....-.....-
b430: ef ac 86 e1 b4 80 2d e1 b6 bf 5f 2d 5d 2a 29 22  ......-..._-]*)"
b440: 2c 20 22 69 67 22 29 3b 0a 20 20 20 20 6c 65 74  , "ig");.    let
b450: 20 6d 20 3d 20 5f 7a 4e 65 78 74 57 6f 72 64 2e   m = _zNextWord.
b460: 65 78 65 63 28 73 2e 73 6c 69 63 65 28 69 53 74  exec(s.slice(iSt
b470: 61 72 74 29 29 3b 0a 20 20 20 20 69 66 20 28 21  art));.    if (!
b480: 6d 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m) {.        ret
b490: 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a  urn null;.    }.
b4a0: 20 20 20 20 72 65 74 75 72 6e 20 5b 69 53 74 61      return [iSta
b4b0: 72 74 20 2b 20 5f 7a 4e 65 78 74 57 6f 72 64 2e  rt + _zNextWord.
b4c0: 6c 61 73 74 49 6e 64 65 78 20 2d 20 6d 5b 31 5d  lastIndex - m[1]
b4d0: 2e 6c 65 6e 67 74 68 2c 20 6d 5b 31 5d 5d 3b 0a  .length, m[1]];.
b4e0: 7d 0a 0a 63 6f 6e 73 74 20 5f 7a 50 72 65 76 57  }..const _zPrevW
b4f0: 6f 72 64 20 3d 20 6e 65 77 20 52 65 67 45 78 70  ord = new RegExp
b500: 20 28 22 28 5b 61 2d 7a c3 a0 2d c3 b6 41 2d 5a   ("([a-z..-..A-Z
b510: c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39 c3 98 2d  ..-....-..0-9..-
b520: c3 9f c4 80 2d ca af ef ac 81 2d ef ac 86 e1 b4  ....-.....-.....
b530: 80 2d e1 b6 bf 5f 5d 5b 61 2d 7a c3 a0 2d c3 b6  .-..._][a-z..-..
b540: 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39  A-Z..-....-..0-9
b550: c3 98 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac  ..-....-.....-..
b560: 86 e1 b4 80 2d e1 b6 bf 5f 2d 5d 2a 29 20 2b 24  ....-..._-]*) +$
b570: 22 2c 20 22 69 22 29 3b 0a 0a 66 75 6e 63 74 69  ", "i");..functi
b580: 6f 6e 20 70 72 65 76 77 6f 72 64 31 20 28 73 2c  on prevword1 (s,
b590: 20 69 45 6e 64 29 20 7b 0a 20 20 20 20 2f 2f 20   iEnd) {.    // 
b5a0: 67 65 74 20 70 72 65 76 69 6f 75 73 20 77 6f 72  get previous wor
b5b0: 64 20 28 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 29  d (optimization)
b5c0: 0a 20 20 20 20 6c 65 74 20 6d 20 3d 20 5f 7a 50  .    let m = _zP
b5d0: 72 65 76 57 6f 72 64 2e 65 78 65 63 28 73 2e 73  revWord.exec(s.s
b5e0: 6c 69 63 65 28 30 2c 20 69 45 6e 64 29 29 3b 0a  lice(0, iEnd));.
b5f0: 20 20 20 20 69 66 20 28 21 6d 29 20 7b 0a 20 20      if (!m) {.  
b600: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c        return nul
b610: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  l;.    }.    ret
b620: 75 72 6e 20 5b 6d 2e 69 6e 64 65 78 2c 20 6d 5b  urn [m.index, m[
b630: 31 5d 5d 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e  1]];.}..function
b640: 20 6c 6f 6f 6b 20 28 73 2c 20 73 50 61 74 74 65   look (s, sPatte
b650: 72 6e 2c 20 73 4e 65 67 50 61 74 74 65 72 6e 3d  rn, sNegPattern=
b660: 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 2f 2f 20 73  null) {.    // s
b670: 65 65 6b 20 73 50 61 74 74 65 72 6e 20 69 6e 20  eek sPattern in 
b680: 73 20 28 62 65 66 6f 72 65 2f 61 66 74 65 72 2f  s (before/after/
b690: 66 75 6c 6c 74 65 78 74 29 2c 20 69 66 20 61 6e  fulltext), if an
b6a0: 74 69 70 61 74 74 65 72 6e 20 73 4e 65 67 50 61  tipattern sNegPa
b6b0: 74 74 65 72 6e 20 6e 6f 74 20 69 6e 20 73 0a 20  ttern not in s. 
b6c0: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
b6d0: 20 69 66 20 28 73 4e 65 67 50 61 74 74 65 72 6e   if (sNegPattern
b6e0: 20 26 26 20 72 65 2e 73 65 61 72 63 68 28 73 4e   && re.search(sN
b6f0: 65 67 50 61 74 74 65 72 6e 2c 20 73 29 29 20 7b  egPattern, s)) {
b700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
b710: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 20  urn false;.     
b720: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
b730: 75 72 6e 20 72 65 2e 73 65 61 72 63 68 28 73 50  urn re.search(sP
b740: 61 74 74 65 72 6e 2c 20 73 29 3b 0a 20 20 20 20  attern, s);.    
b750: 7d 0a 20 20 20 20 63 61 74 63 68 20 28 65 29 20  }.    catch (e) 
b760: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c  {.        consol
b770: 65 2e 65 72 72 6f 72 28 65 29 3b 0a 20 20 20 20  e.error(e);.    
b780: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c  }.    return fal
b790: 73 65 3b 0a 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  se;.}...////////
b7a0: 20 41 6e 61 6c 79 73 65 20 67 72 6f 75 70 73 20   Analyse groups 
b7b0: 66 6f 72 20 72 65 67 65 78 20 72 75 6c 65 73 0a  for regex rules.
b7c0: 0a 66 75 6e 63 74 69 6f 6e 20 64 69 73 70 6c 61  .function displa
b7d0: 79 49 6e 66 6f 20 28 64 54 6f 6b 65 6e 50 6f 73  yInfo (dTokenPos
b7e0: 2c 20 61 57 6f 72 64 29 20 7b 0a 20 20 20 20 2f  , aWord) {.    /
b7f0: 2f 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 3a  / for debugging:
b800: 20 69 6e 66 6f 20 6f 66 20 77 6f 72 64 0a 20 20   info of word.  
b810: 20 20 69 66 20 28 21 61 57 6f 72 64 29 20 7b 0a    if (!aWord) {.
b820: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
b830: 6c 6f 67 28 22 3e 20 6e 6f 74 68 69 6e 67 20 74  log("> nothing t
b840: 6f 20 66 69 6e 64 22 29 3b 0a 20 20 20 20 20 20  o find");.      
b850: 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20    return true;. 
b860: 20 20 20 7d 0a 20 20 20 20 6c 65 74 20 6c 4d 6f     }.    let lMo
b870: 72 70 68 20 3d 20 5f 6f 53 70 65 6c 6c 43 68 65  rph = _oSpellChe
b880: 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28 61 57  cker.getMorph(aW
b890: 6f 72 64 5b 31 5d 29 3b 0a 20 20 20 20 69 66 20  ord[1]);.    if 
b8a0: 28 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d  (lMorph.length =
b8b0: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20  == 0) {.        
b8c0: 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 3e 20 6e  console.log("> n
b8d0: 6f 74 20 69 6e 20 64 69 63 74 69 6f 6e 61 72 79  ot in dictionary
b8e0: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
b8f0: 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20  rn true;.    }. 
b900: 20 20 20 69 66 20 28 64 54 6f 6b 65 6e 50 6f 73     if (dTokenPos
b910: 2e 68 61 73 28 61 57 6f 72 64 5b 30 5d 29 29 20  .has(aWord[0])) 
b920: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c  {.        consol
b930: 65 2e 6c 6f 67 28 22 44 41 3a 20 22 20 2b 20 64  e.log("DA: " + d
b940: 54 6f 6b 65 6e 50 6f 73 2e 67 65 74 28 61 57 6f  TokenPos.get(aWo
b950: 72 64 5b 30 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  rd[0]));.    }. 
b960: 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22     console.log("
b970: 46 53 41 3a 20 22 20 2b 20 6c 4d 6f 72 70 68 29  FSA: " + lMorph)
b980: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72 75  ;.    return tru
b990: 65 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 6d  e;.}..function m
b9a0: 6f 72 70 68 20 28 64 54 6f 6b 65 6e 50 6f 73 2c  orph (dTokenPos,
b9b0: 20 61 57 6f 72 64 2c 20 73 50 61 74 74 65 72 6e   aWord, sPattern
b9c0: 2c 20 73 4e 65 67 50 61 74 74 65 72 6e 2c 20 62  , sNegPattern, b
b9d0: 4e 6f 57 6f 72 64 3d 66 61 6c 73 65 29 20 7b 0a  NoWord=false) {.
b9e0: 20 20 20 20 2f 2f 20 61 6e 61 6c 79 73 65 20 61      // analyse a
b9f0: 20 74 75 70 6c 65 20 28 70 6f 73 69 74 69 6f 6e   tuple (position
ba00: 2c 20 77 6f 72 64 29 2c 20 72 65 74 75 72 6e 73  , word), returns
ba10: 20 74 72 75 65 20 69 66 20 6e 6f 74 20 73 4e 65   true if not sNe
ba20: 67 50 61 74 74 65 72 6e 20 69 6e 20 77 6f 72 64  gPattern in word
ba30: 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20 61 6e   morphologies an
ba40: 64 20 73 50 61 74 74 65 72 6e 20 69 6e 20 77 6f  d sPattern in wo
ba50: 72 64 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20  rd morphologies 
ba60: 28 64 69 73 61 6d 62 69 67 75 61 74 69 6f 6e 20  (disambiguation 
ba70: 6f 6e 29 0a 20 20 20 20 69 66 20 28 21 61 57 6f  on).    if (!aWo
ba80: 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  rd) {.        re
ba90: 74 75 72 6e 20 62 4e 6f 57 6f 72 64 3b 0a 20 20  turn bNoWord;.  
baa0: 20 20 7d 0a 20 20 20 20 6c 65 74 20 6c 4d 6f 72    }.    let lMor
bab0: 70 68 20 3d 20 28 64 54 6f 6b 65 6e 50 6f 73 2e  ph = (dTokenPos.
bac0: 68 61 73 28 61 57 6f 72 64 5b 30 5d 29 20 20 26  has(aWord[0])  &
bad0: 26 20 20 64 54 6f 6b 65 6e 50 6f 73 2e 67 65 74  &  dTokenPos.get
bae0: 28 61 57 6f 72 64 5b 30 5d 29 29 5b 22 6c 4d 6f  (aWord[0]))["lMo
baf0: 72 70 68 22 5d 20 3f 20 64 54 6f 6b 65 6e 50 6f  rph"] ? dTokenPo
bb00: 73 2e 67 65 74 28 61 57 6f 72 64 5b 30 5d 29 5b  s.get(aWord[0])[
bb10: 22 6c 4d 6f 72 70 68 22 5d 20 3a 20 5f 6f 53 70  "lMorph"] : _oSp
bb20: 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74 4d 6f  ellChecker.getMo
bb30: 72 70 68 28 61 57 6f 72 64 5b 31 5d 29 3b 0a 20  rph(aWord[1]);. 
bb40: 20 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e 6c 65     if (lMorph.le
bb50: 6e 67 74 68 20 3d 3d 3d 20 30 29 20 7b 0a 20 20  ngth === 0) {.  
bb60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
bb70: 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  se;.    }.    if
bb80: 20 28 73 4e 65 67 50 61 74 74 65 72 6e 29 20 7b   (sNegPattern) {
bb90: 0a 20 20 20 20 20 20 20 20 2f 2f 20 63 68 65 63  .        // chec
bba0: 6b 20 6e 65 67 61 74 69 76 65 20 63 6f 6e 64 69  k negative condi
bbb0: 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 69 66 20  tion.        if 
bbc0: 28 73 4e 65 67 50 61 74 74 65 72 6e 20 3d 3d 3d  (sNegPattern ===
bbd0: 20 22 2a 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "*") {.        
bbe0: 20 20 20 20 2f 2f 20 61 6c 6c 20 6d 6f 72 70 68      // all morph
bbf0: 20 6d 75 73 74 20 6d 61 74 63 68 20 73 50 61 74   must match sPat
bc00: 74 65 72 6e 0a 20 20 20 20 20 20 20 20 20 20 20  tern.           
bc10: 20 72 65 74 75 72 6e 20 6c 4d 6f 72 70 68 2e 65   return lMorph.e
bc20: 76 65 72 79 28 73 4d 6f 72 70 68 20 20 3d 3e 20  very(sMorph  => 
bc30: 20 28 73 4d 6f 72 70 68 2e 73 65 61 72 63 68 28   (sMorph.search(
bc40: 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31  sPattern) !== -1
bc50: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
bc60: 20 20 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20        else {.   
bc70: 20 20 20 20 20 20 20 20 20 69 66 20 28 6c 4d 6f           if (lMo
bc80: 72 70 68 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20  rph.some(sMorph 
bc90: 20 3d 3e 20 20 28 73 4d 6f 72 70 68 2e 73 65 61   =>  (sMorph.sea
bca0: 72 63 68 28 73 4e 65 67 50 61 74 74 65 72 6e 29  rch(sNegPattern)
bcb0: 20 21 3d 3d 20 2d 31 29 29 29 20 7b 0a 20 20 20   !== -1))) {.   
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
bcd0: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 20  urn false;.     
bce0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bcf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2f 20   }.    }.    // 
bd00: 73 65 61 72 63 68 20 73 50 61 74 74 65 72 6e 0a  search sPattern.
bd10: 20 20 20 20 72 65 74 75 72 6e 20 6c 4d 6f 72 70      return lMorp
bd20: 68 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20 20 3d  h.some(sMorph  =
bd30: 3e 20 20 28 73 4d 6f 72 70 68 2e 73 65 61 72 63  >  (sMorph.searc
bd40: 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20  h(sPattern) !== 
bd50: 2d 31 29 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f  -1));.}..functio
bd60: 6e 20 61 6e 61 6c 79 73 65 20 28 73 57 6f 72 64  n analyse (sWord
bd70: 2c 20 73 50 61 74 74 65 72 6e 2c 20 73 4e 65 67  , sPattern, sNeg
bd80: 50 61 74 74 65 72 6e 29 20 7b 0a 20 20 20 20 2f  Pattern) {.    /
bd90: 2f 20 61 6e 61 6c 79 73 65 20 61 20 77 6f 72 64  / analyse a word
bda0: 2c 20 72 65 74 75 72 6e 73 20 54 72 75 65 20 69  , returns True i
bdb0: 66 20 6e 6f 74 20 73 4e 65 67 50 61 74 74 65 72  f not sNegPatter
bdc0: 6e 20 69 6e 20 77 6f 72 64 20 6d 6f 72 70 68 6f  n in word morpho
bdd0: 6c 6f 67 69 65 73 20 61 6e 64 20 73 50 61 74 74  logies and sPatt
bde0: 65 72 6e 20 69 6e 20 77 6f 72 64 20 6d 6f 72 70  ern in word morp
bdf0: 68 6f 6c 6f 67 69 65 73 20 28 64 69 73 61 6d 62  hologies (disamb
be00: 69 67 75 61 74 69 6f 6e 20 6f 66 66 29 0a 20 20  iguation off).  
be10: 20 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20 5f    let lMorph = _
be20: 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65  oSpellChecker.ge
be30: 74 4d 6f 72 70 68 28 73 57 6f 72 64 29 3b 0a 20  tMorph(sWord);. 
be40: 20 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e 6c 65     if (lMorph.le
be50: 6e 67 74 68 20 3d 3d 3d 20 30 29 20 7b 0a 20 20  ngth === 0) {.  
be60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
be70: 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  se;.    }.    if
be80: 20 28 73 4e 65 67 50 61 74 74 65 72 6e 29 20 7b   (sNegPattern) {
be90: 0a 20 20 20 20 20 20 20 20 2f 2f 20 63 68 65 63  .        // chec
bea0: 6b 20 6e 65 67 61 74 69 76 65 20 63 6f 6e 64 69  k negative condi
beb0: 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 69 66 20  tion.        if 
bec0: 28 73 4e 65 67 50 61 74 74 65 72 6e 20 3d 3d 3d  (sNegPattern ===
bed0: 20 22 2a 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "*") {.        
bee0: 20 20 20 20 2f 2f 20 61 6c 6c 20 6d 6f 72 70 68      // all morph
bef0: 20 6d 75 73 74 20 6d 61 74 63 68 20 73 50 61 74   must match sPat
bf00: 74 65 72 6e 0a 20 20 20 20 20 20 20 20 20 20 20  tern.           
bf10: 20 72 65 74 75 72 6e 20 6c 4d 6f 72 70 68 2e 65   return lMorph.e
bf20: 76 65 72 79 28 73 4d 6f 72 70 68 20 20 3d 3e 20  very(sMorph  => 
bf30: 20 28 73 4d 6f 72 70 68 2e 73 65 61 72 63 68 28   (sMorph.search(
bf40: 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31  sPattern) !== -1
bf50: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
bf60: 20 20 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20        else {.   
bf70: 20 20 20 20 20 20 20 20 20 69 66 20 28 6c 4d 6f           if (lMo
bf80: 72 70 68 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20  rph.some(sMorph 
bf90: 20 3d 3e 20 20 28 73 4d 6f 72 70 68 2e 73 65 61   =>  (sMorph.sea
bfa0: 72 63 68 28 73 4e 65 67 50 61 74 74 65 72 6e 29  rch(sNegPattern)
bfb0: 20 21 3d 3d 20 2d 31 29 29 29 20 7b 0a 20 20 20   !== -1))) {.   
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
bfd0: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 20  urn false;.     
bfe0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bff0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2f 20   }.    }.    // 
c000: 73 65 61 72 63 68 20 73 50 61 74 74 65 72 6e 0a  search sPattern.
c010: 20 20 20 20 72 65 74 75 72 6e 20 6c 4d 6f 72 70      return lMorp
c020: 68 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20 20 3d  h.some(sMorph  =
c030: 3e 20 20 28 73 4d 6f 72 70 68 2e 73 65 61 72 63  >  (sMorph.searc
c040: 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20  h(sPattern) !== 
c050: 2d 31 29 29 3b 0a 7d 0a 0a 0a 2f 2f 2f 2f 20 41  -1));.}...//// A
c060: 6e 61 6c 79 73 65 20 74 6f 6b 65 6e 73 20 66 6f  nalyse tokens fo
c070: 72 20 67 72 61 70 68 20 72 75 6c 65 73 0a 0a 66  r graph rules..f
c080: 75 6e 63 74 69 6f 6e 20 67 5f 76 61 6c 75 65 20  unction g_value 
c090: 28 64 54 6f 6b 65 6e 2c 20 73 56 61 6c 75 65 73  (dToken, sValues
c0a0: 2c 20 6e 4c 65 66 74 3d 6e 75 6c 6c 2c 20 6e 52  , nLeft=null, nR
c0b0: 69 67 68 74 3d 6e 75 6c 6c 29 20 7b 0a 20 20 20  ight=null) {.   
c0c0: 20 2f 2f 20 74 65 73 74 20 69 66 20 3c 64 54 6f   // test if <dTo
c0d0: 6b 65 6e 5b 27 73 56 61 6c 75 65 27 5d 3e 20 69  ken['sValue']> i
c0e0: 73 20 69 6e 20 73 56 61 6c 75 65 73 20 28 65 61  s in sValues (ea
c0f0: 63 68 20 76 61 6c 75 65 20 73 68 6f 75 6c 64 20  ch value should 
c100: 62 65 20 73 65 70 61 72 61 74 65 64 20 77 69 74  be separated wit
c110: 68 20 7c 29 0a 20 20 20 20 6c 65 74 20 73 56 61  h |).    let sVa
c120: 6c 75 65 20 3d 20 28 6e 4c 65 66 74 20 3d 3d 3d  lue = (nLeft ===
c130: 20 6e 75 6c 6c 29 20 3f 20 22 7c 22 2b 64 54 6f   null) ? "|"+dTo
c140: 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 2b 22 7c  ken["sValue"]+"|
c150: 22 20 3a 20 22 7c 22 2b 64 54 6f 6b 65 6e 5b 22  " : "|"+dToken["
c160: 73 56 61 6c 75 65 22 5d 2e 73 6c 69 63 65 28 6e  sValue"].slice(n
c170: 4c 65 66 74 2c 20 6e 52 69 67 68 74 29 2b 22 7c  Left, nRight)+"|
c180: 22 3b 0a 20 20 20 20 69 66 20 28 73 56 61 6c 75  ";.    if (sValu
c190: 65 73 2e 69 6e 63 6c 75 64 65 73 28 73 56 61 6c  es.includes(sVal
c1a0: 75 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20 72  ue)) {.        r
c1b0: 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20  eturn true;.    
c1c0: 7d 0a 20 20 20 20 69 66 20 28 64 54 6f 6b 65 6e  }.    if (dToken
c1d0: 5b 22 73 56 61 6c 75 65 22 5d 2e 73 6c 69 63 65  ["sValue"].slice
c1e0: 28 30 2c 32 29 2e 67 6c 5f 69 73 54 69 74 6c 65  (0,2).gl_isTitle
c1f0: 28 29 29 20 7b 20 2f 2f 20 77 65 20 74 65 73 74  ()) { // we test
c200: 20 6f 6e 6c 79 20 32 20 66 69 72 73 74 20 63 68   only 2 first ch
c210: 61 72 73 2c 20 74 6f 20 6d 61 6b 65 20 76 61 6c  ars, to make val
c220: 69 64 20 77 6f 72 64 73 20 73 75 63 68 20 61 73  id words such as
c230: 20 22 4c 61 69 73 73 65 7a 2d 6c 65 73 22 2c 20   "Laissez-les", 
c240: 22 50 61 73 73 65 2d 70 61 72 74 6f 75 74 22 2e  "Passe-partout".
c250: 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 56 61  .        if (sVa
c260: 6c 75 65 73 2e 69 6e 63 6c 75 64 65 73 28 73 56  lues.includes(sV
c270: 61 6c 75 65 2e 74 6f 4c 6f 77 65 72 43 61 73 65  alue.toLowerCase
c280: 28 29 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ())) {.         
c290: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a     return true;.
c2a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
c2b0: 20 20 20 20 65 6c 73 65 20 69 66 20 28 64 54 6f      else if (dTo
c2c0: 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 2e 67 6c  ken["sValue"].gl
c2d0: 5f 69 73 55 70 70 65 72 43 61 73 65 28 29 29 20  _isUpperCase()) 
c2e0: 7b 0a 20 20 20 20 20 20 20 20 2f 2f 69 66 20 73  {.        //if s
c2f0: 56 61 6c 75 65 2e 6c 6f 77 65 72 28 29 20 69 6e  Value.lower() in
c300: 20 73 56 61 6c 75 65 73 3a 0a 20 20 20 20 20 20   sValues:.      
c310: 20 20 2f 2f 20 20 20 20 72 65 74 75 72 6e 20 74    //    return t
c320: 72 75 65 3b 0a 20 20 20 20 20 20 20 20 73 56 61  rue;.        sVa
c330: 6c 75 65 20 3d 20 22 7c 22 2b 73 56 61 6c 75 65  lue = "|"+sValue
c340: 2e 73 6c 69 63 65 28 31 29 2e 67 6c 5f 74 6f 43  .slice(1).gl_toC
c350: 61 70 69 74 61 6c 69 7a 65 28 29 3b 0a 20 20 20  apitalize();.   
c360: 20 20 20 20 20 69 66 20 28 73 56 61 6c 75 65 73       if (sValues
c370: 2e 69 6e 63 6c 75 64 65 73 28 73 56 61 6c 75 65  .includes(sValue
c380: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
c390: 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20   return true;.  
c3a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c3b0: 73 56 61 6c 75 65 20 3d 20 73 56 61 6c 75 65 2e  sValue = sValue.
c3c0: 74 6f 4c 6f 77 65 72 43 61 73 65 28 29 3b 0a 20  toLowerCase();. 
c3d0: 20 20 20 20 20 20 20 69 66 20 28 73 56 61 6c 75         if (sValu
c3e0: 65 73 2e 69 6e 63 6c 75 64 65 73 28 73 56 61 6c  es.includes(sVal
c3f0: 75 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ue)) {.         
c400: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a     return true;.
c410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
c420: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
c430: 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 5f  ;.}..function g_
c440: 6d 6f 72 70 68 20 28 64 54 6f 6b 65 6e 2c 20 73  morph (dToken, s
c450: 50 61 74 74 65 72 6e 2c 20 73 4e 65 67 50 61 74  Pattern, sNegPat
c460: 74 65 72 6e 3d 22 22 2c 20 6e 4c 65 66 74 3d 6e  tern="", nLeft=n
c470: 75 6c 6c 2c 20 6e 52 69 67 68 74 3d 6e 75 6c 6c  ull, nRight=null
c480: 2c 20 62 4d 65 6d 6f 72 69 7a 65 4d 6f 72 70 68  , bMemorizeMorph
c490: 3d 74 72 75 65 29 20 7b 0a 20 20 20 20 2f 2f 20  =true) {.    // 
c4a0: 61 6e 61 6c 79 73 65 20 61 20 74 6f 6b 65 6e 2c  analyse a token,
c4b0: 20 72 65 74 75 72 6e 20 54 72 75 65 20 69 66 20   return True if 
c4c0: 3c 73 4e 65 67 50 61 74 74 65 72 6e 3e 20 6e 6f  <sNegPattern> no
c4d0: 74 20 69 6e 20 6d 6f 72 70 68 6f 6c 6f 67 69 65  t in morphologie
c4e0: 73 20 61 6e 64 20 3c 73 50 61 74 74 65 72 6e 3e  s and <sPattern>
c4f0: 20 69 6e 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73   in morphologies
c500: 0a 20 20 20 20 6c 65 74 20 6c 4d 6f 72 70 68 3b  .    let lMorph;
c510: 0a 20 20 20 20 69 66 20 28 64 54 6f 6b 65 6e 2e  .    if (dToken.
c520: 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 22  hasOwnProperty("
c530: 6c 4d 6f 72 70 68 22 29 29 20 7b 0a 20 20 20 20  lMorph")) {.    
c540: 20 20 20 20 6c 4d 6f 72 70 68 20 3d 20 64 54 6f      lMorph = dTo
c550: 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 3b 0a 20  ken["lMorph"];. 
c560: 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 7b 0a     }.    else {.
c570: 20 20 20 20 20 20 20 20 69 66 20 28 6e 4c 65 66          if (nLef
c580: 74 20 21 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20  t !== null) {.  
c590: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 73 56            let sV
c5a0: 61 6c 75 65 20 3d 20 28 6e 52 69 67 68 74 20 21  alue = (nRight !
c5b0: 3d 3d 20 6e 75 6c 6c 29 20 3f 20 64 54 6f 6b 65  == null) ? dToke
c5c0: 6e 5b 22 73 56 61 6c 75 65 22 5d 2e 73 6c 69 63  n["sValue"].slic
c5d0: 65 28 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74 29  e(nLeft, nRight)
c5e0: 20 3a 20 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75   : dToken["sValu
c5f0: 65 22 5d 2e 73 6c 69 63 65 28 6e 4c 65 66 74 29  e"].slice(nLeft)
c600: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 4d  ;.            lM
c610: 6f 72 70 68 20 3d 20 5f 6f 53 70 65 6c 6c 43 68  orph = _oSpellCh
c620: 65 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28 73  ecker.getMorph(s
c630: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
c640: 20 20 20 20 69 66 20 28 62 4d 65 6d 6f 72 69 7a      if (bMemoriz
c650: 65 4d 6f 72 70 68 29 20 7b 0a 20 20 20 20 20 20  eMorph) {.      
c660: 20 20 20 20 20 20 20 20 20 20 64 54 6f 6b 65 6e            dToken
c670: 5b 22 6c 4d 6f 72 70 68 22 5d 20 3d 20 6c 4d 6f  ["lMorph"] = lMo
c680: 72 70 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rph;.           
c690: 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73   }.        } els
c6a0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
c6b0: 6c 4d 6f 72 70 68 20 3d 20 5f 6f 53 70 65 6c 6c  lMorph = _oSpell
c6c0: 43 68 65 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68  Checker.getMorph
c6d0: 28 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22  (dToken["sValue"
c6e0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
c6f0: 20 20 7d 0a 20 20 20 20 69 66 20 28 6c 4d 6f 72    }.    if (lMor
c700: 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 20 30 29 20  ph.length == 0) 
c710: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
c720: 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20   false;.    }.  
c730: 20 20 2f 2f 20 63 68 65 63 6b 20 6e 65 67 61 74    // check negat
c740: 69 76 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20  ive condition.  
c750: 20 20 69 66 20 28 73 4e 65 67 50 61 74 74 65 72    if (sNegPatter
c760: 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  n) {.        if 
c770: 28 73 4e 65 67 50 61 74 74 65 72 6e 20 3d 3d 20  (sNegPattern == 
c780: 22 2a 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20  "*") {.         
c790: 20 20 20 2f 2f 20 61 6c 6c 20 6d 6f 72 70 68 20     // all morph 
c7a0: 6d 75 73 74 20 6d 61 74 63 68 20 73 50 61 74 74  must match sPatt
c7b0: 65 72 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ern.            
c7c0: 72 65 74 75 72 6e 20 6c 4d 6f 72 70 68 2e 65 76  return lMorph.ev
c7d0: 65 72 79 28 73 4d 6f 72 70 68 20 20 3d 3e 20 20  ery(sMorph  =>  
c7e0: 28 73 4d 6f 72 70 68 2e 73 65 61 72 63 68 28 73  (sMorph.search(s
c7f0: 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29  Pattern) !== -1)
c800: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c810: 20 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20       else {.    
c820: 20 20 20 20 20 20 20 20 69 66 20 28 6c 4d 6f 72          if (lMor
c830: 70 68 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20 20  ph.some(sMorph  
c840: 3d 3e 20 20 28 73 4d 6f 72 70 68 2e 73 65 61 72  =>  (sMorph.sear
c850: 63 68 28 73 4e 65 67 50 61 74 74 65 72 6e 29 20  ch(sNegPattern) 
c860: 21 3d 3d 20 2d 31 29 29 29 20 7b 0a 20 20 20 20  !== -1))) {.    
c870: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
c880: 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20  rn false;.      
c890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c8a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2f 20 73  }.    }.    // s
c8b0: 65 61 72 63 68 20 73 50 61 74 74 65 72 6e 0a 20  earch sPattern. 
c8c0: 20 20 20 72 65 74 75 72 6e 20 6c 4d 6f 72 70 68     return lMorph
c8d0: 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20 20 3d 3e  .some(sMorph  =>
c8e0: 20 20 28 73 4d 6f 72 70 68 2e 73 65 61 72 63 68    (sMorph.search
c8f0: 28 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d  (sPattern) !== -
c900: 31 29 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e  1));.}..function
c910: 20 67 5f 61 6e 61 6c 79 73 65 20 28 64 54 6f 6b   g_analyse (dTok
c920: 65 6e 2c 20 73 50 61 74 74 65 72 6e 2c 20 73 4e  en, sPattern, sN
c930: 65 67 50 61 74 74 65 72 6e 3d 22 22 2c 20 6e 4c  egPattern="", nL
c940: 65 66 74 3d 6e 75 6c 6c 2c 20 6e 52 69 67 68 74  eft=null, nRight
c950: 3d 6e 75 6c 6c 2c 20 62 4d 65 6d 6f 72 69 7a 65  =null, bMemorize
c960: 4d 6f 72 70 68 3d 74 72 75 65 29 20 7b 0a 20 20  Morph=true) {.  
c970: 20 20 2f 2f 20 61 6e 61 6c 79 73 65 20 61 20 74    // analyse a t
c980: 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 54 72 75  oken, return Tru
c990: 65 20 69 66 20 3c 73 4e 65 67 50 61 74 74 65 72  e if <sNegPatter
c9a0: 6e 3e 20 6e 6f 74 20 69 6e 20 6d 6f 72 70 68 6f  n> not in morpho
c9b0: 6c 6f 67 69 65 73 20 61 6e 64 20 3c 73 50 61 74  logies and <sPat
c9c0: 74 65 72 6e 3e 20 69 6e 20 6d 6f 72 70 68 6f 6c  tern> in morphol
c9d0: 6f 67 69 65 73 0a 20 20 20 20 6c 65 74 20 6c 4d  ogies.    let lM
c9e0: 6f 72 70 68 3b 0a 20 20 20 20 69 66 20 28 6e 4c  orph;.    if (nL
c9f0: 65 66 74 20 21 3d 3d 20 6e 75 6c 6c 29 20 7b 0a  eft !== null) {.
ca00: 20 20 20 20 20 20 20 20 6c 65 74 20 73 56 61 6c          let sVal
ca10: 75 65 20 3d 20 28 6e 52 69 67 68 74 20 21 3d 3d  ue = (nRight !==
ca20: 20 6e 75 6c 6c 29 20 3f 20 64 54 6f 6b 65 6e 5b   null) ? dToken[
ca30: 22 73 56 61 6c 75 65 22 5d 2e 73 6c 69 63 65 28  "sValue"].slice(
ca40: 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74 29 20 3a  nLeft, nRight) :
ca50: 20 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22   dToken["sValue"
ca60: 5d 2e 73 6c 69 63 65 28 6e 4c 65 66 74 29 3b 0a  ].slice(nLeft);.
ca70: 20 20 20 20 20 20 20 20 6c 4d 6f 72 70 68 20 3d          lMorph =
ca80: 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e   _oSpellChecker.
ca90: 67 65 74 4d 6f 72 70 68 28 73 56 61 6c 75 65 29  getMorph(sValue)
caa0: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 62 4d  ;.        if (bM
cab0: 65 6d 6f 72 69 7a 65 4d 6f 72 70 68 29 20 7b 0a  emorizeMorph) {.
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 64 54 6f 6b              dTok
cad0: 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 20 3d 20 6c  en["lMorph"] = l
cae0: 4d 6f 72 70 68 3b 0a 20 20 20 20 20 20 20 20 7d  Morph;.        }
caf0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
cb00: 20 20 20 20 20 20 6c 4d 6f 72 70 68 20 3d 20 5f        lMorph = _
cb10: 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65  oSpellChecker.ge
cb20: 74 4d 6f 72 70 68 28 64 54 6f 6b 65 6e 5b 22 73  tMorph(dToken["s
cb30: 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20 7d 0a  Value"]);.    }.
cb40: 20 20 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e 6c      if (lMorph.l
cb50: 65 6e 67 74 68 20 3d 3d 20 30 29 20 7b 0a 20 20  ength == 0) {.  
cb60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
cb70: 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2f  se;.    }.    //
cb80: 20 63 68 65 63 6b 20 6e 65 67 61 74 69 76 65 20   check negative 
cb90: 63 6f 6e 64 69 74 69 6f 6e 0a 20 20 20 20 69 66  condition.    if
cba0: 20 28 73 4e 65 67 50 61 74 74 65 72 6e 29 20 7b   (sNegPattern) {
cbb0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 4e 65  .        if (sNe
cbc0: 67 50 61 74 74 65 72 6e 20 3d 3d 20 22 2a 22 29  gPattern == "*")
cbd0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   {.            /
cbe0: 2f 20 61 6c 6c 20 6d 6f 72 70 68 20 6d 75 73 74  / all morph must
cbf0: 20 6d 61 74 63 68 20 73 50 61 74 74 65 72 6e 0a   match sPattern.
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
cc10: 72 6e 20 6c 4d 6f 72 70 68 2e 65 76 65 72 79 28  rn lMorph.every(
cc20: 73 4d 6f 72 70 68 20 20 3d 3e 20 20 28 73 4d 6f  sMorph  =>  (sMo
cc30: 72 70 68 2e 73 65 61 72 63 68 28 73 50 61 74 74  rph.search(sPatt
cc40: 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 20  ern) !== -1));. 
cc50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cc60: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
cc70: 20 20 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e 73      if (lMorph.s
cc80: 6f 6d 65 28 73 4d 6f 72 70 68 20 20 3d 3e 20 20  ome(sMorph  =>  
cc90: 28 73 4d 6f 72 70 68 2e 73 65 61 72 63 68 28 73  (sMorph.search(s
cca0: 4e 65 67 50 61 74 74 65 72 6e 29 20 21 3d 3d 20  NegPattern) !== 
ccb0: 2d 31 29 29 29 20 7b 0a 20 20 20 20 20 20 20 20  -1))) {.        
ccc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
ccd0: 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  alse;.          
cce0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
ccf0: 20 20 7d 0a 20 20 20 20 2f 2f 20 73 65 61 72 63    }.    // searc
cd00: 68 20 73 50 61 74 74 65 72 6e 0a 20 20 20 20 72  h sPattern.    r
cd10: 65 74 75 72 6e 20 6c 4d 6f 72 70 68 2e 73 6f 6d  eturn lMorph.som
cd20: 65 28 73 4d 6f 72 70 68 20 20 3d 3e 20 20 28 73  e(sMorph  =>  (s
cd30: 4d 6f 72 70 68 2e 73 65 61 72 63 68 28 73 50 61  Morph.search(sPa
cd40: 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29 3b  ttern) !== -1));
cd50: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 5f 6d  .}..function g_m
cd60: 65 72 67 65 64 5f 61 6e 61 6c 79 73 65 20 28 64  erged_analyse (d
cd70: 54 6f 6b 65 6e 31 2c 20 64 54 6f 6b 65 6e 32 2c  Token1, dToken2,
cd80: 20 63 4d 65 72 67 65 72 2c 20 73 50 61 74 74 65   cMerger, sPatte
cd90: 72 6e 2c 20 73 4e 65 67 50 61 74 74 65 72 6e 3d  rn, sNegPattern=
cda0: 22 22 2c 20 62 53 65 74 4d 6f 72 70 68 3d 74 72  "", bSetMorph=tr
cdb0: 75 65 29 20 7b 0a 20 20 20 20 2f 2f 20 6d 65 72  ue) {.    // mer
cdc0: 67 65 20 74 77 6f 20 74 6f 6b 65 6e 20 76 61 6c  ge two token val
cdd0: 75 65 73 2c 20 72 65 74 75 72 6e 20 54 72 75 65  ues, return True
cde0: 20 69 66 20 3c 73 4e 65 67 50 61 74 74 65 72 6e   if <sNegPattern
cdf0: 3e 20 6e 6f 74 20 69 6e 20 6d 6f 72 70 68 6f 6c  > not in morphol
ce00: 6f 67 69 65 73 20 61 6e 64 20 3c 73 50 61 74 74  ogies and <sPatt
ce10: 65 72 6e 3e 20 69 6e 20 6d 6f 72 70 68 6f 6c 6f  ern> in morpholo
ce20: 67 69 65 73 20 28 64 69 73 61 6d 62 69 67 75 61  gies (disambigua
ce30: 74 69 6f 6e 20 6f 66 66 29 0a 20 20 20 20 6c 65  tion off).    le
ce40: 74 20 6c 4d 6f 72 70 68 20 3d 20 5f 6f 53 70 65  t lMorph = _oSpe
ce50: 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74 4d 6f 72  llChecker.getMor
ce60: 70 68 28 64 54 6f 6b 65 6e 31 5b 22 73 56 61 6c  ph(dToken1["sVal
ce70: 75 65 22 5d 20 2b 20 63 4d 65 72 67 65 72 20 2b  ue"] + cMerger +
ce80: 20 64 54 6f 6b 65 6e 32 5b 22 73 56 61 6c 75 65   dToken2["sValue
ce90: 22 5d 29 3b 0a 20 20 20 20 69 66 20 28 6c 4d 6f  "]);.    if (lMo
cea0: 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 20 30 29  rph.length == 0)
ceb0: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
cec0: 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20  n false;.    }. 
ced0: 20 20 20 2f 2f 20 63 68 65 63 6b 20 6e 65 67 61     // check nega
cee0: 74 69 76 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20  tive condition. 
cef0: 20 20 20 69 66 20 28 73 4e 65 67 50 61 74 74 65     if (sNegPatte
cf00: 72 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66  rn) {.        if
cf10: 20 28 73 4e 65 67 50 61 74 74 65 72 6e 20 3d 3d   (sNegPattern ==
cf20: 20 22 2a 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "*") {.        
cf30: 20 20 20 20 2f 2f 20 61 6c 6c 20 6d 6f 72 70 68      // all morph
cf40: 20 6d 75 73 74 20 6d 61 74 63 68 20 73 50 61 74   must match sPat
cf50: 74 65 72 6e 0a 20 20 20 20 20 20 20 20 20 20 20  tern.           
cf60: 20 6c 65 74 20 62 52 65 73 75 6c 74 20 3d 20 6c   let bResult = l
cf70: 4d 6f 72 70 68 2e 65 76 65 72 79 28 73 4d 6f 72  Morph.every(sMor
cf80: 70 68 20 20 3d 3e 20 20 28 73 4d 6f 72 70 68 2e  ph  =>  (sMorph.
cf90: 73 65 61 72 63 68 28 73 50 61 74 74 65 72 6e 29  search(sPattern)
cfa0: 20 21 3d 3d 20 2d 31 29 29 3b 0a 20 20 20 20 20   !== -1));.     
cfb0: 20 20 20 20 20 20 20 69 66 20 28 62 52 65 73 75         if (bResu
cfc0: 6c 74 20 26 26 20 62 53 65 74 4d 6f 72 70 68 29  lt && bSetMorph)
cfd0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
cfe0: 20 20 20 64 54 6f 6b 65 6e 31 5b 22 6c 4d 6f 72     dToken1["lMor
cff0: 70 68 22 5d 20 3d 20 6c 4d 6f 72 70 68 3b 0a 20  ph"] = lMorph;. 
d000: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
d010: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
d020: 62 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 20  bResult;.       
d030: 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20   }.        else 
d040: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
d050: 20 28 6c 4d 6f 72 70 68 2e 73 6f 6d 65 28 73 4d   (lMorph.some(sM
d060: 6f 72 70 68 20 20 3d 3e 20 20 28 73 4d 6f 72 70  orph  =>  (sMorp
d070: 68 2e 73 65 61 72 63 68 28 73 4e 65 67 50 61 74  h.search(sNegPat
d080: 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29 29 20  tern) !== -1))) 
d090: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
d0a0: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a    return false;.
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
d0c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d0d0: 20 20 2f 2f 20 73 65 61 72 63 68 20 73 50 61 74    // search sPat
d0e0: 74 65 72 6e 0a 20 20 20 20 6c 65 74 20 62 52 65  tern.    let bRe
d0f0: 73 75 6c 74 20 3d 20 6c 4d 6f 72 70 68 2e 73 6f  sult = lMorph.so
d100: 6d 65 28 73 4d 6f 72 70 68 20 20 3d 3e 20 20 28  me(sMorph  =>  (
d110: 73 4d 6f 72 70 68 2e 73 65 61 72 63 68 28 73 50  sMorph.search(sP
d120: 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29  attern) !== -1))
d130: 3b 0a 20 20 20 20 69 66 20 28 62 52 65 73 75 6c  ;.    if (bResul
d140: 74 20 26 26 20 62 53 65 74 4d 6f 72 70 68 29 20  t && bSetMorph) 
d150: 7b 0a 20 20 20 20 20 20 20 20 64 54 6f 6b 65 6e  {.        dToken
d160: 31 5b 22 6c 4d 6f 72 70 68 22 5d 20 3d 20 6c 4d  1["lMorph"] = lM
d170: 6f 72 70 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  orph;.    }.    
d180: 72 65 74 75 72 6e 20 62 52 65 73 75 6c 74 3b 0a  return bResult;.
d190: 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 5f 74 61  }..function g_ta
d1a0: 67 5f 62 65 66 6f 72 65 20 28 64 54 6f 6b 65 6e  g_before (dToken
d1b0: 2c 20 64 54 61 67 73 2c 20 73 54 61 67 29 20 7b  , dTags, sTag) {
d1c0: 0a 20 20 20 20 69 66 20 28 21 64 54 61 67 73 2e  .    if (!dTags.
d1d0: 68 61 73 28 73 54 61 67 29 29 20 7b 0a 20 20 20  has(sTag)) {.   
d1e0: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
d1f0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  e;.    }.    if 
d200: 28 64 54 6f 6b 65 6e 5b 22 69 22 5d 20 3e 20 64  (dToken["i"] > d
d210: 54 61 67 73 2e 67 65 74 28 73 54 61 67 29 5b 30  Tags.get(sTag)[0
d220: 5d 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ]) {.        ret
d230: 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a  urn true;.    }.
d240: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
d250: 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 5f  ;.}..function g_
d260: 74 61 67 5f 61 66 74 65 72 20 28 64 54 6f 6b 65  tag_after (dToke
d270: 6e 2c 20 64 54 61 67 73 2c 20 73 54 61 67 29 20  n, dTags, sTag) 
d280: 7b 0a 20 20 20 20 69 66 20 28 21 64 54 61 67 73  {.    if (!dTags
d290: 2e 68 61 73 28 73 54 61 67 29 29 20 7b 0a 20 20  .has(sTag)) {.  
d2a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
d2b0: 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  se;.    }.    if
d2c0: 20 28 64 54 6f 6b 65 6e 5b 22 69 22 5d 20 3c 20   (dToken["i"] < 
d2d0: 64 54 61 67 73 2e 67 65 74 28 73 54 61 67 29 5b  dTags.get(sTag)[
d2e0: 31 5d 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  1]) {.        re
d2f0: 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d  turn true;.    }
d300: 0a 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73  .    return fals
d310: 65 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67  e;.}..function g
d320: 5f 74 61 67 20 28 64 54 6f 6b 65 6e 2c 20 73 54  _tag (dToken, sT
d330: 61 67 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  ag) {.    return
d340: 20 64 54 6f 6b 65 6e 2e 68 61 73 4f 77 6e 50 72   dToken.hasOwnPr
d350: 6f 70 65 72 74 79 28 22 61 54 61 67 73 22 29 20  operty("aTags") 
d360: 26 26 20 64 54 6f 6b 65 6e 5b 22 61 54 61 67 73  && dToken["aTags
d370: 22 5d 2e 68 61 73 28 73 54 61 67 29 3b 0a 7d 0a  "].has(sTag);.}.
d380: 0a 66 75 6e 63 74 69 6f 6e 20 67 5f 73 70 61 63  .function g_spac
d390: 65 5f 62 65 74 77 65 65 6e 5f 74 6f 6b 65 6e 73  e_between_tokens
d3a0: 20 28 64 54 6f 6b 65 6e 31 2c 20 64 54 6f 6b 65   (dToken1, dToke
d3b0: 6e 32 2c 20 6e 4d 69 6e 2c 20 6e 4d 61 78 3d 6e  n2, nMin, nMax=n
d3c0: 75 6c 6c 29 20 7b 0a 20 20 20 20 6c 65 74 20 6e  ull) {.    let n
d3d0: 53 70 61 63 65 20 3d 20 64 54 6f 6b 65 6e 32 5b  Space = dToken2[
d3e0: 22 6e 53 74 61 72 74 22 5d 20 2d 20 64 54 6f 6b  "nStart"] - dTok
d3f0: 65 6e 31 5b 22 6e 45 6e 64 22 5d 0a 20 20 20 20  en1["nEnd"].    
d400: 69 66 20 28 6e 53 70 61 63 65 20 3c 20 6e 4d 69  if (nSpace < nMi
d410: 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  n) {.        ret
d420: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d  urn false;.    }
d430: 0a 20 20 20 20 69 66 20 28 6e 4d 61 78 20 21 3d  .    if (nMax !=
d440: 3d 20 6e 75 6c 6c 20 26 26 20 6e 53 70 61 63 65  = null && nSpace
d450: 20 3e 20 6e 4d 61 78 29 20 7b 0a 20 20 20 20 20   > nMax) {.     
d460: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
d470: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
d480: 6e 20 74 72 75 65 3b 0a 7d 0a 0a 66 75 6e 63 74  n true;.}..funct
d490: 69 6f 6e 20 67 5f 74 6f 6b 65 6e 20 28 6c 54 6f  ion g_token (lTo
d4a0: 6b 65 6e 2c 20 69 29 20 7b 0a 20 20 20 20 69 66  ken, i) {.    if
d4b0: 20 28 69 20 3c 20 30 29 20 7b 0a 20 20 20 20 20   (i < 0) {.     
d4c0: 20 20 20 72 65 74 75 72 6e 20 6c 54 6f 6b 65 6e     return lToken
d4d0: 5b 30 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  [0];.    }.    i
d4e0: 66 20 28 69 20 3e 3d 20 6c 54 6f 6b 65 6e 2e 6c  f (i >= lToken.l
d4f0: 65 6e 67 74 68 29 20 7b 0a 20 20 20 20 20 20 20  ength) {.       
d500: 20 72 65 74 75 72 6e 20 6c 54 6f 6b 65 6e 5b 2d   return lToken[-
d510: 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  1];.    }.    re
d520: 74 75 72 6e 20 6c 54 6f 6b 65 6e 5b 69 5d 3b 0a  turn lToken[i];.
d530: 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 20 44 69 73  }...//////// Dis
d540: 61 6d 62 69 67 75 61 74 6f 72 0a 0a 66 75 6e 63  ambiguator..func
d550: 74 69 6f 6e 20 73 65 6c 65 63 74 20 28 64 54 6f  tion select (dTo
d560: 6b 65 6e 50 6f 73 2c 20 6e 50 6f 73 2c 20 73 57  kenPos, nPos, sW
d570: 6f 72 64 2c 20 73 50 61 74 74 65 72 6e 2c 20 6c  ord, sPattern, l
d580: 44 65 66 61 75 6c 74 3d 6e 75 6c 6c 29 20 7b 0a  Default=null) {.
d590: 20 20 20 20 69 66 20 28 21 73 57 6f 72 64 29 20      if (!sWord) 
d5a0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
d5b0: 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20   true;.    }.   
d5c0: 20 69 66 20 28 21 64 54 6f 6b 65 6e 50 6f 73 2e   if (!dTokenPos.
d5d0: 68 61 73 28 6e 50 6f 73 29 29 20 7b 0a 20 20 20  has(nPos)) {.   
d5e0: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
d5f0: 28 22 45 72 72 6f 72 2e 20 54 68 65 72 65 20 73  ("Error. There s
d600: 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e  hould be a token
d610: 20 61 74 20 74 68 69 73 20 70 6f 73 69 74 69 6f   at this positio
d620: 6e 3a 20 22 2c 20 6e 50 6f 73 29 3b 0a 20 20 20  n: ", nPos);.   
d630: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
d640: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 74 20  ;.    }.    let 
d650: 6c 4d 6f 72 70 68 20 3d 20 5f 6f 53 70 65 6c 6c  lMorph = _oSpell
d660: 43 68 65 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68  Checker.getMorph
d670: 28 73 57 6f 72 64 29 3b 0a 20 20 20 20 69 66 20  (sWord);.    if 
d680: 28 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d  (lMorph.length =
d690: 3d 3d 20 30 20 20 7c 7c 20 20 6c 4d 6f 72 70 68  == 0  ||  lMorph
d6a0: 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20 31 29 20 7b  .length === 1) {
d6b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d6c0: 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  true;.    }.    
d6d0: 6c 65 74 20 6c 53 65 6c 65 63 74 20 3d 20 6c 4d  let lSelect = lM
d6e0: 6f 72 70 68 2e 66 69 6c 74 65 72 28 20 73 4d 6f  orph.filter( sMo
d6f0: 72 70 68 20 3d 3e 20 73 4d 6f 72 70 68 2e 73 65  rph => sMorph.se
d700: 61 72 63 68 28 73 50 61 74 74 65 72 6e 29 20 21  arch(sPattern) !
d710: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 20  == -1 );.    if 
d720: 28 6c 53 65 6c 65 63 74 2e 6c 65 6e 67 74 68 20  (lSelect.length 
d730: 3e 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 69  > 0) {.        i
d740: 66 20 28 6c 53 65 6c 65 63 74 2e 6c 65 6e 67 74  f (lSelect.lengt
d750: 68 20 21 3d 20 6c 4d 6f 72 70 68 2e 6c 65 6e 67  h != lMorph.leng
d760: 74 68 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  th) {.          
d770: 20 20 64 54 6f 6b 65 6e 50 6f 73 2e 67 65 74 28    dTokenPos.get(
d780: 6e 50 6f 73 29 5b 22 6c 4d 6f 72 70 68 22 5d 20  nPos)["lMorph"] 
d790: 3d 20 6c 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  = lSelect;.     
d7a0: 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
d7b0: 69 66 20 28 6c 44 65 66 61 75 6c 74 29 20 7b 0a  if (lDefault) {.
d7c0: 20 20 20 20 20 20 20 20 64 54 6f 6b 65 6e 50 6f          dTokenPo
d7d0: 73 2e 67 65 74 28 6e 50 6f 73 29 5b 22 6c 4d 6f  s.get(nPos)["lMo
d7e0: 72 70 68 22 5d 20 3d 20 6c 44 65 66 61 75 6c 74  rph"] = lDefault
d7f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
d800: 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a 66 75 6e 63  rn true;.}..func
d810: 74 69 6f 6e 20 65 78 63 6c 75 64 65 20 28 64 54  tion exclude (dT
d820: 6f 6b 65 6e 50 6f 73 2c 20 6e 50 6f 73 2c 20 73  okenPos, nPos, s
d830: 57 6f 72 64 2c 20 73 50 61 74 74 65 72 6e 2c 20  Word, sPattern, 
d840: 6c 44 65 66 61 75 6c 74 3d 6e 75 6c 6c 29 20 7b  lDefault=null) {
d850: 0a 20 20 20 20 69 66 20 28 21 73 57 6f 72 64 29  .    if (!sWord)
d860: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
d870: 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20  n true;.    }.  
d880: 20 20 69 66 20 28 21 64 54 6f 6b 65 6e 50 6f 73    if (!dTokenPos
d890: 2e 68 61 73 28 6e 50 6f 73 29 29 20 7b 0a 20 20  .has(nPos)) {.  
d8a0: 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f        console.lo
d8b0: 67 28 22 45 72 72 6f 72 2e 20 54 68 65 72 65 20  g("Error. There 
d8c0: 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65  should be a toke
d8d0: 6e 20 61 74 20 74 68 69 73 20 70 6f 73 69 74 69  n at this positi
d8e0: 6f 6e 3a 20 22 2c 20 6e 50 6f 73 29 3b 0a 20 20  on: ", nPos);.  
d8f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
d900: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 74  e;.    }.    let
d910: 20 6c 4d 6f 72 70 68 20 3d 20 5f 6f 53 70 65 6c   lMorph = _oSpel
d920: 6c 43 68 65 63 6b 65 72 2e 67 65 74 4d 6f 72 70  lChecker.getMorp
d930: 68 28 73 57 6f 72 64 29 3b 0a 20 20 20 20 69 66  h(sWord);.    if
d940: 20 28 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20   (lMorph.length 
d950: 3d 3d 3d 20 30 20 20 7c 7c 20 20 6c 4d 6f 72 70  === 0  ||  lMorp
d960: 68 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20 31 29 20  h.length === 1) 
d970: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
d980: 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20   true;.    }.   
d990: 20 6c 65 74 20 6c 53 65 6c 65 63 74 20 3d 20 6c   let lSelect = l
d9a0: 4d 6f 72 70 68 2e 66 69 6c 74 65 72 28 20 73 4d  Morph.filter( sM
d9b0: 6f 72 70 68 20 3d 3e 20 73 4d 6f 72 70 68 2e 73  orph => sMorph.s
d9c0: 65 61 72 63 68 28 73 50 61 74 74 65 72 6e 29 20  earch(sPattern) 
d9d0: 3d 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69 66  === -1 );.    if
d9e0: 20 28 6c 53 65 6c 65 63 74 2e 6c 65 6e 67 74 68   (lSelect.length
d9f0: 20 3e 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20   > 0) {.        
da00: 69 66 20 28 6c 53 65 6c 65 63 74 2e 6c 65 6e 67  if (lSelect.leng
da10: 74 68 20 21 3d 20 6c 4d 6f 72 70 68 2e 6c 65 6e  th != lMorph.len
da20: 67 74 68 29 20 7b 0a 20 20 20 20 20 20 20 20 20  gth) {.         
da30: 20 20 20 64 54 6f 6b 65 6e 50 6f 73 2e 67 65 74     dTokenPos.get
da40: 28 6e 50 6f 73 29 5b 22 6c 4d 6f 72 70 68 22 5d  (nPos)["lMorph"]
da50: 20 3d 20 6c 53 65 6c 65 63 74 3b 0a 20 20 20 20   = lSelect;.    
da60: 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
da70: 20 69 66 20 28 6c 44 65 66 61 75 6c 74 29 20 7b   if (lDefault) {
da80: 0a 20 20 20 20 20 20 20 20 64 54 6f 6b 65 6e 50  .        dTokenP
da90: 6f 73 2e 67 65 74 28 6e 50 6f 73 29 5b 22 6c 4d  os.get(nPos)["lM
daa0: 6f 72 70 68 22 5d 20 3d 20 6c 44 65 66 61 75 6c  orph"] = lDefaul
dab0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  t;.    }.    ret
dac0: 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a 66 75 6e  urn true;.}..fun
dad0: 63 74 69 6f 6e 20 64 65 66 69 6e 65 20 28 64 54  ction define (dT
dae0: 6f 6b 65 6e 50 6f 73 2c 20 6e 50 6f 73 2c 20 6c  okenPos, nPos, l
daf0: 4d 6f 72 70 68 29 20 7b 0a 20 20 20 20 64 54 6f  Morph) {.    dTo
db00: 6b 65 6e 50 6f 73 2e 67 65 74 28 6e 50 6f 73 29  kenPos.get(nPos)
db10: 5b 22 6c 4d 6f 72 70 68 22 5d 20 3d 20 6c 4d 6f  ["lMorph"] = lMo
db20: 72 70 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rph;.    return 
db30: 74 72 75 65 3b 0a 7d 0a 0a 0a 2f 2f 2f 2f 20 44  true;.}...//// D
db40: 69 73 61 6d 62 69 67 75 61 74 69 6f 6e 20 66 6f  isambiguation fo
db50: 72 20 67 72 61 70 68 20 72 75 6c 65 73 0a 0a 66  r graph rules..f
db60: 75 6e 63 74 69 6f 6e 20 67 5f 73 65 6c 65 63 74  unction g_select
db70: 20 28 64 54 6f 6b 65 6e 2c 20 73 50 61 74 74 65   (dToken, sPatte
db80: 72 6e 2c 20 6c 44 65 66 61 75 6c 74 3d 6e 75 6c  rn, lDefault=nul
db90: 6c 29 20 7b 0a 20 20 20 20 2f 2f 20 73 65 6c 65  l) {.    // sele
dba0: 63 74 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20  ct morphologies 
dbb0: 66 6f 72 20 3c 64 54 6f 6b 65 6e 3e 20 61 63 63  for <dToken> acc
dbc0: 6f 72 64 69 6e 67 20 74 6f 20 3c 73 50 61 74 74  ording to <sPatt
dbd0: 65 72 6e 3e 2c 20 61 6c 77 61 79 73 20 72 65 74  ern>, always ret
dbe0: 75 72 6e 20 74 72 75 65 0a 20 20 20 20 6c 65 74  urn true.    let
dbf0: 20 6c 4d 6f 72 70 68 20 3d 20 28 64 54 6f 6b 65   lMorph = (dToke
dc00: 6e 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79  n.hasOwnProperty
dc10: 28 22 6c 4d 6f 72 70 68 22 29 29 20 3f 20 64 54  ("lMorph")) ? dT
dc20: 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 20 3a  oken["lMorph"] :
dc30: 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e   _oSpellChecker.
dc40: 67 65 74 4d 6f 72 70 68 28 64 54 6f 6b 65 6e 5b  getMorph(dToken[
dc50: 22 73 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20  "sValue"]);.    
dc60: 69 66 20 28 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74  if (lMorph.lengt
dc70: 68 20 3d 3d 3d 20 30 20 20 7c 7c 20 6c 4d 6f 72  h === 0  || lMor
dc80: 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20 31 29  ph.length === 1)
dc90: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 6c   {.        if (l
dca0: 44 65 66 61 75 6c 74 29 20 7b 0a 20 20 20 20 20  Default) {.     
dcb0: 20 20 20 20 20 20 20 64 54 6f 6b 65 6e 5b 22 6c         dToken["l
dcc0: 4d 6f 72 70 68 22 5d 20 3d 20 6c 44 65 66 61 75  Morph"] = lDefau
dcd0: 6c 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  lt;.        }.  
dce0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
dcf0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 74  e;.    }.    let
dd00: 20 6c 53 65 6c 65 63 74 20 3d 20 6c 4d 6f 72 70   lSelect = lMorp
dd10: 68 2e 66 69 6c 74 65 72 28 20 73 4d 6f 72 70 68  h.filter( sMorph
dd20: 20 3d 3e 20 73 4d 6f 72 70 68 2e 73 65 61 72 63   => sMorph.searc
dd30: 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20  h(sPattern) !== 
dd40: 2d 31 20 29 3b 0a 20 20 20 20 69 66 20 28 6c 53  -1 );.    if (lS
dd50: 65 6c 65 63 74 2e 6c 65 6e 67 74 68 20 3e 20 30  elect.length > 0
dd60: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ) {.        if (
dd70: 6c 53 65 6c 65 63 74 2e 6c 65 6e 67 74 68 20 21  lSelect.length !
dd80: 3d 20 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 29  = lMorph.length)
dd90: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64   {.            d
dda0: 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 20  Token["lMorph"] 
ddb0: 3d 20 6c 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  = lSelect;.     
ddc0: 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
ddd0: 69 66 20 28 6c 44 65 66 61 75 6c 74 29 20 7b 0a  if (lDefault) {.
dde0: 20 20 20 20 20 20 20 20 64 54 6f 6b 65 6e 5b 22          dToken["
ddf0: 6c 4d 6f 72 70 68 22 5d 20 3d 20 6c 44 65 66 61  lMorph"] = lDefa
de00: 75 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ult;.    }.    r
de10: 65 74 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a 66  eturn true;.}..f
de20: 75 6e 63 74 69 6f 6e 20 67 5f 65 78 63 6c 75 64  unction g_exclud
de30: 65 20 28 64 54 6f 6b 65 6e 2c 20 73 50 61 74 74  e (dToken, sPatt
de40: 65 72 6e 2c 20 6c 44 65 66 61 75 6c 74 3d 6e 75  ern, lDefault=nu
de50: 6c 6c 29 20 7b 0a 20 20 20 20 2f 2f 20 73 65 6c  ll) {.    // sel
de60: 65 63 74 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73  ect morphologies
de70: 20 66 6f 72 20 3c 64 54 6f 6b 65 6e 3e 20 61 63   for <dToken> ac
de80: 63 6f 72 64 69 6e 67 20 74 6f 20 3c 73 50 61 74  cording to <sPat
de90: 74 65 72 6e 3e 2c 20 61 6c 77 61 79 73 20 72 65  tern>, always re
dea0: 74 75 72 6e 20 74 72 75 65 0a 20 20 20 20 6c 65  turn true.    le
deb0: 74 20 6c 4d 6f 72 70 68 20 3d 20 28 64 54 6f 6b  t lMorph = (dTok
dec0: 65 6e 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74  en.hasOwnPropert
ded0: 79 28 22 6c 4d 6f 72 70 68 22 29 29 20 3f 20 64  y("lMorph")) ? d
dee0: 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 20  Token["lMorph"] 
def0: 3a 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72  : _oSpellChecker
df00: 2e 67 65 74 4d 6f 72 70 68 28 64 54 6f 6b 65 6e  .getMorph(dToken
df10: 5b 22 73 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20  ["sValue"]);.   
df20: 20 69 66 20 28 6c 4d 6f 72 70 68 2e 6c 65 6e 67   if (lMorph.leng
df30: 74 68 20 3d 3d 3d 20 30 20 20 7c 7c 20 6c 4d 6f  th === 0  || lMo
df40: 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20 31  rph.length === 1
df50: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ) {.        if (
df60: 6c 44 65 66 61 75 6c 74 29 20 7b 0a 20 20 20 20  lDefault) {.    
df70: 20 20 20 20 20 20 20 20 64 54 6f 6b 65 6e 5b 22          dToken["
df80: 6c 4d 6f 72 70 68 22 5d 20 3d 20 6c 44 65 66 61  lMorph"] = lDefa
df90: 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ult;.        }. 
dfa0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
dfb0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  ue;.    }.    le
dfc0: 74 20 6c 53 65 6c 65 63 74 20 3d 20 6c 4d 6f 72  t lSelect = lMor
dfd0: 70 68 2e 66 69 6c 74 65 72 28 20 73 4d 6f 72 70  ph.filter( sMorp
dfe0: 68 20 3d 3e 20 73 4d 6f 72 70 68 2e 73 65 61 72  h => sMorph.sear
dff0: 63 68 28 73 50 61 74 74 65 72 6e 29 20 3d 3d 3d  ch(sPattern) ===
e000: 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 20 28 6c   -1 );.    if (l
e010: 53 65 6c 65 63 74 2e 6c 65 6e 67 74 68 20 3e 20  Select.length > 
e020: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  0) {.        if 
e030: 28 6c 53 65 6c 65 63 74 2e 6c 65 6e 67 74 68 20  (lSelect.length 
e040: 21 3d 20 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68  != lMorph.length
e050: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
e060: 64 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d  dToken["lMorph"]
e070: 20 3d 20 6c 53 65 6c 65 63 74 3b 0a 20 20 20 20   = lSelect;.    
e080: 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
e090: 20 69 66 20 28 6c 44 65 66 61 75 6c 74 29 20 7b   if (lDefault) {
e0a0: 0a 20 20 20 20 20 20 20 20 64 54 6f 6b 65 6e 5b  .        dToken[
e0b0: 22 6c 4d 6f 72 70 68 22 5d 20 3d 20 6c 44 65 66  "lMorph"] = lDef
e0c0: 61 75 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ault;.    }.    
e0d0: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a  return true;.}..
e0e0: 66 75 6e 63 74 69 6f 6e 20 67 5f 64 65 66 69 6e  function g_defin
e0f0: 65 20 28 64 54 6f 6b 65 6e 2c 20 6c 4d 6f 72 70  e (dToken, lMorp
e100: 68 29 20 7b 0a 20 20 20 20 2f 2f 20 73 65 74 20  h) {.    // set 
e110: 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20 6f 66 20  morphologies of 
e120: 3c 64 54 6f 6b 65 6e 3e 2c 20 61 6c 77 61 79 73  <dToken>, always
e130: 20 72 65 74 75 72 6e 20 74 72 75 65 0a 20 20 20   return true.   
e140: 20 64 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22   dToken["lMorph"
e150: 5d 20 3d 20 6c 4d 6f 72 70 68 3b 0a 20 20 20 20  ] = lMorph;.    
e160: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a  return true;.}..
e170: 66 75 6e 63 74 69 6f 6e 20 67 5f 64 65 66 69 6e  function g_defin
e180: 65 5f 66 72 6f 6d 20 28 64 54 6f 6b 65 6e 2c 20  e_from (dToken, 
e190: 6e 4c 65 66 74 3d 6e 75 6c 6c 2c 20 6e 52 69 67  nLeft=null, nRig
e1a0: 68 74 3d 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 6c  ht=null) {.    l
e1b0: 65 74 20 73 56 61 6c 75 65 20 3d 20 64 54 6f 6b  et sValue = dTok
e1c0: 65 6e 5b 22 73 56 61 6c 75 65 22 5d 3b 0a 20 20  en["sValue"];.  
e1d0: 20 20 69 66 20 28 6e 4c 65 66 74 20 21 3d 3d 20    if (nLeft !== 
e1e0: 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  null) {.        
e1f0: 73 56 61 6c 75 65 20 3d 20 28 6e 52 69 67 68 74  sValue = (nRight
e200: 20 21 3d 3d 20 6e 75 6c 6c 29 20 3f 20 73 56 61   !== null) ? sVa
e210: 6c 75 65 2e 73 6c 69 63 65 28 6e 4c 65 66 74 2c  lue.slice(nLeft,
e220: 20 6e 52 69 67 68 74 29 20 3a 20 73 56 61 6c 75   nRight) : sValu
e230: 65 2e 73 6c 69 63 65 28 6e 4c 65 66 74 29 3b 0a  e.slice(nLeft);.
e240: 20 20 20 20 7d 0a 20 20 20 20 64 54 6f 6b 65 6e      }.    dToken
e250: 5b 22 6c 4d 6f 72 70 68 22 5d 20 3d 20 5f 6f 53  ["lMorph"] = _oS
e260: 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74 4d  pellChecker.getM
e270: 6f 72 70 68 28 73 56 61 6c 75 65 29 3b 0a 20 20  orph(sValue);.  
e280: 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 7d    return true;.}
e290: 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 20 47 52 41 4d  ...//////// GRAM
e2a0: 4d 41 52 20 43 48 45 43 4b 45 52 20 50 4c 55 47  MAR CHECKER PLUG
e2b0: 49 4e 53 0a 0a 24 7b 70 6c 75 67 69 6e 73 4a 53  INS..${pluginsJS
e2c0: 7d 0a 0a 0a 2f 2f 20 67 65 6e 65 72 61 74 65 64  }...// generated
e2d0: 20 63 6f 64 65 2c 20 64 6f 20 6e 6f 74 20 65 64   code, do not ed
e2e0: 69 74 0a 63 6f 6e 73 74 20 6f 45 76 61 6c 46 75  it.const oEvalFu
e2f0: 6e 63 20 3d 20 7b 0a 20 20 20 20 2f 2f 20 63 61  nc = {.    // ca
e300: 6c 6c 61 62 6c 65 73 20 66 6f 72 20 72 65 67 65  llables for rege
e310: 78 20 72 75 6c 65 73 0a 24 7b 63 61 6c 6c 61 62  x rules.${callab
e320: 6c 65 73 4a 53 7d 0a 0a 20 20 20 20 2f 2f 20 63  lesJS}..    // c
e330: 61 6c 6c 61 62 6c 65 73 20 66 6f 72 20 67 72 61  allables for gra
e340: 70 68 20 72 75 6c 65 73 0a 24 7b 67 72 61 70 68  ph rules.${graph
e350: 5f 63 61 6c 6c 61 62 6c 65 73 4a 53 7d 0a 7d 0a  _callablesJS}.}.
e360: 0a 0a 69 66 20 28 74 79 70 65 6f 66 28 65 78 70  ..if (typeof(exp
e370: 6f 72 74 73 29 20 21 3d 3d 20 27 75 6e 64 65 66  orts) !== 'undef
e380: 69 6e 65 64 27 29 20 7b 0a 20 20 20 20 65 78 70  ined') {.    exp
e390: 6f 72 74 73 2e 6c 61 6e 67 20 3d 20 67 63 5f 65  orts.lang = gc_e
e3a0: 6e 67 69 6e 65 2e 6c 61 6e 67 3b 0a 20 20 20 20  ngine.lang;.    
e3b0: 65 78 70 6f 72 74 73 2e 6c 6f 63 61 6c 65 73 20  exports.locales 
e3c0: 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 6c 6f 63 61  = gc_engine.loca
e3d0: 6c 65 73 3b 0a 20 20 20 20 65 78 70 6f 72 74 73  les;.    exports
e3e0: 2e 70 6b 67 20 3d 20 67 63 5f 65 6e 67 69 6e 65  .pkg = gc_engine
e3f0: 2e 70 6b 67 3b 0a 20 20 20 20 65 78 70 6f 72 74  .pkg;.    export
e400: 73 2e 6e 61 6d 65 20 3d 20 67 63 5f 65 6e 67 69  s.name = gc_engi
e410: 6e 65 2e 6e 61 6d 65 3b 0a 20 20 20 20 65 78 70  ne.name;.    exp
e420: 6f 72 74 73 2e 76 65 72 73 69 6f 6e 20 3d 20 67  orts.version = g
e430: 63 5f 65 6e 67 69 6e 65 2e 76 65 72 73 69 6f 6e  c_engine.version
e440: 3b 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 61 75  ;.    exports.au
e450: 74 68 6f 72 20 3d 20 67 63 5f 65 6e 67 69 6e 65  thor = gc_engine
e460: 2e 61 75 74 68 6f 72 3b 0a 20 20 20 20 2f 2f 20  .author;.    // 
e470: 69 6e 69 74 0a 20 20 20 20 65 78 70 6f 72 74 73  init.    exports
e480: 2e 6c 6f 61 64 20 3d 20 67 63 5f 65 6e 67 69 6e  .load = gc_engin
e490: 65 2e 6c 6f 61 64 3b 0a 20 20 20 20 65 78 70 6f  e.load;.    expo
e4a0: 72 74 73 2e 70 61 72 73 65 20 3d 20 67 63 5f 65  rts.parse = gc_e
e4b0: 6e 67 69 6e 65 2e 70 61 72 73 65 3b 0a 20 20 20  ngine.parse;.   
e4c0: 20 65 78 70 6f 72 74 73 2e 67 65 74 53 70 65 6c   exports.getSpel
e4d0: 6c 43 68 65 63 6b 65 72 20 3d 20 67 63 5f 65 6e  lChecker = gc_en
e4e0: 67 69 6e 65 2e 67 65 74 53 70 65 6c 6c 43 68 65  gine.getSpellChe
e4f0: 63 6b 65 72 3b 0a 20 20 20 20 2f 2f 20 73 65 6e  cker;.    // sen
e500: 74 65 6e 63 65 0a 20 20 20 20 65 78 70 6f 72 74  tence.    export
e510: 73 2e 5f 7a 45 6e 64 4f 66 53 65 6e 74 65 6e 63  s._zEndOfSentenc
e520: 65 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 5f 7a  e = gc_engine._z
e530: 45 6e 64 4f 66 53 65 6e 74 65 6e 63 65 3b 0a 20  EndOfSentence;. 
e540: 20 20 20 65 78 70 6f 72 74 73 2e 5f 7a 42 65 67     exports._zBeg
e550: 69 6e 4f 66 50 61 72 61 67 72 61 70 68 20 3d 20  inOfParagraph = 
e560: 67 63 5f 65 6e 67 69 6e 65 2e 5f 7a 42 65 67 69  gc_engine._zBegi
e570: 6e 4f 66 50 61 72 61 67 72 61 70 68 3b 0a 20 20  nOfParagraph;.  
e580: 20 20 65 78 70 6f 72 74 73 2e 5f 7a 45 6e 64 4f    exports._zEndO
e590: 66 50 61 72 61 67 72 61 70 68 20 3d 20 67 63 5f  fParagraph = gc_
e5a0: 65 6e 67 69 6e 65 2e 5f 7a 45 6e 64 4f 66 50 61  engine._zEndOfPa
e5b0: 72 61 67 72 61 70 68 3b 0a 20 20 20 20 65 78 70  ragraph;.    exp
e5c0: 6f 72 74 73 2e 67 65 74 53 65 6e 74 65 6e 63 65  orts.getSentence
e5d0: 42 6f 75 6e 64 61 72 69 65 73 20 3d 20 67 63 5f  Boundaries = gc_
e5e0: 65 6e 67 69 6e 65 2e 67 65 74 53 65 6e 74 65 6e  engine.getSenten
e5f0: 63 65 42 6f 75 6e 64 61 72 69 65 73 3b 0a 20 20  ceBoundaries;.  
e600: 20 20 2f 2f 20 72 75 6c 65 73 0a 20 20 20 20 65    // rules.    e
e610: 78 70 6f 72 74 73 2e 69 67 6e 6f 72 65 52 75 6c  xports.ignoreRul
e620: 65 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 69 67  e = gc_engine.ig
e630: 6e 6f 72 65 52 75 6c 65 3b 0a 20 20 20 20 65 78  noreRule;.    ex
e640: 70 6f 72 74 73 2e 72 65 73 65 74 49 67 6e 6f 72  ports.resetIgnor
e650: 65 52 75 6c 65 73 20 3d 20 67 63 5f 65 6e 67 69  eRules = gc_engi
e660: 6e 65 2e 72 65 73 65 74 49 67 6e 6f 72 65 52 75  ne.resetIgnoreRu
e670: 6c 65 73 3b 0a 20 20 20 20 65 78 70 6f 72 74 73  les;.    exports
e680: 2e 72 65 61 63 74 69 76 61 74 65 52 75 6c 65 20  .reactivateRule 
e690: 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 72 65 61 63  = gc_engine.reac
e6a0: 74 69 76 61 74 65 52 75 6c 65 3b 0a 20 20 20 20  tivateRule;.    
e6b0: 65 78 70 6f 72 74 73 2e 6c 69 73 74 52 75 6c 65  exports.listRule
e6c0: 73 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 6c 69  s = gc_engine.li
e6d0: 73 74 52 75 6c 65 73 3b 0a 20 20 20 20 65 78 70  stRules;.    exp
e6e0: 6f 72 74 73 2e 67 65 74 52 75 6c 65 73 20 3d 20  orts.getRules = 
e6f0: 67 63 5f 65 6e 67 69 6e 65 2e 67 65 74 52 75 6c  gc_engine.getRul
e700: 65 73 3b 0a 20 20 20 20 2f 2f 20 6f 70 74 69 6f  es;.    // optio
e710: 6e 73 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 73  ns.    exports.s
e720: 65 74 4f 70 74 69 6f 6e 20 3d 20 67 63 5f 65 6e  etOption = gc_en
e730: 67 69 6e 65 2e 73 65 74 4f 70 74 69 6f 6e 3b 0a  gine.setOption;.
e740: 20 20 20 20 65 78 70 6f 72 74 73 2e 73 65 74 4f      exports.setO
e750: 70 74 69 6f 6e 73 20 3d 20 67 63 5f 65 6e 67 69  ptions = gc_engi
e760: 6e 65 2e 73 65 74 4f 70 74 69 6f 6e 73 3b 0a 20  ne.setOptions;. 
e770: 20 20 20 65 78 70 6f 72 74 73 2e 67 65 74 4f 70     exports.getOp
e780: 74 69 6f 6e 73 20 3d 20 67 63 5f 65 6e 67 69 6e  tions = gc_engin
e790: 65 2e 67 65 74 4f 70 74 69 6f 6e 73 3b 0a 20 20  e.getOptions;.  
e7a0: 20 20 65 78 70 6f 72 74 73 2e 67 65 74 44 65 66    exports.getDef
e7b0: 61 75 6c 74 4f 70 74 69 6f 6e 73 20 3d 20 67 63  aultOptions = gc
e7c0: 5f 65 6e 67 69 6e 65 2e 67 65 74 44 65 66 61 75  _engine.getDefau
e7d0: 6c 74 4f 70 74 69 6f 6e 73 3b 0a 20 20 20 20 65  ltOptions;.    e
e7e0: 78 70 6f 72 74 73 2e 72 65 73 65 74 4f 70 74 69  xports.resetOpti
e7f0: 6f 6e 73 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e  ons = gc_engine.
e800: 72 65 73 65 74 4f 70 74 69 6f 6e 73 3b 0a 20 20  resetOptions;.  
e810: 20 20 2f 2f 20 6f 74 68 65 72 0a 20 20 20 20 65    // other.    e
e820: 78 70 6f 72 74 73 2e 54 65 78 74 50 61 72 73 65  xports.TextParse
e830: 72 20 3d 20 54 65 78 74 50 61 72 73 65 72 3b 0a  r = TextParser;.
e840: 7d 0a                                            }.