Grammalecte  Hex Artifact Content

Artifact 2a12fbd54bc73f8f5de2a3f862a0ab87a8efb8c11fd2586c5e0022760b71199a:


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 2f 2a 6a 73 6c 69  er engine./*jsli
0020: 6e 74 20 65 73 76 65 72 73 69 6f 6e 3a 20 36 2a  nt esversion: 6*
0030: 2f 0a 2f 2a 67 6c 6f 62 61 6c 20 63 6f 6e 73 6f  /./*global conso
0040: 6c 65 2c 72 65 71 75 69 72 65 2c 65 78 70 6f 72  le,require,expor
0050: 74 73 2a 2f 0a 0a 22 75 73 65 20 73 74 72 69 63  ts*/.."use stric
0060: 74 22 3b 0a 0a 24 7b 73 74 72 69 6e 67 7d 0a 24  t";..${string}.$
0070: 7b 72 65 67 65 78 7d 0a 24 7b 6d 61 70 7d 0a 0a  {regex}.${map}..
0080: 0a 69 66 20 28 74 79 70 65 6f 66 28 72 65 71 75  .if (typeof(requ
0090: 69 72 65 29 20 21 3d 3d 20 27 75 6e 64 65 66 69  ire) !== 'undefi
00a0: 6e 65 64 27 29 20 7b 0a 20 20 20 20 76 61 72 20  ned') {.    var 
00b0: 67 63 5f 6f 70 74 69 6f 6e 73 20 3d 20 72 65 71  gc_options = req
00c0: 75 69 72 65 28 22 72 65 73 6f 75 72 63 65 3a 2f  uire("resource:/
00d0: 2f 67 72 61 6d 6d 61 6c 65 63 74 65 2f 24 7b 6c  /grammalecte/${l
00e0: 61 6e 67 7d 2f 67 63 5f 6f 70 74 69 6f 6e 73 2e  ang}/gc_options.
00f0: 6a 73 22 29 3b 0a 20 20 20 20 76 61 72 20 67 63  js");.    var gc
0100: 5f 72 75 6c 65 73 20 3d 20 72 65 71 75 69 72 65  _rules = require
0110: 28 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61  ("resource://gra
0120: 6d 6d 61 6c 65 63 74 65 2f 24 7b 6c 61 6e 67 7d  mmalecte/${lang}
0130: 2f 67 63 5f 72 75 6c 65 73 2e 6a 73 22 29 3b 0a  /gc_rules.js");.
0140: 20 20 20 20 76 61 72 20 67 63 5f 72 75 6c 65 73      var gc_rules
0150: 5f 67 72 61 70 68 20 3d 20 72 65 71 75 69 72 65  _graph = require
0160: 28 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61  ("resource://gra
0170: 6d 6d 61 6c 65 63 74 65 2f 24 7b 6c 61 6e 67 7d  mmalecte/${lang}
0180: 2f 67 63 5f 72 75 6c 65 73 5f 67 72 61 70 68 2e  /gc_rules_graph.
0190: 6a 73 22 29 3b 0a 20 20 20 20 76 61 72 20 63 72  js");.    var cr
01a0: 65 67 65 78 20 3d 20 72 65 71 75 69 72 65 28 22  egex = require("
01b0: 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d  resource://gramm
01c0: 61 6c 65 63 74 65 2f 24 7b 6c 61 6e 67 7d 2f 63  alecte/${lang}/c
01d0: 72 65 67 65 78 2e 6a 73 22 29 3b 0a 20 20 20 20  regex.js");.    
01e0: 76 61 72 20 74 65 78 74 20 3d 20 72 65 71 75 69  var text = requi
01f0: 72 65 28 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67  re("resource://g
0200: 72 61 6d 6d 61 6c 65 63 74 65 2f 74 65 78 74 2e  rammalecte/text.
0210: 6a 73 22 29 3b 0a 7d 0a 0a 0a 66 75 6e 63 74 69  js");.}...functi
0220: 6f 6e 20 63 61 70 69 74 61 6c 69 7a 65 41 72 72  on capitalizeArr
0230: 61 79 20 28 61 41 72 72 61 79 29 20 7b 0a 20 20  ay (aArray) {.  
0240: 20 20 2f 2f 20 63 61 6e e2 80 99 74 20 6d 61 70    // can...t map
0250: 20 6f 6e 20 75 73 65 72 20 64 65 66 69 6e 65 64   on user defined
0260: 20 66 75 6e 63 74 69 6f 6e 3f 3f 0a 20 20 20 20   function??.    
0270: 6c 65 74 20 61 4e 65 77 20 3d 20 5b 5d 3b 0a 20  let aNew = [];. 
0280: 20 20 20 66 6f 72 20 28 6c 65 74 20 69 20 3d 20     for (let i = 
0290: 30 3b 20 69 20 3c 20 61 41 72 72 61 79 2e 6c 65  0; i < aArray.le
02a0: 6e 67 74 68 3b 20 69 20 3d 20 69 20 2b 20 31 29  ngth; i = i + 1)
02b0: 20 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b   {.        aNew[
02c0: 69 5d 20 3d 20 61 41 72 72 61 79 5b 69 5d 2e 67  i] = aArray[i].g
02d0: 6c 5f 74 6f 43 61 70 69 74 61 6c 69 7a 65 28 29  l_toCapitalize()
02e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
02f0: 72 6e 20 61 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2f 20  rn aNew;.}...// 
0300: 64 61 74 61 0a 6c 65 74 20 5f 73 41 70 70 43 6f  data.let _sAppCo
0310: 6e 74 65 78 74 20 3d 20 22 22 3b 20 20 20 20 20  ntext = "";     
0320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
0340: 77 68 61 74 20 73 6f 66 74 77 61 72 65 20 69 73  what software is
0350: 20 72 75 6e 6e 69 6e 67 0a 6c 65 74 20 5f 64 4f   running.let _dO
0360: 70 74 69 6f 6e 73 20 3d 20 6e 75 6c 6c 3b 0a 6c  ptions = null;.l
0370: 65 74 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65  et _oSpellChecke
0380: 72 20 3d 20 6e 75 6c 6c 3b 0a 6c 65 74 20 5f 6f  r = null;.let _o
0390: 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 6e 75 6c 6c  Tokenizer = null
03a0: 3b 0a 6c 65 74 20 5f 61 49 67 6e 6f 72 65 64 52  ;.let _aIgnoredR
03b0: 75 6c 65 73 20 3d 20 6e 65 77 20 53 65 74 28 29  ules = new Set()
03c0: 3b 0a 0a 0a 0a 76 61 72 20 67 63 5f 65 6e 67 69  ;....var gc_engi
03d0: 6e 65 20 3d 20 7b 0a 0a 20 20 20 20 2f 2f 2f 2f  ne = {..    ////
03e0: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 73 0a 0a 20   Informations.. 
03f0: 20 20 20 6c 61 6e 67 3a 20 22 24 7b 6c 61 6e 67     lang: "${lang
0400: 7d 22 2c 0a 20 20 20 20 6c 6f 63 61 6c 65 73 3a  }",.    locales:
0410: 20 24 7b 6c 6f 63 7d 2c 0a 20 20 20 20 70 6b 67   ${loc},.    pkg
0420: 3a 20 22 24 7b 69 6d 70 6c 6e 61 6d 65 7d 22 2c  : "${implname}",
0430: 0a 20 20 20 20 6e 61 6d 65 3a 20 22 24 7b 6e 61  .    name: "${na
0440: 6d 65 7d 22 2c 0a 20 20 20 20 76 65 72 73 69 6f  me}",.    versio
0450: 6e 3a 20 22 24 7b 76 65 72 73 69 6f 6e 7d 22 2c  n: "${version}",
0460: 0a 20 20 20 20 61 75 74 68 6f 72 3a 20 22 24 7b  .    author: "${
0470: 61 75 74 68 6f 72 7d 22 2c 0a 0a 20 20 20 20 2f  author}",..    /
0480: 2f 2f 2f 20 49 6e 69 74 69 61 6c 69 7a 61 74 69  /// Initializati
0490: 6f 6e 0a 0a 20 20 20 20 6c 6f 61 64 3a 20 66 75  on..    load: fu
04a0: 6e 63 74 69 6f 6e 20 28 73 43 6f 6e 74 65 78 74  nction (sContext
04b0: 3d 22 4a 61 76 61 53 63 72 69 70 74 22 2c 20 73  ="JavaScript", s
04c0: 50 61 74 68 3d 22 22 29 20 7b 0a 20 20 20 20 20  Path="") {.     
04d0: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
04e0: 20 20 20 20 20 69 66 20 28 74 79 70 65 6f 66 28       if (typeof(
04f0: 72 65 71 75 69 72 65 29 20 21 3d 3d 20 27 75 6e  require) !== 'un
0500: 64 65 66 69 6e 65 64 27 29 20 7b 0a 20 20 20 20  defined') {.    
0510: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72 20              var 
0520: 73 70 65 6c 6c 63 68 65 63 6b 65 72 20 3d 20 72  spellchecker = r
0530: 65 71 75 69 72 65 28 22 72 65 73 6f 75 72 63 65  equire("resource
0540: 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74 65 2f 67  ://grammalecte/g
0550: 72 61 70 68 73 70 65 6c 6c 2f 73 70 65 6c 6c 63  raphspell/spellc
0560: 68 65 63 6b 65 72 2e 6a 73 22 29 3b 0a 20 20 20  hecker.js");.   
0570: 20 20 20 20 20 20 20 20 20 20 20 20 20 5f 6f 53               _oS
0580: 70 65 6c 6c 43 68 65 63 6b 65 72 20 3d 20 6e 65  pellChecker = ne
0590: 77 20 73 70 65 6c 6c 63 68 65 63 6b 65 72 2e 53  w spellchecker.S
05a0: 70 65 6c 6c 43 68 65 63 6b 65 72 28 22 24 7b 6c  pellChecker("${l
05b0: 61 6e 67 7d 22 2c 20 22 22 2c 20 22 24 7b 64 69  ang}", "", "${di
05c0: 63 5f 6d 61 69 6e 5f 66 69 6c 65 6e 61 6d 65 5f  c_main_filename_
05d0: 6a 73 7d 22 2c 20 22 24 7b 64 69 63 5f 65 78 74  js}", "${dic_ext
05e0: 65 6e 64 65 64 5f 66 69 6c 65 6e 61 6d 65 5f 6a  ended_filename_j
05f0: 73 7d 22 2c 20 22 24 7b 64 69 63 5f 63 6f 6d 6d  s}", "${dic_comm
0600: 75 6e 69 74 79 5f 66 69 6c 65 6e 61 6d 65 5f 6a  unity_filename_j
0610: 73 7d 22 2c 20 22 24 7b 64 69 63 5f 70 65 72 73  s}", "${dic_pers
0620: 6f 6e 61 6c 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73  onal_filename_js
0630: 7d 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  }");.           
0640: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
0650: 20 20 20 20 20 20 20 20 20 20 5f 6f 53 70 65 6c            _oSpel
0660: 6c 43 68 65 63 6b 65 72 20 3d 20 6e 65 77 20 53  lChecker = new S
0670: 70 65 6c 6c 43 68 65 63 6b 65 72 28 22 24 7b 6c  pellChecker("${l
0680: 61 6e 67 7d 22 2c 20 73 50 61 74 68 2c 20 22 24  ang}", sPath, "$
0690: 7b 64 69 63 5f 6d 61 69 6e 5f 66 69 6c 65 6e 61  {dic_main_filena
06a0: 6d 65 5f 6a 73 7d 22 2c 20 22 24 7b 64 69 63 5f  me_js}", "${dic_
06b0: 65 78 74 65 6e 64 65 64 5f 66 69 6c 65 6e 61 6d  extended_filenam
06c0: 65 5f 6a 73 7d 22 2c 20 22 24 7b 64 69 63 5f 63  e_js}", "${dic_c
06d0: 6f 6d 6d 75 6e 69 74 79 5f 66 69 6c 65 6e 61 6d  ommunity_filenam
06e0: 65 5f 6a 73 7d 22 2c 20 22 24 7b 64 69 63 5f 70  e_js}", "${dic_p
06f0: 65 72 73 6f 6e 61 6c 5f 66 69 6c 65 6e 61 6d 65  ersonal_filename
0700: 5f 6a 73 7d 22 29 3b 0a 20 20 20 20 20 20 20 20  _js}");.        
0710: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
0720: 20 20 5f 73 41 70 70 43 6f 6e 74 65 78 74 20 3d    _sAppContext =
0730: 20 73 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20   sContext;.     
0740: 20 20 20 20 20 20 20 5f 64 4f 70 74 69 6f 6e 73         _dOptions
0750: 20 3d 20 67 63 5f 6f 70 74 69 6f 6e 73 2e 67 65   = gc_options.ge
0760: 74 4f 70 74 69 6f 6e 73 28 73 43 6f 6e 74 65 78  tOptions(sContex
0770: 74 29 2e 67 6c 5f 73 68 61 6c 6c 6f 77 43 6f 70  t).gl_shallowCop
0780: 79 28 29 3b 20 20 20 20 20 2f 2f 20 64 75 70 6c  y();     // dupl
0790: 69 63 61 74 69 6f 6e 20 6e 65 63 65 73 73 61 72  ication necessar
07a0: 79 2c 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  y, to be able to
07b0: 20 72 65 73 65 74 20 74 6f 20 64 65 66 61 75 6c   reset to defaul
07c0: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 5f 6f  t.            _o
07d0: 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 5f 6f 53 70  Tokenizer = _oSp
07e0: 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74 54 6f  ellChecker.getTo
07f0: 6b 65 6e 69 7a 65 72 28 29 3b 0a 20 20 20 20 20  kenizer();.     
0800: 20 20 20 20 20 20 20 5f 6f 53 70 65 6c 6c 43 68         _oSpellCh
0810: 65 63 6b 65 72 2e 61 63 74 69 76 61 74 65 53 74  ecker.activateSt
0820: 6f 72 61 67 65 28 29 3b 0a 20 20 20 20 20 20 20  orage();.       
0830: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68   }.        catch
0840: 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20   (e) {.         
0850: 20 20 20 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72     console.error
0860: 28 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (e);.        }. 
0870: 20 20 20 7d 2c 0a 0a 20 20 20 20 67 65 74 53 70     },..    getSp
0880: 65 6c 6c 43 68 65 63 6b 65 72 3a 20 66 75 6e 63  ellChecker: func
0890: 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20  tion () {.      
08a0: 20 20 72 65 74 75 72 6e 20 5f 6f 53 70 65 6c 6c    return _oSpell
08b0: 43 68 65 63 6b 65 72 3b 0a 20 20 20 20 7d 2c 0a  Checker;.    },.
08c0: 0a 20 20 20 20 2f 2f 2f 2f 20 52 75 6c 65 73 0a  .    //// Rules.
08d0: 0a 20 20 20 20 67 65 74 52 75 6c 65 73 3a 20 66  .    getRules: f
08e0: 75 6e 63 74 69 6f 6e 20 28 62 50 61 72 61 67 72  unction (bParagr
08f0: 61 70 68 29 20 7b 0a 20 20 20 20 20 20 20 20 69  aph) {.        i
0900: 66 20 28 21 62 50 61 72 61 67 72 61 70 68 29 20  f (!bParagraph) 
0910: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
0920: 74 75 72 6e 20 67 63 5f 72 75 6c 65 73 2e 6c 53  turn gc_rules.lS
0930: 65 6e 74 65 6e 63 65 52 75 6c 65 73 3b 0a 20 20  entenceRules;.  
0940: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0950: 72 65 74 75 72 6e 20 67 63 5f 72 75 6c 65 73 2e  return gc_rules.
0960: 6c 50 61 72 61 67 72 61 70 68 52 75 6c 65 73 3b  lParagraphRules;
0970: 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 69 67 6e  .    },..    ign
0980: 6f 72 65 52 75 6c 65 3a 20 66 75 6e 63 74 69 6f  oreRule: functio
0990: 6e 20 28 73 52 75 6c 65 49 64 29 20 7b 0a 20 20  n (sRuleId) {.  
09a0: 20 20 20 20 20 20 5f 61 49 67 6e 6f 72 65 64 52        _aIgnoredR
09b0: 75 6c 65 73 2e 61 64 64 28 73 52 75 6c 65 49 64  ules.add(sRuleId
09c0: 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 72  );.    },..    r
09d0: 65 73 65 74 49 67 6e 6f 72 65 52 75 6c 65 73 3a  esetIgnoreRules:
09e0: 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20   function () {. 
09f0: 20 20 20 20 20 20 20 5f 61 49 67 6e 6f 72 65 64         _aIgnored
0a00: 52 75 6c 65 73 2e 63 6c 65 61 72 28 29 3b 0a 20  Rules.clear();. 
0a10: 20 20 20 7d 2c 0a 0a 20 20 20 20 72 65 61 63 74     },..    react
0a20: 69 76 61 74 65 52 75 6c 65 3a 20 66 75 6e 63 74  ivateRule: funct
0a30: 69 6f 6e 20 28 73 52 75 6c 65 49 64 29 20 7b 0a  ion (sRuleId) {.
0a40: 20 20 20 20 20 20 20 20 5f 61 49 67 6e 6f 72 65          _aIgnore
0a50: 64 52 75 6c 65 73 2e 64 65 6c 65 74 65 28 73 52  dRules.delete(sR
0a60: 75 6c 65 49 64 29 3b 0a 20 20 20 20 7d 2c 0a 0a  uleId);.    },..
0a70: 20 20 20 20 6c 69 73 74 52 75 6c 65 73 3a 20 66      listRules: f
0a80: 75 6e 63 74 69 6f 6e 2a 20 28 73 46 69 6c 74 65  unction* (sFilte
0a90: 72 3d 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20  r=null) {.      
0aa0: 20 20 2f 2f 20 67 65 6e 65 72 61 74 6f 72 3a 20    // generator: 
0ab0: 72 65 74 75 72 6e 73 20 74 75 70 6c 65 20 28 73  returns tuple (s
0ac0: 4f 70 74 69 6f 6e 2c 20 73 4c 69 6e 65 49 64 2c  Option, sLineId,
0ad0: 20 73 52 75 6c 65 49 64 29 0a 20 20 20 20 20 20   sRuleId).      
0ae0: 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20    try {.        
0af0: 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 73 4f      for (let [sO
0b00: 70 74 69 6f 6e 2c 20 6c 52 75 6c 65 47 72 6f 75  ption, lRuleGrou
0b10: 70 5d 20 6f 66 20 74 68 69 73 2e 67 65 74 52 75  p] of this.getRu
0b20: 6c 65 73 28 74 72 75 65 29 29 20 7b 0a 20 20 20  les(true)) {.   
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
0b40: 20 28 6c 65 74 20 5b 2c 2c 20 73 4c 69 6e 65 49   (let [,, sLineI
0b50: 64 2c 20 73 52 75 6c 65 49 64 2c 2c 5d 20 6f 66  d, sRuleId,,] of
0b60: 20 6c 52 75 6c 65 47 72 6f 75 70 29 20 7b 0a 20   lRuleGroup) {. 
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b80: 20 20 20 69 66 20 28 21 73 46 69 6c 74 65 72 20     if (!sFilter 
0b90: 7c 7c 20 73 52 75 6c 65 49 64 2e 74 65 73 74 28  || sRuleId.test(
0ba0: 73 46 69 6c 74 65 72 29 29 20 7b 0a 20 20 20 20  sFilter)) {.    
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bc0: 20 20 20 20 79 69 65 6c 64 20 5b 73 4f 70 74 69      yield [sOpti
0bd0: 6f 6e 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75  on, sLineId, sRu
0be0: 6c 65 49 64 5d 3b 0a 20 20 20 20 20 20 20 20 20  leId];.         
0bf0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
0c10: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0c20: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65           for (le
0c30: 74 20 5b 73 4f 70 74 69 6f 6e 2c 20 6c 52 75 6c  t [sOption, lRul
0c40: 65 47 72 6f 75 70 5d 20 6f 66 20 74 68 69 73 2e  eGroup] of this.
0c50: 67 65 74 52 75 6c 65 73 28 66 61 6c 73 65 29 29  getRules(false))
0c60: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
0c70: 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 2c 2c 20     for (let [,, 
0c80: 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65 49 64  sLineId, sRuleId
0c90: 2c 2c 5d 20 6f 66 20 6c 52 75 6c 65 47 72 6f 75  ,,] of lRuleGrou
0ca0: 70 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p) {.           
0cb0: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73 46           if (!sF
0cc0: 69 6c 74 65 72 20 7c 7c 20 73 52 75 6c 65 49 64  ilter || sRuleId
0cd0: 2e 74 65 73 74 28 73 46 69 6c 74 65 72 29 29 20  .test(sFilter)) 
0ce0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
0cf0: 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
0d00: 5b 73 4f 70 74 69 6f 6e 2c 20 73 4c 69 6e 65 49  [sOption, sLineI
0d10: 64 2c 20 73 52 75 6c 65 49 64 5d 3b 0a 20 20 20  d, sRuleId];.   
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
0d40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
0d50: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
0d60: 20 20 20 20 20 63 61 74 63 68 20 28 65 29 20 7b       catch (e) {
0d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
0d80: 73 6f 6c 65 2e 65 72 72 6f 72 28 65 29 3b 0a 20  sole.error(e);. 
0d90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 2c 0a         }.    },.
0da0: 0a 20 20 20 20 2f 2f 2f 2f 20 4f 70 74 69 6f 6e  .    //// Option
0db0: 73 0a 0a 20 20 20 20 73 65 74 4f 70 74 69 6f 6e  s..    setOption
0dc0: 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73 4f 70 74  : function (sOpt
0dd0: 2c 20 62 56 61 6c 29 20 7b 0a 20 20 20 20 20 20  , bVal) {.      
0de0: 20 20 69 66 20 28 5f 64 4f 70 74 69 6f 6e 73 2e    if (_dOptions.
0df0: 68 61 73 28 73 4f 70 74 29 29 20 7b 0a 20 20 20  has(sOpt)) {.   
0e00: 20 20 20 20 20 20 20 20 20 5f 64 4f 70 74 69 6f           _dOptio
0e10: 6e 73 2e 73 65 74 28 73 4f 70 74 2c 20 62 56 61  ns.set(sOpt, bVa
0e20: 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
0e30: 20 20 7d 2c 0a 0a 20 20 20 20 73 65 74 4f 70 74    },..    setOpt
0e40: 69 6f 6e 73 3a 20 66 75 6e 63 74 69 6f 6e 20 28  ions: function (
0e50: 64 4f 70 74 29 20 7b 0a 20 20 20 20 20 20 20 20  dOpt) {.        
0e60: 5f 64 4f 70 74 69 6f 6e 73 2e 67 6c 5f 75 70 64  _dOptions.gl_upd
0e70: 61 74 65 4f 6e 6c 79 45 78 69 73 74 69 6e 67 4b  ateOnlyExistingK
0e80: 65 79 73 28 64 4f 70 74 29 3b 0a 20 20 20 20 7d  eys(dOpt);.    }
0e90: 2c 0a 0a 20 20 20 20 67 65 74 4f 70 74 69 6f 6e  ,..    getOption
0ea0: 73 3a 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b  s: function () {
0eb0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0ec0: 5f 64 4f 70 74 69 6f 6e 73 3b 0a 20 20 20 20 7d  _dOptions;.    }
0ed0: 2c 0a 0a 20 20 20 20 67 65 74 44 65 66 61 75 6c  ,..    getDefaul
0ee0: 74 4f 70 74 69 6f 6e 73 3a 20 66 75 6e 63 74 69  tOptions: functi
0ef0: 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20  on () {.        
0f00: 72 65 74 75 72 6e 20 67 63 5f 6f 70 74 69 6f 6e  return gc_option
0f10: 73 2e 67 65 74 4f 70 74 69 6f 6e 73 28 5f 73 41  s.getOptions(_sA
0f20: 70 70 43 6f 6e 74 65 78 74 29 2e 67 6c 5f 73 68  ppContext).gl_sh
0f30: 61 6c 6c 6f 77 43 6f 70 79 28 29 3b 0a 20 20 20  allowCopy();.   
0f40: 20 7d 2c 0a 0a 20 20 20 20 72 65 73 65 74 4f 70   },..    resetOp
0f50: 74 69 6f 6e 73 3a 20 66 75 6e 63 74 69 6f 6e 20  tions: function 
0f60: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 5f 64 4f  () {.        _dO
0f70: 70 74 69 6f 6e 73 20 3d 20 67 63 5f 6f 70 74 69  ptions = gc_opti
0f80: 6f 6e 73 2e 67 65 74 4f 70 74 69 6f 6e 73 28 5f  ons.getOptions(_
0f90: 73 41 70 70 43 6f 6e 74 65 78 74 29 2e 67 6c 5f  sAppContext).gl_
0fa0: 73 68 61 6c 6c 6f 77 43 6f 70 79 28 29 3b 0a 20  shallowCopy();. 
0fb0: 20 20 20 7d 2c 0a 0a 20 20 20 20 2f 2f 2f 2f 20     },..    //// 
0fc0: 50 61 72 73 69 6e 67 0a 0a 20 20 20 20 70 61 72  Parsing..    par
0fd0: 73 65 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73 54  se: function (sT
0fe0: 65 78 74 2c 20 73 43 6f 75 6e 74 72 79 3d 22 24  ext, sCountry="$
0ff0: 7b 63 6f 75 6e 74 72 79 5f 64 65 66 61 75 6c 74  {country_default
1000: 7d 22 2c 20 62 44 65 62 75 67 3d 66 61 6c 73 65  }", bDebug=false
1010: 2c 20 64 4f 70 74 69 6f 6e 73 3d 6e 75 6c 6c 2c  , dOptions=null,
1020: 20 62 43 6f 6e 74 65 78 74 3d 66 61 6c 73 65 29   bContext=false)
1030: 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6f   {.        let o
1040: 54 65 78 74 20 3d 20 6e 65 77 20 54 65 78 74 50  Text = new TextP
1050: 61 72 73 65 72 28 73 54 65 78 74 29 3b 0a 20 20  arser(sText);.  
1060: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6f 54 65        return oTe
1070: 78 74 2e 70 61 72 73 65 28 73 43 6f 75 6e 74 72  xt.parse(sCountr
1080: 79 2c 20 62 44 65 62 75 67 2c 20 64 4f 70 74 69  y, bDebug, dOpti
1090: 6f 6e 73 2c 20 62 43 6f 6e 74 65 78 74 29 3b 0a  ons, bContext);.
10a0: 20 20 20 20 7d 2c 0a 0a 20 20 20 20 5f 7a 45 6e      },..    _zEn
10b0: 64 4f 66 53 65 6e 74 65 6e 63 65 3a 20 6e 65 77  dOfSentence: new
10c0: 20 52 65 67 45 78 70 20 28 27 28 5b 2e 3f 21 3a   RegExp ('([.?!:
10d0: 3b e2 80 a6 5d 5b 20 2e 3f 21 e2 80 a6 20 c2 bb  ;...][ .?!... ..
10e0: e2 80 9d 22 29 5d 2a 7c 2e 24 29 27 2c 20 22 67  ...")]*|.$)', "g
10f0: 22 29 2c 0a 20 20 20 20 5f 7a 42 65 67 69 6e 4f  "),.    _zBeginO
1100: 66 50 61 72 61 67 72 61 70 68 3a 20 6e 65 77 20  fParagraph: new 
1110: 52 65 67 45 78 70 20 28 22 5e 5b 2d 20 c2 a0 e2  RegExp ("^[- ...
1120: 80 93 e2 80 94 2e 2c 3b 3f 21 e2 80 a6 5d 2a 22  ......,;?!...]*"
1130: 2c 20 22 69 67 22 29 2c 0a 20 20 20 20 5f 7a 45  , "ig"),.    _zE
1140: 6e 64 4f 66 50 61 72 61 67 72 61 70 68 3a 20 6e  ndOfParagraph: n
1150: 65 77 20 52 65 67 45 78 70 20 28 22 5b 2d 20 c2  ew RegExp ("[- .
1160: a0 2e 2c 3b 3f 21 e2 80 a6 e2 80 93 e2 80 94 5d  ..,;?!.........]
1170: 2a 24 22 2c 20 22 69 67 22 29 2c 0a 0a 20 20 20  *$", "ig"),..   
1180: 20 67 65 74 53 65 6e 74 65 6e 63 65 42 6f 75 6e   getSentenceBoun
1190: 64 61 72 69 65 73 3a 20 66 75 6e 63 74 69 6f 6e  daries: function
11a0: 2a 20 28 73 54 65 78 74 29 20 7b 0a 20 20 20 20  * (sText) {.    
11b0: 20 20 20 20 6c 65 74 20 6d 42 65 67 69 6e 4f 66      let mBeginOf
11c0: 53 65 6e 74 65 6e 63 65 20 3d 20 74 68 69 73 2e  Sentence = this.
11d0: 5f 7a 42 65 67 69 6e 4f 66 50 61 72 61 67 72 61  _zBeginOfParagra
11e0: 70 68 2e 65 78 65 63 28 73 54 65 78 74 29 3b 0a  ph.exec(sText);.
11f0: 20 20 20 20 20 20 20 20 6c 65 74 20 69 53 74 61          let iSta
1200: 72 74 20 3d 20 74 68 69 73 2e 5f 7a 42 65 67 69  rt = this._zBegi
1210: 6e 4f 66 50 61 72 61 67 72 61 70 68 2e 6c 61 73  nOfParagraph.las
1220: 74 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  tIndex;.        
1230: 6c 65 74 20 6d 3b 0a 20 20 20 20 20 20 20 20 77  let m;.        w
1240: 68 69 6c 65 20 28 28 6d 20 3d 20 74 68 69 73 2e  hile ((m = this.
1250: 5f 7a 45 6e 64 4f 66 53 65 6e 74 65 6e 63 65 2e  _zEndOfSentence.
1260: 65 78 65 63 28 73 54 65 78 74 29 29 20 21 3d 3d  exec(sText)) !==
1270: 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20   null) {.       
1280: 20 20 20 20 20 79 69 65 6c 64 20 5b 69 53 74 61       yield [iSta
1290: 72 74 2c 20 74 68 69 73 2e 5f 7a 45 6e 64 4f 66  rt, this._zEndOf
12a0: 53 65 6e 74 65 6e 63 65 2e 6c 61 73 74 49 6e 64  Sentence.lastInd
12b0: 65 78 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ex];.           
12c0: 20 69 53 74 61 72 74 20 3d 20 74 68 69 73 2e 5f   iStart = this._
12d0: 7a 45 6e 64 4f 66 53 65 6e 74 65 6e 63 65 2e 6c  zEndOfSentence.l
12e0: 61 73 74 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  astIndex;.      
12f0: 20 20 7d 0a 20 20 20 20 7d 0a 7d 3b 0a 0a 0a 63    }.    }.};...c
1300: 6c 61 73 73 20 54 65 78 74 50 61 72 73 65 72 20  lass TextParser 
1310: 7b 0a 0a 20 20 20 20 63 6f 6e 73 74 72 75 63 74  {..    construct
1320: 6f 72 20 28 73 54 65 78 74 29 20 7b 0a 20 20 20  or (sText) {.   
1330: 20 20 20 20 20 74 68 69 73 2e 73 54 65 78 74 20       this.sText 
1340: 3d 20 73 54 65 78 74 3b 0a 20 20 20 20 20 20 20  = sText;.       
1350: 20 74 68 69 73 2e 73 54 65 78 74 30 20 3d 20 73   this.sText0 = s
1360: 54 65 78 74 3b 0a 20 20 20 20 20 20 20 20 74 68  Text;.        th
1370: 69 73 2e 73 53 65 6e 74 65 6e 63 65 20 3d 20 22  is.sSentence = "
1380: 22 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e  ";.        this.
1390: 73 53 65 6e 74 65 6e 63 65 30 20 3d 20 22 22 3b  sSentence0 = "";
13a0: 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 6e 4f  .        this.nO
13b0: 66 66 73 65 74 57 69 74 68 69 6e 50 61 72 61 67  ffsetWithinParag
13c0: 72 61 70 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  raph = 0;.      
13d0: 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 20 3d 20    this.lToken = 
13e0: 5b 5d 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73  [];.        this
13f0: 2e 64 54 6f 6b 65 6e 50 6f 73 20 3d 20 6e 65 77  .dTokenPos = new
1400: 20 4d 61 70 28 29 3b 0a 20 20 20 20 20 20 20 20   Map();.        
1410: 74 68 69 73 2e 64 54 61 67 73 20 3d 20 6e 65 77  this.dTags = new
1420: 20 4d 61 70 28 29 3b 0a 20 20 20 20 20 20 20 20   Map();.        
1430: 74 68 69 73 2e 64 45 72 72 6f 72 20 3d 20 6e 65  this.dError = ne
1440: 77 20 4d 61 70 28 29 3b 0a 20 20 20 20 20 20 20  w Map();.       
1450: 20 74 68 69 73 2e 64 45 72 72 6f 72 50 72 69 6f   this.dErrorPrio
1460: 72 69 74 79 20 3d 20 6e 65 77 20 4d 61 70 28 29  rity = new Map()
1470: 3b 20 20 2f 2f 20 4b 65 79 20 3d 20 70 6f 73 69  ;  // Key = posi
1480: 74 69 6f 6e 3b 20 76 61 6c 75 65 20 3d 20 70 72  tion; value = pr
1490: 69 6f 72 69 74 79 0a 20 20 20 20 7d 0a 0a 20 20  iority.    }..  
14a0: 20 20 61 73 53 74 72 69 6e 67 20 28 29 20 7b 0a    asString () {.
14b0: 20 20 20 20 20 20 20 20 6c 65 74 20 73 20 3d 20          let s = 
14c0: 22 3d 3d 3d 3d 3d 20 54 45 58 54 20 3d 3d 3d 3d  "===== TEXT ====
14d0: 3d 5c 6e 22 0a 20 20 20 20 20 20 20 20 73 20 2b  =\n".        s +
14e0: 3d 20 22 73 65 6e 74 65 6e 63 65 3a 20 22 20 2b  = "sentence: " +
14f0: 20 74 68 69 73 2e 73 53 65 6e 74 65 6e 63 65 30   this.sSentence0
1500: 20 2b 20 22 5c 6e 22 3b 0a 20 20 20 20 20 20 20   + "\n";.       
1510: 20 73 20 2b 3d 20 22 6e 6f 77 3a 20 20 20 20 20   s += "now:     
1520: 20 22 20 2b 20 74 68 69 73 2e 73 53 65 6e 74 65   " + this.sSente
1530: 6e 63 65 20 20 2b 20 22 5c 6e 22 3b 0a 20 20 20  nce  + "\n";.   
1540: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 64 54       for (let dT
1550: 6f 6b 65 6e 20 6f 66 20 74 68 69 73 2e 6c 54 6f  oken of this.lTo
1560: 6b 65 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ken) {.         
1570: 20 20 20 73 20 2b 3d 20 60 23 24 7b 64 54 6f 6b     s += `#${dTok
1580: 65 6e 5b 22 69 22 5d 7d 5c 74 24 7b 64 54 6f 6b  en["i"]}\t${dTok
1590: 65 6e 5b 22 6e 53 74 61 72 74 22 5d 7d 3a 24 7b  en["nStart"]}:${
15a0: 64 54 6f 6b 65 6e 5b 22 6e 45 6e 64 22 5d 7d 5c  dToken["nEnd"]}\
15b0: 74 24 7b 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75  t${dToken["sValu
15c0: 65 22 5d 7d 5c 74 24 7b 64 54 6f 6b 65 6e 5b 22  e"]}\t${dToken["
15d0: 73 54 79 70 65 22 5d 7d 60 3b 0a 20 20 20 20 20  sType"]}`;.     
15e0: 20 20 20 20 20 20 20 69 66 20 28 64 54 6f 6b 65         if (dToke
15f0: 6e 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79  n.hasOwnProperty
1600: 28 22 6c 4d 6f 72 70 68 22 29 29 20 7b 0a 20 20  ("lMorph")) {.  
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 20                s 
1620: 2b 3d 20 22 5c 74 22 20 2b 20 64 54 6f 6b 65 6e  += "\t" + dToken
1630: 5b 22 6c 4d 6f 72 70 68 22 5d 2e 74 6f 53 74 72  ["lMorph"].toStr
1640: 69 6e 67 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ing();.         
1650: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1660: 20 69 66 20 28 64 54 6f 6b 65 6e 2e 68 61 73 4f   if (dToken.hasO
1670: 77 6e 50 72 6f 70 65 72 74 79 28 22 61 54 61 67  wnProperty("aTag
1680: 73 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  s")) {.         
1690: 20 20 20 20 20 20 20 73 20 2b 3d 20 22 5c 74 22         s += "\t"
16a0: 20 2b 20 64 54 6f 6b 65 6e 5b 22 61 54 61 67 73   + dToken["aTags
16b0: 22 5d 2e 74 6f 53 74 72 69 6e 67 28 29 3b 0a 20  "].toString();. 
16c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
16d0: 20 20 20 20 20 20 20 20 20 73 20 2b 3d 20 22 5c           s += "\
16e0: 6e 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n";.        }.  
16f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a        return s;.
1700: 20 20 20 20 7d 0a 0a 20 20 20 20 70 61 72 73 65      }..    parse
1710: 20 28 73 43 6f 75 6e 74 72 79 3d 22 24 7b 63 6f   (sCountry="${co
1720: 75 6e 74 72 79 5f 64 65 66 61 75 6c 74 7d 22 2c  untry_default}",
1730: 20 62 44 65 62 75 67 3d 66 61 6c 73 65 2c 20 64   bDebug=false, d
1740: 4f 70 74 69 6f 6e 73 3d 6e 75 6c 6c 2c 20 62 43  Options=null, bC
1750: 6f 6e 74 65 78 74 3d 66 61 6c 73 65 29 20 7b 0a  ontext=false) {.
1760: 20 20 20 20 20 20 20 20 2f 2f 20 61 6e 61 6c 79          // analy
1770: 73 65 73 20 74 68 65 20 70 61 72 61 67 72 61 70  ses the paragrap
1780: 68 20 73 54 65 78 74 20 61 6e 64 20 72 65 74 75  h sText and retu
1790: 72 6e 73 20 6c 69 73 74 20 6f 66 20 65 72 72 6f  rns list of erro
17a0: 72 73 0a 20 20 20 20 20 20 20 20 6c 65 74 20 64  rs.        let d
17b0: 4f 70 74 20 3d 20 64 4f 70 74 69 6f 6e 73 20 7c  Opt = dOptions |
17c0: 7c 20 5f 64 4f 70 74 69 6f 6e 73 3b 0a 20 20 20  | _dOptions;.   
17d0: 20 20 20 20 20 6c 65 74 20 62 53 68 6f 77 52 75       let bShowRu
17e0: 6c 65 49 64 20 3d 20 6f 70 74 69 6f 6e 28 27 69  leId = option('i
17f0: 64 72 75 6c 65 27 29 3b 0a 20 20 20 20 20 20 20  drule');.       
1800: 20 2f 2f 20 70 61 72 73 65 20 70 61 72 61 67 72   // parse paragr
1810: 61 70 68 0a 20 20 20 20 20 20 20 20 74 72 79 20  aph.        try 
1820: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68  {.            th
1830: 69 73 2e 70 61 72 73 65 54 65 78 74 28 74 68 69  is.parseText(thi
1840: 73 2e 73 54 65 78 74 2c 20 74 68 69 73 2e 73 54  s.sText, this.sT
1850: 65 78 74 30 2c 20 74 72 75 65 2c 20 30 2c 20 73  ext0, true, 0, s
1860: 43 6f 75 6e 74 72 79 2c 20 64 4f 70 74 2c 20 62  Country, dOpt, b
1870: 53 68 6f 77 52 75 6c 65 49 64 2c 20 62 44 65 62  ShowRuleId, bDeb
1880: 75 67 2c 20 62 43 6f 6e 74 65 78 74 29 3b 0a 20  ug, bContext);. 
1890: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18a0: 20 63 61 74 63 68 20 28 65 29 20 7b 0a 20 20 20   catch (e) {.   
18b0: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65           console
18c0: 2e 65 72 72 6f 72 28 65 29 3b 0a 20 20 20 20 20  .error(e);.     
18d0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2f     }..        //
18e0: 20 63 6c 65 61 6e 75 70 0a 20 20 20 20 20 20 20   cleanup.       
18f0: 20 69 66 20 28 74 68 69 73 2e 73 54 65 78 74 2e   if (this.sText.
1900: 69 6e 63 6c 75 64 65 73 28 22 c2 a0 22 29 29 20  includes("..")) 
1910: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68  {.            th
1920: 69 73 2e 73 54 65 78 74 20 3d 20 74 68 69 73 2e  is.sText = this.
1930: 73 54 65 78 74 2e 72 65 70 6c 61 63 65 28 2f c2  sText.replace(/.
1940: a0 2f 67 2c 20 27 20 27 29 3b 20 2f 2f 20 6e 62  ./g, ' '); // nb
1950: 73 70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  sp.        }.   
1960: 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 73 54       if (this.sT
1970: 65 78 74 2e 69 6e 63 6c 75 64 65 73 28 22 e2 80  ext.includes("..
1980: af 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  .")) {.         
1990: 20 20 20 74 68 69 73 2e 73 54 65 78 74 20 3d 20     this.sText = 
19a0: 74 68 69 73 2e 73 54 65 78 74 2e 72 65 70 6c 61  this.sText.repla
19b0: 63 65 28 2f e2 80 af 2f 67 2c 20 27 20 27 29 3b  ce(/.../g, ' ');
19c0: 20 2f 2f 20 73 6e 62 73 70 0a 20 20 20 20 20 20   // snbsp.      
19d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28    }.        if (
19e0: 74 68 69 73 2e 73 54 65 78 74 2e 69 6e 63 6c 75  this.sText.inclu
19f0: 64 65 73 28 22 27 22 29 29 20 7b 0a 20 20 20 20  des("'")) {.    
1a00: 20 20 20 20 20 20 20 20 74 68 69 73 2e 73 54 65          this.sTe
1a10: 78 74 20 3d 20 74 68 69 73 2e 73 54 65 78 74 2e  xt = this.sText.
1a20: 72 65 70 6c 61 63 65 28 2f 27 2f 67 2c 20 22 e2  replace(/'/g, ".
1a30: 80 99 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ..");.        }.
1a40: 20 20 20 20 20 20 20 20 69 66 20 28 74 68 69 73          if (this
1a50: 2e 73 54 65 78 74 2e 69 6e 63 6c 75 64 65 73 28  .sText.includes(
1a60: 22 e2 80 91 22 29 29 20 7b 0a 20 20 20 20 20 20  "...")) {.      
1a70: 20 20 20 20 20 20 74 68 69 73 2e 73 54 65 78 74        this.sText
1a80: 20 3d 20 74 68 69 73 2e 73 54 65 78 74 2e 72 65   = this.sText.re
1a90: 70 6c 61 63 65 28 2f e2 80 91 2f 67 2c 20 22 2d  place(/.../g, "-
1aa0: 22 29 3b 20 2f 2f 20 6e 6f 62 72 65 61 6b 64 61  "); // nobreakda
1ab0: 73 68 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  sh.        }..  
1ac0: 20 20 20 20 20 20 2f 2f 20 70 61 72 73 65 20 73        // parse s
1ad0: 65 6e 74 65 6e 63 65 0a 20 20 20 20 20 20 20 20  entence.        
1ae0: 66 6f 72 20 28 6c 65 74 20 5b 69 53 74 61 72 74  for (let [iStart
1af0: 2c 20 69 45 6e 64 5d 20 6f 66 20 67 63 5f 65 6e  , iEnd] of gc_en
1b00: 67 69 6e 65 2e 67 65 74 53 65 6e 74 65 6e 63 65  gine.getSentence
1b10: 42 6f 75 6e 64 61 72 69 65 73 28 74 68 69 73 2e  Boundaries(this.
1b20: 73 54 65 78 74 29 29 20 7b 0a 20 20 20 20 20 20  sText)) {.      
1b30: 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20        try {.    
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
1b50: 2e 73 53 65 6e 74 65 6e 63 65 20 3d 20 74 68 69  .sSentence = thi
1b60: 73 2e 73 54 65 78 74 2e 73 6c 69 63 65 28 69 53  s.sText.slice(iS
1b70: 74 61 72 74 2c 20 69 45 6e 64 29 3b 0a 20 20 20  tart, iEnd);.   
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
1b90: 73 2e 73 53 65 6e 74 65 6e 63 65 30 20 3d 20 74  s.sSentence0 = t
1ba0: 68 69 73 2e 73 54 65 78 74 30 2e 73 6c 69 63 65  his.sText0.slice
1bb0: 28 69 53 74 61 72 74 2c 20 69 45 6e 64 29 3b 0a  (iStart, iEnd);.
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 74 68 69 73 2e 6e 4f 66 66 73 65 74 57 69 74 68  this.nOffsetWith
1be0: 69 6e 50 61 72 61 67 72 61 70 68 20 3d 20 69 53  inParagraph = iS
1bf0: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tart;.          
1c00: 20 20 20 20 20 20 74 68 69 73 2e 6c 54 6f 6b 65        this.lToke
1c10: 6e 20 3d 20 41 72 72 61 79 2e 66 72 6f 6d 28 5f  n = Array.from(_
1c20: 6f 54 6f 6b 65 6e 69 7a 65 72 2e 67 65 6e 54 6f  oTokenizer.genTo
1c30: 6b 65 6e 73 28 74 68 69 73 2e 73 53 65 6e 74 65  kens(this.sSente
1c40: 6e 63 65 2c 20 74 72 75 65 29 29 3b 0a 20 20 20  nce, true));.   
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
1c60: 73 2e 64 54 6f 6b 65 6e 50 6f 73 2e 63 6c 65 61  s.dTokenPos.clea
1c70: 72 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r();.           
1c80: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 64 54       for (let dT
1c90: 6f 6b 65 6e 20 6f 66 20 74 68 69 73 2e 6c 54 6f  oken of this.lTo
1ca0: 6b 65 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ken) {.         
1cb0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64             if (d
1cc0: 54 6f 6b 65 6e 5b 22 73 54 79 70 65 22 5d 20 21  Token["sType"] !
1cd0: 3d 20 22 49 4e 46 4f 22 29 20 7b 0a 20 20 20 20  = "INFO") {.    
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 20 74 68 69 73 2e 64 54 6f 6b 65 6e 50      this.dTokenP
1d00: 6f 73 2e 73 65 74 28 64 54 6f 6b 65 6e 5b 22 6e  os.set(dToken["n
1d10: 53 74 61 72 74 22 5d 2c 20 64 54 6f 6b 65 6e 29  Start"], dToken)
1d20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d50: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 70            this.p
1d60: 61 72 73 65 54 65 78 74 28 74 68 69 73 2e 73 53  arseText(this.sS
1d70: 65 6e 74 65 6e 63 65 2c 20 74 68 69 73 2e 73 53  entence, this.sS
1d80: 65 6e 74 65 6e 63 65 30 2c 20 66 61 6c 73 65 2c  entence0, false,
1d90: 20 69 53 74 61 72 74 2c 20 73 43 6f 75 6e 74 72   iStart, sCountr
1da0: 79 2c 20 64 4f 70 74 2c 20 62 53 68 6f 77 52 75  y, dOpt, bShowRu
1db0: 6c 65 49 64 2c 20 62 44 65 62 75 67 2c 20 62 43  leId, bDebug, bC
1dc0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
1dd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1de0: 20 20 20 63 61 74 63 68 20 28 65 29 20 7b 0a 20     catch (e) {. 
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1e00: 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72 28 65 29 3b  onsole.error(e);
1e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1e20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e30: 20 72 65 74 75 72 6e 20 41 72 72 61 79 2e 66 72   return Array.fr
1e40: 6f 6d 28 74 68 69 73 2e 64 45 72 72 6f 72 2e 76  om(this.dError.v
1e50: 61 6c 75 65 73 28 29 29 3b 0a 20 20 20 20 7d 0a  alues());.    }.
1e60: 0a 20 20 20 20 70 61 72 73 65 54 65 78 74 20 28  .    parseText (
1e70: 73 54 65 78 74 2c 20 73 54 65 78 74 30 2c 20 62  sText, sText0, b
1e80: 50 61 72 61 67 72 61 70 68 2c 20 6e 4f 66 66 73  Paragraph, nOffs
1e90: 65 74 2c 20 73 43 6f 75 6e 74 72 79 2c 20 64 4f  et, sCountry, dO
1ea0: 70 74 69 6f 6e 73 2c 20 62 53 68 6f 77 52 75 6c  ptions, bShowRul
1eb0: 65 49 64 2c 20 62 44 65 62 75 67 2c 20 62 43 6f  eId, bDebug, bCo
1ec0: 6e 74 65 78 74 29 20 7b 0a 20 20 20 20 20 20 20  ntext) {.       
1ed0: 20 6c 65 74 20 62 43 68 61 6e 67 65 20 3d 20 66   let bChange = f
1ee0: 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 6c 65  alse;.        le
1ef0: 74 20 6d 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f  t m;..        fo
1f00: 72 20 28 6c 65 74 20 5b 73 4f 70 74 69 6f 6e 2c  r (let [sOption,
1f10: 20 6c 52 75 6c 65 47 72 6f 75 70 5d 20 6f 66 20   lRuleGroup] of 
1f20: 67 63 5f 65 6e 67 69 6e 65 2e 67 65 74 52 75 6c  gc_engine.getRul
1f30: 65 73 28 62 50 61 72 61 67 72 61 70 68 29 29 20  es(bParagraph)) 
1f40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1f50: 20 28 73 4f 70 74 69 6f 6e 20 3d 3d 20 22 40 40   (sOption == "@@
1f60: 40 40 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20  @@") {.         
1f70: 20 20 20 20 20 20 20 2f 2f 20 67 72 61 70 68 20         // graph 
1f80: 72 75 6c 65 73 0a 20 20 20 20 20 20 20 20 20 20  rules.          
1f90: 20 20 20 20 20 20 69 66 20 28 21 62 50 61 72 61        if (!bPara
1fa0: 67 72 61 70 68 20 26 26 20 62 43 68 61 6e 67 65  graph && bChange
1fb0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
1fc0: 20 20 20 20 20 20 20 20 74 68 69 73 2e 75 70 64          this.upd
1fd0: 61 74 65 28 73 54 65 78 74 2c 20 62 44 65 62 75  ate(sText, bDebu
1fe0: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
1ff0: 20 20 20 20 20 20 20 20 62 43 68 61 6e 67 65 20          bChange 
2000: 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20  = false;.       
2010: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2020: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
2030: 6c 65 74 20 5b 73 47 72 61 70 68 4e 61 6d 65 2c  let [sGraphName,
2040: 20 73 4c 69 6e 65 49 64 5d 20 6f 66 20 6c 52 75   sLineId] of lRu
2050: 6c 65 47 72 6f 75 70 29 20 7b 0a 20 20 20 20 20  leGroup) {.     
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2070: 66 20 28 21 64 4f 70 74 69 6f 6e 73 2e 68 61 73  f (!dOptions.has
2080: 28 73 47 72 61 70 68 4e 61 6d 65 29 20 7c 7c 20  (sGraphName) || 
2090: 64 4f 70 74 69 6f 6e 73 2e 67 65 74 28 73 47 72  dOptions.get(sGr
20a0: 61 70 68 4e 61 6d 65 29 29 20 7b 0a 20 20 20 20  aphName)) {.    
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 20 20 20 69 66 20 28 62 44 65 62 75 67 29 20      if (bDebug) 
20d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
20f0: 6e 73 6f 6c 65 2e 6c 6f 67 28 22 3e 3e 3e 3e 20  nsole.log(">>>> 
2100: 47 52 41 50 48 3a 20 22 20 2b 20 73 47 72 61 70  GRAPH: " + sGrap
2110: 68 4e 61 6d 65 20 2b 20 22 20 22 20 2b 20 73 4c  hName + " " + sL
2120: 69 6e 65 49 64 29 3b 0a 20 20 20 20 20 20 20 20  ineId);.        
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2150: 20 20 20 20 20 20 20 20 20 20 73 54 65 78 74 20            sText 
2160: 3d 20 74 68 69 73 2e 70 61 72 73 65 47 72 61 70  = this.parseGrap
2170: 68 28 67 63 5f 72 75 6c 65 73 5f 67 72 61 70 68  h(gc_rules_graph
2180: 2e 64 41 6c 6c 47 72 61 70 68 5b 73 47 72 61 70  .dAllGraph[sGrap
2190: 68 4e 61 6d 65 5d 2c 20 73 43 6f 75 6e 74 72 79  hName], sCountry
21a0: 2c 20 64 4f 70 74 69 6f 6e 73 2c 20 62 53 68 6f  , dOptions, bSho
21b0: 77 52 75 6c 65 49 64 2c 20 62 44 65 62 75 67 2c  wRuleId, bDebug,
21c0: 20 62 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   bContext);.    
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
21f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2200: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  }.            el
2210: 73 65 20 69 66 20 28 21 73 4f 70 74 69 6f 6e 20  se if (!sOption 
2220: 7c 7c 20 6f 70 74 69 6f 6e 28 73 4f 70 74 69 6f  || option(sOptio
2230: 6e 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  n)) {.          
2240: 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b        for (let [
2250: 7a 52 65 67 65 78 2c 20 62 55 70 70 65 72 63 61  zRegex, bUpperca
2260: 73 65 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75  se, sLineId, sRu
2270: 6c 65 49 64 2c 20 6e 50 72 69 6f 72 69 74 79 2c  leId, nPriority,
2280: 20 6c 41 63 74 69 6f 6e 73 2c 20 6c 47 72 6f 75   lActions, lGrou
2290: 70 73 2c 20 6c 4e 65 67 4c 6f 6f 6b 42 65 66 6f  ps, lNegLookBefo
22a0: 72 65 5d 20 6f 66 20 6c 52 75 6c 65 47 72 6f 75  re] of lRuleGrou
22b0: 70 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p) {.           
22c0: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 5f 61           if (!_a
22d0: 49 67 6e 6f 72 65 64 52 75 6c 65 73 2e 68 61 73  IgnoredRules.has
22e0: 28 73 52 75 6c 65 49 64 29 29 20 7b 0a 20 20 20  (sRuleId)) {.   
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 20 77 68 69 6c 65 20 28 28 6d 20 3d       while ((m =
2310: 20 7a 52 65 67 65 78 2e 67 6c 5f 65 78 65 63 32   zRegex.gl_exec2
2320: 28 73 54 65 78 74 2c 20 6c 47 72 6f 75 70 73 2c  (sText, lGroups,
2330: 20 6c 4e 65 67 4c 6f 6f 6b 42 65 66 6f 72 65 29   lNegLookBefore)
2340: 29 20 21 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20  ) !== null) {.  
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2360: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 62 43            let bC
2370: 6f 6e 64 4d 65 6d 6f 20 3d 20 6e 75 6c 6c 3b 0a  ondMemo = null;.
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2390: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
23a0: 28 6c 65 74 20 5b 73 46 75 6e 63 43 6f 6e 64 2c  (let [sFuncCond,
23b0: 20 63 41 63 74 69 6f 6e 54 79 70 65 2c 20 73 57   cActionType, sW
23c0: 68 61 74 2c 20 2e 2e 2e 65 41 63 74 5d 20 6f 66  hat, ...eAct] of
23d0: 20 6c 41 63 74 69 6f 6e 73 29 20 7b 0a 20 20 20   lActions) {.   
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
2400: 61 63 74 69 6f 6e 20 69 6e 20 6c 41 63 74 69 6f  action in lActio
2410: 6e 73 3a 20 5b 20 63 6f 6e 64 69 74 69 6f 6e 2c  ns: [ condition,
2420: 20 61 63 74 69 6f 6e 20 74 79 70 65 2c 20 72 65   action type, re
2430: 70 6c 61 63 65 6d 65 6e 74 2f 73 75 67 67 65 73  placement/sugges
2440: 74 69 6f 6e 2f 61 63 74 69 6f 6e 5b 2c 20 69 47  tion/action[, iG
2450: 72 6f 75 70 5b 2c 20 6d 65 73 73 61 67 65 2c 20  roup[, message, 
2460: 55 52 4c 5d 5d 20 5d 0a 20 20 20 20 20 20 20 20  URL]] ].        
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 62 43 6f 6e 64 4d 65 6d 6f 20 3d 20 28 21    bCondMemo = (!
24c0: 73 46 75 6e 63 43 6f 6e 64 20 7c 7c 20 6f 45 76  sFuncCond || oEv
24d0: 61 6c 46 75 6e 63 5b 73 46 75 6e 63 43 6f 6e 64  alFunc[sFuncCond
24e0: 5d 28 73 54 65 78 74 2c 20 73 54 65 78 74 30 2c  ](sText, sText0,
24f0: 20 6d 2c 20 74 68 69 73 2e 64 54 6f 6b 65 6e 50   m, this.dTokenP
2500: 6f 73 2c 20 73 43 6f 75 6e 74 72 79 2c 20 62 43  os, sCountry, bC
2510: 6f 6e 64 4d 65 6d 6f 29 29 3b 0a 20 20 20 20 20  ondMemo));.     
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2540: 66 20 28 62 43 6f 6e 64 4d 65 6d 6f 29 20 7b 0a  f (bCondMemo) {.
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 20 20 20 20 20 20 73 77 69 74 63 68 20 28          switch (
2580: 63 41 63 74 69 6f 6e 54 79 70 65 29 20 7b 0a 20  cActionType) {. 
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
25c0: 22 2d 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20  "-":.           
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 20 20 20 20 20 2f 2f 20 67 72 61 6d 6d 61 72 20       // grammar 
2600: 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 20 20 20 20 20 20 2f 2f 63 6f 6e 73 6f 6c 65 2e        //console.
2640: 6c 6f 67 28 22 2d 3e 20 65 72 72 6f 72 20 64 65  log("-> error de
2650: 74 65 63 74 65 64 20 69 6e 20 22 20 2b 20 73 4c  tected in " + sL
2660: 69 6e 65 49 64 20 2b 20 22 5c 6e 7a 52 65 67 65  ineId + "\nzRege
2670: 78 3a 20 22 20 2b 20 7a 52 65 67 65 78 2e 73 6f  x: " + zRegex.so
2680: 75 72 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  urce);.         
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 6c 65 74 20 6e 45 72 72 6f         let nErro
26c0: 72 53 74 61 72 74 20 3d 20 6e 4f 66 66 73 65 74  rStart = nOffset
26d0: 20 2b 20 6d 2e 73 74 61 72 74 5b 65 41 63 74 5b   + m.start[eAct[
26e0: 30 5d 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0]];.           
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 20 20 20 20 69 66 20 28 21 74 68 69 73 2e 64       if (!this.d
2720: 45 72 72 6f 72 2e 68 61 73 28 6e 45 72 72 6f 72  Error.has(nError
2730: 53 74 61 72 74 29 20 7c 7c 20 6e 50 72 69 6f 72  Start) || nPrior
2740: 69 74 79 20 3e 20 74 68 69 73 2e 64 45 72 72 6f  ity > this.dErro
2750: 72 50 72 69 6f 72 69 74 79 2e 67 65 74 28 6e 45  rPriority.get(nE
2760: 72 72 6f 72 53 74 61 72 74 29 29 20 7b 0a 20 20  rrorStart)) {.  
2770: 20 20 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 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a0: 20 20 74 68 69 73 2e 64 45 72 72 6f 72 2e 73 65    this.dError.se
27b0: 74 28 6e 45 72 72 6f 72 53 74 61 72 74 2c 20 74  t(nErrorStart, t
27c0: 68 69 73 2e 5f 63 72 65 61 74 65 45 72 72 6f 72  his._createError
27d0: 46 72 6f 6d 52 65 67 65 78 28 73 54 65 78 74 2c  FromRegex(sText,
27e0: 20 73 54 65 78 74 30 2c 20 73 57 68 61 74 2c 20   sText0, sWhat, 
27f0: 6e 4f 66 66 73 65 74 2c 20 6d 2c 20 65 41 63 74  nOffset, m, eAct
2800: 5b 30 5d 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52  [0], sLineId, sR
2810: 75 6c 65 49 64 2c 20 62 55 70 70 65 72 63 61 73  uleId, bUppercas
2820: 65 2c 20 65 41 63 74 5b 31 5d 2c 20 65 41 63 74  e, eAct[1], eAct
2830: 5b 32 5d 2c 20 62 53 68 6f 77 52 75 6c 65 49 64  [2], bShowRuleId
2840: 2c 20 73 4f 70 74 69 6f 6e 2c 20 62 43 6f 6e 74  , sOption, bCont
2850: 65 78 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ext));.         
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
2890: 64 45 72 72 6f 72 50 72 69 6f 72 69 74 79 2e 73  dErrorPriority.s
28a0: 65 74 28 6e 45 72 72 6f 72 53 74 61 72 74 2c 20  et(nErrorStart, 
28b0: 6e 50 72 69 6f 72 69 74 79 29 3b 0a 20 20 20 20  nPriority);.    
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
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 20 20 20                  
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2920: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
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: 20 63 61 73 65 20 22 7e 22 3a 0a 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 20 2f 2f 20 74 65             // te
2990: 78 74 20 70 72 6f 63 65 73 73 6f 72 0a 20 20 20  xt processor.   
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 20 20 2f 2f 63               //c
29d0: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 2d 3e 20 74  onsole.log("-> t
29e0: 65 78 74 20 70 72 6f 63 65 73 73 6f 72 20 62 79  ext processor by
29f0: 20 22 20 2b 20 73 4c 69 6e 65 49 64 20 2b 20 22   " + sLineId + "
2a00: 5c 6e 7a 52 65 67 65 78 3a 20 22 20 2b 20 7a 52  \nzRegex: " + zR
2a10: 65 67 65 78 2e 73 6f 75 72 63 65 29 3b 0a 20 20  egex.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 20 20 73 54                sT
2a50: 65 78 74 20 3d 20 74 68 69 73 2e 72 65 77 72 69  ext = this.rewri
2a60: 74 65 54 65 78 74 28 73 54 65 78 74 2c 20 73 57  teText(sText, sW
2a70: 68 61 74 2c 20 65 41 63 74 5b 30 5d 2c 20 6d 2c  hat, eAct[0], m,
2a80: 20 62 55 70 70 65 72 63 61 73 65 29 3b 0a 20 20   bUppercase);.  
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 43                bC
2ac0: 68 61 6e 67 65 20 3d 20 74 72 75 65 3b 0a 20 20  hange = true;.  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2b00: 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20   (bDebug) {.    
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 20 20 20 20 20 20 20 20 20                  
2b40: 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 7e 20 22  console.log("~ "
2b50: 20 2b 20 73 54 65 78 74 20 2b 20 22 20 20 2d 2d   + sText + "  --
2b60: 20 22 20 2b 20 6d 5b 65 41 63 74 5b 30 5d 5d 20   " + m[eAct[0]] 
2b70: 2b 20 22 20 20 23 20 22 20 2b 20 73 4c 69 6e 65  + "  # " + sLine
2b80: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Id);.           
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
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 63 61 73 65 20 22            case "
2c20: 3d 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  =":.            
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c50: 20 20 20 20 2f 2f 20 64 69 73 61 6d 62 69 67 75      // disambigu
2c60: 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ation.          
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 20 20 20 20 20 2f 2f 63 6f 6e 73 6f 6c 65 2e        //console.
2ca0: 6c 6f 67 28 22 2d 3e 20 64 69 73 61 6d 62 69 67  log("-> disambig
2cb0: 75 61 74 69 6f 6e 20 62 79 20 22 20 2b 20 73 4c  uation by " + sL
2cc0: 69 6e 65 49 64 20 2b 20 22 5c 6e 7a 52 65 67 65  ineId + "\nzRege
2cd0: 78 3a 20 22 20 2b 20 7a 52 65 67 65 78 2e 73 6f  x: " + zRegex.so
2ce0: 75 72 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  urce);.         
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 6f 45 76 61 6c 46 75 6e 63         oEvalFunc
2d20: 5b 73 57 68 61 74 5d 28 73 54 65 78 74 2c 20 6d  [sWhat](sText, m
2d30: 2c 20 74 68 69 73 2e 64 54 6f 6b 65 6e 50 6f 73  , this.dTokenPos
2d40: 29 3b 0a 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 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 20 69 66 20 28 62 44 65 62 75 67 29 20 7b     if (bDebug) {
2d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
2dc0: 28 22 3d 20 22 20 2b 20 6d 5b 30 5d 20 2b 20 22  ("= " + m[0] + "
2dd0: 20 20 23 20 22 20 2b 20 73 4c 69 6e 65 49 64 2c    # " + sLineId,
2de0: 20 22 5c 6e 44 41 3a 22 2c 20 74 68 69 73 2e 64   "\nDA:", this.d
2df0: 54 6f 6b 65 6e 50 6f 73 29 3b 0a 20 20 20 20 20  TokenPos);.     
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 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 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2e60: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
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: 63 61 73 65 20 22 3e 22 3a 0a 20 20 20 20 20 20  case ">":.      
2ea0: 20 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 2f 2f 20 77 65 20            // we 
2ed0: 64 6f 20 6e 6f 74 68 69 6e 67 2c 20 74 68 69 73  do nothing, this
2ee0: 20 74 65 73 74 20 69 73 20 6a 75 73 74 20 61 20   test is just a 
2ef0: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 61 70 70  condition to app
2f00: 6c 79 20 61 6c 6c 20 66 6f 6c 6c 6f 77 69 6e 67  ly all following
2f10: 20 61 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 20   actions.       
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 62 72 65 61 6b 3b 0a           break;.
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 64 65 66 61              defa
2f80: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ult:.           
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 20                  
2fb0: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
2fc0: 28 22 23 20 65 72 72 6f 72 3a 20 75 6e 6b 6e 6f  ("# error: unkno
2fd0: 77 6e 20 61 63 74 69 6f 6e 20 61 74 20 22 20 2b  wn action at " +
2fe0: 20 73 4c 69 6e 65 49 64 29 3b 0a 20 20 20 20 20   sLineId);.     
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3010: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3030: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
3040: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3060: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63 41            if (cA
3070: 63 74 69 6f 6e 54 79 70 65 20 3d 3d 20 22 3e 22  ctionType == ">"
3080: 29 20 7b 0a 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 20 20 20 20                  
30b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
30e0: 0a 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 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 20 20 20 20 20 7d 0a 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 63 61 74 63 68 20 28           catch (
3150: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3170: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65           console
3180: 2e 6c 6f 67 28 73 54 65 78 74 29 3b 0a 20 20 20  .log(sText);.   
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 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 23 20   console.log("# 
31c0: 6c 69 6e 65 20 69 64 3a 20 22 20 2b 20 73 4c 69  line id: " + sLi
31d0: 6e 65 49 64 20 2b 20 22 5c 6e 23 20 72 75 6c 65  neId + "\n# rule
31e0: 20 69 64 3a 20 22 20 2b 20 73 52 75 6c 65 49 64   id: " + sRuleId
31f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
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 63 6f 6e 73 6f 6c 65 2e 65         console.e
3220: 72 72 6f 72 28 65 29 3b 0a 20 20 20 20 20 20 20  rror(e);.       
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 7d 0a 20 20 20 20 20           }.     
3250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3260: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
3290: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32c0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 62   }.        if (b
32d0: 43 68 61 6e 67 65 29 20 7b 0a 20 20 20 20 20 20  Change) {.      
32e0: 20 20 20 20 20 20 69 66 20 28 62 50 61 72 61 67        if (bParag
32f0: 72 61 70 68 29 20 7b 0a 20 20 20 20 20 20 20 20  raph) {.        
3300: 20 20 20 20 20 20 20 20 74 68 69 73 2e 73 54 65          this.sTe
3310: 78 74 20 3d 20 73 54 65 78 74 3b 0a 20 20 20 20  xt = sText;.    
3320: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
3330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3340: 20 74 68 69 73 2e 73 53 65 6e 74 65 6e 63 65 20   this.sSentence 
3350: 3d 20 73 54 65 78 74 3b 0a 20 20 20 20 20 20 20  = sText;.       
3360: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
3370: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 75 70 64 61  .    }..    upda
3380: 74 65 20 28 73 53 65 6e 74 65 6e 63 65 2c 20 62  te (sSentence, b
3390: 44 65 62 75 67 3d 66 61 6c 73 65 29 20 7b 0a 20  Debug=false) {. 
33a0: 20 20 20 20 20 20 20 2f 2f 20 75 70 64 61 74 65         // update
33b0: 20 3c 73 53 65 6e 74 65 6e 63 65 3e 20 61 6e 64   <sSentence> and
33c0: 20 72 65 74 6f 6b 65 6e 69 7a 65 0a 20 20 20 20   retokenize.    
33d0: 20 20 20 20 74 68 69 73 2e 73 53 65 6e 74 65 6e      this.sSenten
33e0: 63 65 20 3d 20 73 53 65 6e 74 65 6e 63 65 3b 0a  ce = sSentence;.
33f0: 20 20 20 20 20 20 20 20 6c 65 74 20 6c 4e 65 77          let lNew
3400: 54 6f 6b 65 6e 20 3d 20 41 72 72 61 79 2e 66 72  Token = Array.fr
3410: 6f 6d 28 5f 6f 54 6f 6b 65 6e 69 7a 65 72 2e 67  om(_oTokenizer.g
3420: 65 6e 54 6f 6b 65 6e 73 28 73 53 65 6e 74 65 6e  enTokens(sSenten
3430: 63 65 2c 20 74 72 75 65 29 29 3b 0a 20 20 20 20  ce, true));.    
3440: 20 20 20 20 66 6f 72 20 28 6c 65 74 20 64 54 6f      for (let dTo
3450: 6b 65 6e 20 6f 66 20 6c 4e 65 77 54 6f 6b 65 6e  ken of lNewToken
3460: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3470: 69 66 20 28 74 68 69 73 2e 64 54 6f 6b 65 6e 50  if (this.dTokenP
3480: 6f 73 2e 67 6c 5f 67 65 74 28 64 54 6f 6b 65 6e  os.gl_get(dToken
3490: 5b 22 6e 53 74 61 72 74 22 5d 2c 20 7b 7d 29 2e  ["nStart"], {}).
34a0: 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 22  hasOwnProperty("
34b0: 6c 4d 6f 72 70 68 22 29 29 20 7b 0a 20 20 20 20  lMorph")) {.    
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 64 54 6f 6b              dTok
34d0: 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 20 3d 20 74  en["lMorph"] = t
34e0: 68 69 73 2e 64 54 6f 6b 65 6e 50 6f 73 2e 67 65  his.dTokenPos.ge
34f0: 74 28 64 54 6f 6b 65 6e 5b 22 6e 53 74 61 72 74  t(dToken["nStart
3500: 22 5d 29 5b 22 6c 4d 6f 72 70 68 22 5d 3b 0a 20  "])["lMorph"];. 
3510: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3520: 20 20 20 20 20 20 20 20 20 69 66 20 28 74 68 69           if (thi
3530: 73 2e 64 54 6f 6b 65 6e 50 6f 73 2e 67 6c 5f 67  s.dTokenPos.gl_g
3540: 65 74 28 64 54 6f 6b 65 6e 5b 22 6e 53 74 61 72  et(dToken["nStar
3550: 74 22 5d 2c 20 7b 7d 29 2e 68 61 73 4f 77 6e 50  t"], {}).hasOwnP
3560: 72 6f 70 65 72 74 79 28 22 61 54 61 67 73 22 29  roperty("aTags")
3570: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3580: 20 20 20 20 64 54 6f 6b 65 6e 5b 22 61 54 61 67      dToken["aTag
3590: 73 22 5d 20 3d 20 74 68 69 73 2e 64 54 6f 6b 65  s"] = this.dToke
35a0: 6e 50 6f 73 2e 67 65 74 28 64 54 6f 6b 65 6e 5b  nPos.get(dToken[
35b0: 22 6e 53 74 61 72 74 22 5d 29 5b 22 61 54 61 67  "nStart"])["aTag
35c0: 73 22 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  s"];.           
35d0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
35e0: 20 20 20 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e       this.lToken
35f0: 20 3d 20 6c 4e 65 77 54 6f 6b 65 6e 3b 0a 20 20   = lNewToken;.  
3600: 20 20 20 20 20 20 74 68 69 73 2e 64 54 6f 6b 65        this.dToke
3610: 6e 50 6f 73 2e 63 6c 65 61 72 28 29 3b 0a 20 20  nPos.clear();.  
3620: 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 64        for (let d
3630: 54 6f 6b 65 6e 20 6f 66 20 74 68 69 73 2e 6c 54  Token of this.lT
3640: 6f 6b 65 6e 29 20 7b 0a 20 20 20 20 20 20 20 20  oken) {.        
3650: 20 20 20 20 69 66 20 28 64 54 6f 6b 65 6e 5b 22      if (dToken["
3660: 73 54 79 70 65 22 5d 20 21 3d 20 22 49 4e 46 4f  sType"] != "INFO
3670: 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ") {.           
3680: 20 20 20 20 20 74 68 69 73 2e 64 54 6f 6b 65 6e       this.dToken
3690: 50 6f 73 2e 73 65 74 28 64 54 6f 6b 65 6e 5b 22  Pos.set(dToken["
36a0: 6e 53 74 61 72 74 22 5d 2c 20 64 54 6f 6b 65 6e  nStart"], dToken
36b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
36c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36d0: 20 20 20 69 66 20 28 62 44 65 62 75 67 29 20 7b     if (bDebug) {
36e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
36f0: 73 6f 6c 65 2e 6c 6f 67 28 22 55 50 44 41 54 45  sole.log("UPDATE
3700: 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  :");.           
3710: 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 74 68 69   console.log(thi
3720: 73 2e 61 73 53 74 72 69 6e 67 28 29 29 3b 0a 20  s.asString());. 
3730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
3740: 20 20 20 20 2a 20 5f 67 65 74 4e 65 78 74 50 6f      * _getNextPo
3750: 69 6e 74 65 72 73 20 28 64 54 6f 6b 65 6e 2c 20  inters (dToken, 
3760: 64 47 72 61 70 68 2c 20 64 50 6f 69 6e 74 65 72  dGraph, dPointer
3770: 2c 20 62 44 65 62 75 67 3d 66 61 6c 73 65 29 20  , bDebug=false) 
3780: 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 67 65 6e  {.        // gen
3790: 65 72 61 74 6f 72 3a 20 72 65 74 75 72 6e 20 6e  erator: return n
37a0: 6f 64 65 73 20 77 68 65 72 65 20 3c 64 54 6f 6b  odes where <dTok
37b0: 65 6e 3e 20 e2 80 9c 76 61 6c 75 65 73 e2 80 9d  en> ...values...
37c0: 20 6d 61 74 63 68 20 3c 64 4e 6f 64 65 3e 20 61   match <dNode> a
37d0: 72 63 73 0a 20 20 20 20 20 20 20 20 74 72 79 20  rcs.        try 
37e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  {.            le
37f0: 74 20 64 4e 6f 64 65 20 3d 20 64 50 6f 69 6e 74  t dNode = dPoint
3800: 65 72 5b 22 64 4e 6f 64 65 22 5d 3b 0a 20 20 20  er["dNode"];.   
3810: 20 20 20 20 20 20 20 20 20 6c 65 74 20 69 4e 6f           let iNo
3820: 64 65 31 20 3d 20 64 50 6f 69 6e 74 65 72 5b 22  de1 = dPointer["
3830: 69 4e 6f 64 65 31 22 5d 3b 0a 20 20 20 20 20 20  iNode1"];.      
3840: 20 20 20 20 20 20 6c 65 74 20 62 54 6f 6b 65 6e        let bToken
3850: 46 6f 75 6e 64 20 3d 20 66 61 6c 73 65 3b 0a 20  Found = false;. 
3860: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74 6f             // to
3870: 6b 65 6e 20 76 61 6c 75 65 0a 20 20 20 20 20 20  ken value.      
3880: 20 20 20 20 20 20 69 66 20 28 64 4e 6f 64 65 2e        if (dNode.
3890: 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 64  hasOwnProperty(d
38a0: 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 29  Token["sValue"])
38b0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
38c0: 20 20 20 20 69 66 20 28 62 44 65 62 75 67 29 20      if (bDebug) 
38d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
38e0: 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f        console.lo
38f0: 67 28 22 20 20 4d 41 54 43 48 3a 20 22 20 2b 20  g("  MATCH: " + 
3900: 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d  dToken["sValue"]
3910: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3920: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
3930: 20 20 20 20 20 79 69 65 6c 64 20 7b 20 22 69 4e       yield { "iN
3940: 6f 64 65 31 22 3a 20 69 4e 6f 64 65 31 2c 20 22  ode1": iNode1, "
3950: 64 4e 6f 64 65 22 3a 20 64 47 72 61 70 68 5b 64  dNode": dGraph[d
3960: 4e 6f 64 65 5b 64 54 6f 6b 65 6e 5b 22 73 56 61  Node[dToken["sVa
3970: 6c 75 65 22 5d 5d 5d 20 7d 3b 0a 20 20 20 20 20  lue"]]] };.     
3980: 20 20 20 20 20 20 20 20 20 20 20 62 54 6f 6b 65             bToke
3990: 6e 46 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0a 20  nFound = true;. 
39a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
39b0: 20 20 20 20 20 20 20 20 20 69 66 20 28 64 54 6f           if (dTo
39c0: 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 2e 73 6c  ken["sValue"].sl
39d0: 69 63 65 28 30 2c 32 29 2e 67 6c 5f 69 73 54 69  ice(0,2).gl_isTi
39e0: 74 6c 65 28 29 29 20 7b 20 2f 2f 20 77 65 20 74  tle()) { // we t
39f0: 65 73 74 20 6f 6e 6c 79 20 32 20 66 69 72 73 74  est only 2 first
3a00: 20 63 68 61 72 73 2c 20 74 6f 20 6d 61 6b 65 20   chars, to make 
3a10: 76 61 6c 69 64 20 77 6f 72 64 73 20 73 75 63 68  valid words such
3a20: 20 61 73 20 22 4c 61 69 73 73 65 7a 2d 6c 65 73   as "Laissez-les
3a30: 22 2c 20 22 50 61 73 73 65 2d 70 61 72 74 6f 75  ", "Passe-partou
3a40: 74 22 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t"..            
3a50: 20 20 20 20 6c 65 74 20 73 56 61 6c 75 65 20 3d      let sValue =
3a60: 20 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22   dToken["sValue"
3a70: 5d 2e 74 6f 4c 6f 77 65 72 43 61 73 65 28 29 3b  ].toLowerCase();
3a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3a90: 20 69 66 20 28 64 4e 6f 64 65 2e 68 61 73 4f 77   if (dNode.hasOw
3aa0: 6e 50 72 6f 70 65 72 74 79 28 73 56 61 6c 75 65  nProperty(sValue
3ab0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
3ac0: 20 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65           if (bDe
3ad0: 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20  bug) {.         
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
3af0: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 4d 41  onsole.log("  MA
3b00: 54 43 48 3a 20 22 20 2b 20 73 56 61 6c 75 65 29  TCH: " + sValue)
3b10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3b20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c              yiel
3b40: 64 20 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69 4e  d { "iNode1": iN
3b50: 6f 64 65 31 2c 20 22 64 4e 6f 64 65 22 3a 20 64  ode1, "dNode": d
3b60: 47 72 61 70 68 5b 64 4e 6f 64 65 5b 73 56 61 6c  Graph[dNode[sVal
3b70: 75 65 5d 5d 20 7d 3b 0a 20 20 20 20 20 20 20 20  ue]] };.        
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 62 54 6f 6b              bTok
3b90: 65 6e 46 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0a  enFound = true;.
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bb0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
3bd0: 20 69 66 20 28 64 54 6f 6b 65 6e 5b 22 73 56 61   if (dToken["sVa
3be0: 6c 75 65 22 5d 2e 67 6c 5f 69 73 55 70 70 65 72  lue"].gl_isUpper
3bf0: 43 61 73 65 28 29 29 20 7b 0a 20 20 20 20 20 20  Case()) {.      
3c00: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 73 56            let sV
3c10: 61 6c 75 65 20 3d 20 64 54 6f 6b 65 6e 5b 22 73  alue = dToken["s
3c20: 56 61 6c 75 65 22 5d 2e 74 6f 4c 6f 77 65 72 43  Value"].toLowerC
3c30: 61 73 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ase();.         
3c40: 20 20 20 20 20 20 20 69 66 20 28 64 4e 6f 64 65         if (dNode
3c50: 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28  .hasOwnProperty(
3c60: 73 56 61 6c 75 65 29 29 20 7b 0a 20 20 20 20 20  sValue)) {.     
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3c80: 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20  f (bDebug) {.   
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
3cb0: 28 22 20 20 4d 41 54 43 48 3a 20 22 20 2b 20 73  ("  MATCH: " + s
3cc0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cf0: 20 20 79 69 65 6c 64 20 7b 20 22 69 4e 6f 64 65    yield { "iNode
3d00: 31 22 3a 20 69 4e 6f 64 65 31 2c 20 22 64 4e 6f  1": iNode1, "dNo
3d10: 64 65 22 3a 20 64 47 72 61 70 68 5b 64 4e 6f 64  de": dGraph[dNod
3d20: 65 5b 73 56 61 6c 75 65 5d 5d 20 7d 3b 0a 20 20  e[sValue]] };.  
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d40: 20 20 62 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20    bTokenFound = 
3d50: 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  true;.          
3d60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3d70: 20 20 20 20 20 20 20 20 73 56 61 6c 75 65 20 3d          sValue =
3d80: 20 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22   dToken["sValue"
3d90: 5d 2e 67 6c 5f 74 6f 43 61 70 69 74 61 6c 69 7a  ].gl_toCapitaliz
3da0: 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e();.           
3db0: 20 20 20 20 20 69 66 20 28 64 4e 6f 64 65 2e 68       if (dNode.h
3dc0: 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 73 56  asOwnProperty(sV
3dd0: 61 6c 75 65 29 29 20 7b 0a 20 20 20 20 20 20 20  alue)) {.       
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
3df0: 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20  (bDebug) {.     
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22     console.log("
3e20: 20 20 4d 41 54 43 48 3a 20 22 20 2b 20 73 56 61    MATCH: " + sVa
3e30: 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lue);.          
3e40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 79 69 65 6c 64 20 7b 20 22 69 4e 6f 64 65 31 22  yield { "iNode1"
3e70: 3a 20 69 4e 6f 64 65 31 2c 20 22 64 4e 6f 64 65  : iNode1, "dNode
3e80: 22 3a 20 64 47 72 61 70 68 5b 64 4e 6f 64 65 5b  ": dGraph[dNode[
3e90: 73 56 61 6c 75 65 5d 5d 20 7d 3b 0a 20 20 20 20  sValue]] };.    
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3eb0: 62 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20 74 72  bTokenFound = tr
3ec0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
3ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3ee0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3ef0: 2f 2f 20 72 65 67 65 78 20 76 61 6c 75 65 20 61  // regex value a
3f00: 72 63 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  rcs.            
3f10: 69 66 20 28 64 54 6f 6b 65 6e 5b 22 73 54 79 70  if (dToken["sTyp
3f20: 65 22 5d 20 21 3d 20 22 49 4e 46 4f 22 20 20 26  e"] != "INFO"  &
3f30: 26 20 20 64 54 6f 6b 65 6e 5b 22 73 54 79 70 65  &  dToken["sType
3f40: 22 5d 20 21 3d 20 22 50 55 4e 43 22 20 20 26 26  "] != "PUNC"  &&
3f50: 20 20 64 54 6f 6b 65 6e 5b 22 73 54 79 70 65 22    dToken["sType"
3f60: 5d 20 21 3d 20 22 53 49 47 4e 22 29 20 7b 0a 20  ] != "SIGN") {. 
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3f80: 66 20 28 64 4e 6f 64 65 2e 68 61 73 4f 77 6e 50  f (dNode.hasOwnP
3f90: 72 6f 70 65 72 74 79 28 22 3c 72 65 5f 76 61 6c  roperty("<re_val
3fa0: 75 65 3e 22 29 29 20 7b 0a 20 20 20 20 20 20 20  ue>")) {.       
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
3fc0: 20 28 6c 65 74 20 73 52 65 67 65 78 20 69 6e 20   (let sRegex in 
3fd0: 64 4e 6f 64 65 5b 22 3c 72 65 5f 76 61 6c 75 65  dNode["<re_value
3fe0: 3e 22 5d 29 20 7b 0a 20 20 20 20 20 20 20 20 20  >"]) {.         
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4000: 66 20 28 21 73 52 65 67 65 78 2e 69 6e 63 6c 75  f (!sRegex.inclu
4010: 64 65 73 28 22 c2 ac 22 29 29 20 7b 0a 20 20 20  des("..")) {.   
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4030: 20 20 20 20 20 20 20 20 20 2f 2f 20 6e 6f 20 61           // no a
4040: 6e 74 69 2d 70 61 74 74 65 72 6e 0a 20 20 20 20  nti-pattern.    
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 20 20 20 20 20 20 20 20 69 66 20 28 64 54 6f 6b          if (dTok
4070: 65 6e 5b 22 73 56 61 6c 75 65 22 5d 2e 73 65 61  en["sValue"].sea
4080: 72 63 68 28 73 52 65 67 65 78 29 20 21 3d 3d 20  rch(sRegex) !== 
4090: 2d 31 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  -1) {.          
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40b0: 20 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67        if (bDebug
40c0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
40f0: 6c 6f 67 28 22 20 20 4d 41 54 43 48 3a 20 7e 22  log("  MATCH: ~"
4100: 20 2b 20 73 52 65 67 65 78 29 3b 0a 20 20 20 20   + sRegex);.    
4110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4120: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 79 69                yi
4150: 65 6c 64 20 7b 20 22 69 4e 6f 64 65 31 22 3a 20  eld { "iNode1": 
4160: 69 4e 6f 64 65 31 2c 20 22 64 4e 6f 64 65 22 3a  iNode1, "dNode":
4170: 20 64 47 72 61 70 68 5b 64 4e 6f 64 65 5b 22 3c   dGraph[dNode["<
4180: 72 65 5f 76 61 6c 75 65 3e 22 5d 5b 73 52 65 67  re_value>"][sReg
4190: 65 78 5d 5d 20 7d 3b 0a 20 20 20 20 20 20 20 20  ex]] };.        
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41b0: 20 20 20 20 20 20 20 20 62 54 6f 6b 65 6e 46 6f          bTokenFo
41c0: 75 6e 64 20 3d 20 74 72 75 65 3b 0a 20 20 20 20  und = true;.    
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4200: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4220: 20 20 20 20 20 20 20 2f 2f 20 74 68 65 72 65 20         // there 
4230: 69 73 20 61 6e 20 61 6e 74 69 2d 70 61 74 74 65  is an anti-patte
4240: 72 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rn.             
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
4260: 65 74 20 5b 73 50 61 74 74 65 72 6e 2c 20 73 4e  et [sPattern, sN
4270: 65 67 50 61 74 74 65 72 6e 5d 20 3d 20 73 52 65  egPattern] = sRe
4280: 67 65 78 2e 73 70 6c 69 74 28 22 c2 ac 22 2c 20  gex.split("..", 
4290: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42b0: 69 66 20 28 73 4e 65 67 50 61 74 74 65 72 6e 20  if (sNegPattern 
42c0: 26 26 20 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75  && dToken["sValu
42d0: 65 22 5d 2e 73 65 61 72 63 68 28 73 4e 65 67 50  e"].search(sNegP
42e0: 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29 20  attern) !== -1) 
42f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4330: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4350: 20 20 20 20 20 20 69 66 20 28 21 73 50 61 74 74        if (!sPatt
4360: 65 72 6e 20 7c 7c 20 64 54 6f 6b 65 6e 5b 22 73  ern || dToken["s
4370: 56 61 6c 75 65 22 5d 2e 73 65 61 72 63 68 28 73  Value"].search(s
4380: 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29  Pattern) !== -1)
4390: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43b0: 20 20 20 69 66 20 28 62 44 65 62 75 67 29 20 7b     if (bDebug) {
43c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67       console.log
43f0: 28 22 20 20 4d 41 54 43 48 3a 20 7e 22 20 2b 20  ("  MATCH: ~" + 
4400: 73 52 65 67 65 78 29 3b 0a 20 20 20 20 20 20 20  sRegex);.       
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
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 79 69 65 6c 64             yield
4450: 20 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69 4e 6f   { "iNode1": iNo
4460: 64 65 31 2c 20 22 64 4e 6f 64 65 22 3a 20 64 47  de1, "dNode": dG
4470: 72 61 70 68 5b 64 4e 6f 64 65 5b 22 3c 72 65 5f  raph[dNode["<re_
4480: 76 61 6c 75 65 3e 22 5d 5b 73 52 65 67 65 78 5d  value>"][sRegex]
4490: 5d 20 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ] };.           
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44b0: 20 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75 6e 64       bTokenFound
44c0: 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20   = true;.       
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
4500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4510: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4520: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4530: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4540: 20 20 20 2f 2f 20 61 6e 61 6c 79 73 61 62 6c 65     // analysable
4550: 20 74 6f 6b 65 6e 73 0a 20 20 20 20 20 20 20 20   tokens.        
4560: 20 20 20 20 69 66 20 28 64 54 6f 6b 65 6e 5b 22      if (dToken["
4570: 73 54 79 70 65 22 5d 2e 73 6c 69 63 65 28 30 2c  sType"].slice(0,
4580: 34 29 20 3d 3d 20 22 57 4f 52 44 22 29 20 7b 0a  4) == "WORD") {.
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 2f 2f 20 74 6f 6b 65 6e 20 6c 65 6d 6d 61 73 0a  // token lemmas.
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45c0: 69 66 20 28 64 4e 6f 64 65 2e 68 61 73 4f 77 6e  if (dNode.hasOwn
45d0: 50 72 6f 70 65 72 74 79 28 22 3c 6c 65 6d 6d 61  Property("<lemma
45e0: 73 3e 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20  s>")) {.        
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
4600: 28 6c 65 74 20 73 4c 65 6d 6d 61 20 6f 66 20 5f  (let sLemma of _
4610: 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65  oSpellChecker.ge
4620: 74 4c 65 6d 6d 61 28 64 54 6f 6b 65 6e 5b 22 73  tLemma(dToken["s
4630: 56 61 6c 75 65 22 5d 29 29 20 7b 0a 20 20 20 20  Value"])) {.    
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4650: 20 20 20 20 69 66 20 28 64 4e 6f 64 65 5b 22 3c      if (dNode["<
4660: 6c 65 6d 6d 61 73 3e 22 5d 2e 68 61 73 4f 77 6e  lemmas>"].hasOwn
4670: 50 72 6f 70 65 72 74 79 28 73 4c 65 6d 6d 61 29  Property(sLemma)
4680: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46a0: 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20  if (bDebug) {.  
46b0: 20 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 20 63 6f                co
46d0: 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 4d 41 54  nsole.log("  MAT
46e0: 43 48 3a 20 3e 22 20 2b 20 73 4c 65 6d 6d 61 29  CH: >" + sLemma)
46f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c              yiel
4730: 64 20 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69 4e  d { "iNode1": iN
4740: 6f 64 65 31 2c 20 22 64 4e 6f 64 65 22 3a 20 64  ode1, "dNode": d
4750: 47 72 61 70 68 5b 64 4e 6f 64 65 5b 22 3c 6c 65  Graph[dNode["<le
4760: 6d 6d 61 73 3e 22 5d 5b 73 4c 65 6d 6d 61 5d 5d  mmas>"][sLemma]]
4770: 20 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   };.            
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 62 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20 74 72  bTokenFound = tr
47a0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
47e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
47f0: 20 20 20 20 20 20 2f 2f 20 72 65 67 65 78 20 6d        // regex m
4800: 6f 72 70 68 20 61 72 63 73 0a 20 20 20 20 20 20  orph arcs.      
4810: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64 4e            if (dN
4820: 6f 64 65 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72  ode.hasOwnProper
4830: 74 79 28 22 3c 72 65 5f 6d 6f 72 70 68 3e 22 29  ty("<re_morph>")
4840: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
4850: 20 20 20 20 20 20 20 20 6c 65 74 20 6c 4d 6f 72          let lMor
4860: 70 68 20 3d 20 28 64 54 6f 6b 65 6e 2e 68 61 73  ph = (dToken.has
4870: 4f 77 6e 50 72 6f 70 65 72 74 79 28 22 6c 4d 6f  OwnProperty("lMo
4880: 72 70 68 22 29 29 20 3f 20 64 54 6f 6b 65 6e 5b  rph")) ? dToken[
4890: 22 6c 4d 6f 72 70 68 22 5d 20 3a 20 5f 6f 53 70  "lMorph"] : _oSp
48a0: 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74 4d 6f  ellChecker.getMo
48b0: 72 70 68 28 64 54 6f 6b 65 6e 5b 22 73 56 61 6c  rph(dToken["sVal
48c0: 75 65 22 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  ue"]);.         
48d0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
48e0: 6c 65 74 20 73 52 65 67 65 78 20 69 6e 20 64 4e  let sRegex in dN
48f0: 6f 64 65 5b 22 3c 72 65 5f 6d 6f 72 70 68 3e 22  ode["<re_morph>"
4900: 5d 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ]) {.           
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
4920: 28 21 73 52 65 67 65 78 2e 69 6e 63 6c 75 64 65  (!sRegex.include
4930: 73 28 22 c2 ac 22 29 29 20 7b 0a 20 20 20 20 20  s("..")) {.     
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4950: 20 20 20 20 20 20 20 2f 2f 20 6e 6f 20 61 6e 74         // no ant
4960: 69 2d 70 61 74 74 65 72 6e 0a 20 20 20 20 20 20  i-pattern.      
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4980: 20 20 20 20 20 20 69 66 20 28 6c 4d 6f 72 70 68        if (lMorph
4990: 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20 20 3d 3e  .some(sMorph  =>
49a0: 20 20 28 73 4d 6f 72 70 68 2e 73 65 61 72 63 68    (sMorph.search
49b0: 28 73 52 65 67 65 78 29 20 21 3d 3d 20 2d 31 29  (sRegex) !== -1)
49c0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49e0: 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67 29       if (bDebug)
49f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c         console.l
4a20: 6f 67 28 22 20 20 4d 41 54 43 48 3a 20 40 22 20  og("  MATCH: @" 
4a30: 2b 20 73 52 65 67 65 78 29 3b 0a 20 20 20 20 20  + sRegex);.     
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a50: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65               yie
4a80: 6c 64 20 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69  ld { "iNode1": i
4a90: 4e 6f 64 65 31 2c 20 22 64 4e 6f 64 65 22 3a 20  Node1, "dNode": 
4aa0: 64 47 72 61 70 68 5b 64 4e 6f 64 65 5b 22 3c 72  dGraph[dNode["<r
4ab0: 65 5f 6d 6f 72 70 68 3e 22 5d 5b 73 52 65 67 65  e_morph>"][sRege
4ac0: 78 5d 5d 20 7d 3b 0a 20 20 20 20 20 20 20 20 20  x]] };.         
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ae0: 20 20 20 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75         bTokenFou
4af0: 6e 64 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  nd = true;.     
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b50: 20 20 20 20 20 20 2f 2f 20 74 68 65 72 65 20 69        // there i
4b60: 73 20 61 6e 20 61 6e 74 69 2d 70 61 74 74 65 72  s an anti-patter
4b70: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
4b90: 74 20 5b 73 50 61 74 74 65 72 6e 2c 20 73 4e 65  t [sPattern, sNe
4ba0: 67 50 61 74 74 65 72 6e 5d 20 3d 20 73 52 65 67  gPattern] = sReg
4bb0: 65 78 2e 73 70 6c 69 74 28 22 c2 ac 22 2c 20 32  ex.split("..", 2
4bc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4be0: 66 20 28 73 4e 65 67 50 61 74 74 65 72 6e 20 3d  f (sNegPattern =
4bf0: 3d 20 22 2a 22 29 20 7b 0a 20 20 20 20 20 20 20  = "*") {.       
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 20 20 20 20 20 20 2f 2f 20 61 6c 6c 20           // all 
4c20: 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20 6d 75 73  morphologies mus
4c30: 74 20 6d 61 74 63 68 20 77 69 74 68 20 3c 73 50  t match with <sP
4c40: 61 74 74 65 72 6e 3e 0a 20 20 20 20 20 20 20 20  attern>.        
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c60: 20 20 20 20 20 20 20 20 69 66 20 28 73 50 61 74          if (sPat
4c70: 74 65 72 6e 29 20 7b 0a 20 20 20 20 20 20 20 20  tern) {.        
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
4ca0: 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3e 20  lMorph.length > 
4cb0: 30 20 20 26 26 20 20 6c 4d 6f 72 70 68 2e 65 76  0  &&  lMorph.ev
4cc0: 65 72 79 28 73 4d 6f 72 70 68 20 20 3d 3e 20 20  ery(sMorph  =>  
4cd0: 28 73 4d 6f 72 70 68 2e 73 65 61 72 63 68 28 73  (sMorph.search(s
4ce0: 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29  Pattern) !== -1)
4cf0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
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 20 20 69 66 20               if 
4d20: 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20  (bDebug) {.     
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d50: 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c         console.l
4d60: 6f 67 28 22 20 20 4d 41 54 43 48 3a 20 40 22 20  og("  MATCH: @" 
4d70: 2b 20 73 52 65 67 65 78 29 3b 0a 20 20 20 20 20  + sRegex);.     
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4da0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65               yie
4dd0: 6c 64 20 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69  ld { "iNode1": i
4de0: 4e 6f 64 65 31 2c 20 22 64 4e 6f 64 65 22 3a 20  Node1, "dNode": 
4df0: 64 47 72 61 70 68 5b 64 4e 6f 64 65 5b 22 3c 72  dGraph[dNode["<r
4e00: 65 5f 6d 6f 72 70 68 3e 22 5d 5b 73 52 65 67 65  e_morph>"][sRege
4e10: 78 5d 5d 20 7d 3b 0a 20 20 20 20 20 20 20 20 20  x]] };.         
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
4e40: 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d 20 74 72 75  TokenFound = tru
4e50: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
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 7d 0a 20 20 20 20 20 20 20         }.       
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ee0: 69 66 20 28 73 4e 65 67 50 61 74 74 65 72 6e 20  if (sNegPattern 
4ef0: 20 26 26 20 20 6c 4d 6f 72 70 68 2e 73 6f 6d 65   &&  lMorph.some
4f00: 28 73 4d 6f 72 70 68 20 20 3d 3e 20 20 28 73 4d  (sMorph  =>  (sM
4f10: 6f 72 70 68 2e 73 65 61 72 63 68 28 73 4e 65 67  orph.search(sNeg
4f20: 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29  Pattern) !== -1)
4f30: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f50: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
4f60: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fa0: 20 20 20 20 20 69 66 20 28 21 73 50 61 74 74 65       if (!sPatte
4fb0: 72 6e 20 20 7c 7c 20 20 6c 4d 6f 72 70 68 2e 73  rn  ||  lMorph.s
4fc0: 6f 6d 65 28 73 4d 6f 72 70 68 20 20 3d 3e 20 20  ome(sMorph  =>  
4fd0: 28 73 4d 6f 72 70 68 2e 73 65 61 72 63 68 28 73  (sMorph.search(s
4fe0: 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29  Pattern) !== -1)
4ff0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5010: 20 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65           if (bDe
5020: 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20  bug) {.         
5030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
5050: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 4d 41  onsole.log("  MA
5060: 54 43 48 3a 20 40 22 20 2b 20 73 52 65 67 65 78  TCH: @" + sRegex
5070: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5090: 20 20 20 20 20 20 20 7d 0a 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 20 20 20 20 20 20 20 20 20 20 20 79 69 65               yie
50c0: 6c 64 20 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69  ld { "iNode1": i
50d0: 4e 6f 64 65 31 2c 20 22 64 4e 6f 64 65 22 3a 20  Node1, "dNode": 
50e0: 64 47 72 61 70 68 5b 64 4e 6f 64 65 5b 22 3c 72  dGraph[dNode["<r
50f0: 65 5f 6d 6f 72 70 68 3e 22 5d 5b 73 52 65 67 65  e_morph>"][sRege
5100: 78 5d 5d 20 7d 3b 0a 20 20 20 20 20 20 20 20 20  x]] };.         
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 62 54 6f 6b 65             bToke
5130: 6e 46 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0a 20  nFound = true;. 
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 7d                 }
5160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
51c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
51d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74 6f             // to
51e0: 6b 65 6e 20 74 61 67 73 0a 20 20 20 20 20 20 20  ken tags.       
51f0: 20 20 20 20 20 69 66 20 28 64 54 6f 6b 65 6e 2e       if (dToken.
5200: 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 22  hasOwnProperty("
5210: 61 54 61 67 73 22 29 20 26 26 20 64 4e 6f 64 65  aTags") && dNode
5220: 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28  .hasOwnProperty(
5230: 22 3c 74 61 67 73 3e 22 29 29 20 7b 0a 20 20 20  "<tags>")) {.   
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
5250: 20 28 6c 65 74 20 73 54 61 67 20 6f 66 20 64 54   (let sTag of dT
5260: 6f 6b 65 6e 5b 22 61 54 61 67 73 22 5d 29 20 7b  oken["aTags"]) {
5270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5280: 20 20 20 20 20 69 66 20 28 64 4e 6f 64 65 5b 22       if (dNode["
5290: 3c 74 61 67 73 3e 22 5d 2e 68 61 73 4f 77 6e 50  <tags>"].hasOwnP
52a0: 72 6f 70 65 72 74 79 28 73 54 61 67 29 29 20 7b  roperty(sTag)) {
52b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
52c0: 20 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65           if (bDe
52d0: 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20  bug) {.         
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52f0: 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22     console.log("
5300: 20 20 4d 41 54 43 48 3a 20 2f 22 20 2b 20 73 54    MATCH: /" + sT
5310: 61 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ag);.           
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5340: 20 20 20 20 20 20 20 79 69 65 6c 64 20 7b 20 22         yield { "
5350: 69 4e 6f 64 65 31 22 3a 20 69 4e 6f 64 65 31 2c  iNode1": iNode1,
5360: 20 22 64 4e 6f 64 65 22 3a 20 64 47 72 61 70 68   "dNode": dGraph
5370: 5b 64 4e 6f 64 65 5b 22 3c 74 61 67 73 3e 22 5d  [dNode["<tags>"]
5380: 5b 73 54 61 67 5d 5d 20 7d 3b 0a 20 20 20 20 20  [sTag]] };.     
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 20 20 20 62 54 6f 6b 65 6e 46 6f 75 6e 64 20 3d     bTokenFound =
53b0: 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20   true;.         
53c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
53e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
53f0: 20 20 20 20 20 20 20 20 20 2f 2f 20 6d 65 74 61           // meta
5400: 20 61 72 63 20 28 66 6f 72 20 74 6f 6b 65 6e 20   arc (for token 
5410: 74 79 70 65 29 0a 20 20 20 20 20 20 20 20 20 20  type).          
5420: 20 20 69 66 20 28 64 4e 6f 64 65 2e 68 61 73 4f    if (dNode.hasO
5430: 77 6e 50 72 6f 70 65 72 74 79 28 22 3c 6d 65 74  wnProperty("<met
5440: 61 3e 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20  a>")) {.        
5450: 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74          for (let
5460: 20 73 4d 65 74 61 20 69 6e 20 64 4e 6f 64 65 5b   sMeta in dNode[
5470: 22 3c 6d 65 74 61 3e 22 5d 29 20 7b 0a 20 20 20  "<meta>"]) {.   
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5490: 20 2f 2f 20 6e 6f 20 72 65 67 65 78 20 68 65 72   // no regex her
54a0: 65 2c 20 77 65 20 6a 75 73 74 20 73 65 61 72 63  e, we just searc
54b0: 68 20 69 66 20 3c 64 4e 6f 64 65 5b 22 73 54 79  h if <dNode["sTy
54c0: 70 65 22 5d 3e 20 65 78 69 73 74 73 20 77 69 74  pe"]> exists wit
54d0: 68 69 6e 20 3c 73 4d 65 74 61 3e 0a 20 20 20 20  hin <sMeta>.    
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 69 66 20 28 73 4d 65 74 61 20 3d 3d 20 22 2a 22  if (sMeta == "*"
5500: 20 7c 7c 20 64 54 6f 6b 65 6e 5b 22 73 54 79 70   || dToken["sTyp
5510: 65 22 5d 20 3d 3d 20 73 4d 65 74 61 29 20 7b 0a  e"] == sMeta) {.
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65 62          if (bDeb
5540: 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ug) {.          
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5560: 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20    console.log(" 
5570: 20 4d 41 54 43 48 3a 20 2a 22 20 2b 20 73 4d 65   MATCH: *" + sMe
5580: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ta);.           
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 20 20 20 20 20 20 79 69 65 6c 64 20 7b 20 22         yield { "
55c0: 69 4e 6f 64 65 31 22 3a 20 69 4e 6f 64 65 31 2c  iNode1": iNode1,
55d0: 20 22 64 4e 6f 64 65 22 3a 20 64 47 72 61 70 68   "dNode": dGraph
55e0: 5b 64 4e 6f 64 65 5b 22 3c 6d 65 74 61 3e 22 5d  [dNode["<meta>"]
55f0: 5b 73 4d 65 74 61 5d 5d 20 7d 3b 0a 20 20 20 20  [sMeta]] };.    
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 20 20 20 62 54 6f 6b 65 6e 46 6f 75 6e 64 20      bTokenFound 
5620: 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20  = true;.        
5630: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 20 20 65 6c 73 65 20 69 66 20 28 73 4d 65 74 61    else if (sMeta
5660: 2e 69 6e 63 6c 75 64 65 73 28 22 c2 ac 22 29 29  .includes(".."))
5670: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
5680: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
5690: 73 4d 65 74 61 2e 69 6e 63 6c 75 64 65 73 28 64  sMeta.includes(d
56a0: 54 6f 6b 65 6e 5b 22 73 54 79 70 65 22 5d 29 29  Token["sType"]))
56b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
56d0: 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20  f (bDebug) {.   
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
5700: 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 4d 41 54 43  sole.log("  MATC
5710: 48 3a 20 2a 22 20 2b 20 73 4d 65 74 61 29 3b 0a  H: *" + sMeta);.
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 20 20 20 20 7d 0a 20 20              }.  
5740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5750: 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
5760: 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69 4e 6f 64  { "iNode1": iNod
5770: 65 31 2c 20 22 64 4e 6f 64 65 22 3a 20 64 47 72  e1, "dNode": dGr
5780: 61 70 68 5b 64 4e 6f 64 65 5b 22 3c 6d 65 74 61  aph[dNode["<meta
5790: 3e 22 5d 5b 73 4d 65 74 61 5d 5d 20 7d 3b 0a 20  >"][sMeta]] };. 
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 20 20 20 20 20 20 20 20 20 20 20 62 54 6f 6b 65             bToke
57c0: 6e 46 6f 75 6e 64 20 3d 20 74 72 75 65 3b 0a 20  nFound = true;. 
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
57f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
5820: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
5830: 62 54 6f 6b 65 6e 46 6f 75 6e 64 20 20 26 26 20  bTokenFound  && 
5840: 20 64 50 6f 69 6e 74 65 72 2e 68 61 73 4f 77 6e   dPointer.hasOwn
5850: 50 72 6f 70 65 72 74 79 28 22 62 4b 65 65 70 22  Property("bKeep"
5860: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
5870: 20 20 20 20 20 79 69 65 6c 64 20 64 50 6f 69 6e       yield dPoin
5880: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ter;.           
5890: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
58a0: 2f 20 4a 55 4d 50 0a 20 20 20 20 20 20 20 20 20  / JUMP.         
58b0: 20 20 20 2f 2f 20 57 61 72 6e 69 6e 67 21 20 52     // Warning! R
58c0: 65 63 75 72 73 73 69 6f 6e 21 0a 20 20 20 20 20  ecurssion!.     
58d0: 20 20 20 20 20 20 20 69 66 20 28 64 4e 6f 64 65         if (dNode
58e0: 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28  .hasOwnProperty(
58f0: 22 3c 3e 22 29 29 20 7b 0a 20 20 20 20 20 20 20  "<>")) {.       
5900: 20 20 20 20 20 20 20 20 20 6c 65 74 20 64 50 6f           let dPo
5910: 69 6e 74 65 72 32 20 3d 20 7b 20 22 69 4e 6f 64  inter2 = { "iNod
5920: 65 31 22 3a 20 69 4e 6f 64 65 31 2c 20 22 64 4e  e1": iNode1, "dN
5930: 6f 64 65 22 3a 20 64 47 72 61 70 68 5b 64 4e 6f  ode": dGraph[dNo
5940: 64 65 5b 22 3c 3e 22 5d 5d 2c 20 22 62 4b 65 65  de["<>"]], "bKee
5950: 70 22 3a 20 74 72 75 65 20 7d 3b 0a 20 20 20 20  p": true };.    
5960: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c              yiel
5970: 64 2a 20 74 68 69 73 2e 5f 67 65 74 4e 65 78 74  d* this._getNext
5980: 50 6f 69 6e 74 65 72 73 28 64 54 6f 6b 65 6e 2c  Pointers(dToken,
5990: 20 64 47 72 61 70 68 2c 20 64 50 6f 69 6e 74 65   dGraph, dPointe
59a0: 72 32 2c 20 62 44 65 62 75 67 29 3b 0a 20 20 20  r2, bDebug);.   
59b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
59c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 74     }.        cat
59d0: 63 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20  ch (e) {.       
59e0: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 65 72 72       console.err
59f0: 6f 72 28 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  or(e);.        }
5a00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 61 72 73  .    }..    pars
5a10: 65 47 72 61 70 68 20 28 64 47 72 61 70 68 2c 20  eGraph (dGraph, 
5a20: 73 43 6f 75 6e 74 72 79 3d 22 24 7b 63 6f 75 6e  sCountry="${coun
5a30: 74 72 79 5f 64 65 66 61 75 6c 74 7d 22 2c 20 64  try_default}", d
5a40: 4f 70 74 69 6f 6e 73 3d 6e 75 6c 6c 2c 20 62 53  Options=null, bS
5a50: 68 6f 77 52 75 6c 65 49 64 3d 66 61 6c 73 65 2c  howRuleId=false,
5a60: 20 62 44 65 62 75 67 3d 66 61 6c 73 65 2c 20 62   bDebug=false, b
5a70: 43 6f 6e 74 65 78 74 3d 66 61 6c 73 65 29 20 7b  Context=false) {
5a80: 0a 20 20 20 20 20 20 20 20 2f 2f 20 70 61 72 73  .        // pars
5a90: 65 20 67 72 61 70 68 20 77 69 74 68 20 74 6f 6b  e graph with tok
5aa0: 65 6e 73 20 66 72 6f 6d 20 74 68 65 20 74 65 78  ens from the tex
5ab0: 74 20 61 6e 64 20 65 78 65 63 75 74 65 20 61 63  t and execute ac
5ac0: 74 69 6f 6e 73 20 65 6e 63 6f 75 6e 74 65 72 65  tions encountere
5ad0: 64 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6c 50  d.        let lP
5ae0: 6f 69 6e 74 65 72 20 3d 20 5b 5d 3b 0a 20 20 20  ointer = [];.   
5af0: 20 20 20 20 20 6c 65 74 20 62 54 61 67 41 6e 64       let bTagAnd
5b00: 52 65 77 72 69 74 65 20 3d 20 66 61 6c 73 65 3b  Rewrite = false;
5b10: 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20  .        try {. 
5b20: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
5b30: 6c 65 74 20 5b 69 54 6f 6b 65 6e 2c 20 64 54 6f  let [iToken, dTo
5b40: 6b 65 6e 5d 20 6f 66 20 74 68 69 73 2e 6c 54 6f  ken] of this.lTo
5b50: 6b 65 6e 2e 65 6e 74 72 69 65 73 28 29 29 20 7b  ken.entries()) {
5b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5b70: 20 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20   if (bDebug) {. 
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b90: 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22     console.log("
5ba0: 54 4f 4b 45 4e 3a 20 22 20 2b 20 64 54 6f 6b 65  TOKEN: " + dToke
5bb0: 6e 5b 22 73 56 61 6c 75 65 22 5d 29 3b 0a 20 20  n["sValue"]);.  
5bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5be0: 2f 2f 20 63 68 65 63 6b 20 61 72 63 73 20 66 6f  // check arcs fo
5bf0: 72 20 65 61 63 68 20 65 78 69 73 74 69 6e 67 20  r each existing 
5c00: 70 6f 69 6e 74 65 72 0a 20 20 20 20 20 20 20 20  pointer.        
5c10: 20 20 20 20 20 20 20 20 6c 65 74 20 6c 4e 65 78          let lNex
5c20: 74 50 6f 69 6e 74 65 72 20 3d 20 5b 5d 3b 0a 20  tPointer = [];. 
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
5c40: 6f 72 20 28 6c 65 74 20 64 50 6f 69 6e 74 65 72  or (let dPointer
5c50: 20 6f 66 20 6c 50 6f 69 6e 74 65 72 29 20 7b 0a   of lPointer) {.
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c70: 20 20 20 20 6c 4e 65 78 74 50 6f 69 6e 74 65 72      lNextPointer
5c80: 2e 70 75 73 68 28 2e 2e 2e 74 68 69 73 2e 5f 67  .push(...this._g
5c90: 65 74 4e 65 78 74 50 6f 69 6e 74 65 72 73 28 64  etNextPointers(d
5ca0: 54 6f 6b 65 6e 2c 20 64 47 72 61 70 68 2c 20 64  Token, dGraph, d
5cb0: 50 6f 69 6e 74 65 72 2c 20 62 44 65 62 75 67 29  Pointer, bDebug)
5cc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
5cd0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
5ce0: 20 20 20 20 20 6c 50 6f 69 6e 74 65 72 20 3d 20       lPointer = 
5cf0: 6c 4e 65 78 74 50 6f 69 6e 74 65 72 3b 0a 20 20  lNextPointer;.  
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
5d10: 20 63 68 65 63 6b 20 61 72 63 73 20 6f 66 20 66   check arcs of f
5d20: 69 72 73 74 20 6e 6f 64 65 73 0a 20 20 20 20 20  irst nodes.     
5d30: 20 20 20 20 20 20 20 20 20 20 20 6c 50 6f 69 6e             lPoin
5d40: 74 65 72 2e 70 75 73 68 28 2e 2e 2e 74 68 69 73  ter.push(...this
5d50: 2e 5f 67 65 74 4e 65 78 74 50 6f 69 6e 74 65 72  ._getNextPointer
5d60: 73 28 64 54 6f 6b 65 6e 2c 20 64 47 72 61 70 68  s(dToken, dGraph
5d70: 2c 20 7b 20 22 69 4e 6f 64 65 31 22 3a 20 69 54  , { "iNode1": iT
5d80: 6f 6b 65 6e 2c 20 22 64 4e 6f 64 65 22 3a 20 64  oken, "dNode": d
5d90: 47 72 61 70 68 5b 30 5d 20 7d 2c 20 62 44 65 62  Graph[0] }, bDeb
5da0: 75 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ug));.          
5db0: 20 20 20 20 20 20 2f 2f 20 63 68 65 63 6b 20 69        // check i
5dc0: 66 20 74 68 65 72 65 20 69 73 20 72 75 6c 65 73  f there is rules
5dd0: 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 65 61   to check for ea
5de0: 63 68 20 70 6f 69 6e 74 65 72 0a 20 20 20 20 20  ch pointer.     
5df0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
5e00: 6c 65 74 20 64 50 6f 69 6e 74 65 72 20 6f 66 20  let dPointer of 
5e10: 6c 50 6f 69 6e 74 65 72 29 20 7b 0a 20 20 20 20  lPointer) {.    
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e30: 69 66 20 28 64 50 6f 69 6e 74 65 72 5b 22 64 4e  if (dPointer["dN
5e40: 6f 64 65 22 5d 2e 68 61 73 4f 77 6e 50 72 6f 70  ode"].hasOwnProp
5e50: 65 72 74 79 28 22 3c 72 75 6c 65 73 3e 22 29 29  erty("<rules>"))
5e60: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
5e70: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 62             let b
5e80: 43 68 61 6e 67 65 20 3d 20 74 68 69 73 2e 5f 65  Change = this._e
5e90: 78 65 63 75 74 65 41 63 74 69 6f 6e 73 28 64 47  xecuteActions(dG
5ea0: 72 61 70 68 2c 20 64 50 6f 69 6e 74 65 72 5b 22  raph, dPointer["
5eb0: 64 4e 6f 64 65 22 5d 5b 22 3c 72 75 6c 65 73 3e  dNode"]["<rules>
5ec0: 22 5d 2c 20 64 50 6f 69 6e 74 65 72 5b 22 69 4e  "], dPointer["iN
5ed0: 6f 64 65 31 22 5d 2d 31 2c 20 69 54 6f 6b 65 6e  ode1"]-1, iToken
5ee0: 2c 20 64 4f 70 74 69 6f 6e 73 2c 20 73 43 6f 75  , dOptions, sCou
5ef0: 6e 74 72 79 2c 20 62 53 68 6f 77 52 75 6c 65 49  ntry, bShowRuleI
5f00: 64 2c 20 62 44 65 62 75 67 2c 20 62 43 6f 6e 74  d, bDebug, bCont
5f10: 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ext);.          
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
5f30: 20 28 62 43 68 61 6e 67 65 29 20 7b 0a 20 20 20   (bChange) {.   
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f50: 20 20 20 20 20 20 20 20 20 62 54 61 67 41 6e 64           bTagAnd
5f60: 52 65 77 72 69 74 65 20 3d 20 74 72 75 65 3b 0a  Rewrite = true;.
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fb0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
5fc0: 20 20 20 20 20 20 20 20 7d 20 63 61 74 63 68 20          } catch 
5fd0: 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  (e) {.          
5fe0: 20 20 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72 28    console.error(
5ff0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
6000: 20 20 20 20 20 20 69 66 20 28 62 54 61 67 41 6e        if (bTagAn
6010: 64 52 65 77 72 69 74 65 29 20 7b 0a 20 20 20 20  dRewrite) {.    
6020: 20 20 20 20 20 20 20 20 74 68 69 73 2e 72 65 77          this.rew
6030: 72 69 74 65 46 72 6f 6d 54 61 67 73 28 62 44 65  riteFromTags(bDe
6040: 62 75 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  bug);.        }.
6050: 20 20 20 20 20 20 20 20 69 66 20 28 62 44 65 62          if (bDeb
6060: 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ug) {.          
6070: 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 74 68    console.log(th
6080: 69 73 2e 61 73 53 74 72 69 6e 67 28 29 29 3b 0a  is.asString());.
6090: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
60a0: 20 20 72 65 74 75 72 6e 20 74 68 69 73 2e 73 53    return this.sS
60b0: 65 6e 74 65 6e 63 65 3b 0a 20 20 20 20 7d 0a 0a  entence;.    }..
60c0: 20 20 20 20 5f 65 78 65 63 75 74 65 41 63 74 69      _executeActi
60d0: 6f 6e 73 20 28 64 47 72 61 70 68 2c 20 64 4e 6f  ons (dGraph, dNo
60e0: 64 65 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74  de, nTokenOffset
60f0: 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 2c 20 64 4f  , nLastToken, dO
6100: 70 74 69 6f 6e 73 2c 20 73 43 6f 75 6e 74 72 79  ptions, sCountry
6110: 2c 20 62 53 68 6f 77 52 75 6c 65 49 64 2c 20 62  , bShowRuleId, b
6120: 44 65 62 75 67 2c 20 62 43 6f 6e 74 65 78 74 29  Debug, bContext)
6130: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 65 78   {.        // ex
6140: 65 63 75 74 65 20 61 63 74 69 6f 6e 73 20 66 6f  ecute actions fo
6150: 75 6e 64 20 69 6e 20 74 68 65 20 44 41 52 47 0a  und in the DARG.
6160: 20 20 20 20 20 20 20 20 6c 65 74 20 62 43 68 61          let bCha
6170: 6e 67 65 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20  nge = false;.   
6180: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 73       for (let [s
6190: 4c 69 6e 65 49 64 2c 20 6e 65 78 74 4e 6f 64 65  LineId, nextNode
61a0: 4b 65 79 5d 20 6f 66 20 4f 62 6a 65 63 74 2e 65  Key] of Object.e
61b0: 6e 74 72 69 65 73 28 64 4e 6f 64 65 29 29 20 7b  ntries(dNode)) {
61c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74  .            let
61d0: 20 62 43 6f 6e 64 4d 65 6d 6f 20 3d 20 6e 75 6c   bCondMemo = nul
61e0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  l;.            f
61f0: 6f 72 20 28 6c 65 74 20 73 52 75 6c 65 49 64 20  or (let sRuleId 
6200: 6f 66 20 64 47 72 61 70 68 5b 6e 65 78 74 4e 6f  of dGraph[nextNo
6210: 64 65 4b 65 79 5d 29 20 7b 0a 20 20 20 20 20 20  deKey]) {.      
6220: 20 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a            try {.
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6240: 20 20 20 20 69 66 20 28 62 44 65 62 75 67 29 20      if (bDebug) 
6250: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6260: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
6270: 65 2e 6c 6f 67 28 22 20 20 20 3e 54 52 59 3a 20  e.log("   >TRY: 
6280: 22 20 2b 20 73 52 75 6c 65 49 64 20 2b 20 22 20  " + sRuleId + " 
6290: 22 20 2b 20 73 4c 69 6e 65 49 64 29 3b 0a 20 20  " + sLineId);.  
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
62c0: 20 20 20 20 20 20 20 20 6c 65 74 20 5b 73 4f 70          let [sOp
62d0: 74 69 6f 6e 2c 20 73 46 75 6e 63 43 6f 6e 64 2c  tion, sFuncCond,
62e0: 20 63 41 63 74 69 6f 6e 54 79 70 65 2c 20 73 57   cActionType, sW
62f0: 68 61 74 2c 20 2e 2e 2e 65 41 63 74 5d 20 3d 20  hat, ...eAct] = 
6300: 67 63 5f 72 75 6c 65 73 5f 67 72 61 70 68 2e 64  gc_rules_graph.d
6310: 52 75 6c 65 5b 73 52 75 6c 65 49 64 5d 3b 0a 20  Rule[sRuleId];. 
6320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6330: 20 20 20 2f 2f 20 53 75 67 67 65 73 74 69 6f 6e     // Suggestion
6340: 20 20 20 20 5b 20 6f 70 74 69 6f 6e 2c 20 63 6f      [ option, co
6350: 6e 64 69 74 69 6f 6e 2c 20 22 2d 22 2c 20 72 65  ndition, "-", re
6360: 70 6c 61 63 65 6d 65 6e 74 2f 73 75 67 67 65 73  placement/sugges
6370: 74 69 6f 6e 2f 61 63 74 69 6f 6e 2c 20 69 54 6f  tion/action, iTo
6380: 6b 65 6e 53 74 61 72 74 2c 20 69 54 6f 6b 65 6e  kenStart, iToken
6390: 45 6e 64 2c 20 63 53 74 61 72 74 4c 69 6d 69 74  End, cStartLimit
63a0: 2c 20 63 45 6e 64 4c 69 6d 69 74 2c 20 62 43 61  , cEndLimit, bCa
63b0: 73 65 53 76 74 79 2c 20 6e 50 72 69 6f 72 69 74  seSvty, nPriorit
63c0: 79 2c 20 73 4d 65 73 73 61 67 65 2c 20 73 55 52  y, sMessage, sUR
63d0: 4c 20 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  L ].            
63e0: 20 20 20 20 20 20 20 20 2f 2f 20 54 65 78 74 50          // TextP
63f0: 72 6f 63 65 73 73 6f 72 20 5b 20 6f 70 74 69 6f  rocessor [ optio
6400: 6e 2c 20 63 6f 6e 64 69 74 69 6f 6e 2c 20 22 7e  n, condition, "~
6410: 22 2c 20 72 65 70 6c 61 63 65 6d 65 6e 74 2f 73  ", replacement/s
6420: 75 67 67 65 73 74 69 6f 6e 2f 61 63 74 69 6f 6e  uggestion/action
6430: 2c 20 69 54 6f 6b 65 6e 53 74 61 72 74 2c 20 69  , iTokenStart, i
6440: 54 6f 6b 65 6e 45 6e 64 2c 20 62 43 61 73 65 53  TokenEnd, bCaseS
6450: 76 74 79 20 5d 0a 20 20 20 20 20 20 20 20 20 20  vty ].          
6460: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 44 69 73            // Dis
6470: 61 6d 62 69 67 75 61 74 6f 72 20 5b 20 6f 70 74  ambiguator [ opt
6480: 69 6f 6e 2c 20 63 6f 6e 64 69 74 69 6f 6e 2c 20  ion, condition, 
6490: 22 3d 22 2c 20 72 65 70 6c 61 63 65 6d 65 6e 74  "=", replacement
64a0: 2f 73 75 67 67 65 73 74 69 6f 6e 2f 61 63 74 69  /suggestion/acti
64b0: 6f 6e 20 5d 0a 20 20 20 20 20 20 20 20 20 20 20  on ].           
64c0: 20 20 20 20 20 20 20 20 20 2f 2f 20 54 61 67 20           // Tag 
64d0: 20 20 20 20 20 20 20 20 20 20 5b 20 6f 70 74 69            [ opti
64e0: 6f 6e 2c 20 63 6f 6e 64 69 74 69 6f 6e 2c 20 22  on, condition, "
64f0: 2f 22 2c 20 72 65 70 6c 61 63 65 6d 65 6e 74 2f  /", replacement/
6500: 73 75 67 67 65 73 74 69 6f 6e 2f 61 63 74 69 6f  suggestion/actio
6510: 6e 2c 20 69 54 6f 6b 65 6e 53 74 61 72 74 2c 20  n, iTokenStart, 
6520: 69 54 6f 6b 65 6e 45 6e 64 20 5d 0a 20 20 20 20  iTokenEnd ].    
6530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6540: 2f 2f 20 49 6d 6d 75 6e 69 74 79 20 20 20 20 20  // Immunity     
6550: 20 5b 20 6f 70 74 69 6f 6e 2c 20 63 6f 6e 64 69   [ option, condi
6560: 74 69 6f 6e 2c 20 22 25 22 2c 20 22 22 2c 20 20  tion, "%", "",  
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6580: 20 20 20 20 20 20 20 20 20 20 69 54 6f 6b 65 6e            iToken
6590: 53 74 61 72 74 2c 20 69 54 6f 6b 65 6e 45 6e 64  Start, iTokenEnd
65a0: 20 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ].             
65b0: 20 20 20 20 20 20 20 2f 2f 20 54 65 73 74 20 20         // Test  
65c0: 20 20 20 20 20 20 20 20 5b 20 6f 70 74 69 6f 6e          [ option
65d0: 2c 20 63 6f 6e 64 69 74 69 6f 6e 2c 20 22 3e 22  , condition, ">"
65e0: 2c 20 22 22 20 5d 0a 20 20 20 20 20 20 20 20 20  , "" ].         
65f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
6600: 73 4f 70 74 69 6f 6e 20 7c 7c 20 64 4f 70 74 69  sOption || dOpti
6610: 6f 6e 73 2e 67 6c 5f 67 65 74 28 73 4f 70 74 69  ons.gl_get(sOpti
6620: 6f 6e 2c 20 66 61 6c 73 65 29 29 20 7b 0a 20 20  on, false)) {.  
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 20 20 20 20 62 43 6f 6e 64 4d 65 6d 6f 20        bCondMemo 
6650: 3d 20 21 73 46 75 6e 63 43 6f 6e 64 20 7c 7c 20  = !sFuncCond || 
6660: 6f 45 76 61 6c 46 75 6e 63 5b 73 46 75 6e 63 43  oEvalFunc[sFuncC
6670: 6f 6e 64 5d 28 74 68 69 73 2e 6c 54 6f 6b 65 6e  ond](this.lToken
6680: 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20  , nTokenOffset, 
6690: 6e 4c 61 73 74 54 6f 6b 65 6e 2c 20 73 43 6f 75  nLastToken, sCou
66a0: 6e 74 72 79 2c 20 62 43 6f 6e 64 4d 65 6d 6f 2c  ntry, bCondMemo,
66b0: 20 74 68 69 73 2e 64 54 61 67 73 2c 20 74 68 69   this.dTags, thi
66c0: 73 2e 73 53 65 6e 74 65 6e 63 65 2c 20 74 68 69  s.sSentence, thi
66d0: 73 2e 73 53 65 6e 74 65 6e 63 65 30 29 3b 0a 20  s.sSentence0);. 
66e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66f0: 20 20 20 20 20 20 20 69 66 20 28 62 43 6f 6e 64         if (bCond
6700: 4d 65 6d 6f 29 20 7b 0a 20 20 20 20 20 20 20 20  Memo) {.        
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 20 20 20 20 69 66 20 28 63 41 63 74 69 6f 6e 54      if (cActionT
6730: 79 70 65 20 3d 3d 20 22 2d 22 29 20 7b 0a 20 20  ype == "-") {.  
6740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
6760: 20 67 72 61 6d 6d 61 72 20 65 72 72 6f 72 0a 20   grammar error. 
6770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
6790: 65 74 20 5b 69 54 6f 6b 65 6e 53 74 61 72 74 2c  et [iTokenStart,
67a0: 20 69 54 6f 6b 65 6e 45 6e 64 2c 20 63 53 74 61   iTokenEnd, cSta
67b0: 72 74 4c 69 6d 69 74 2c 20 63 45 6e 64 4c 69 6d  rtLimit, cEndLim
67c0: 69 74 2c 20 62 43 61 73 65 53 76 74 79 2c 20 6e  it, bCaseSvty, n
67d0: 50 72 69 6f 72 69 74 79 2c 20 73 4d 65 73 73 61  Priority, sMessa
67e0: 67 65 2c 20 73 55 52 4c 5d 20 3d 20 65 41 63 74  ge, sURL] = eAct
67f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6810: 20 20 6c 65 74 20 6e 54 6f 6b 65 6e 45 72 72 6f    let nTokenErro
6820: 72 53 74 61 72 74 20 3d 20 28 69 54 6f 6b 65 6e  rStart = (iToken
6830: 53 74 61 72 74 20 3e 20 30 29 20 3f 20 6e 54 6f  Start > 0) ? nTo
6840: 6b 65 6e 4f 66 66 73 65 74 20 2b 20 69 54 6f 6b  kenOffset + iTok
6850: 65 6e 53 74 61 72 74 20 3a 20 6e 4c 61 73 74 54  enStart : nLastT
6860: 6f 6b 65 6e 20 2b 20 69 54 6f 6b 65 6e 53 74 61  oken + iTokenSta
6870: 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt;.            
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6890: 20 20 20 20 69 66 20 28 21 74 68 69 73 2e 6c 54      if (!this.lT
68a0: 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 45 72 72 6f 72  oken[nTokenError
68b0: 53 74 61 72 74 5d 2e 68 61 73 4f 77 6e 50 72 6f  Start].hasOwnPro
68c0: 70 65 72 74 79 28 22 62 49 6d 6d 75 6e 65 22 29  perty("bImmune")
68d0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68f0: 20 20 20 20 20 20 20 20 6c 65 74 20 6e 54 6f 6b          let nTok
6900: 65 6e 45 72 72 6f 72 45 6e 64 20 3d 20 28 69 54  enErrorEnd = (iT
6910: 6f 6b 65 6e 45 6e 64 20 3e 20 30 29 20 3f 20 6e  okenEnd > 0) ? n
6920: 54 6f 6b 65 6e 4f 66 66 73 65 74 20 2b 20 69 54  TokenOffset + iT
6930: 6f 6b 65 6e 45 6e 64 20 3a 20 6e 4c 61 73 74 54  okenEnd : nLastT
6940: 6f 6b 65 6e 20 2b 20 69 54 6f 6b 65 6e 45 6e 64  oken + iTokenEnd
6950: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6970: 20 20 20 20 20 20 6c 65 74 20 6e 45 72 72 6f 72        let nError
6980: 53 74 61 72 74 20 3d 20 74 68 69 73 2e 6e 4f 66  Start = this.nOf
6990: 66 73 65 74 57 69 74 68 69 6e 50 61 72 61 67 72  fsetWithinParagr
69a0: 61 70 68 20 2b 20 28 28 63 53 74 61 72 74 4c 69  aph + ((cStartLi
69b0: 6d 69 74 20 3d 3d 20 22 3c 22 29 20 3f 20 74 68  mit == "<") ? th
69c0: 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e  is.lToken[nToken
69d0: 45 72 72 6f 72 53 74 61 72 74 5d 5b 22 6e 53 74  ErrorStart]["nSt
69e0: 61 72 74 22 5d 20 3a 20 74 68 69 73 2e 6c 54 6f  art"] : this.lTo
69f0: 6b 65 6e 5b 6e 54 6f 6b 65 6e 45 72 72 6f 72 53  ken[nTokenErrorS
6a00: 74 61 72 74 5d 5b 22 6e 45 6e 64 22 5d 29 3b 0a  tart]["nEnd"]);.
6a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a30: 20 20 20 20 6c 65 74 20 6e 45 72 72 6f 72 45 6e      let nErrorEn
6a40: 64 20 3d 20 74 68 69 73 2e 6e 4f 66 66 73 65 74  d = this.nOffset
6a50: 57 69 74 68 69 6e 50 61 72 61 67 72 61 70 68 20  WithinParagraph 
6a60: 2b 20 28 28 63 45 6e 64 4c 69 6d 69 74 20 3d 3d  + ((cEndLimit ==
6a70: 20 22 3e 22 29 20 3f 20 74 68 69 73 2e 6c 54 6f   ">") ? this.lTo
6a80: 6b 65 6e 5b 6e 54 6f 6b 65 6e 45 72 72 6f 72 45  ken[nTokenErrorE
6a90: 6e 64 5d 5b 22 6e 45 6e 64 22 5d 20 3a 20 74 68  nd]["nEnd"] : th
6aa0: 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e  is.lToken[nToken
6ab0: 45 72 72 6f 72 45 6e 64 5d 5b 22 6e 53 74 61 72  ErrorEnd]["nStar
6ac0: 74 22 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  t"]);.          
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ae0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 74            if (!t
6af0: 68 69 73 2e 64 45 72 72 6f 72 2e 68 61 73 28 6e  his.dError.has(n
6b00: 45 72 72 6f 72 53 74 61 72 74 29 20 7c 7c 20 6e  ErrorStart) || n
6b10: 50 72 69 6f 72 69 74 79 20 3e 20 74 68 69 73 2e  Priority > this.
6b20: 64 45 72 72 6f 72 50 72 69 6f 72 69 74 79 2e 67  dErrorPriority.g
6b30: 6c 5f 67 65 74 28 6e 45 72 72 6f 72 53 74 61 72  l_get(nErrorStar
6b40: 74 2c 20 2d 31 29 29 20 7b 0a 20 20 20 20 20 20  t, -1)) {.      
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b70: 20 20 74 68 69 73 2e 64 45 72 72 6f 72 2e 73 65    this.dError.se
6b80: 74 28 6e 45 72 72 6f 72 53 74 61 72 74 2c 20 74  t(nErrorStart, t
6b90: 68 69 73 2e 5f 63 72 65 61 74 65 45 72 72 6f 72  his._createError
6ba0: 46 72 6f 6d 54 6f 6b 65 6e 73 28 73 57 68 61 74  FromTokens(sWhat
6bb0: 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20  , nTokenOffset, 
6bc0: 6e 4c 61 73 74 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  nLastToken, nTok
6bd0: 65 6e 45 72 72 6f 72 53 74 61 72 74 2c 20 6e 45  enErrorStart, nE
6be0: 72 72 6f 72 53 74 61 72 74 2c 20 6e 45 72 72 6f  rrorStart, nErro
6bf0: 72 45 6e 64 2c 20 73 4c 69 6e 65 49 64 2c 20 73  rEnd, sLineId, s
6c00: 52 75 6c 65 49 64 2c 20 62 43 61 73 65 53 76 74  RuleId, bCaseSvt
6c10: 79 2c 20 73 4d 65 73 73 61 67 65 2c 20 73 55 52  y, sMessage, sUR
6c20: 4c 2c 20 62 53 68 6f 77 52 75 6c 65 49 64 2c 20  L, bShowRuleId, 
6c30: 73 4f 70 74 69 6f 6e 2c 20 62 43 6f 6e 74 65 78  sOption, bContex
6c40: 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t));.           
6c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
6c70: 73 2e 64 45 72 72 6f 72 50 72 69 6f 72 69 74 79  s.dErrorPriority
6c80: 2e 73 65 74 28 6e 45 72 72 6f 72 53 74 61 72 74  .set(nErrorStart
6c90: 2c 20 6e 50 72 69 6f 72 69 74 79 29 3b 0a 20 20  , nPriority);.  
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cc0: 20 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67        if (bDebug
6cd0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d00: 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 20  console.log("   
6d10: 20 4e 45 57 5f 45 52 52 4f 52 3a 20 22 2c 20 20   NEW_ERROR: ",  
6d20: 74 68 69 73 2e 64 45 72 72 6f 72 2e 67 65 74 28  this.dError.get(
6d30: 6e 45 72 72 6f 72 53 74 61 72 74 29 29 3b 0a 20  nErrorStart));. 
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
6db0: 0a 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 20 20 20 20 7d 0a 20               }. 
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6de0: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
6df0: 69 66 20 28 63 41 63 74 69 6f 6e 54 79 70 65 20  if (cActionType 
6e00: 3d 3d 20 22 7e 22 29 20 7b 0a 20 20 20 20 20 20  == "~") {.      
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e20: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74 65 78            // tex
6e30: 74 20 70 72 6f 63 65 73 73 6f 72 0a 20 20 20 20  t processor.    
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
6e60: 6e 54 6f 6b 65 6e 53 74 61 72 74 20 3d 20 28 65  nTokenStart = (e
6e70: 41 63 74 5b 30 5d 20 3e 20 30 29 20 3f 20 6e 54  Act[0] > 0) ? nT
6e80: 6f 6b 65 6e 4f 66 66 73 65 74 20 2b 20 65 41 63  okenOffset + eAc
6e90: 74 5b 30 5d 20 3a 20 6e 4c 61 73 74 54 6f 6b 65  t[0] : nLastToke
6ea0: 6e 20 2b 20 65 41 63 74 5b 30 5d 3b 0a 20 20 20  n + eAct[0];.   
6eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
6ed0: 20 6e 54 6f 6b 65 6e 45 6e 64 20 3d 20 28 65 41   nTokenEnd = (eA
6ee0: 63 74 5b 31 5d 20 3e 20 30 29 20 3f 20 6e 54 6f  ct[1] > 0) ? nTo
6ef0: 6b 65 6e 4f 66 66 73 65 74 20 2b 20 65 41 63 74  kenOffset + eAct
6f00: 5b 31 5d 20 3a 20 6e 4c 61 73 74 54 6f 6b 65 6e  [1] : nLastToken
6f10: 20 2b 20 65 41 63 74 5b 31 5d 3b 0a 20 20 20 20   + eAct[1];.    
6f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
6f40: 2e 5f 74 61 67 41 6e 64 50 72 65 70 61 72 65 54  ._tagAndPrepareT
6f50: 6f 6b 65 6e 46 6f 72 52 65 77 72 69 74 69 6e 67  okenForRewriting
6f60: 28 73 57 68 61 74 2c 20 6e 54 6f 6b 65 6e 53 74  (sWhat, nTokenSt
6f70: 61 72 74 2c 20 6e 54 6f 6b 65 6e 45 6e 64 2c 20  art, nTokenEnd, 
6f80: 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c  nTokenOffset, nL
6f90: 61 73 74 54 6f 6b 65 6e 2c 20 65 41 63 74 5b 32  astToken, eAct[2
6fa0: 5d 2c 20 62 44 65 62 75 67 29 3b 0a 20 20 20 20  ], bDebug);.    
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fc0: 20 20 20 20 20 20 20 20 20 20 20 20 62 43 68 61              bCha
6fd0: 6e 67 65 20 3d 20 74 72 75 65 3b 0a 20 20 20 20  nge = true;.    
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 69 66 20 28              if (
7000: 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20  bDebug) {.      
7010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
7030: 6e 73 6f 6c 65 2e 6c 6f 67 28 60 20 20 20 20 54  nsole.log(`    T
7040: 45 58 54 5f 50 52 4f 43 45 53 53 4f 52 3a 20 5b  EXT_PROCESSOR: [
7050: 24 7b 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54  ${this.lToken[nT
7060: 6f 6b 65 6e 53 74 61 72 74 5d 5b 22 73 56 61 6c  okenStart]["sVal
7070: 75 65 22 5d 7d 3a 24 7b 74 68 69 73 2e 6c 54 6f  ue"]}:${this.lTo
7080: 6b 65 6e 5b 6e 54 6f 6b 65 6e 45 6e 64 5d 5b 22  ken[nTokenEnd]["
7090: 73 56 61 6c 75 65 22 5d 7d 5d 20 20 3e 20 24 7b  sValue"]}]  > ${
70a0: 73 57 68 61 74 7d 60 29 3b 0a 20 20 20 20 20 20  sWhat}`);.      
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 63        else if (c
7110: 41 63 74 69 6f 6e 54 79 70 65 20 3d 3d 20 22 3d  ActionType == "=
7120: 22 29 20 7b 0a 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 20 2f 2f 20 64 69 73 61 6d 62 69 67       // disambig
7150: 75 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20  uation.         
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7170: 20 20 20 20 20 20 20 6f 45 76 61 6c 46 75 6e 63         oEvalFunc
7180: 5b 73 57 68 61 74 5d 28 74 68 69 73 2e 6c 54 6f  [sWhat](this.lTo
7190: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 4f 66 66 73 65  ken, nTokenOffse
71a0: 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 29 3b 0a  t, nLastToken);.
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71d0: 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20  if (bDebug) {.  
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7200: 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 60 20    console.log(` 
7210: 20 20 20 44 49 53 41 4d 42 49 47 55 41 54 4f 52     DISAMBIGUATOR
7220: 3a 20 28 24 7b 73 57 68 61 74 7d 29 20 20 5b 24  : (${sWhat})  [$
7230: 7b 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f  {this.lToken[nTo
7240: 6b 65 6e 4f 66 66 73 65 74 2b 31 5d 5b 22 73 56  kenOffset+1]["sV
7250: 61 6c 75 65 22 5d 7d 3a 24 7b 74 68 69 73 2e 6c  alue"]}:${this.l
7260: 54 6f 6b 65 6e 5b 6e 4c 61 73 74 54 6f 6b 65 6e  Token[nLastToken
7270: 5d 5b 22 73 56 61 6c 75 65 22 5d 7d 5d 60 29 3b  ]["sValue"]}]`);
7280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
72c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
72d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
72e0: 65 20 69 66 20 28 63 41 63 74 69 6f 6e 54 79 70  e if (cActionTyp
72f0: 65 20 3d 3d 20 22 3e 22 29 20 7b 0a 20 20 20 20  e == ">") {.    
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 77              // w
7320: 65 20 64 6f 20 6e 6f 74 68 69 6e 67 2c 20 74 68  e do nothing, th
7330: 69 73 20 74 65 73 74 20 69 73 20 6a 75 73 74 20  is test is just 
7340: 61 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 61  a condition to a
7350: 70 70 6c 79 20 61 6c 6c 20 66 6f 6c 6c 6f 77 69  pply all followi
7360: 6e 67 20 61 63 74 69 6f 6e 73 0a 20 20 20 20 20  ng actions.     
7370: 20 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 69 66 20 28 62             if (b
7390: 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20  Debug) {.       
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 63 6f 6e               con
73c0: 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 20 20 43 4f  sole.log("    CO
73d0: 4e 44 5f 4f 4b 22 29 3b 0a 20 20 20 20 20 20 20  ND_OK");.       
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7410: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 63 41       else if (cA
7440: 63 74 69 6f 6e 54 79 70 65 20 3d 3d 20 22 2f 22  ctionType == "/"
7450: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
7460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7470: 20 20 20 20 2f 2f 20 54 61 67 0a 20 20 20 20 20      // Tag.     
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 6c 65 74 20 6e             let n
74a0: 54 6f 6b 65 6e 53 74 61 72 74 20 3d 20 28 65 41  TokenStart = (eA
74b0: 63 74 5b 30 5d 20 3e 20 30 29 20 3f 20 6e 54 6f  ct[0] > 0) ? nTo
74c0: 6b 65 6e 4f 66 66 73 65 74 20 2b 20 65 41 63 74  kenOffset + eAct
74d0: 5b 30 5d 20 3a 20 6e 4c 61 73 74 54 6f 6b 65 6e  [0] : nLastToken
74e0: 20 2b 20 65 41 63 74 5b 30 5d 3b 0a 20 20 20 20   + eAct[0];.    
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 6c 65 74 20              let 
7510: 6e 54 6f 6b 65 6e 45 6e 64 20 3d 20 28 65 41 63  nTokenEnd = (eAc
7520: 74 5b 31 5d 20 3e 20 30 29 20 3f 20 6e 54 6f 6b  t[1] > 0) ? nTok
7530: 65 6e 4f 66 66 73 65 74 20 2b 20 65 41 63 74 5b  enOffset + eAct[
7540: 31 5d 20 3a 20 6e 4c 61 73 74 54 6f 6b 65 6e 20  1] : nLastToken 
7550: 2b 20 65 41 63 74 5b 31 5d 3b 0a 20 20 20 20 20  + eAct[1];.     
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7570: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
7580: 6c 65 74 20 69 20 3d 20 6e 54 6f 6b 65 6e 53 74  let i = nTokenSt
7590: 61 72 74 3b 20 69 20 3c 3d 20 6e 54 6f 6b 65 6e  art; i <= nToken
75a0: 45 6e 64 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20  End; i++) {.    
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75d0: 69 66 20 28 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b  if (this.lToken[
75e0: 69 5d 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74  i].hasOwnPropert
75f0: 79 28 22 61 54 61 67 73 22 29 29 20 7b 0a 20 20  y("aTags")) {.  
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7620: 20 20 20 20 20 20 74 68 69 73 2e 6c 54 6f 6b 65        this.lToke
7630: 6e 5b 69 5d 5b 22 61 54 61 67 73 22 5d 2e 61 64  n[i]["aTags"].ad
7640: 64 28 2e 2e 2e 73 57 68 61 74 2e 73 70 6c 69 74  d(...sWhat.split
7650: 28 22 7c 22 29 29 0a 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 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
7680: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
7690: 20 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 74 68 69 73              this
76b0: 2e 6c 54 6f 6b 65 6e 5b 69 5d 5b 22 61 54 61 67  .lToken[i]["aTag
76c0: 73 22 5d 20 3d 20 6e 65 77 20 53 65 74 28 73 57  s"] = new Set(sW
76d0: 68 61 74 2e 73 70 6c 69 74 28 22 7c 22 29 29 3b  hat.split("|"));
76e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7700: 20 20 20 20 20 7d 0a 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: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
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 69 66 20 28 62 44 65           if (bDe
7750: 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20  bug) {.         
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7770: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f             conso
7780: 6c 65 2e 6c 6f 67 28 60 20 20 20 20 54 41 47 3a  le.log(`    TAG:
7790: 20 20 24 7b 73 57 68 61 74 7d 20 3e 20 5b 24 7b    ${sWhat} > [${
77a0: 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b  this.lToken[nTok
77b0: 65 6e 53 74 61 72 74 5d 5b 22 73 56 61 6c 75 65  enStart]["sValue
77c0: 22 5d 7d 3a 24 7b 74 68 69 73 2e 6c 54 6f 6b 65  "]}:${this.lToke
77d0: 6e 5b 6e 54 6f 6b 65 6e 45 6e 64 5d 5b 22 73 56  n[nTokenEnd]["sV
77e0: 61 6c 75 65 22 5d 7d 5d 60 29 3b 0a 20 20 20 20  alue"]}]`);.    
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 20 20 20 7d 0a 20 20              }.  
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 69 66                if
7830: 20 28 21 74 68 69 73 2e 64 54 61 67 73 2e 68 61   (!this.dTags.ha
7840: 73 28 73 57 68 61 74 29 29 20 7b 0a 20 20 20 20  s(sWhat)) {.    
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7870: 74 68 69 73 2e 64 54 61 67 73 2e 73 65 74 28 73  this.dTags.set(s
7880: 57 68 61 74 2c 20 5b 6e 54 6f 6b 65 6e 53 74 61  What, [nTokenSta
7890: 72 74 2c 20 6e 54 6f 6b 65 6e 53 74 61 72 74 5d  rt, nTokenStart]
78a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78f0: 74 68 69 73 2e 64 54 61 67 73 2e 73 65 74 28 73  this.dTags.set(s
7900: 57 68 61 74 2c 20 5b 4d 61 74 68 2e 6d 69 6e 28  What, [Math.min(
7910: 6e 54 6f 6b 65 6e 53 74 61 72 74 2c 20 74 68 69  nTokenStart, thi
7920: 73 2e 64 54 61 67 73 2e 67 65 74 28 73 57 68 61  s.dTags.get(sWha
7930: 74 29 5b 30 5d 29 2c 20 4d 61 74 68 2e 6d 61 78  t)[0]), Math.max
7940: 28 6e 54 6f 6b 65 6e 45 6e 64 2c 20 74 68 69 73  (nTokenEnd, this
7950: 2e 64 54 61 67 73 2e 67 65 74 28 73 57 68 61 74  .dTags.get(sWhat
7960: 29 5b 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20 20  )[1])]);.       
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7980: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79c0: 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 63 41       else if (cA
79d0: 63 74 69 6f 6e 54 79 70 65 20 3d 3d 20 22 25 22  ctionType == "%"
79e0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 20 20 2f 2f 20 69 6d 6d 75 6e 69 74 79 0a      // immunity.
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a30: 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20  if (bDebug) {.  
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a60: 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20    console.log(" 
7a70: 20 20 20 49 4d 4d 55 4e 49 54 59 3a 20 22 20 2b     IMMUNITY: " +
7a80: 20 5f 72 75 6c 65 73 5f 67 72 61 70 68 2e 64 52   _rules_graph.dR
7a90: 75 6c 65 5b 73 52 75 6c 65 49 64 5d 29 3b 0a 20  ule[sRuleId]);. 
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 20 20 20 7d                 }
7ac0: 0a 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 20 20                  
7ae0: 20 6c 65 74 20 6e 54 6f 6b 65 6e 53 74 61 72 74   let nTokenStart
7af0: 20 3d 20 28 65 41 63 74 5b 30 5d 20 3e 20 30 29   = (eAct[0] > 0)
7b00: 20 3f 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 20   ? nTokenOffset 
7b10: 2b 20 65 41 63 74 5b 30 5d 20 3a 20 6e 4c 61 73  + eAct[0] : nLas
7b20: 74 54 6f 6b 65 6e 20 2b 20 65 41 63 74 5b 30 5d  tToken + eAct[0]
7b30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b50: 20 20 6c 65 74 20 6e 54 6f 6b 65 6e 45 6e 64 20    let nTokenEnd 
7b60: 3d 20 28 65 41 63 74 5b 31 5d 20 3e 20 30 29 20  = (eAct[1] > 0) 
7b70: 3f 20 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 20 2b  ? nTokenOffset +
7b80: 20 65 41 63 74 5b 31 5d 20 3a 20 6e 4c 61 73 74   eAct[1] : nLast
7b90: 54 6f 6b 65 6e 20 2b 20 65 41 63 74 5b 31 5d 3b  Token + eAct[1];
7ba0: 0a 20 20 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 69 66 20 28 6e 54 6f 6b 65 6e 45 6e 64 20 2d   if (nTokenEnd -
7bd0: 20 6e 54 6f 6b 65 6e 53 74 61 72 74 20 3d 3d 20   nTokenStart == 
7be0: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0) {.           
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6c 54           this.lT
7c10: 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 53 74 61 72 74  oken[nTokenStart
7c20: 5d 5b 22 62 49 6d 6d 75 6e 65 22 5d 20 3d 20 74  ]["bImmune"] = t
7c30: 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rue;.           
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 20 6c 65 74 20 6e 45 72           let nEr
7c60: 72 6f 72 53 74 61 72 74 20 3d 20 74 68 69 73 2e  rorStart = this.
7c70: 6e 4f 66 66 73 65 74 57 69 74 68 69 6e 50 61 72  nOffsetWithinPar
7c80: 61 67 72 61 70 68 20 2b 20 74 68 69 73 2e 6c 54  agraph + this.lT
7c90: 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 53 74 61 72 74  oken[nTokenStart
7ca0: 5d 5b 22 6e 53 74 61 72 74 22 5d 3b 0a 20 20 20  ]["nStart"];.   
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cd0: 20 69 66 20 28 74 68 69 73 2e 64 45 72 72 6f 72   if (this.dError
7ce0: 2e 68 61 73 28 6e 45 72 72 6f 72 53 74 61 72 74  .has(nErrorStart
7cf0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
7d20: 73 2e 64 45 72 72 6f 72 2e 64 65 6c 65 74 65 28  s.dError.delete(
7d30: 6e 45 72 72 6f 72 53 74 61 72 74 29 3b 0a 20 20  nErrorStart);.  
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 20 20 20 20 20 20                  
7d60: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7db0: 20 66 6f 72 20 28 6c 65 74 20 69 20 3d 20 6e 54   for (let i = nT
7dc0: 6f 6b 65 6e 53 74 61 72 74 3b 20 20 69 20 3c 3d  okenStart;  i <=
7dd0: 20 6e 54 6f 6b 65 6e 45 6e 64 3b 20 20 69 2b 2b   nTokenEnd;  i++
7de0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
7e10: 2e 6c 54 6f 6b 65 6e 5b 69 5d 5b 22 62 49 6d 6d  .lToken[i]["bImm
7e20: 75 6e 65 22 5d 20 3d 20 74 72 75 65 3b 0a 20 20  une"] = true;.  
7e30: 20 20 20 20 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 20 20 6c 65 74 20 6e 45 72 72 6f 72        let nError
7e60: 53 74 61 72 74 20 3d 20 74 68 69 73 2e 6e 4f 66  Start = this.nOf
7e70: 66 73 65 74 57 69 74 68 69 6e 50 61 72 61 67 72  fsetWithinParagr
7e80: 61 70 68 20 2b 20 74 68 69 73 2e 6c 54 6f 6b 65  aph + this.lToke
7e90: 6e 5b 69 5d 5b 22 6e 53 74 61 72 74 22 5d 3b 0a  n[i]["nStart"];.
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ec0: 20 20 20 20 20 20 20 20 69 66 20 28 74 68 69 73          if (this
7ed0: 2e 64 45 72 72 6f 72 2e 68 61 73 28 6e 45 72 72  .dError.has(nErr
7ee0: 6f 72 53 74 61 72 74 29 29 20 7b 0a 20 20 20 20  orStart)) {.    
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f10: 20 20 20 20 20 20 20 20 74 68 69 73 2e 64 45 72          this.dEr
7f20: 72 6f 72 2e 64 65 6c 65 74 65 28 6e 45 72 72 6f  ror.delete(nErro
7f30: 72 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  rStart);.       
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f60: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fa0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
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 20 20                  
7ff0: 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 23 20 65  console.log("# e
8000: 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 61 63  rror: unknown ac
8010: 74 69 6f 6e 20 61 74 20 22 20 2b 20 73 4c 69 6e  tion at " + sLin
8020: 65 49 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eId);.          
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 20 7d 0a 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 7d 0a 20 20              }.  
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8070: 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 63        else if (c
8080: 41 63 74 69 6f 6e 54 79 70 65 20 3d 3d 20 22 3e  ActionType == ">
8090: 22 29 20 7b 0a 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 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20   if (bDebug) {. 
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
80e0: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 20 20  onsole.log("    
80f0: 43 4f 4e 44 5f 42 52 45 41 4b 22 29 3b 0a 20 20  COND_BREAK");.  
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 20 7d 0a 20 20 20 20            }.    
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8130: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8150: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
8170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8190: 20 63 61 74 63 68 20 28 65 29 20 7b 0a 20 20 20   catch (e) {.   
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81b0: 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 45 72   console.log("Er
81c0: 72 6f 72 3a 20 22 2c 20 73 4c 69 6e 65 49 64 2c  ror: ", sLineId,
81d0: 20 73 52 75 6c 65 49 64 2c 20 74 68 69 73 2e 73   sRuleId, this.s
81e0: 53 65 6e 74 65 6e 63 65 29 3b 0a 20 20 20 20 20  Sentence);.     
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
8200: 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72 28 65 29 3b  onsole.error(e);
8210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8220: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
8230: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8240: 20 20 20 72 65 74 75 72 6e 20 62 43 68 61 6e 67     return bChang
8250: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 5f 63  e;.    }..    _c
8260: 72 65 61 74 65 45 72 72 6f 72 46 72 6f 6d 52 65  reateErrorFromRe
8270: 67 65 78 20 28 73 54 65 78 74 2c 20 73 54 65 78  gex (sText, sTex
8280: 74 30 2c 20 73 53 75 67 67 2c 20 6e 4f 66 66 73  t0, sSugg, nOffs
8290: 65 74 2c 20 6d 2c 20 69 47 72 6f 75 70 2c 20 73  et, m, iGroup, s
82a0: 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65 49 64 2c  LineId, sRuleId,
82b0: 20 62 55 70 70 65 72 63 61 73 65 2c 20 73 4d 73   bUppercase, sMs
82c0: 67 2c 20 73 55 52 4c 2c 20 62 53 68 6f 77 52 75  g, sURL, bShowRu
82d0: 6c 65 49 64 2c 20 73 4f 70 74 69 6f 6e 2c 20 62  leId, sOption, b
82e0: 43 6f 6e 74 65 78 74 29 20 7b 0a 20 20 20 20 20  Context) {.     
82f0: 20 20 20 6c 65 74 20 6e 53 74 61 72 74 20 3d 20     let nStart = 
8300: 6e 4f 66 66 73 65 74 20 2b 20 6d 2e 73 74 61 72  nOffset + m.star
8310: 74 5b 69 47 72 6f 75 70 5d 3b 0a 20 20 20 20 20  t[iGroup];.     
8320: 20 20 20 6c 65 74 20 6e 45 6e 64 20 3d 20 6e 4f     let nEnd = nO
8330: 66 66 73 65 74 20 2b 20 6d 2e 65 6e 64 5b 69 47  ffset + m.end[iG
8340: 72 6f 75 70 5d 3b 0a 20 20 20 20 20 20 20 20 2f  roup];.        /
8350: 2f 20 73 75 67 67 65 73 74 69 6f 6e 73 0a 20 20  / suggestions.  
8360: 20 20 20 20 20 20 6c 65 74 20 6c 53 75 67 67 20        let lSugg 
8370: 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  = [];.        if
8380: 20 28 73 53 75 67 67 2e 73 74 61 72 74 73 57 69   (sSugg.startsWi
8390: 74 68 28 22 3d 22 29 29 20 7b 0a 20 20 20 20 20  th("=")) {.     
83a0: 20 20 20 20 20 20 20 73 53 75 67 67 20 3d 20 6f         sSugg = o
83b0: 45 76 61 6c 46 75 6e 63 5b 73 53 75 67 67 2e 73  EvalFunc[sSugg.s
83c0: 6c 69 63 65 28 31 29 5d 28 73 54 65 78 74 2c 20  lice(1)](sText, 
83d0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  m);.            
83e0: 6c 53 75 67 67 20 3d 20 28 73 53 75 67 67 29 20  lSugg = (sSugg) 
83f0: 3f 20 73 53 75 67 67 2e 73 70 6c 69 74 28 22 7c  ? sSugg.split("|
8400: 22 29 20 3a 20 5b 5d 3b 0a 20 20 20 20 20 20 20  ") : [];.       
8410: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 53 75 67   } else if (sSug
8420: 67 20 3d 3d 20 22 5f 22 29 20 7b 0a 20 20 20 20  g == "_") {.    
8430: 20 20 20 20 20 20 20 20 6c 53 75 67 67 20 3d 20          lSugg = 
8440: 5b 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  [];.        } el
8450: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
8460: 20 6c 53 75 67 67 20 3d 20 73 53 75 67 67 2e 67   lSugg = sSugg.g
8470: 6c 5f 65 78 70 61 6e 64 28 6d 29 2e 73 70 6c 69  l_expand(m).spli
8480: 74 28 22 7c 22 29 3b 0a 20 20 20 20 20 20 20 20  t("|");.        
8490: 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 62 55  }.        if (bU
84a0: 70 70 65 72 63 61 73 65 20 26 26 20 6c 53 75 67  ppercase && lSug
84b0: 67 2e 6c 65 6e 67 74 68 20 3e 20 30 20 26 26 20  g.length > 0 && 
84c0: 6d 5b 69 47 72 6f 75 70 5d 2e 73 6c 69 63 65 28  m[iGroup].slice(
84d0: 30 2c 31 29 2e 67 6c 5f 69 73 55 70 70 65 72 43  0,1).gl_isUpperC
84e0: 61 73 65 28 29 29 20 7b 0a 20 20 20 20 20 20 20  ase()) {.       
84f0: 20 20 20 20 20 6c 53 75 67 67 20 3d 20 63 61 70       lSugg = cap
8500: 69 74 61 6c 69 7a 65 41 72 72 61 79 28 6c 53 75  italizeArray(lSu
8510: 67 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  gg);.        }. 
8520: 20 20 20 20 20 20 20 2f 2f 20 4d 65 73 73 61 67         // Messag
8530: 65 0a 20 20 20 20 20 20 20 20 6c 65 74 20 73 4d  e.        let sM
8540: 65 73 73 61 67 65 20 3d 20 28 73 4d 73 67 2e 73  essage = (sMsg.s
8550: 74 61 72 74 73 57 69 74 68 28 22 3d 22 29 29 20  tartsWith("=")) 
8560: 3f 20 6f 45 76 61 6c 46 75 6e 63 5b 73 4d 73 67  ? oEvalFunc[sMsg
8570: 2e 73 6c 69 63 65 28 31 29 5d 28 73 54 65 78 74  .slice(1)](sText
8580: 2c 20 6d 29 20 3a 20 73 4d 73 67 2e 67 6c 5f 65  , m) : sMsg.gl_e
8590: 78 70 61 6e 64 28 6d 29 3b 0a 20 20 20 20 20 20  xpand(m);.      
85a0: 20 20 69 66 20 28 62 53 68 6f 77 52 75 6c 65 49    if (bShowRuleI
85b0: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d) {.           
85c0: 20 73 4d 65 73 73 61 67 65 20 2b 3d 20 22 20 20   sMessage += "  
85d0: 23 23 20 22 20 2b 20 73 4c 69 6e 65 49 64 20 2b  ## " + sLineId +
85e0: 20 22 20 23 20 22 20 2b 20 73 52 75 6c 65 49 64   " # " + sRuleId
85f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8600: 20 20 20 20 2f 2f 0a 20 20 20 20 20 20 20 20 72      //.        r
8610: 65 74 75 72 6e 20 74 68 69 73 2e 5f 63 72 65 61  eturn this._crea
8620: 74 65 45 72 72 6f 72 28 6e 53 74 61 72 74 2c 20  teError(nStart, 
8630: 6e 45 6e 64 2c 20 73 4c 69 6e 65 49 64 2c 20 73  nEnd, sLineId, s
8640: 52 75 6c 65 49 64 2c 20 73 4f 70 74 69 6f 6e 2c  RuleId, sOption,
8650: 20 73 4d 65 73 73 61 67 65 2c 20 6c 53 75 67 67   sMessage, lSugg
8660: 2c 20 73 55 52 4c 2c 20 62 43 6f 6e 74 65 78 74  , sURL, bContext
8670: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 5f 63  );.    }..    _c
8680: 72 65 61 74 65 45 72 72 6f 72 46 72 6f 6d 54 6f  reateErrorFromTo
8690: 6b 65 6e 73 20 28 73 53 75 67 67 2c 20 6e 54 6f  kens (sSugg, nTo
86a0: 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73 74  kenOffset, nLast
86b0: 54 6f 6b 65 6e 2c 20 69 46 69 72 73 74 54 6f 6b  Token, iFirstTok
86c0: 65 6e 2c 20 6e 53 74 61 72 74 2c 20 6e 45 6e 64  en, nStart, nEnd
86d0: 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65  , sLineId, sRule
86e0: 49 64 2c 20 62 43 61 73 65 53 76 74 79 2c 20 73  Id, bCaseSvty, s
86f0: 4d 73 67 2c 20 73 55 52 4c 2c 20 62 53 68 6f 77  Msg, sURL, bShow
8700: 52 75 6c 65 49 64 2c 20 73 4f 70 74 69 6f 6e 2c  RuleId, sOption,
8710: 20 62 43 6f 6e 74 65 78 74 29 20 7b 0a 20 20 20   bContext) {.   
8720: 20 20 20 20 20 2f 2f 20 73 75 67 67 65 73 74 69       // suggesti
8730: 6f 6e 73 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ons.        let 
8740: 6c 53 75 67 67 20 3d 20 5b 5d 3b 0a 20 20 20 20  lSugg = [];.    
8750: 20 20 20 20 69 66 20 28 73 53 75 67 67 2e 73 74      if (sSugg.st
8760: 61 72 74 73 57 69 74 68 28 22 3d 22 29 29 20 7b  artsWith("=")) {
8770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 53 75  .            sSu
8780: 67 67 20 3d 20 6f 45 76 61 6c 46 75 6e 63 5b 73  gg = oEvalFunc[s
8790: 53 75 67 67 2e 73 6c 69 63 65 28 31 29 5d 28 74  Sugg.slice(1)](t
87a0: 68 69 73 2e 6c 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  his.lToken, nTok
87b0: 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73 74 54  enOffset, nLastT
87c0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  oken);.         
87d0: 20 20 20 6c 53 75 67 67 20 3d 20 28 73 53 75 67     lSugg = (sSug
87e0: 67 29 20 3f 20 73 53 75 67 67 2e 73 70 6c 69 74  g) ? sSugg.split
87f0: 28 22 7c 22 29 20 3a 20 5b 5d 3b 0a 20 20 20 20  ("|") : [];.    
8800: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
8810: 53 75 67 67 20 3d 3d 20 22 5f 22 29 20 7b 0a 20  Sugg == "_") {. 
8820: 20 20 20 20 20 20 20 20 20 20 20 6c 53 75 67 67             lSugg
8830: 20 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20 7d   = [];.        }
8840: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
8850: 20 20 20 20 6c 53 75 67 67 20 3d 20 74 68 69 73      lSugg = this
8860: 2e 5f 65 78 70 61 6e 64 28 73 53 75 67 67 2c 20  ._expand(sSugg, 
8870: 6e 54 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c  nTokenOffset, nL
8880: 61 73 74 54 6f 6b 65 6e 29 2e 73 70 6c 69 74 28  astToken).split(
8890: 22 7c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  "|");.        }.
88a0: 20 20 20 20 20 20 20 20 69 66 20 28 62 43 61 73          if (bCas
88b0: 65 53 76 74 79 20 26 26 20 6c 53 75 67 67 2e 6c  eSvty && lSugg.l
88c0: 65 6e 67 74 68 20 3e 20 30 20 26 26 20 74 68 69  ength > 0 && thi
88d0: 73 2e 6c 54 6f 6b 65 6e 5b 69 46 69 72 73 74 54  s.lToken[iFirstT
88e0: 6f 6b 65 6e 5d 5b 22 73 56 61 6c 75 65 22 5d 2e  oken]["sValue"].
88f0: 73 6c 69 63 65 28 30 2c 31 29 2e 67 6c 5f 69 73  slice(0,1).gl_is
8900: 55 70 70 65 72 43 61 73 65 28 29 29 20 7b 0a 20  UpperCase()) {. 
8910: 20 20 20 20 20 20 20 20 20 20 20 6c 53 75 67 67             lSugg
8920: 20 3d 20 63 61 70 69 74 61 6c 69 7a 65 41 72 72   = capitalizeArr
8930: 61 79 28 6c 53 75 67 67 29 3b 0a 20 20 20 20 20  ay(lSugg);.     
8940: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f 20     }.        // 
8950: 4d 65 73 73 61 67 65 0a 20 20 20 20 20 20 20 20  Message.        
8960: 6c 65 74 20 73 4d 65 73 73 61 67 65 20 3d 20 28  let sMessage = (
8970: 73 4d 73 67 2e 73 74 61 72 74 73 57 69 74 68 28  sMsg.startsWith(
8980: 22 3d 22 29 29 20 3f 20 6f 45 76 61 6c 46 75 6e  "=")) ? oEvalFun
8990: 63 5b 73 4d 73 67 2e 73 6c 69 63 65 28 31 29 5d  c[sMsg.slice(1)]
89a0: 28 74 68 69 73 2e 6c 54 6f 6b 65 6e 2c 20 6e 54  (this.lToken, nT
89b0: 6f 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73  okenOffset, nLas
89c0: 74 54 6f 6b 65 6e 29 20 3a 20 74 68 69 73 2e 5f  tToken) : this._
89d0: 65 78 70 61 6e 64 28 73 4d 73 67 2c 20 6e 54 6f  expand(sMsg, nTo
89e0: 6b 65 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73 74  kenOffset, nLast
89f0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
8a00: 69 66 20 28 62 53 68 6f 77 52 75 6c 65 49 64 29  if (bShowRuleId)
8a10: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
8a20: 4d 65 73 73 61 67 65 20 2b 3d 20 22 20 23 23 20  Message += " ## 
8a30: 22 20 2b 20 73 4c 69 6e 65 49 64 20 2b 20 22 20  " + sLineId + " 
8a40: 23 20 22 20 2b 20 73 52 75 6c 65 49 64 3b 0a 20  # " + sRuleId;. 
8a50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8a60: 20 2f 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   //.        retu
8a70: 72 6e 20 74 68 69 73 2e 5f 63 72 65 61 74 65 45  rn this._createE
8a80: 72 72 6f 72 28 6e 53 74 61 72 74 2c 20 6e 45 6e  rror(nStart, nEn
8a90: 64 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c  d, sLineId, sRul
8aa0: 65 49 64 2c 20 73 4f 70 74 69 6f 6e 2c 20 73 4d  eId, sOption, sM
8ab0: 65 73 73 61 67 65 2c 20 6c 53 75 67 67 2c 20 73  essage, lSugg, s
8ac0: 55 52 4c 2c 20 62 43 6f 6e 74 65 78 74 29 3b 0a  URL, bContext);.
8ad0: 20 20 20 20 7d 0a 0a 20 20 20 20 5f 63 72 65 61      }..    _crea
8ae0: 74 65 45 72 72 6f 72 20 28 6e 53 74 61 72 74 2c  teError (nStart,
8af0: 20 6e 45 6e 64 2c 20 73 4c 69 6e 65 49 64 2c 20   nEnd, sLineId, 
8b00: 73 52 75 6c 65 49 64 2c 20 73 4f 70 74 69 6f 6e  sRuleId, sOption
8b10: 2c 20 73 4d 65 73 73 61 67 65 2c 20 6c 53 75 67  , sMessage, lSug
8b20: 67 2c 20 73 55 52 4c 2c 20 62 43 6f 6e 74 65 78  g, sURL, bContex
8b30: 74 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74  t) {.        let
8b40: 20 6f 45 72 72 20 3d 20 7b 0a 20 20 20 20 20 20   oErr = {.      
8b50: 20 20 20 20 20 20 22 6e 53 74 61 72 74 22 3a 20        "nStart": 
8b60: 6e 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20  nStart,.        
8b70: 20 20 20 20 22 6e 45 6e 64 22 3a 20 6e 45 6e 64      "nEnd": nEnd
8b80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73  ,.            "s
8b90: 4c 69 6e 65 49 64 22 3a 20 73 4c 69 6e 65 49 64  LineId": sLineId
8ba0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73  ,.            "s
8bb0: 52 75 6c 65 49 64 22 3a 20 73 52 75 6c 65 49 64  RuleId": sRuleId
8bc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73  ,.            "s
8bd0: 54 79 70 65 22 3a 20 73 4f 70 74 69 6f 6e 20 7c  Type": sOption |
8be0: 7c 20 22 6e 6f 74 79 70 65 22 2c 0a 20 20 20 20  | "notype",.    
8bf0: 20 20 20 20 20 20 20 20 22 73 4d 65 73 73 61 67          "sMessag
8c00: 65 22 3a 20 73 4d 65 73 73 61 67 65 2c 0a 20 20  e": sMessage,.  
8c10: 20 20 20 20 20 20 20 20 20 20 22 61 53 75 67 67            "aSugg
8c20: 65 73 74 69 6f 6e 73 22 3a 20 6c 53 75 67 67 2c  estions": lSugg,
8c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 55 52  .            "UR
8c40: 4c 22 3a 20 73 55 52 4c 0a 20 20 20 20 20 20 20  L": sURL.       
8c50: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 62   }.        if (b
8c60: 43 6f 6e 74 65 78 74 29 20 7b 0a 20 20 20 20 20  Context) {.     
8c70: 20 20 20 20 20 20 20 6f 45 72 72 5b 27 73 55 6e         oErr['sUn
8c80: 64 65 72 6c 69 6e 65 64 27 5d 20 3d 20 74 68 69  derlined'] = thi
8c90: 73 2e 73 54 65 78 74 30 2e 73 6c 69 63 65 28 6e  s.sText0.slice(n
8ca0: 53 74 61 72 74 2c 20 6e 45 6e 64 29 3b 0a 20 20  Start, nEnd);.  
8cb0: 20 20 20 20 20 20 20 20 20 20 6f 45 72 72 5b 27            oErr['
8cc0: 73 42 65 66 6f 72 65 27 5d 20 3d 20 74 68 69 73  sBefore'] = this
8cd0: 2e 73 54 65 78 74 30 2e 73 6c 69 63 65 28 4d 61  .sText0.slice(Ma
8ce0: 74 68 2e 6d 61 78 28 30 2c 6e 53 74 61 72 74 2d  th.max(0,nStart-
8cf0: 38 30 29 2c 20 6e 53 74 61 72 74 29 3b 0a 20 20  80), nStart);.  
8d00: 20 20 20 20 20 20 20 20 20 20 6f 45 72 72 5b 27            oErr['
8d10: 73 41 66 74 65 72 27 5d 20 3d 20 74 68 69 73 2e  sAfter'] = this.
8d20: 73 54 65 78 74 30 2e 73 6c 69 63 65 28 6e 45 6e  sText0.slice(nEn
8d30: 64 2c 20 6e 45 6e 64 2b 38 30 29 3b 0a 20 20 20  d, nEnd+80);.   
8d40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
8d50: 65 74 75 72 6e 20 6f 45 72 72 3b 0a 20 20 20 20  eturn oErr;.    
8d60: 7d 0a 0a 20 20 20 20 5f 65 78 70 61 6e 64 20 28  }..    _expand (
8d70: 73 54 65 78 74 2c 20 6e 54 6f 6b 65 6e 4f 66 66  sText, nTokenOff
8d80: 73 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 29  set, nLastToken)
8d90: 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d   {.        let m
8da0: 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20  ;.        while 
8db0: 28 28 6d 20 3d 20 2f 5c 5c 28 2d 3f 5b 30 2d 39  ((m = /\\(-?[0-9
8dc0: 5d 2b 29 2f 2e 65 78 65 63 28 73 54 65 78 74 29  ]+)/.exec(sText)
8dd0: 29 20 21 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20  ) !== null) {.  
8de0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6d 5b            if (m[
8df0: 31 5d 2e 73 6c 69 63 65 28 30 2c 31 29 20 3d 3d  1].slice(0,1) ==
8e00: 20 22 2d 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "-") {.        
8e10: 20 20 20 20 20 20 20 20 73 54 65 78 74 20 3d 20          sText = 
8e20: 73 54 65 78 74 2e 72 65 70 6c 61 63 65 28 6d 5b  sText.replace(m[
8e30: 30 5d 2c 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b  0], this.lToken[
8e40: 6e 4c 61 73 74 54 6f 6b 65 6e 2b 70 61 72 73 65  nLastToken+parse
8e50: 49 6e 74 28 6d 5b 31 5d 2c 31 30 29 2b 31 5d 5b  Int(m[1],10)+1][
8e60: 22 73 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20  "sValue"]);.    
8e70: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
8e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8e90: 20 73 54 65 78 74 20 3d 20 73 54 65 78 74 2e 72   sText = sText.r
8ea0: 65 70 6c 61 63 65 28 6d 5b 30 5d 2c 20 74 68 69  eplace(m[0], thi
8eb0: 73 2e 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 4f  s.lToken[nTokenO
8ec0: 66 66 73 65 74 2b 70 61 72 73 65 49 6e 74 28 6d  ffset+parseInt(m
8ed0: 5b 31 5d 2c 31 30 29 5d 5b 22 73 56 61 6c 75 65  [1],10)]["sValue
8ee0: 22 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  "]);.           
8ef0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8f00: 20 20 20 20 20 72 65 74 75 72 6e 20 73 54 65 78       return sTex
8f10: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65  t;.    }..    re
8f20: 77 72 69 74 65 54 65 78 74 20 28 73 54 65 78 74  writeText (sText
8f30: 2c 20 73 52 65 70 6c 2c 20 69 47 72 6f 75 70 2c  , sRepl, iGroup,
8f40: 20 6d 2c 20 62 55 70 70 65 72 63 61 73 65 29 20   m, bUppercase) 
8f50: 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 74 65 78  {.        // tex
8f60: 74 20 70 72 6f 63 65 73 73 6f 72 3a 20 77 72 69  t processor: wri
8f70: 74 65 20 73 52 65 70 6c 20 69 6e 20 73 54 65 78  te sRepl in sTex
8f80: 74 20 61 74 20 69 47 72 6f 75 70 20 70 6f 73 69  t at iGroup posi
8f90: 74 69 6f 6e 22 0a 20 20 20 20 20 20 20 20 6c 65  tion".        le
8fa0: 74 20 6c 6e 20 3d 20 6d 2e 65 6e 64 5b 69 47 72  t ln = m.end[iGr
8fb0: 6f 75 70 5d 20 2d 20 6d 2e 73 74 61 72 74 5b 69  oup] - m.start[i
8fc0: 47 72 6f 75 70 5d 3b 0a 20 20 20 20 20 20 20 20  Group];.        
8fd0: 6c 65 74 20 73 4e 65 77 20 3d 20 22 22 3b 0a 20  let sNew = "";. 
8fe0: 20 20 20 20 20 20 20 69 66 20 28 73 52 65 70 6c         if (sRepl
8ff0: 20 3d 3d 3d 20 22 2a 22 29 20 7b 0a 20 20 20 20   === "*") {.    
9000: 20 20 20 20 20 20 20 20 73 4e 65 77 20 3d 20 22          sNew = "
9010: 20 22 2e 72 65 70 65 61 74 28 6c 6e 29 3b 0a 20   ".repeat(ln);. 
9020: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9030: 20 65 6c 73 65 20 69 66 20 28 73 52 65 70 6c 20   else if (sRepl 
9040: 3d 3d 3d 20 22 3e 22 20 7c 7c 20 73 52 65 70 6c  === ">" || sRepl
9050: 20 3d 3d 3d 20 22 5f 22 20 7c 7c 20 73 52 65 70   === "_" || sRep
9060: 6c 20 3d 3d 3d 20 22 7e 22 29 20 7b 0a 20 20 20  l === "~") {.   
9070: 20 20 20 20 20 20 20 20 20 73 4e 65 77 20 3d 20           sNew = 
9080: 73 52 65 70 6c 20 2b 20 22 20 22 2e 72 65 70 65  sRepl + " ".repe
9090: 61 74 28 6c 6e 2d 31 29 3b 0a 20 20 20 20 20 20  at(ln-1);.      
90a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65    }.        else
90b0: 20 69 66 20 28 73 52 65 70 6c 20 3d 3d 3d 20 22   if (sRepl === "
90c0: 40 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  @") {.          
90d0: 20 20 73 4e 65 77 20 3d 20 22 40 22 2e 72 65 70    sNew = "@".rep
90e0: 65 61 74 28 6c 6e 29 3b 0a 20 20 20 20 20 20 20  eat(ln);.       
90f0: 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20   }.        else 
9100: 69 66 20 28 73 52 65 70 6c 2e 73 6c 69 63 65 28  if (sRepl.slice(
9110: 30 2c 31 29 20 3d 3d 3d 20 22 3d 22 29 20 7b 0a  0,1) === "=") {.
9120: 20 20 20 20 20 20 20 20 20 20 20 20 73 4e 65 77              sNew
9130: 20 3d 20 6f 45 76 61 6c 46 75 6e 63 5b 73 52 65   = oEvalFunc[sRe
9140: 70 6c 2e 73 6c 69 63 65 28 31 29 5d 28 73 54 65  pl.slice(1)](sTe
9150: 78 74 2c 20 6d 29 3b 0a 20 20 20 20 20 20 20 20  xt, m);.        
9160: 20 20 20 20 73 4e 65 77 20 3d 20 73 4e 65 77 20      sNew = sNew 
9170: 2b 20 22 20 22 2e 72 65 70 65 61 74 28 6c 6e 2d  + " ".repeat(ln-
9180: 73 4e 65 77 2e 6c 65 6e 67 74 68 29 3b 0a 20 20  sNew.length);.  
9190: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62 55            if (bU
91a0: 70 70 65 72 63 61 73 65 20 26 26 20 6d 5b 69 47  ppercase && m[iG
91b0: 72 6f 75 70 5d 2e 73 6c 69 63 65 28 30 2c 31 29  roup].slice(0,1)
91c0: 2e 67 6c 5f 69 73 55 70 70 65 72 43 61 73 65 28  .gl_isUpperCase(
91d0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
91e0: 20 20 20 20 20 73 4e 65 77 20 3d 20 73 4e 65 77       sNew = sNew
91f0: 2e 67 6c 5f 74 6f 43 61 70 69 74 61 6c 69 7a 65  .gl_toCapitalize
9200: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
9210: 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  }.        } else
9220: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
9230: 4e 65 77 20 3d 20 73 52 65 70 6c 2e 67 6c 5f 65  New = sRepl.gl_e
9240: 78 70 61 6e 64 28 6d 29 3b 0a 20 20 20 20 20 20  xpand(m);.      
9250: 20 20 20 20 20 20 73 4e 65 77 20 3d 20 73 4e 65        sNew = sNe
9260: 77 20 2b 20 22 20 22 2e 72 65 70 65 61 74 28 6c  w + " ".repeat(l
9270: 6e 2d 73 4e 65 77 2e 6c 65 6e 67 74 68 29 3b 0a  n-sNew.length);.
9280: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9290: 20 20 2f 2f 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28    //console.log(
92a0: 73 54 65 78 74 2b 22 5c 6e 73 74 61 72 74 3a 20  sText+"\nstart: 
92b0: 22 2b 6d 2e 73 74 61 72 74 5b 69 47 72 6f 75 70  "+m.start[iGroup
92c0: 5d 2b 22 20 65 6e 64 3a 22 2b 6d 2e 65 6e 64 5b  ]+" end:"+m.end[
92d0: 69 47 72 6f 75 70 5d 29 3b 0a 20 20 20 20 20 20  iGroup]);.      
92e0: 20 20 72 65 74 75 72 6e 20 73 54 65 78 74 2e 73    return sText.s
92f0: 6c 69 63 65 28 30 2c 20 6d 2e 73 74 61 72 74 5b  lice(0, m.start[
9300: 69 47 72 6f 75 70 5d 29 20 2b 20 73 4e 65 77 20  iGroup]) + sNew 
9310: 2b 20 73 54 65 78 74 2e 73 6c 69 63 65 28 6d 2e  + sText.slice(m.
9320: 65 6e 64 5b 69 47 72 6f 75 70 5d 29 3b 0a 20 20  end[iGroup]);.  
9330: 20 20 7d 0a 0a 20 20 20 20 5f 74 61 67 41 6e 64    }..    _tagAnd
9340: 50 72 65 70 61 72 65 54 6f 6b 65 6e 46 6f 72 52  PrepareTokenForR
9350: 65 77 72 69 74 69 6e 67 20 28 73 57 68 61 74 2c  ewriting (sWhat,
9360: 20 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 53 74   nTokenRewriteSt
9370: 61 72 74 2c 20 6e 54 6f 6b 65 6e 52 65 77 72 69  art, nTokenRewri
9380: 74 65 45 6e 64 2c 20 6e 54 6f 6b 65 6e 4f 66 66  teEnd, nTokenOff
9390: 73 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 2c  set, nLastToken,
93a0: 20 62 43 61 73 65 53 76 74 79 2c 20 62 44 65 62   bCaseSvty, bDeb
93b0: 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f  ug) {.        //
93c0: 20 74 65 78 74 20 70 72 6f 63 65 73 73 6f 72 3a   text processor:
93d0: 20 72 65 77 72 69 74 65 20 74 6f 6b 65 6e 73 20   rewrite tokens 
93e0: 62 65 74 77 65 65 6e 20 3c 6e 54 6f 6b 65 6e 52  between <nTokenR
93f0: 65 77 72 69 74 65 53 74 61 72 74 3e 20 61 6e 64  ewriteStart> and
9400: 20 3c 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 45   <nTokenRewriteE
9410: 6e 64 3e 20 70 6f 73 69 74 69 6f 6e 0a 20 20 20  nd> position.   
9420: 20 20 20 20 20 69 66 20 28 73 57 68 61 74 20 3d       if (sWhat =
9430: 3d 3d 20 22 2a 22 29 20 7b 0a 20 20 20 20 20 20  == "*") {.      
9440: 20 20 20 20 20 20 2f 2f 20 70 75 72 67 65 20 74        // purge t
9450: 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ext.            
9460: 69 66 20 28 6e 54 6f 6b 65 6e 52 65 77 72 69 74  if (nTokenRewrit
9470: 65 45 6e 64 20 2d 20 6e 54 6f 6b 65 6e 52 65 77  eEnd - nTokenRew
9480: 72 69 74 65 53 74 61 72 74 20 3d 3d 20 30 29 20  riteStart == 0) 
9490: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
94a0: 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 6e 54    this.lToken[nT
94b0: 6f 6b 65 6e 52 65 77 72 69 74 65 53 74 61 72 74  okenRewriteStart
94c0: 5d 5b 22 62 54 6f 52 65 6d 6f 76 65 22 5d 20 3d  ]["bToRemove"] =
94d0: 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20   true;.         
94e0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
9500: 28 6c 65 74 20 69 20 3d 20 6e 54 6f 6b 65 6e 52  (let i = nTokenR
9510: 65 77 72 69 74 65 53 74 61 72 74 3b 20 20 69 20  ewriteStart;  i 
9520: 3c 3d 20 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65  <= nTokenRewrite
9530: 45 6e 64 3b 20 20 69 2b 2b 29 20 7b 0a 20 20 20  End;  i++) {.   
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9550: 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 5b 69 5d 5b   this.lToken[i][
9560: 22 62 54 6f 52 65 6d 6f 76 65 22 5d 20 3d 20 74  "bToRemove"] = t
9570: 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rue;.           
9580: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9590: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
95a0: 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28         else if (
95b0: 73 57 68 61 74 20 3d 3d 3d 20 22 e2 90 a3 22 29  sWhat === "...")
95c0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   {.            /
95d0: 2f 20 6d 65 72 67 65 20 74 6f 6b 65 6e 73 0a 20  / merge tokens. 
95e0: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
95f0: 6c 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 52 65 77  lToken[nTokenRew
9600: 72 69 74 65 53 74 61 72 74 5d 5b 22 6e 4d 65 72  riteStart]["nMer
9610: 67 65 55 6e 74 69 6c 22 5d 20 3d 20 6e 54 6f 6b  geUntil"] = nTok
9620: 65 6e 52 65 77 72 69 74 65 45 6e 64 3b 0a 20 20  enRewriteEnd;.  
9630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9640: 65 6c 73 65 20 69 66 20 28 73 57 68 61 74 20 3d  else if (sWhat =
9650: 3d 3d 20 22 5f 22 29 20 7b 0a 20 20 20 20 20 20  == "_") {.      
9660: 20 20 20 20 20 20 2f 2f 20 6e 65 75 74 72 61 6c        // neutral
9670: 69 7a 65 64 20 74 6f 6b 65 6e 0a 20 20 20 20 20  ized token.     
9680: 20 20 20 20 20 20 20 69 66 20 28 6e 54 6f 6b 65         if (nToke
9690: 6e 52 65 77 72 69 74 65 45 6e 64 20 2d 20 6e 54  nRewriteEnd - nT
96a0: 6f 6b 65 6e 52 65 77 72 69 74 65 53 74 61 72 74  okenRewriteStart
96b0: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20   == 0) {.       
96c0: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6c 54           this.lT
96d0: 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 52 65 77 72 69  oken[nTokenRewri
96e0: 74 65 53 74 61 72 74 5d 5b 22 73 4e 65 77 56 61  teStart]["sNewVa
96f0: 6c 75 65 22 5d 20 3d 20 22 5f 22 3b 0a 20 20 20  lue"] = "_";.   
9700: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
9710: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9720: 20 20 66 6f 72 20 28 6c 65 74 20 69 20 3d 20 6e    for (let i = n
9730: 54 6f 6b 65 6e 52 65 77 72 69 74 65 53 74 61 72  TokenRewriteStar
9740: 74 3b 20 20 69 20 3c 3d 20 6e 54 6f 6b 65 6e 52  t;  i <= nTokenR
9750: 65 77 72 69 74 65 45 6e 64 3b 20 20 69 2b 2b 29  ewriteEnd;  i++)
9760: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
9770: 20 20 20 20 20 20 20 74 68 69 73 2e 6c 54 6f 6b         this.lTok
9780: 65 6e 5b 69 5d 5b 22 73 4e 65 77 56 61 6c 75 65  en[i]["sNewValue
9790: 22 5d 20 3d 20 22 5f 22 3b 0a 20 20 20 20 20 20  "] = "_";.      
97a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
97b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
97c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65    }.        else
97d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
97e0: 66 20 28 73 57 68 61 74 2e 73 74 61 72 74 73 57  f (sWhat.startsW
97f0: 69 74 68 28 22 3d 22 29 29 20 7b 0a 20 20 20 20  ith("=")) {.    
9800: 20 20 20 20 20 20 20 20 20 20 20 20 73 57 68 61              sWha
9810: 74 20 3d 20 6f 45 76 61 6c 46 75 6e 63 5b 73 57  t = oEvalFunc[sW
9820: 68 61 74 2e 73 6c 69 63 65 28 31 29 5d 28 74 68  hat.slice(1)](th
9830: 69 73 2e 6c 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  is.lToken, nToke
9840: 6e 4f 66 66 73 65 74 2c 20 6e 4c 61 73 74 54 6f  nOffset, nLastTo
9850: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ken);.          
9860: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
9870: 20 20 20 20 20 20 20 20 20 20 20 73 57 68 61 74             sWhat
9880: 20 3d 20 74 68 69 73 2e 5f 65 78 70 61 6e 64 28   = this._expand(
9890: 73 57 68 61 74 2c 20 6e 54 6f 6b 65 6e 4f 66 66  sWhat, nTokenOff
98a0: 73 65 74 2c 20 6e 4c 61 73 74 54 6f 6b 65 6e 29  set, nLastToken)
98b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
98d0: 62 55 70 70 65 72 63 61 73 65 20 3d 20 62 43 61  bUppercase = bCa
98e0: 73 65 53 76 74 79 20 26 26 20 74 68 69 73 2e 6c  seSvty && this.l
98f0: 54 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 52 65 77 72  Token[nTokenRewr
9900: 69 74 65 53 74 61 72 74 5d 5b 22 73 56 61 6c 75  iteStart]["sValu
9910: 65 22 5d 2e 73 6c 69 63 65 28 30 2c 31 29 2e 67  e"].slice(0,1).g
9920: 6c 5f 69 73 55 70 70 65 72 43 61 73 65 28 29 3b  l_isUpperCase();
9930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
9940: 28 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 45 6e  (nTokenRewriteEn
9950: 64 20 2d 20 6e 54 6f 6b 65 6e 52 65 77 72 69 74  d - nTokenRewrit
9960: 65 53 74 61 72 74 20 3d 3d 20 30 29 20 7b 0a 20  eStart == 0) {. 
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9980: 2f 20 6f 6e 65 20 74 6f 6b 65 6e 0a 20 20 20 20  / one token.    
9990: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
99a0: 62 55 70 70 65 72 63 61 73 65 29 20 7b 0a 20 20  bUppercase) {.  
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 73 57 68 61 74 20 3d 20 73 57 68 61 74 2e    sWhat = sWhat.
99d0: 67 6c 5f 74 6f 43 61 70 69 74 61 6c 69 7a 65 28  gl_toCapitalize(
99e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
99f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
9a00: 20 20 20 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e       this.lToken
9a10: 5b 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 53 74  [nTokenRewriteSt
9a20: 61 72 74 5d 5b 22 73 4e 65 77 56 61 6c 75 65 22  art]["sNewValue"
9a30: 5d 20 3d 20 73 57 68 61 74 3b 0a 20 20 20 20 20  ] = sWhat;.     
9a40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9a50: 20 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20       else {.    
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73              // s
9a70: 65 76 65 72 61 6c 20 74 6f 6b 65 6e 73 0a 20 20  everal tokens.  
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
9a90: 74 20 6c 54 6f 6b 65 6e 56 61 6c 75 65 20 3d 20  t lTokenValue = 
9aa0: 73 57 68 61 74 2e 73 70 6c 69 74 28 22 7c 22 29  sWhat.split("|")
9ab0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9ac0: 20 20 69 66 20 28 6c 54 6f 6b 65 6e 56 61 6c 75    if (lTokenValu
9ad0: 65 2e 6c 65 6e 67 74 68 20 21 3d 20 28 6e 54 6f  e.length != (nTo
9ae0: 6b 65 6e 52 65 77 72 69 74 65 45 6e 64 20 2d 20  kenRewriteEnd - 
9af0: 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 53 74 61  nTokenRewriteSta
9b00: 72 74 20 2b 20 31 29 29 20 7b 0a 20 20 20 20 20  rt + 1)) {.     
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
9b20: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 45 72 72 6f  onsole.log("Erro
9b30: 72 2e 20 54 65 78 74 20 70 72 6f 63 65 73 73 6f  r. Text processo
9b40: 72 3a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 70  r: number of rep
9b50: 6c 61 63 65 6d 65 6e 74 73 20 21 3d 20 6e 75 6d  lacements != num
9b60: 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 2e 22 29  ber of tokens.")
9b70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9b80: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bb0: 6c 65 74 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20  let j = 0;.     
9bc0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
9bd0: 6c 65 74 20 69 20 3d 20 6e 54 6f 6b 65 6e 52 65  let i = nTokenRe
9be0: 77 72 69 74 65 53 74 61 72 74 3b 20 20 69 20 3c  writeStart;  i <
9bf0: 3d 20 6e 54 6f 6b 65 6e 52 65 77 72 69 74 65 45  = nTokenRewriteE
9c00: 6e 64 3b 20 20 69 2b 2b 29 20 7b 0a 20 20 20 20  nd;  i++) {.    
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c20: 6c 65 74 20 73 56 61 6c 75 65 20 3d 20 6c 54 6f  let sValue = lTo
9c30: 6b 65 6e 56 61 6c 75 65 5b 6a 5d 3b 0a 20 20 20  kenValue[j];.   
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c50: 20 69 66 20 28 21 73 56 61 6c 75 65 20 7c 7c 20   if (!sValue || 
9c60: 73 56 61 6c 75 65 20 3d 3d 3d 20 22 2a 22 29 20  sValue === "*") 
9c70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9c80: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6c            this.l
9c90: 54 6f 6b 65 6e 5b 69 5d 5b 22 62 54 6f 52 65 6d  Token[i]["bToRem
9ca0: 6f 76 65 22 5d 20 3d 20 74 72 75 65 3b 0a 20 20  ove"] = true;.  
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cc0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 20 20 20 69 66 20 28 62 55 70 70 65 72 63 61 73     if (bUppercas
9cf0: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 73 56 61 6c 75 65 20 3d 20 73 56 61 6c 75 65   sValue = sValue
9d20: 2e 67 6c 5f 74 6f 43 61 70 69 74 61 6c 69 7a 65  .gl_toCapitalize
9d30: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 20 20 20 20 74 68 69 73 2e 6c 54 6f 6b 65        this.lToke
9d70: 6e 5b 69 5d 5b 22 73 4e 65 77 56 61 6c 75 65 22  n[i]["sNewValue"
9d80: 5d 20 3d 20 73 56 61 6c 75 65 3b 0a 20 20 20 20  ] = sValue;.    
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9da0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
9db0: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
9dc0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9dd0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9de0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
9df0: 72 65 77 72 69 74 65 46 72 6f 6d 54 61 67 73 20  rewriteFromTags 
9e00: 28 62 44 65 62 75 67 3d 66 61 6c 73 65 29 20 7b  (bDebug=false) {
9e10: 0a 20 20 20 20 20 20 20 20 2f 2f 20 72 65 77 72  .        // rewr
9e20: 69 74 65 20 74 68 65 20 73 65 6e 74 65 6e 63 65  ite the sentence
9e30: 2c 20 6d 6f 64 69 66 79 20 74 6f 6b 65 6e 73 2c  , modify tokens,
9e40: 20 70 75 72 67 65 20 74 68 65 20 74 6f 6b 65 6e   purge the token
9e50: 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20 69 66   list.        if
9e60: 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20   (bDebug) {.    
9e70: 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e          console.
9e80: 6c 6f 67 28 22 52 45 57 52 49 54 45 22 29 3b 0a  log("REWRITE");.
9e90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9ea0: 20 20 6c 65 74 20 6c 4e 65 77 54 6f 6b 65 6e 20    let lNewToken 
9eb0: 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20 6c 65  = [];.        le
9ec0: 74 20 6e 4d 65 72 67 65 55 6e 74 69 6c 20 3d 20  t nMergeUntil = 
9ed0: 30 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 64  0;.        let d
9ee0: 54 6f 6b 65 6e 4d 65 72 67 65 72 20 3d 20 6e 75  TokenMerger = nu
9ef0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20  ll;.        for 
9f00: 28 6c 65 74 20 5b 69 54 6f 6b 65 6e 2c 20 64 54  (let [iToken, dT
9f10: 6f 6b 65 6e 5d 20 6f 66 20 74 68 69 73 2e 6c 54  oken] of this.lT
9f20: 6f 6b 65 6e 2e 65 6e 74 72 69 65 73 28 29 29 20  oken.entries()) 
9f30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  {.            le
9f40: 74 20 62 4b 65 65 70 54 6f 6b 65 6e 20 3d 20 74  t bKeepToken = t
9f50: 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rue;.           
9f60: 20 69 66 20 28 64 54 6f 6b 65 6e 5b 22 73 54 79   if (dToken["sTy
9f70: 70 65 22 5d 20 21 3d 20 22 49 4e 46 4f 22 29 20  pe"] != "INFO") 
9f80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9f90: 20 20 69 66 20 28 6e 4d 65 72 67 65 55 6e 74 69    if (nMergeUnti
9fa0: 6c 20 26 26 20 69 54 6f 6b 65 6e 20 3c 3d 20 6e  l && iToken <= n
9fb0: 4d 65 72 67 65 55 6e 74 69 6c 29 20 7b 0a 20 20  MergeUntil) {.  
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 64 54 6f 6b 65 6e 4d 65 72 67 65 72 5b 22    dTokenMerger["
9fe0: 73 56 61 6c 75 65 22 5d 20 2b 3d 20 22 20 22 2e  sValue"] += " ".
9ff0: 72 65 70 65 61 74 28 64 54 6f 6b 65 6e 5b 22 6e  repeat(dToken["n
a000: 53 74 61 72 74 22 5d 20 2d 20 64 54 6f 6b 65 6e  Start"] - dToken
a010: 4d 65 72 67 65 72 5b 22 6e 45 6e 64 22 5d 29 20  Merger["nEnd"]) 
a020: 2b 20 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65  + dToken["sValue
a030: 22 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  "];.            
a040: 20 20 20 20 20 20 20 20 64 54 6f 6b 65 6e 4d 65          dTokenMe
a050: 72 67 65 72 5b 22 6e 45 6e 64 22 5d 20 3d 20 64  rger["nEnd"] = d
a060: 54 6f 6b 65 6e 5b 22 6e 45 6e 64 22 5d 3b 0a 20  Token["nEnd"];. 
a070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a080: 20 20 20 69 66 20 28 62 44 65 62 75 67 29 20 7b     if (bDebug) {
a090: 0a 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 63 6f 6e 73 6f 6c 65           console
a0b0: 2e 6c 6f 67 28 22 20 20 4d 45 52 47 45 44 20 54  .log("  MERGED T
a0c0: 4f 4b 45 4e 3a 20 22 20 2b 20 64 54 6f 6b 65 6e  OKEN: " + dToken
a0d0: 4d 65 72 67 65 72 5b 22 73 56 61 6c 75 65 22 5d  Merger["sValue"]
a0e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
a0f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 4b 65               bKe
a110: 65 70 54 6f 6b 65 6e 20 3d 20 66 61 6c 73 65 3b  epToken = false;
a120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a130: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
a140: 20 20 20 69 66 20 28 64 54 6f 6b 65 6e 2e 68 61     if (dToken.ha
a150: 73 4f 77 6e 50 72 6f 70 65 72 74 79 28 22 6e 4d  sOwnProperty("nM
a160: 65 72 67 65 55 6e 74 69 6c 22 29 29 20 7b 0a 20  ergeUntil")) {. 
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 20 20 20 69 66 20 28 69 54 6f 6b 65 6e 20 3e 20     if (iToken > 
a190: 6e 4d 65 72 67 65 55 6e 74 69 6c 29 20 7b 20 2f  nMergeUntil) { /
a1a0: 2f 20 74 68 69 73 20 74 6f 6b 65 6e 20 69 73 20  / this token is 
a1b0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 6d 65 72 67  not already merg
a1c0: 65 64 20 77 69 74 68 20 61 20 70 72 65 76 69 6f  ed with a previo
a1d0: 75 73 20 74 6f 6b 65 6e 0a 20 20 20 20 20 20 20  us token.       
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1f0: 20 64 54 6f 6b 65 6e 4d 65 72 67 65 72 20 3d 20   dTokenMerger = 
a200: 64 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  dToken;.        
a210: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a230: 20 20 69 66 20 28 64 54 6f 6b 65 6e 5b 22 6e 4d    if (dToken["nM
a240: 65 72 67 65 55 6e 74 69 6c 22 5d 20 3e 20 6e 4d  ergeUntil"] > nM
a250: 65 72 67 65 55 6e 74 69 6c 29 20 7b 0a 20 20 20  ergeUntil) {.   
a260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a270: 20 20 20 20 20 6e 4d 65 72 67 65 55 6e 74 69 6c       nMergeUntil
a280: 20 3d 20 64 54 6f 6b 65 6e 5b 22 6e 4d 65 72 67   = dToken["nMerg
a290: 65 55 6e 74 69 6c 22 5d 3b 0a 20 20 20 20 20 20  eUntil"];.      
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2c0: 20 20 20 20 64 65 6c 65 74 65 20 64 54 6f 6b 65      delete dToke
a2d0: 6e 5b 22 6e 4d 65 72 67 65 55 6e 74 69 6c 22 5d  n["nMergeUntil"]
a2e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a2f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
a300: 20 20 20 20 65 6c 73 65 20 69 66 20 28 64 54 6f      else if (dTo
a310: 6b 65 6e 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72  ken.hasOwnProper
a320: 74 79 28 22 62 54 6f 52 65 6d 6f 76 65 22 29 29  ty("bToRemove"))
a330: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
a340: 20 20 20 20 20 20 20 69 66 20 28 62 44 65 62 75         if (bDebu
a350: 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g) {.           
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
a370: 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 52 45 4d 4f  sole.log("  REMO
a380: 56 45 44 3a 20 22 20 2b 20 64 54 6f 6b 65 6e 5b  VED: " + dToken[
a390: 22 73 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20  "sValue"]);.    
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
a3c0: 20 20 20 20 20 20 74 68 69 73 2e 73 53 65 6e 74        this.sSent
a3d0: 65 6e 63 65 20 3d 20 74 68 69 73 2e 73 53 65 6e  ence = this.sSen
a3e0: 74 65 6e 63 65 2e 73 6c 69 63 65 28 30 2c 20 64  tence.slice(0, d
a3f0: 54 6f 6b 65 6e 5b 22 6e 53 74 61 72 74 22 5d 29  Token["nStart"])
a400: 20 2b 20 22 20 22 2e 72 65 70 65 61 74 28 64 54   + " ".repeat(dT
a410: 6f 6b 65 6e 5b 22 6e 45 6e 64 22 5d 20 2d 20 64  oken["nEnd"] - d
a420: 54 6f 6b 65 6e 5b 22 6e 53 74 61 72 74 22 5d 29  Token["nStart"])
a430: 20 2b 20 74 68 69 73 2e 73 53 65 6e 74 65 6e 63   + this.sSentenc
a440: 65 2e 73 6c 69 63 65 28 64 54 6f 6b 65 6e 5b 22  e.slice(dToken["
a450: 6e 45 6e 64 22 5d 29 3b 0a 20 20 20 20 20 20 20  nEnd"]);.       
a460: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 4b 65               bKe
a470: 65 70 54 6f 6b 65 6e 20 3d 20 66 61 6c 73 65 3b  epToken = false;
a480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a490: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
a4a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0a  .            //.
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
a4c0: 62 4b 65 65 70 54 6f 6b 65 6e 29 20 7b 0a 20 20  bKeepToken) {.  
a4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 4e                lN
a4e0: 65 77 54 6f 6b 65 6e 2e 70 75 73 68 28 64 54 6f  ewToken.push(dTo
a4f0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ken);.          
a500: 20 20 20 20 20 20 69 66 20 28 64 54 6f 6b 65 6e        if (dToken
a510: 2e 68 61 73 4f 77 6e 50 72 6f 70 65 72 74 79 28  .hasOwnProperty(
a520: 22 73 4e 65 77 56 61 6c 75 65 22 29 29 20 7b 0a  "sNewValue")) {.
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 20 20 20 20 2f 2f 20 72 65 77 72 69 74 65 20 74      // rewrite t
a550: 6f 6b 65 6e 20 61 6e 64 20 73 65 6e 74 65 6e 63  oken and sentenc
a560: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
a570: 20 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67        if (bDebug
a580: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
a590: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
a5a0: 6f 6c 65 2e 6c 6f 67 28 64 54 6f 6b 65 6e 5b 22  ole.log(dToken["
a5b0: 73 56 61 6c 75 65 22 5d 20 2b 20 22 20 2d 3e 20  sValue"] + " -> 
a5c0: 22 20 2b 20 64 54 6f 6b 65 6e 5b 22 73 4e 65 77  " + dToken["sNew
a5d0: 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20 20 20  Value"]);.      
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a600: 20 20 20 20 64 54 6f 6b 65 6e 5b 22 73 52 65 61      dToken["sRea
a610: 6c 56 61 6c 75 65 22 5d 20 3d 20 64 54 6f 6b 65  lValue"] = dToke
a620: 6e 5b 22 73 56 61 6c 75 65 22 5d 3b 0a 20 20 20  n["sValue"];.   
a630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a640: 20 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22   dToken["sValue"
a650: 5d 20 3d 20 64 54 6f 6b 65 6e 5b 22 73 4e 65 77  ] = dToken["sNew
a660: 56 61 6c 75 65 22 5d 3b 0a 20 20 20 20 20 20 20  Value"];.       
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
a680: 20 6e 44 69 66 66 4c 65 6e 20 3d 20 64 54 6f 6b   nDiffLen = dTok
a690: 65 6e 5b 22 73 52 65 61 6c 56 61 6c 75 65 22 5d  en["sRealValue"]
a6a0: 2e 6c 65 6e 67 74 68 20 2d 20 64 54 6f 6b 65 6e  .length - dToken
a6b0: 5b 22 73 4e 65 77 56 61 6c 75 65 22 5d 2e 6c 65  ["sNewValue"].le
a6c0: 6e 67 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20  ngth;.          
a6d0: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 73 4e            let sN
a6e0: 65 77 52 65 70 6c 20 3d 20 28 6e 44 69 66 66 4c  ewRepl = (nDiffL
a6f0: 65 6e 20 3e 3d 20 30 29 20 3f 20 64 54 6f 6b 65  en >= 0) ? dToke
a700: 6e 5b 22 73 4e 65 77 56 61 6c 75 65 22 5d 20 2b  n["sNewValue"] +
a710: 20 22 20 22 2e 72 65 70 65 61 74 28 6e 44 69 66   " ".repeat(nDif
a720: 66 4c 65 6e 29 20 3a 20 64 54 6f 6b 65 6e 5b 22  fLen) : dToken["
a730: 73 4e 65 77 56 61 6c 75 65 22 5d 2e 73 6c 69 63  sNewValue"].slic
a740: 65 28 30 2c 20 64 54 6f 6b 65 6e 5b 22 73 52 65  e(0, dToken["sRe
a750: 61 6c 56 61 6c 75 65 22 5d 2e 6c 65 6e 67 74 68  alValue"].length
a760: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
a770: 20 20 20 20 20 20 20 74 68 69 73 2e 73 53 65 6e         this.sSen
a780: 74 65 6e 63 65 20 3d 20 74 68 69 73 2e 73 53 65  tence = this.sSe
a790: 6e 74 65 6e 63 65 2e 73 6c 69 63 65 28 30 2c 64  ntence.slice(0,d
a7a0: 54 6f 6b 65 6e 5b 22 6e 53 74 61 72 74 22 5d 29  Token["nStart"])
a7b0: 20 2b 20 73 4e 65 77 52 65 70 6c 20 2b 20 74 68   + sNewRepl + th
a7c0: 69 73 2e 73 53 65 6e 74 65 6e 63 65 2e 73 6c 69  is.sSentence.sli
a7d0: 63 65 28 64 54 6f 6b 65 6e 5b 22 6e 45 6e 64 22  ce(dToken["nEnd"
a7e0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
a7f0: 20 20 20 20 20 20 20 20 64 65 6c 65 74 65 20 64          delete d
a800: 54 6f 6b 65 6e 5b 22 73 4e 65 77 56 61 6c 75 65  Token["sNewValue
a810: 22 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  "];.            
a820: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a830: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
a840: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
a850: 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20         try {.   
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a870: 20 74 68 69 73 2e 64 54 6f 6b 65 6e 50 6f 73 2e   this.dTokenPos.
a880: 64 65 6c 65 74 65 28 64 54 6f 6b 65 6e 5b 22 6e  delete(dToken["n
a890: 53 74 61 72 74 22 5d 29 3b 0a 20 20 20 20 20 20  Start"]);.      
a8a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
a8c0: 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20  h (e) {.        
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
a8e0: 6f 6c 65 2e 6c 6f 67 28 74 68 69 73 2e 61 73 53  ole.log(this.asS
a8f0: 74 72 69 6e 67 28 29 29 3b 0a 20 20 20 20 20 20  tring());.      
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
a910: 6e 73 6f 6c 65 2e 6c 6f 67 28 64 54 6f 6b 65 6e  nsole.log(dToken
a920: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
a930: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
a940: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
a950: 20 20 20 20 20 69 66 20 28 62 44 65 62 75 67 29       if (bDebug)
a960: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   {.            c
a970: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 20 20 54 45  onsole.log("  TE
a980: 58 54 20 52 45 57 52 49 54 45 44 3a 20 22 20 2b  XT REWRITED: " +
a990: 20 74 68 69 73 2e 73 53 65 6e 74 65 6e 63 65 29   this.sSentence)
a9a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a9b0: 20 20 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 2e      this.lToken.
a9c0: 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 20 20  length = 0;.    
a9d0: 20 20 20 20 74 68 69 73 2e 6c 54 6f 6b 65 6e 20      this.lToken 
a9e0: 3d 20 6c 4e 65 77 54 6f 6b 65 6e 3b 0a 20 20 20  = lNewToken;.   
a9f0: 20 7d 0a 7d 3b 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f   }.};...////////
aa00: 20 43 6f 6d 6d 6f 6e 20 66 75 6e 63 74 69 6f 6e   Common function
aa10: 73 0a 0a 66 75 6e 63 74 69 6f 6e 20 6f 70 74 69  s..function opti
aa20: 6f 6e 20 28 73 4f 70 74 29 20 7b 0a 20 20 20 20  on (sOpt) {.    
aa30: 2f 2f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  // return true i
aa40: 66 20 6f 70 74 69 6f 6e 20 73 4f 70 74 20 69 73  f option sOpt is
aa50: 20 61 63 74 69 76 65 0a 20 20 20 20 72 65 74 75   active.    retu
aa60: 72 6e 20 5f 64 4f 70 74 69 6f 6e 73 2e 67 65 74  rn _dOptions.get
aa70: 28 73 4f 70 74 29 3b 0a 7d 0a 0a 76 61 72 20 72  (sOpt);.}..var r
aa80: 65 20 3d 20 7b 0a 20 20 20 20 73 65 61 72 63 68  e = {.    search
aa90: 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73 52 65 67  : function (sReg
aaa0: 65 78 2c 20 73 54 65 78 74 29 20 7b 0a 20 20 20  ex, sText) {.   
aab0: 20 20 20 20 20 69 66 20 28 73 52 65 67 65 78 2e       if (sRegex.
aac0: 73 74 61 72 74 73 57 69 74 68 28 22 28 3f 69 29  startsWith("(?i)
aad0: 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ")) {.          
aae0: 20 20 72 65 74 75 72 6e 20 73 54 65 78 74 2e 73    return sText.s
aaf0: 65 61 72 63 68 28 6e 65 77 20 52 65 67 45 78 70  earch(new RegExp
ab00: 28 73 52 65 67 65 78 2e 73 6c 69 63 65 28 34 29  (sRegex.slice(4)
ab10: 2c 20 22 69 22 29 29 20 21 3d 3d 20 2d 31 3b 0a  , "i")) !== -1;.
ab20: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
ab30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
ab40: 75 72 6e 20 73 54 65 78 74 2e 73 65 61 72 63 68  urn sText.search
ab50: 28 73 52 65 67 65 78 29 20 21 3d 3d 20 2d 31 3b  (sRegex) !== -1;
ab60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
ab70: 2c 0a 0a 20 20 20 20 63 72 65 61 74 65 52 65 67  ,..    createReg
ab80: 45 78 70 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73  Exp: function (s
ab90: 52 65 67 65 78 29 20 7b 0a 20 20 20 20 20 20 20  Regex) {.       
aba0: 20 69 66 20 28 73 52 65 67 65 78 2e 73 74 61 72   if (sRegex.star
abb0: 74 73 57 69 74 68 28 22 28 3f 69 29 22 29 29 20  tsWith("(?i)")) 
abc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
abd0: 74 75 72 6e 20 6e 65 77 20 52 65 67 45 78 70 28  turn new RegExp(
abe0: 73 52 65 67 65 78 2e 73 6c 69 63 65 28 34 29 2c  sRegex.slice(4),
abf0: 20 22 69 22 29 3b 0a 20 20 20 20 20 20 20 20 7d   "i");.        }
ac00: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
ac10: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 77 20 52      return new R
ac20: 65 67 45 78 70 28 73 52 65 67 65 78 29 3b 0a 20  egExp(sRegex);. 
ac30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d         }.    }.}
ac40: 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 20 66 75 6e 63  ...//////// func
ac50: 74 69 6f 6e 73 20 74 6f 20 67 65 74 20 74 65 78  tions to get tex
ac60: 74 20 6f 75 74 73 69 64 65 20 70 61 74 74 65 72  t outside patter
ac70: 6e 20 73 63 6f 70 65 0a 0a 2f 2f 20 77 61 72 6e  n scope..// warn
ac80: 69 6e 67 3a 20 63 68 65 63 6b 20 63 6f 6d 70 69  ing: check compi
ac90: 6c 65 5f 72 75 6c 65 73 2e 70 79 20 74 6f 20 75  le_rules.py to u
aca0: 6e 64 65 72 73 74 61 6e 64 20 68 6f 77 20 69 74  nderstand how it
acb0: 20 77 6f 72 6b 73 0a 0a 66 75 6e 63 74 69 6f 6e   works..function
acc0: 20 6e 65 78 74 77 6f 72 64 20 28 73 2c 20 69 53   nextword (s, iS
acd0: 74 61 72 74 2c 20 6e 29 20 7b 0a 20 20 20 20 2f  tart, n) {.    /
ace0: 2f 20 67 65 74 20 74 68 65 20 6e 74 68 20 77 6f  / get the nth wo
acf0: 72 64 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  rd of the input 
ad00: 73 74 72 69 6e 67 20 6f 72 20 65 6d 70 74 79 20  string or empty 
ad10: 73 74 72 69 6e 67 0a 20 20 20 20 6c 65 74 20 7a  string.    let z
ad20: 20 3d 20 6e 65 77 20 52 65 67 45 78 70 28 22 5e   = new RegExp("^
ad30: 28 3f 3a 20 2b 5b 61 2d 7a c3 a0 2d c3 b6 41 2d  (?: +[a-z..-..A-
ad40: 5a c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39 c3 98  Z..-....-..0-9..
ad50: 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac 86 e1  -....-.....-....
ad60: b4 80 2d e1 b6 bf 25 5f 2d 5d 2b 29 7b 22 20 2b  ..-...%_-]+){" +
ad70: 20 28 6e 2d 31 29 2e 74 6f 53 74 72 69 6e 67 28   (n-1).toString(
ad80: 29 20 2b 20 22 7d 20 2b 28 5b 61 2d 7a c3 a0 2d  ) + "} +([a-z..-
ad90: c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3 96 30  ..A-Z..-....-..0
ada0: 2d 39 c3 98 2d c3 9f c4 80 2d ca af ef ac 81 2d  -9..-....-.....-
adb0: ef ac 86 e1 b4 80 2d e1 b6 bf 25 5f 2d 5d 2b 29  ......-...%_-]+)
adc0: 22 2c 20 22 69 67 22 29 3b 0a 20 20 20 20 6c 65  ", "ig");.    le
add0: 74 20 6d 20 3d 20 7a 2e 65 78 65 63 28 73 2e 73  t m = z.exec(s.s
ade0: 6c 69 63 65 28 69 53 74 61 72 74 29 29 3b 0a 20  lice(iStart));. 
adf0: 20 20 20 69 66 20 28 21 6d 29 20 7b 0a 20 20 20     if (!m) {.   
ae00: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c       return null
ae10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
ae20: 72 6e 20 5b 69 53 74 61 72 74 20 2b 20 7a 2e 6c  rn [iStart + z.l
ae30: 61 73 74 49 6e 64 65 78 20 2d 20 6d 5b 31 5d 2e  astIndex - m[1].
ae40: 6c 65 6e 67 74 68 2c 20 6d 5b 31 5d 5d 3b 0a 7d  length, m[1]];.}
ae50: 0a 0a 66 75 6e 63 74 69 6f 6e 20 70 72 65 76 77  ..function prevw
ae60: 6f 72 64 20 28 73 2c 20 69 45 6e 64 2c 20 6e 29  ord (s, iEnd, n)
ae70: 20 7b 0a 20 20 20 20 2f 2f 20 67 65 74 20 74 68   {.    // get th
ae80: 65 20 28 2d 29 6e 74 68 20 77 6f 72 64 20 6f 66  e (-)nth word of
ae90: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
aea0: 67 20 6f 72 20 65 6d 70 74 79 20 73 74 72 69 6e  g or empty strin
aeb0: 67 0a 20 20 20 20 6c 65 74 20 7a 20 3d 20 6e 65  g.    let z = ne
aec0: 77 20 52 65 67 45 78 70 28 22 28 5b 61 2d 7a c3  w RegExp("([a-z.
aed0: a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3  .-..A-Z..-....-.
aee0: 96 30 2d 39 c3 98 2d c3 9f c4 80 2d ca af ef ac  .0-9..-....-....
aef0: 81 2d ef ac 86 e1 b4 80 2d e1 b6 bf 25 5f 2d 5d  .-......-...%_-]
af00: 2b 29 20 2b 28 3f 3a 5b 61 2d 7a c3 a0 2d c3 b6  +) +(?:[a-z..-..
af10: 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39  A-Z..-....-..0-9
af20: c3 98 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac  ..-....-.....-..
af30: 86 e1 b4 80 2d e1 b6 bf 25 5f 2d 5d 2b 20 2b 29  ....-...%_-]+ +)
af40: 7b 22 20 2b 20 28 6e 2d 31 29 2e 74 6f 53 74 72  {" + (n-1).toStr
af50: 69 6e 67 28 29 20 2b 20 22 7d 24 22 2c 20 22 69  ing() + "}$", "i
af60: 22 29 3b 0a 20 20 20 20 6c 65 74 20 6d 20 3d 20  ");.    let m = 
af70: 7a 2e 65 78 65 63 28 73 2e 73 6c 69 63 65 28 30  z.exec(s.slice(0
af80: 2c 20 69 45 6e 64 29 29 3b 0a 20 20 20 20 69 66  , iEnd));.    if
af90: 20 28 21 6d 29 20 7b 0a 20 20 20 20 20 20 20 20   (!m) {.        
afa0: 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20  return null;.   
afb0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 6d   }.    return [m
afc0: 2e 69 6e 64 65 78 2c 20 6d 5b 31 5d 5d 3b 0a 7d  .index, m[1]];.}
afd0: 0a 0a 66 75 6e 63 74 69 6f 6e 20 6e 65 78 74 77  ..function nextw
afe0: 6f 72 64 31 20 28 73 2c 20 69 53 74 61 72 74 29  ord1 (s, iStart)
aff0: 20 7b 0a 20 20 20 20 2f 2f 20 67 65 74 20 6e 65   {.    // get ne
b000: 78 74 20 77 6f 72 64 20 28 6f 70 74 69 6d 69 7a  xt word (optimiz
b010: 61 74 69 6f 6e 29 0a 20 20 20 20 6c 65 74 20 5f  ation).    let _
b020: 7a 4e 65 78 74 57 6f 72 64 20 3d 20 6e 65 77 20  zNextWord = new 
b030: 52 65 67 45 78 70 20 28 22 5e 20 2b 28 5b 61 2d  RegExp ("^ +([a-
b040: 7a c3 a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80  z..-..A-Z..-....
b050: 2d c3 96 30 2d 39 c3 98 2d c3 9f c4 80 2d ca af  -..0-9..-....-..
b060: ef ac 81 2d ef ac 86 e1 b4 80 2d e1 b6 bf 5f 5d  ...-......-..._]
b070: 5b 61 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8 2d c3  [a-z..-..A-Z..-.
b080: bf c3 80 2d c3 96 30 2d 39 c3 98 2d c3 9f c4 80  ...-..0-9..-....
b090: 2d ca af ef ac 81 2d ef ac 86 e1 b4 80 2d e1 b6  -.....-......-..
b0a0: bf 5f 2d 5d 2a 29 22 2c 20 22 69 67 22 29 3b 0a  ._-]*)", "ig");.
b0b0: 20 20 20 20 6c 65 74 20 6d 20 3d 20 5f 7a 4e 65      let m = _zNe
b0c0: 78 74 57 6f 72 64 2e 65 78 65 63 28 73 2e 73 6c  xtWord.exec(s.sl
b0d0: 69 63 65 28 69 53 74 61 72 74 29 29 3b 0a 20 20  ice(iStart));.  
b0e0: 20 20 69 66 20 28 21 6d 29 20 7b 0a 20 20 20 20    if (!m) {.    
b0f0: 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b      return null;
b100: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
b110: 6e 20 5b 69 53 74 61 72 74 20 2b 20 5f 7a 4e 65  n [iStart + _zNe
b120: 78 74 57 6f 72 64 2e 6c 61 73 74 49 6e 64 65 78  xtWord.lastIndex
b130: 20 2d 20 6d 5b 31 5d 2e 6c 65 6e 67 74 68 2c 20   - m[1].length, 
b140: 6d 5b 31 5d 5d 3b 0a 7d 0a 0a 63 6f 6e 73 74 20  m[1]];.}..const 
b150: 5f 7a 50 72 65 76 57 6f 72 64 20 3d 20 6e 65 77  _zPrevWord = new
b160: 20 52 65 67 45 78 70 20 28 22 28 5b 61 2d 7a c3   RegExp ("([a-z.
b170: a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3  .-..A-Z..-....-.
b180: 96 30 2d 39 c3 98 2d c3 9f c4 80 2d ca af ef ac  .0-9..-....-....
b190: 81 2d ef ac 86 e1 b4 80 2d e1 b6 bf 5f 5d 5b 61  .-......-..._][a
b1a0: 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf c3  -z..-..A-Z..-...
b1b0: 80 2d c3 96 30 2d 39 c3 98 2d c3 9f c4 80 2d ca  .-..0-9..-....-.
b1c0: af ef ac 81 2d ef ac 86 e1 b4 80 2d e1 b6 bf 5f  ....-......-..._
b1d0: 2d 5d 2a 29 20 2b 24 22 2c 20 22 69 22 29 3b 0a  -]*) +$", "i");.
b1e0: 0a 66 75 6e 63 74 69 6f 6e 20 70 72 65 76 77 6f  .function prevwo
b1f0: 72 64 31 20 28 73 2c 20 69 45 6e 64 29 20 7b 0a  rd1 (s, iEnd) {.
b200: 20 20 20 20 2f 2f 20 67 65 74 20 70 72 65 76 69      // get previ
b210: 6f 75 73 20 77 6f 72 64 20 28 6f 70 74 69 6d 69  ous word (optimi
b220: 7a 61 74 69 6f 6e 29 0a 20 20 20 20 6c 65 74 20  zation).    let 
b230: 6d 20 3d 20 5f 7a 50 72 65 76 57 6f 72 64 2e 65  m = _zPrevWord.e
b240: 78 65 63 28 73 2e 73 6c 69 63 65 28 30 2c 20 69  xec(s.slice(0, i
b250: 45 6e 64 29 29 3b 0a 20 20 20 20 69 66 20 28 21  End));.    if (!
b260: 6d 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m) {.        ret
b270: 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a  urn null;.    }.
b280: 20 20 20 20 72 65 74 75 72 6e 20 5b 6d 2e 69 6e      return [m.in
b290: 64 65 78 2c 20 6d 5b 31 5d 5d 3b 0a 7d 0a 0a 66  dex, m[1]];.}..f
b2a0: 75 6e 63 74 69 6f 6e 20 6c 6f 6f 6b 20 28 73 2c  unction look (s,
b2b0: 20 73 50 61 74 74 65 72 6e 2c 20 73 4e 65 67 50   sPattern, sNegP
b2c0: 61 74 74 65 72 6e 3d 6e 75 6c 6c 29 20 7b 0a 20  attern=null) {. 
b2d0: 20 20 20 2f 2f 20 73 65 65 6b 20 73 50 61 74 74     // seek sPatt
b2e0: 65 72 6e 20 69 6e 20 73 20 28 62 65 66 6f 72 65  ern in s (before
b2f0: 2f 61 66 74 65 72 2f 66 75 6c 6c 74 65 78 74 29  /after/fulltext)
b300: 2c 20 69 66 20 61 6e 74 69 70 61 74 74 65 72 6e  , if antipattern
b310: 20 73 4e 65 67 50 61 74 74 65 72 6e 20 6e 6f 74   sNegPattern not
b320: 20 69 6e 20 73 0a 20 20 20 20 74 72 79 20 7b 0a   in s.    try {.
b330: 20 20 20 20 20 20 20 20 69 66 20 28 73 4e 65 67          if (sNeg
b340: 50 61 74 74 65 72 6e 20 26 26 20 72 65 2e 73 65  Pattern && re.se
b350: 61 72 63 68 28 73 4e 65 67 50 61 74 74 65 72 6e  arch(sNegPattern
b360: 2c 20 73 29 29 20 7b 0a 20 20 20 20 20 20 20 20  , s)) {.        
b370: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
b380: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b390: 20 20 20 20 72 65 74 75 72 6e 20 72 65 2e 73 65      return re.se
b3a0: 61 72 63 68 28 73 50 61 74 74 65 72 6e 2c 20 73  arch(sPattern, s
b3b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 74  );.    }.    cat
b3c0: 63 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20  ch (e) {.       
b3d0: 20 63 6f 6e 73 6f 6c 65 2e 65 72 72 6f 72 28 65   console.error(e
b3e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
b3f0: 75 72 6e 20 66 61 6c 73 65 3b 0a 7d 0a 0a 0a 2f  urn false;.}.../
b400: 2f 2f 2f 2f 2f 2f 2f 20 41 6e 61 6c 79 73 65 20  /////// Analyse 
b410: 67 72 6f 75 70 73 20 66 6f 72 20 72 65 67 65 78  groups for regex
b420: 20 72 75 6c 65 73 0a 0a 66 75 6e 63 74 69 6f 6e   rules..function
b430: 20 64 69 73 70 6c 61 79 49 6e 66 6f 20 28 64 54   displayInfo (dT
b440: 6f 6b 65 6e 50 6f 73 2c 20 61 57 6f 72 64 29 20  okenPos, aWord) 
b450: 7b 0a 20 20 20 20 2f 2f 20 66 6f 72 20 64 65 62  {.    // for deb
b460: 75 67 67 69 6e 67 3a 20 69 6e 66 6f 20 6f 66 20  ugging: info of 
b470: 77 6f 72 64 0a 20 20 20 20 69 66 20 28 21 61 57  word.    if (!aW
b480: 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20 63  ord) {.        c
b490: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 3e 20 6e 6f  onsole.log("> no
b4a0: 74 68 69 6e 67 20 74 6f 20 66 69 6e 64 22 29 3b  thing to find");
b4b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b4c0: 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  true;.    }.    
b4d0: 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20 5f 6f 53  let lMorph = _oS
b4e0: 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74 4d  pellChecker.getM
b4f0: 6f 72 70 68 28 61 57 6f 72 64 5b 31 5d 29 3b 0a  orph(aWord[1]);.
b500: 20 20 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e 6c      if (lMorph.l
b510: 65 6e 67 74 68 20 3d 3d 3d 20 30 29 20 7b 0a 20  ength === 0) {. 
b520: 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c         console.l
b530: 6f 67 28 22 3e 20 6e 6f 74 20 69 6e 20 64 69 63  og("> not in dic
b540: 74 69 6f 6e 61 72 79 22 29 3b 0a 20 20 20 20 20  tionary");.     
b550: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a     return true;.
b560: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 64 54      }.    if (dT
b570: 6f 6b 65 6e 50 6f 73 2e 68 61 73 28 61 57 6f 72  okenPos.has(aWor
b580: 64 5b 30 5d 29 29 20 7b 0a 20 20 20 20 20 20 20  d[0])) {.       
b590: 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 22 44 41   console.log("DA
b5a0: 3a 20 22 20 2b 20 64 54 6f 6b 65 6e 50 6f 73 2e  : " + dTokenPos.
b5b0: 67 65 74 28 61 57 6f 72 64 5b 30 5d 29 29 3b 0a  get(aWord[0]));.
b5c0: 20 20 20 20 7d 0a 20 20 20 20 63 6f 6e 73 6f 6c      }.    consol
b5d0: 65 2e 6c 6f 67 28 22 46 53 41 3a 20 22 20 2b 20  e.log("FSA: " + 
b5e0: 6c 4d 6f 72 70 68 29 3b 0a 20 20 20 20 72 65 74  lMorph);.    ret
b5f0: 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a 66 75 6e  urn true;.}..fun
b600: 63 74 69 6f 6e 20 6d 6f 72 70 68 20 28 64 54 6f  ction morph (dTo
b610: 6b 65 6e 50 6f 73 2c 20 61 57 6f 72 64 2c 20 73  kenPos, aWord, s
b620: 50 61 74 74 65 72 6e 2c 20 73 4e 65 67 50 61 74  Pattern, sNegPat
b630: 74 65 72 6e 2c 20 62 4e 6f 57 6f 72 64 3d 66 61  tern, bNoWord=fa
b640: 6c 73 65 29 20 7b 0a 20 20 20 20 2f 2f 20 61 6e  lse) {.    // an
b650: 61 6c 79 73 65 20 61 20 74 75 70 6c 65 20 28 70  alyse a tuple (p
b660: 6f 73 69 74 69 6f 6e 2c 20 77 6f 72 64 29 2c 20  osition, word), 
b670: 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
b680: 6e 6f 74 20 73 4e 65 67 50 61 74 74 65 72 6e 20  not sNegPattern 
b690: 69 6e 20 77 6f 72 64 20 6d 6f 72 70 68 6f 6c 6f  in word morpholo
b6a0: 67 69 65 73 20 61 6e 64 20 73 50 61 74 74 65 72  gies and sPatter
b6b0: 6e 20 69 6e 20 77 6f 72 64 20 6d 6f 72 70 68 6f  n in word morpho
b6c0: 6c 6f 67 69 65 73 20 28 64 69 73 61 6d 62 69 67  logies (disambig
b6d0: 75 61 74 69 6f 6e 20 6f 6e 29 0a 20 20 20 20 69  uation on).    i
b6e0: 66 20 28 21 61 57 6f 72 64 29 20 7b 0a 20 20 20  f (!aWord) {.   
b6f0: 20 20 20 20 20 72 65 74 75 72 6e 20 62 4e 6f 57       return bNoW
b700: 6f 72 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  ord;.    }.    l
b710: 65 74 20 6c 4d 6f 72 70 68 20 3d 20 28 64 54 6f  et lMorph = (dTo
b720: 6b 65 6e 50 6f 73 2e 68 61 73 28 61 57 6f 72 64  kenPos.has(aWord
b730: 5b 30 5d 29 20 20 26 26 20 20 64 54 6f 6b 65 6e  [0])  &&  dToken
b740: 50 6f 73 2e 67 65 74 28 61 57 6f 72 64 5b 30 5d  Pos.get(aWord[0]
b750: 29 29 5b 22 6c 4d 6f 72 70 68 22 5d 20 3f 20 64  ))["lMorph"] ? d
b760: 54 6f 6b 65 6e 50 6f 73 2e 67 65 74 28 61 57 6f  TokenPos.get(aWo
b770: 72 64 5b 30 5d 29 5b 22 6c 4d 6f 72 70 68 22 5d  rd[0])["lMorph"]
b780: 20 3a 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65   : _oSpellChecke
b790: 72 2e 67 65 74 4d 6f 72 70 68 28 61 57 6f 72 64  r.getMorph(aWord
b7a0: 5b 31 5d 29 3b 0a 20 20 20 20 69 66 20 28 6c 4d  [1]);.    if (lM
b7b0: 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20  orph.length === 
b7c0: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0) {.        ret
b7d0: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d  urn false;.    }
b7e0: 0a 20 20 20 20 69 66 20 28 73 4e 65 67 50 61 74  .    if (sNegPat
b7f0: 74 65 72 6e 29 20 7b 0a 20 20 20 20 20 20 20 20  tern) {.        
b800: 2f 2f 20 63 68 65 63 6b 20 6e 65 67 61 74 69 76  // check negativ
b810: 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20 20 20  e condition.    
b820: 20 20 20 20 69 66 20 28 73 4e 65 67 50 61 74 74      if (sNegPatt
b830: 65 72 6e 20 3d 3d 3d 20 22 2a 22 29 20 7b 0a 20  ern === "*") {. 
b840: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 61 6c             // al
b850: 6c 20 6d 6f 72 70 68 20 6d 75 73 74 20 6d 61 74  l morph must mat
b860: 63 68 20 73 50 61 74 74 65 72 6e 0a 20 20 20 20  ch sPattern.    
b870: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c          return l
b880: 4d 6f 72 70 68 2e 65 76 65 72 79 28 73 4d 6f 72  Morph.every(sMor
b890: 70 68 20 20 3d 3e 20 20 28 73 4d 6f 72 70 68 2e  ph  =>  (sMorph.
b8a0: 73 65 61 72 63 68 28 73 50 61 74 74 65 72 6e 29  search(sPattern)
b8b0: 20 21 3d 3d 20 2d 31 29 29 3b 0a 20 20 20 20 20   !== -1));.     
b8c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73     }.        els
b8d0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
b8e0: 69 66 20 28 6c 4d 6f 72 70 68 2e 73 6f 6d 65 28  if (lMorph.some(
b8f0: 73 4d 6f 72 70 68 20 20 3d 3e 20 20 28 73 4d 6f  sMorph  =>  (sMo
b900: 72 70 68 2e 73 65 61 72 63 68 28 73 4e 65 67 50  rph.search(sNegP
b910: 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29  attern) !== -1))
b920: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
b930: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
b940: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
b950: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
b960: 20 20 20 20 2f 2f 20 73 65 61 72 63 68 20 73 50      // search sP
b970: 61 74 74 65 72 6e 0a 20 20 20 20 72 65 74 75 72  attern.    retur
b980: 6e 20 6c 4d 6f 72 70 68 2e 73 6f 6d 65 28 73 4d  n lMorph.some(sM
b990: 6f 72 70 68 20 20 3d 3e 20 20 28 73 4d 6f 72 70  orph  =>  (sMorp
b9a0: 68 2e 73 65 61 72 63 68 28 73 50 61 74 74 65 72  h.search(sPatter
b9b0: 6e 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 7d 0a 0a  n) !== -1));.}..
b9c0: 66 75 6e 63 74 69 6f 6e 20 61 6e 61 6c 79 73 65  function analyse
b9d0: 20 28 73 57 6f 72 64 2c 20 73 50 61 74 74 65 72   (sWord, sPatter
b9e0: 6e 2c 20 73 4e 65 67 50 61 74 74 65 72 6e 29 20  n, sNegPattern) 
b9f0: 7b 0a 20 20 20 20 2f 2f 20 61 6e 61 6c 79 73 65  {.    // analyse
ba00: 20 61 20 77 6f 72 64 2c 20 72 65 74 75 72 6e 73   a word, returns
ba10: 20 54 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 66 66 29 0a 20 20 20 20 6c 65 74 20 6c 4d 6f  off).    let lMo
ba80: 72 70 68 20 3d 20 5f 6f 53 70 65 6c 6c 43 68 65  rph = _oSpellChe
ba90: 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28 73 57  cker.getMorph(sW
baa0: 6f 72 64 29 3b 0a 20 20 20 20 69 66 20 28 6c 4d  ord);.    if (lM
bab0: 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20  orph.length === 
bac0: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0) {.        ret
bad0: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d  urn false;.    }
bae0: 0a 20 20 20 20 69 66 20 28 73 4e 65 67 50 61 74  .    if (sNegPat
baf0: 74 65 72 6e 29 20 7b 0a 20 20 20 20 20 20 20 20  tern) {.        
bb00: 2f 2f 20 63 68 65 63 6b 20 6e 65 67 61 74 69 76  // check negativ
bb10: 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20 20 20  e condition.    
bb20: 20 20 20 20 69 66 20 28 73 4e 65 67 50 61 74 74      if (sNegPatt
bb30: 65 72 6e 20 3d 3d 3d 20 22 2a 22 29 20 7b 0a 20  ern === "*") {. 
bb40: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 61 6c             // al
bb50: 6c 20 6d 6f 72 70 68 20 6d 75 73 74 20 6d 61 74  l morph must mat
bb60: 63 68 20 73 50 61 74 74 65 72 6e 0a 20 20 20 20  ch sPattern.    
bb70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c          return l
bb80: 4d 6f 72 70 68 2e 65 76 65 72 79 28 73 4d 6f 72  Morph.every(sMor
bb90: 70 68 20 20 3d 3e 20 20 28 73 4d 6f 72 70 68 2e  ph  =>  (sMorph.
bba0: 73 65 61 72 63 68 28 73 50 61 74 74 65 72 6e 29  search(sPattern)
bbb0: 20 21 3d 3d 20 2d 31 29 29 3b 0a 20 20 20 20 20   !== -1));.     
bbc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73     }.        els
bbd0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
bbe0: 69 66 20 28 6c 4d 6f 72 70 68 2e 73 6f 6d 65 28  if (lMorph.some(
bbf0: 73 4d 6f 72 70 68 20 20 3d 3e 20 20 28 73 4d 6f  sMorph  =>  (sMo
bc00: 72 70 68 2e 73 65 61 72 63 68 28 73 4e 65 67 50  rph.search(sNegP
bc10: 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29  attern) !== -1))
bc20: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
bc30: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
bc40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
bc50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
bc60: 20 20 20 20 2f 2f 20 73 65 61 72 63 68 20 73 50      // search sP
bc70: 61 74 74 65 72 6e 0a 20 20 20 20 72 65 74 75 72  attern.    retur
bc80: 6e 20 6c 4d 6f 72 70 68 2e 73 6f 6d 65 28 73 4d  n lMorph.some(sM
bc90: 6f 72 70 68 20 20 3d 3e 20 20 28 73 4d 6f 72 70  orph  =>  (sMorp
bca0: 68 2e 73 65 61 72 63 68 28 73 50 61 74 74 65 72  h.search(sPatter
bcb0: 6e 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 7d 0a 0a  n) !== -1));.}..
bcc0: 0a 2f 2f 2f 2f 20 41 6e 61 6c 79 73 65 20 74 6f  .//// Analyse to
bcd0: 6b 65 6e 73 20 66 6f 72 20 67 72 61 70 68 20 72  kens for graph r
bce0: 75 6c 65 73 0a 0a 66 75 6e 63 74 69 6f 6e 20 67  ules..function g
bcf0: 5f 76 61 6c 75 65 20 28 64 54 6f 6b 65 6e 2c 20  _value (dToken, 
bd00: 73 56 61 6c 75 65 73 2c 20 6e 4c 65 66 74 3d 6e  sValues, nLeft=n
bd10: 75 6c 6c 2c 20 6e 52 69 67 68 74 3d 6e 75 6c 6c  ull, nRight=null
bd20: 29 20 7b 0a 20 20 20 20 2f 2f 20 74 65 73 74 20  ) {.    // test 
bd30: 69 66 20 3c 64 54 6f 6b 65 6e 5b 27 73 56 61 6c  if <dToken['sVal
bd40: 75 65 27 5d 3e 20 69 73 20 69 6e 20 73 56 61 6c  ue']> is in sVal
bd50: 75 65 73 20 28 65 61 63 68 20 76 61 6c 75 65 20  ues (each value 
bd60: 73 68 6f 75 6c 64 20 62 65 20 73 65 70 61 72 61  should be separa
bd70: 74 65 64 20 77 69 74 68 20 7c 29 0a 20 20 20 20  ted with |).    
bd80: 6c 65 74 20 73 56 61 6c 75 65 20 3d 20 28 6e 4c  let sValue = (nL
bd90: 65 66 74 20 3d 3d 3d 20 6e 75 6c 6c 29 20 3f 20  eft === null) ? 
bda0: 22 7c 22 2b 64 54 6f 6b 65 6e 5b 22 73 56 61 6c  "|"+dToken["sVal
bdb0: 75 65 22 5d 2b 22 7c 22 20 3a 20 22 7c 22 2b 64  ue"]+"|" : "|"+d
bdc0: 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 2e  Token["sValue"].
bdd0: 73 6c 69 63 65 28 6e 4c 65 66 74 2c 20 6e 52 69  slice(nLeft, nRi
bde0: 67 68 74 29 2b 22 7c 22 3b 0a 20 20 20 20 69 66  ght)+"|";.    if
bdf0: 20 28 73 56 61 6c 75 65 73 2e 69 6e 63 6c 75 64   (sValues.includ
be00: 65 73 28 73 56 61 6c 75 65 29 29 20 7b 0a 20 20  es(sValue)) {.  
be10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
be20: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  e;.    }.    if 
be30: 28 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22  (dToken["sValue"
be40: 5d 2e 73 6c 69 63 65 28 30 2c 32 29 2e 67 6c 5f  ].slice(0,2).gl_
be50: 69 73 54 69 74 6c 65 28 29 29 20 7b 20 2f 2f 20  isTitle()) { // 
be60: 77 65 20 74 65 73 74 20 6f 6e 6c 79 20 32 20 66  we test only 2 f
be70: 69 72 73 74 20 63 68 61 72 73 2c 20 74 6f 20 6d  irst chars, to m
be80: 61 6b 65 20 76 61 6c 69 64 20 77 6f 72 64 73 20  ake valid words 
be90: 73 75 63 68 20 61 73 20 22 4c 61 69 73 73 65 7a  such as "Laissez
bea0: 2d 6c 65 73 22 2c 20 22 50 61 73 73 65 2d 70 61  -les", "Passe-pa
beb0: 72 74 6f 75 74 22 2e 0a 20 20 20 20 20 20 20 20  rtout"..        
bec0: 69 66 20 28 73 56 61 6c 75 65 73 2e 69 6e 63 6c  if (sValues.incl
bed0: 75 64 65 73 28 73 56 61 6c 75 65 2e 74 6f 4c 6f  udes(sValue.toLo
bee0: 77 65 72 43 61 73 65 28 29 29 29 20 7b 0a 20 20  werCase())) {.  
bef0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
bf00: 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 7d   true;.        }
bf10: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
bf20: 69 66 20 28 64 54 6f 6b 65 6e 5b 22 73 56 61 6c  if (dToken["sVal
bf30: 75 65 22 5d 2e 67 6c 5f 69 73 55 70 70 65 72 43  ue"].gl_isUpperC
bf40: 61 73 65 28 29 29 20 7b 0a 20 20 20 20 20 20 20  ase()) {.       
bf50: 20 2f 2f 69 66 20 73 56 61 6c 75 65 2e 6c 6f 77   //if sValue.low
bf60: 65 72 28 29 20 69 6e 20 73 56 61 6c 75 65 73 3a  er() in sValues:
bf70: 0a 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 72  .        //    r
bf80: 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20  eturn true;.    
bf90: 20 20 20 20 73 56 61 6c 75 65 20 3d 20 22 7c 22      sValue = "|"
bfa0: 2b 73 56 61 6c 75 65 2e 73 6c 69 63 65 28 31 29  +sValue.slice(1)
bfb0: 2e 67 6c 5f 74 6f 43 61 70 69 74 61 6c 69 7a 65  .gl_toCapitalize
bfc0: 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ();.        if (
bfd0: 73 56 61 6c 75 65 73 2e 69 6e 63 6c 75 64 65 73  sValues.includes
bfe0: 28 73 56 61 6c 75 65 29 29 20 7b 0a 20 20 20 20  (sValue)) {.    
bff0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
c000: 72 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rue;.        }. 
c010: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
c020: 66 61 6c 73 65 3b 0a 7d 0a 0a 66 75 6e 63 74 69  false;.}..functi
c030: 6f 6e 20 67 5f 6d 6f 72 70 68 20 28 64 54 6f 6b  on g_morph (dTok
c040: 65 6e 2c 20 73 50 61 74 74 65 72 6e 2c 20 73 4e  en, sPattern, sN
c050: 65 67 50 61 74 74 65 72 6e 3d 22 22 2c 20 6e 4c  egPattern="", nL
c060: 65 66 74 3d 6e 75 6c 6c 2c 20 6e 52 69 67 68 74  eft=null, nRight
c070: 3d 6e 75 6c 6c 2c 20 62 4d 65 6d 6f 72 69 7a 65  =null, bMemorize
c080: 4d 6f 72 70 68 3d 74 72 75 65 29 20 7b 0a 20 20  Morph=true) {.  
c090: 20 20 2f 2f 20 61 6e 61 6c 79 73 65 20 61 20 74    // analyse a t
c0a0: 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 54 72 75  oken, return Tru
c0b0: 65 20 69 66 20 3c 73 4e 65 67 50 61 74 74 65 72  e if <sNegPatter
c0c0: 6e 3e 20 6e 6f 74 20 69 6e 20 6d 6f 72 70 68 6f  n> not in morpho
c0d0: 6c 6f 67 69 65 73 20 61 6e 64 20 3c 73 50 61 74  logies and <sPat
c0e0: 74 65 72 6e 3e 20 69 6e 20 6d 6f 72 70 68 6f 6c  tern> in morphol
c0f0: 6f 67 69 65 73 0a 20 20 20 20 6c 65 74 20 6c 4d  ogies.    let lM
c100: 6f 72 70 68 3b 0a 20 20 20 20 69 66 20 28 64 54  orph;.    if (dT
c110: 6f 6b 65 6e 2e 68 61 73 4f 77 6e 50 72 6f 70 65  oken.hasOwnPrope
c120: 72 74 79 28 22 6c 4d 6f 72 70 68 22 29 29 20 7b  rty("lMorph")) {
c130: 0a 20 20 20 20 20 20 20 20 6c 4d 6f 72 70 68 20  .        lMorph 
c140: 3d 20 64 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68  = dToken["lMorph
c150: 22 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  "];.    }.    el
c160: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  se {.        if 
c170: 28 6e 4c 65 66 74 20 21 3d 3d 20 6e 75 6c 6c 29  (nLeft !== null)
c180: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c   {.            l
c190: 65 74 20 73 56 61 6c 75 65 20 3d 20 28 6e 52 69  et sValue = (nRi
c1a0: 67 68 74 20 21 3d 3d 20 6e 75 6c 6c 29 20 3f 20  ght !== null) ? 
c1b0: 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d  dToken["sValue"]
c1c0: 2e 73 6c 69 63 65 28 6e 4c 65 66 74 2c 20 6e 52  .slice(nLeft, nR
c1d0: 69 67 68 74 29 20 3a 20 64 54 6f 6b 65 6e 5b 22  ight) : dToken["
c1e0: 73 56 61 6c 75 65 22 5d 2e 73 6c 69 63 65 28 6e  sValue"].slice(n
c1f0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Left);.         
c200: 20 20 20 6c 4d 6f 72 70 68 20 3d 20 5f 6f 53 70     lMorph = _oSp
c210: 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74 4d 6f  ellChecker.getMo
c220: 72 70 68 28 73 56 61 6c 75 65 29 3b 0a 20 20 20  rph(sValue);.   
c230: 20 20 20 20 20 20 20 20 20 69 66 20 28 62 4d 65           if (bMe
c240: 6d 6f 72 69 7a 65 4d 6f 72 70 68 29 20 7b 0a 20  morizeMorph) {. 
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
c260: 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 20  Token["lMorph"] 
c270: 3d 20 6c 4d 6f 72 70 68 3b 0a 20 20 20 20 20 20  = lMorph;.      
c280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c290: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
c2a0: 20 20 20 20 20 6c 4d 6f 72 70 68 20 3d 20 5f 6f       lMorph = _o
c2b0: 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74  SpellChecker.get
c2c0: 4d 6f 72 70 68 28 64 54 6f 6b 65 6e 5b 22 73 56  Morph(dToken["sV
c2d0: 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20 20 20 20  alue"]);.       
c2e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20   }.    }.    if 
c2f0: 28 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d  (lMorph.length =
c300: 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 72  = 0) {.        r
c310: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20  eturn false;.   
c320: 20 7d 0a 20 20 20 20 2f 2f 20 63 68 65 63 6b 20   }.    // check 
c330: 6e 65 67 61 74 69 76 65 20 63 6f 6e 64 69 74 69  negative conditi
c340: 6f 6e 0a 20 20 20 20 69 66 20 28 73 4e 65 67 50  on.    if (sNegP
c350: 61 74 74 65 72 6e 29 20 7b 0a 20 20 20 20 20 20  attern) {.      
c360: 20 20 69 66 20 28 73 4e 65 67 50 61 74 74 65 72    if (sNegPatter
c370: 6e 20 3d 3d 20 22 2a 22 29 20 7b 0a 20 20 20 20  n == "*") {.    
c380: 20 20 20 20 20 20 20 20 2f 2f 20 61 6c 6c 20 6d          // all m
c390: 6f 72 70 68 20 6d 75 73 74 20 6d 61 74 63 68 20  orph must match 
c3a0: 73 50 61 74 74 65 72 6e 0a 20 20 20 20 20 20 20  sPattern.       
c3b0: 20 20 20 20 20 72 65 74 75 72 6e 20 6c 4d 6f 72       return lMor
c3c0: 70 68 2e 65 76 65 72 79 28 73 4d 6f 72 70 68 20  ph.every(sMorph 
c3d0: 20 3d 3e 20 20 28 73 4d 6f 72 70 68 2e 73 65 61   =>  (sMorph.sea
c3e0: 72 63 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d  rch(sPattern) !=
c3f0: 3d 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20  = -1));.        
c400: 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 7b  }.        else {
c410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
c420: 28 6c 4d 6f 72 70 68 2e 73 6f 6d 65 28 73 4d 6f  (lMorph.some(sMo
c430: 72 70 68 20 20 3d 3e 20 20 28 73 4d 6f 72 70 68  rph  =>  (sMorph
c440: 2e 73 65 61 72 63 68 28 73 4e 65 67 50 61 74 74  .search(sNegPatt
c450: 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29 29 20 7b  ern) !== -1))) {
c460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c470: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20   return false;. 
c480: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
c490: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c4a0: 20 2f 2f 20 73 65 61 72 63 68 20 73 50 61 74 74   // search sPatt
c4b0: 65 72 6e 0a 20 20 20 20 72 65 74 75 72 6e 20 6c  ern.    return l
c4c0: 4d 6f 72 70 68 2e 73 6f 6d 65 28 73 4d 6f 72 70  Morph.some(sMorp
c4d0: 68 20 20 3d 3e 20 20 28 73 4d 6f 72 70 68 2e 73  h  =>  (sMorph.s
c4e0: 65 61 72 63 68 28 73 50 61 74 74 65 72 6e 29 20  earch(sPattern) 
c4f0: 21 3d 3d 20 2d 31 29 29 3b 0a 7d 0a 0a 66 75 6e  !== -1));.}..fun
c500: 63 74 69 6f 6e 20 67 5f 61 6e 61 6c 79 73 65 20  ction g_analyse 
c510: 28 64 54 6f 6b 65 6e 2c 20 73 50 61 74 74 65 72  (dToken, sPatter
c520: 6e 2c 20 73 4e 65 67 50 61 74 74 65 72 6e 3d 22  n, sNegPattern="
c530: 22 2c 20 6e 4c 65 66 74 3d 6e 75 6c 6c 2c 20 6e  ", nLeft=null, n
c540: 52 69 67 68 74 3d 6e 75 6c 6c 2c 20 62 4d 65 6d  Right=null, bMem
c550: 6f 72 69 7a 65 4d 6f 72 70 68 3d 74 72 75 65 29  orizeMorph=true)
c560: 20 7b 0a 20 20 20 20 2f 2f 20 61 6e 61 6c 79 73   {.    // analys
c570: 65 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72  e a token, retur
c580: 6e 20 54 72 75 65 20 69 66 20 3c 73 4e 65 67 50  n True if <sNegP
c590: 61 74 74 65 72 6e 3e 20 6e 6f 74 20 69 6e 20 6d  attern> not in m
c5a0: 6f 72 70 68 6f 6c 6f 67 69 65 73 20 61 6e 64 20  orphologies and 
c5b0: 3c 73 50 61 74 74 65 72 6e 3e 20 69 6e 20 6d 6f  <sPattern> in mo
c5c0: 72 70 68 6f 6c 6f 67 69 65 73 0a 20 20 20 20 6c  rphologies.    l
c5d0: 65 74 20 6c 4d 6f 72 70 68 3b 0a 20 20 20 20 69  et lMorph;.    i
c5e0: 66 20 28 6e 4c 65 66 74 20 21 3d 3d 20 6e 75 6c  f (nLeft !== nul
c5f0: 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74  l) {.        let
c600: 20 73 56 61 6c 75 65 20 3d 20 28 6e 52 69 67 68   sValue = (nRigh
c610: 74 20 21 3d 3d 20 6e 75 6c 6c 29 20 3f 20 64 54  t !== null) ? dT
c620: 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 2e 73  oken["sValue"].s
c630: 6c 69 63 65 28 6e 4c 65 66 74 2c 20 6e 52 69 67  lice(nLeft, nRig
c640: 68 74 29 20 3a 20 64 54 6f 6b 65 6e 5b 22 73 56  ht) : dToken["sV
c650: 61 6c 75 65 22 5d 2e 73 6c 69 63 65 28 6e 4c 65  alue"].slice(nLe
c660: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 6c 4d 6f  ft);.        lMo
c670: 72 70 68 20 3d 20 5f 6f 53 70 65 6c 6c 43 68 65  rph = _oSpellChe
c680: 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28 73 56  cker.getMorph(sV
c690: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 69  alue);.        i
c6a0: 66 20 28 62 4d 65 6d 6f 72 69 7a 65 4d 6f 72 70  f (bMemorizeMorp
c6b0: 68 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  h) {.           
c6c0: 20 64 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22   dToken["lMorph"
c6d0: 5d 20 3d 20 6c 4d 6f 72 70 68 3b 0a 20 20 20 20  ] = lMorph;.    
c6e0: 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
c6f0: 20 7b 0a 20 20 20 20 20 20 20 20 6c 4d 6f 72 70   {.        lMorp
c700: 68 20 3d 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b  h = _oSpellCheck
c710: 65 72 2e 67 65 74 4d 6f 72 70 68 28 64 54 6f 6b  er.getMorph(dTok
c720: 65 6e 5b 22 73 56 61 6c 75 65 22 5d 29 3b 0a 20  en["sValue"]);. 
c730: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6c 4d 6f     }.    if (lMo
c740: 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 20 30 29  rph.length == 0)
c750: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
c760: 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20  n false;.    }. 
c770: 20 20 20 2f 2f 20 63 68 65 63 6b 20 6e 65 67 61     // check nega
c780: 74 69 76 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20  tive condition. 
c790: 20 20 20 69 66 20 28 73 4e 65 67 50 61 74 74 65     if (sNegPatte
c7a0: 72 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66  rn) {.        if
c7b0: 20 28 73 4e 65 67 50 61 74 74 65 72 6e 20 3d 3d   (sNegPattern ==
c7c0: 20 22 2a 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "*") {.        
c7d0: 20 20 20 20 2f 2f 20 61 6c 6c 20 6d 6f 72 70 68      // all morph
c7e0: 20 6d 75 73 74 20 6d 61 74 63 68 20 73 50 61 74   must match sPat
c7f0: 74 65 72 6e 0a 20 20 20 20 20 20 20 20 20 20 20  tern.           
c800: 20 72 65 74 75 72 6e 20 6c 4d 6f 72 70 68 2e 65   return lMorph.e
c810: 76 65 72 79 28 73 4d 6f 72 70 68 20 20 3d 3e 20  very(sMorph  => 
c820: 20 28 73 4d 6f 72 70 68 2e 73 65 61 72 63 68 28   (sMorph.search(
c830: 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31  sPattern) !== -1
c840: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
c850: 20 20 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20        else {.   
c860: 20 20 20 20 20 20 20 20 20 69 66 20 28 6c 4d 6f           if (lMo
c870: 72 70 68 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20  rph.some(sMorph 
c880: 20 3d 3e 20 20 28 73 4d 6f 72 70 68 2e 73 65 61   =>  (sMorph.sea
c890: 72 63 68 28 73 4e 65 67 50 61 74 74 65 72 6e 29  rch(sNegPattern)
c8a0: 20 21 3d 3d 20 2d 31 29 29 29 20 7b 0a 20 20 20   !== -1))) {.   
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
c8c0: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 20  urn false;.     
c8d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c8e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2f 20   }.    }.    // 
c8f0: 73 65 61 72 63 68 20 73 50 61 74 74 65 72 6e 0a  search sPattern.
c900: 20 20 20 20 72 65 74 75 72 6e 20 6c 4d 6f 72 70      return lMorp
c910: 68 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20 20 3d  h.some(sMorph  =
c920: 3e 20 20 28 73 4d 6f 72 70 68 2e 73 65 61 72 63  >  (sMorph.searc
c930: 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20  h(sPattern) !== 
c940: 2d 31 29 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f  -1));.}..functio
c950: 6e 20 67 5f 6d 65 72 67 65 64 5f 61 6e 61 6c 79  n g_merged_analy
c960: 73 65 20 28 64 54 6f 6b 65 6e 31 2c 20 64 54 6f  se (dToken1, dTo
c970: 6b 65 6e 32 2c 20 63 4d 65 72 67 65 72 2c 20 73  ken2, cMerger, s
c980: 50 61 74 74 65 72 6e 2c 20 73 4e 65 67 50 61 74  Pattern, sNegPat
c990: 74 65 72 6e 3d 22 22 2c 20 62 53 65 74 4d 6f 72  tern="", bSetMor
c9a0: 70 68 3d 74 72 75 65 29 20 7b 0a 20 20 20 20 2f  ph=true) {.    /
c9b0: 2f 20 6d 65 72 67 65 20 74 77 6f 20 74 6f 6b 65  / merge two toke
c9c0: 6e 20 76 61 6c 75 65 73 2c 20 72 65 74 75 72 6e  n values, return
c9d0: 20 54 72 75 65 20 69 66 20 3c 73 4e 65 67 50 61   True if <sNegPa
c9e0: 74 74 65 72 6e 3e 20 6e 6f 74 20 69 6e 20 6d 6f  ttern> not in mo
c9f0: 72 70 68 6f 6c 6f 67 69 65 73 20 61 6e 64 20 3c  rphologies and <
ca00: 73 50 61 74 74 65 72 6e 3e 20 69 6e 20 6d 6f 72  sPattern> in mor
ca10: 70 68 6f 6c 6f 67 69 65 73 20 28 64 69 73 61 6d  phologies (disam
ca20: 62 69 67 75 61 74 69 6f 6e 20 6f 66 66 29 0a 20  biguation off). 
ca30: 20 20 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20     let lMorph = 
ca40: 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67  _oSpellChecker.g
ca50: 65 74 4d 6f 72 70 68 28 64 54 6f 6b 65 6e 31 5b  etMorph(dToken1[
ca60: 22 73 56 61 6c 75 65 22 5d 20 2b 20 63 4d 65 72  "sValue"] + cMer
ca70: 67 65 72 20 2b 20 64 54 6f 6b 65 6e 32 5b 22 73  ger + dToken2["s
ca80: 56 61 6c 75 65 22 5d 29 3b 0a 20 20 20 20 69 66  Value"]);.    if
ca90: 20 28 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20   (lMorph.length 
caa0: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20  == 0) {.        
cab0: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20  return false;.  
cac0: 20 20 7d 0a 20 20 20 20 2f 2f 20 63 68 65 63 6b    }.    // check
cad0: 20 6e 65 67 61 74 69 76 65 20 63 6f 6e 64 69 74   negative condit
cae0: 69 6f 6e 0a 20 20 20 20 69 66 20 28 73 4e 65 67  ion.    if (sNeg
caf0: 50 61 74 74 65 72 6e 29 20 7b 0a 20 20 20 20 20  Pattern) {.     
cb00: 20 20 20 69 66 20 28 73 4e 65 67 50 61 74 74 65     if (sNegPatte
cb10: 72 6e 20 3d 3d 20 22 2a 22 29 20 7b 0a 20 20 20  rn == "*") {.   
cb20: 20 20 20 20 20 20 20 20 20 2f 2f 20 61 6c 6c 20           // all 
cb30: 6d 6f 72 70 68 20 6d 75 73 74 20 6d 61 74 63 68  morph must match
cb40: 20 73 50 61 74 74 65 72 6e 0a 20 20 20 20 20 20   sPattern.      
cb50: 20 20 20 20 20 20 6c 65 74 20 62 52 65 73 75 6c        let bResul
cb60: 74 20 3d 20 6c 4d 6f 72 70 68 2e 65 76 65 72 79  t = lMorph.every
cb70: 28 73 4d 6f 72 70 68 20 20 3d 3e 20 20 28 73 4d  (sMorph  =>  (sM
cb80: 6f 72 70 68 2e 73 65 61 72 63 68 28 73 50 61 74  orph.search(sPat
cb90: 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29 3b 0a  tern) !== -1));.
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
cbb0: 62 52 65 73 75 6c 74 20 26 26 20 62 53 65 74 4d  bResult && bSetM
cbc0: 6f 72 70 68 29 20 7b 0a 20 20 20 20 20 20 20 20  orph) {.        
cbd0: 20 20 20 20 20 20 20 20 64 54 6f 6b 65 6e 31 5b          dToken1[
cbe0: 22 6c 4d 6f 72 70 68 22 5d 20 3d 20 6c 4d 6f 72  "lMorph"] = lMor
cbf0: 70 68 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ph;.            
cc00: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  }.            re
cc10: 74 75 72 6e 20 62 52 65 73 75 6c 74 3b 0a 20 20  turn bResult;.  
cc20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cc30: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
cc40: 20 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e 73 6f     if (lMorph.so
cc50: 6d 65 28 73 4d 6f 72 70 68 20 20 3d 3e 20 20 28  me(sMorph  =>  (
cc60: 73 4d 6f 72 70 68 2e 73 65 61 72 63 68 28 73 4e  sMorph.search(sN
cc70: 65 67 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d  egPattern) !== -
cc80: 31 29 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  1))) {.         
cc90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
cca0: 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  lse;.           
ccb0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
ccc0: 20 7d 0a 20 20 20 20 2f 2f 20 73 65 61 72 63 68   }.    // search
ccd0: 20 73 50 61 74 74 65 72 6e 0a 20 20 20 20 6c 65   sPattern.    le
cce0: 74 20 62 52 65 73 75 6c 74 20 3d 20 6c 4d 6f 72  t bResult = lMor
ccf0: 70 68 2e 73 6f 6d 65 28 73 4d 6f 72 70 68 20 20  ph.some(sMorph  
cd00: 3d 3e 20 20 28 73 4d 6f 72 70 68 2e 73 65 61 72  =>  (sMorph.sear
cd10: 63 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d 3d  ch(sPattern) !==
cd20: 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 62   -1));.    if (b
cd30: 52 65 73 75 6c 74 20 26 26 20 62 53 65 74 4d 6f  Result && bSetMo
cd40: 72 70 68 29 20 7b 0a 20 20 20 20 20 20 20 20 64  rph) {.        d
cd50: 54 6f 6b 65 6e 31 5b 22 6c 4d 6f 72 70 68 22 5d  Token1["lMorph"]
cd60: 20 3d 20 6c 4d 6f 72 70 68 3b 0a 20 20 20 20 7d   = lMorph;.    }
cd70: 0a 20 20 20 20 72 65 74 75 72 6e 20 62 52 65 73  .    return bRes
cd80: 75 6c 74 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e  ult;.}..function
cd90: 20 67 5f 74 61 67 5f 62 65 66 6f 72 65 20 28 64   g_tag_before (d
cda0: 54 6f 6b 65 6e 2c 20 64 54 61 67 73 2c 20 73 54  Token, dTags, sT
cdb0: 61 67 29 20 7b 0a 20 20 20 20 69 66 20 28 21 64  ag) {.    if (!d
cdc0: 54 61 67 73 2e 68 61 73 28 73 54 61 67 29 29 20  Tags.has(sTag)) 
cdd0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
cde0: 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20   false;.    }.  
cdf0: 20 20 69 66 20 28 64 54 6f 6b 65 6e 5b 22 69 22    if (dToken["i"
ce00: 5d 20 3e 20 64 54 61 67 73 2e 67 65 74 28 73 54  ] > dTags.get(sT
ce10: 61 67 29 5b 30 5d 29 20 7b 0a 20 20 20 20 20 20  ag)[0]) {.      
ce20: 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20    return true;. 
ce30: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
ce40: 66 61 6c 73 65 3b 0a 7d 0a 0a 66 75 6e 63 74 69  false;.}..functi
ce50: 6f 6e 20 67 5f 74 61 67 5f 61 66 74 65 72 20 28  on g_tag_after (
ce60: 64 54 6f 6b 65 6e 2c 20 64 54 61 67 73 2c 20 73  dToken, dTags, s
ce70: 54 61 67 29 20 7b 0a 20 20 20 20 69 66 20 28 21  Tag) {.    if (!
ce80: 64 54 61 67 73 2e 68 61 73 28 73 54 61 67 29 29  dTags.has(sTag))
ce90: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
cea0: 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20  n false;.    }. 
ceb0: 20 20 20 69 66 20 28 64 54 6f 6b 65 6e 5b 22 69     if (dToken["i
cec0: 22 5d 20 3c 20 64 54 61 67 73 2e 67 65 74 28 73  "] < dTags.get(s
ced0: 54 61 67 29 5b 31 5d 29 20 7b 0a 20 20 20 20 20  Tag)[1]) {.     
cee0: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a     return true;.
cef0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
cf00: 20 66 61 6c 73 65 3b 0a 7d 0a 0a 66 75 6e 63 74   false;.}..funct
cf10: 69 6f 6e 20 67 5f 74 61 67 20 28 64 54 6f 6b 65  ion g_tag (dToke
cf20: 6e 2c 20 73 54 61 67 29 20 7b 0a 20 20 20 20 72  n, sTag) {.    r
cf30: 65 74 75 72 6e 20 64 54 6f 6b 65 6e 2e 68 61 73  eturn dToken.has
cf40: 4f 77 6e 50 72 6f 70 65 72 74 79 28 22 61 54 61  OwnProperty("aTa
cf50: 67 73 22 29 20 26 26 20 64 54 6f 6b 65 6e 5b 22  gs") && dToken["
cf60: 61 54 61 67 73 22 5d 2e 68 61 73 28 73 54 61 67  aTags"].has(sTag
cf70: 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67  );.}..function g
cf80: 5f 73 70 61 63 65 5f 62 65 74 77 65 65 6e 5f 74  _space_between_t
cf90: 6f 6b 65 6e 73 20 28 64 54 6f 6b 65 6e 31 2c 20  okens (dToken1, 
cfa0: 64 54 6f 6b 65 6e 32 2c 20 6e 4d 69 6e 2c 20 6e  dToken2, nMin, n
cfb0: 4d 61 78 3d 6e 75 6c 6c 29 20 7b 0a 20 20 20 20  Max=null) {.    
cfc0: 6c 65 74 20 6e 53 70 61 63 65 20 3d 20 64 54 6f  let nSpace = dTo
cfd0: 6b 65 6e 32 5b 22 6e 53 74 61 72 74 22 5d 20 2d  ken2["nStart"] -
cfe0: 20 64 54 6f 6b 65 6e 31 5b 22 6e 45 6e 64 22 5d   dToken1["nEnd"]
cff0: 0a 20 20 20 20 69 66 20 28 6e 53 70 61 63 65 20  .    if (nSpace 
d000: 3c 20 6e 4d 69 6e 29 20 7b 0a 20 20 20 20 20 20  < nMin) {.      
d010: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a    return false;.
d020: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6e 4d      }.    if (nM
d030: 61 78 20 21 3d 3d 20 6e 75 6c 6c 20 26 26 20 6e  ax !== null && n
d040: 53 70 61 63 65 20 3e 20 6e 4d 61 78 29 20 7b 0a  Space > nMax) {.
d050: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
d060: 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  alse;.    }.    
d070: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a  return true;.}..
d080: 66 75 6e 63 74 69 6f 6e 20 67 5f 74 6f 6b 65 6e  function g_token
d090: 20 28 6c 54 6f 6b 65 6e 2c 20 69 29 20 7b 0a 20   (lToken, i) {. 
d0a0: 20 20 20 69 66 20 28 69 20 3c 20 30 29 20 7b 0a     if (i < 0) {.
d0b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c          return l
d0c0: 54 6f 6b 65 6e 5b 30 5d 3b 0a 20 20 20 20 7d 0a  Token[0];.    }.
d0d0: 20 20 20 20 69 66 20 28 69 20 3e 3d 20 6c 54 6f      if (i >= lTo
d0e0: 6b 65 6e 2e 6c 65 6e 67 74 68 29 20 7b 0a 20 20  ken.length) {.  
d0f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 54 6f        return lTo
d100: 6b 65 6e 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20  ken[-1];.    }. 
d110: 20 20 20 72 65 74 75 72 6e 20 6c 54 6f 6b 65 6e     return lToken
d120: 5b 69 5d 3b 0a 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f  [i];.}...///////
d130: 2f 20 44 69 73 61 6d 62 69 67 75 61 74 6f 72 0a  / Disambiguator.
d140: 0a 66 75 6e 63 74 69 6f 6e 20 73 65 6c 65 63 74  .function select
d150: 20 28 64 54 6f 6b 65 6e 50 6f 73 2c 20 6e 50 6f   (dTokenPos, nPo
d160: 73 2c 20 73 57 6f 72 64 2c 20 73 50 61 74 74 65  s, sWord, sPatte
d170: 72 6e 2c 20 6c 44 65 66 61 75 6c 74 3d 6e 75 6c  rn, lDefault=nul
d180: 6c 29 20 7b 0a 20 20 20 20 69 66 20 28 21 73 57  l) {.    if (!sW
d190: 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20 72  ord) {.        r
d1a0: 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20  eturn true;.    
d1b0: 7d 0a 20 20 20 20 69 66 20 28 21 64 54 6f 6b 65  }.    if (!dToke
d1c0: 6e 50 6f 73 2e 68 61 73 28 6e 50 6f 73 29 29 20  nPos.has(nPos)) 
d1d0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c  {.        consol
d1e0: 65 2e 6c 6f 67 28 22 45 72 72 6f 72 2e 20 54 68  e.log("Error. Th
d1f0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
d200: 74 6f 6b 65 6e 20 61 74 20 74 68 69 73 20 70 6f  token at this po
d210: 73 69 74 69 6f 6e 3a 20 22 2c 20 6e 50 6f 73 29  sition: ", nPos)
d220: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
d230: 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20   true;.    }.   
d240: 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20 5f 6f   let lMorph = _o
d250: 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74  SpellChecker.get
d260: 4d 6f 72 70 68 28 73 57 6f 72 64 29 3b 0a 20 20  Morph(sWord);.  
d270: 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e 6c 65 6e    if (lMorph.len
d280: 67 74 68 20 3d 3d 3d 20 30 20 20 7c 7c 20 20 6c  gth === 0  ||  l
d290: 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 3d  Morph.length ===
d2a0: 20 31 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65   1) {.        re
d2b0: 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d  turn true;.    }
d2c0: 0a 20 20 20 20 6c 65 74 20 6c 53 65 6c 65 63 74  .    let lSelect
d2d0: 20 3d 20 6c 4d 6f 72 70 68 2e 66 69 6c 74 65 72   = lMorph.filter
d2e0: 28 20 73 4d 6f 72 70 68 20 3d 3e 20 73 4d 6f 72  ( sMorph => sMor
d2f0: 70 68 2e 73 65 61 72 63 68 28 73 50 61 74 74 65  ph.search(sPatte
d300: 72 6e 29 20 21 3d 3d 20 2d 31 20 29 3b 0a 20 20  rn) !== -1 );.  
d310: 20 20 69 66 20 28 6c 53 65 6c 65 63 74 2e 6c 65    if (lSelect.le
d320: 6e 67 74 68 20 3e 20 30 29 20 7b 0a 20 20 20 20  ngth > 0) {.    
d330: 20 20 20 20 69 66 20 28 6c 53 65 6c 65 63 74 2e      if (lSelect.
d340: 6c 65 6e 67 74 68 20 21 3d 20 6c 4d 6f 72 70 68  length != lMorph
d350: 2e 6c 65 6e 67 74 68 29 20 7b 0a 20 20 20 20 20  .length) {.     
d360: 20 20 20 20 20 20 20 64 54 6f 6b 65 6e 50 6f 73         dTokenPos
d370: 2e 67 65 74 28 6e 50 6f 73 29 5b 22 6c 4d 6f 72  .get(nPos)["lMor
d380: 70 68 22 5d 20 3d 20 6c 53 65 6c 65 63 74 3b 0a  ph"] = lSelect;.
d390: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20          }.    } 
d3a0: 65 6c 73 65 20 69 66 20 28 6c 44 65 66 61 75 6c  else if (lDefaul
d3b0: 74 29 20 7b 0a 20 20 20 20 20 20 20 20 64 54 6f  t) {.        dTo
d3c0: 6b 65 6e 50 6f 73 2e 67 65 74 28 6e 50 6f 73 29  kenPos.get(nPos)
d3d0: 5b 22 6c 4d 6f 72 70 68 22 5d 20 3d 20 6c 44 65  ["lMorph"] = lDe
d3e0: 66 61 75 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 20  fault;.    }.   
d3f0: 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 7d 0a   return true;.}.
d400: 0a 66 75 6e 63 74 69 6f 6e 20 65 78 63 6c 75 64  .function exclud
d410: 65 20 28 64 54 6f 6b 65 6e 50 6f 73 2c 20 6e 50  e (dTokenPos, nP
d420: 6f 73 2c 20 73 57 6f 72 64 2c 20 73 50 61 74 74  os, sWord, sPatt
d430: 65 72 6e 2c 20 6c 44 65 66 61 75 6c 74 3d 6e 75  ern, lDefault=nu
d440: 6c 6c 29 20 7b 0a 20 20 20 20 69 66 20 28 21 73  ll) {.    if (!s
d450: 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20  Word) {.        
d460: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20  return true;.   
d470: 20 7d 0a 20 20 20 20 69 66 20 28 21 64 54 6f 6b   }.    if (!dTok
d480: 65 6e 50 6f 73 2e 68 61 73 28 6e 50 6f 73 29 29  enPos.has(nPos))
d490: 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 6f   {.        conso
d4a0: 6c 65 2e 6c 6f 67 28 22 45 72 72 6f 72 2e 20 54  le.log("Error. T
d4b0: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
d4c0: 20 74 6f 6b 65 6e 20 61 74 20 74 68 69 73 20 70   token at this p
d4d0: 6f 73 69 74 69 6f 6e 3a 20 22 2c 20 6e 50 6f 73  osition: ", nPos
d4e0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
d4f0: 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20  n true;.    }.  
d500: 20 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20 5f    let lMorph = _
d510: 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65  oSpellChecker.ge
d520: 74 4d 6f 72 70 68 28 73 57 6f 72 64 29 3b 0a 20  tMorph(sWord);. 
d530: 20 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e 6c 65     if (lMorph.le
d540: 6e 67 74 68 20 3d 3d 3d 20 30 20 20 7c 7c 20 20  ngth === 0  ||  
d550: 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d  lMorph.length ==
d560: 3d 20 31 29 20 7b 0a 20 20 20 20 20 20 20 20 72  = 1) {.        r
d570: 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20  eturn true;.    
d580: 7d 0a 20 20 20 20 6c 65 74 20 6c 53 65 6c 65 63  }.    let lSelec
d590: 74 20 3d 20 6c 4d 6f 72 70 68 2e 66 69 6c 74 65  t = lMorph.filte
d5a0: 72 28 20 73 4d 6f 72 70 68 20 3d 3e 20 73 4d 6f  r( sMorph => sMo
d5b0: 72 70 68 2e 73 65 61 72 63 68 28 73 50 61 74 74  rph.search(sPatt
d5c0: 65 72 6e 29 20 3d 3d 3d 20 2d 31 20 29 3b 0a 20  ern) === -1 );. 
d5d0: 20 20 20 69 66 20 28 6c 53 65 6c 65 63 74 2e 6c     if (lSelect.l
d5e0: 65 6e 67 74 68 20 3e 20 30 29 20 7b 0a 20 20 20  ength > 0) {.   
d5f0: 20 20 20 20 20 69 66 20 28 6c 53 65 6c 65 63 74       if (lSelect
d600: 2e 6c 65 6e 67 74 68 20 21 3d 20 6c 4d 6f 72 70  .length != lMorp
d610: 68 2e 6c 65 6e 67 74 68 29 20 7b 0a 20 20 20 20  h.length) {.    
d620: 20 20 20 20 20 20 20 20 64 54 6f 6b 65 6e 50 6f          dTokenPo
d630: 73 2e 67 65 74 28 6e 50 6f 73 29 5b 22 6c 4d 6f  s.get(nPos)["lMo
d640: 72 70 68 22 5d 20 3d 20 6c 53 65 6c 65 63 74 3b  rph"] = lSelect;
d650: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
d660: 20 65 6c 73 65 20 69 66 20 28 6c 44 65 66 61 75   else if (lDefau
d670: 6c 74 29 20 7b 0a 20 20 20 20 20 20 20 20 64 54  lt) {.        dT
d680: 6f 6b 65 6e 50 6f 73 2e 67 65 74 28 6e 50 6f 73  okenPos.get(nPos
d690: 29 5b 22 6c 4d 6f 72 70 68 22 5d 20 3d 20 6c 44  )["lMorph"] = lD
d6a0: 65 66 61 75 6c 74 3b 0a 20 20 20 20 7d 0a 20 20  efault;.    }.  
d6b0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 7d    return true;.}
d6c0: 0a 0a 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  ..function defin
d6d0: 65 20 28 64 54 6f 6b 65 6e 50 6f 73 2c 20 6e 50  e (dTokenPos, nP
d6e0: 6f 73 2c 20 6c 4d 6f 72 70 68 29 20 7b 0a 20 20  os, lMorph) {.  
d6f0: 20 20 64 54 6f 6b 65 6e 50 6f 73 2e 67 65 74 28    dTokenPos.get(
d700: 6e 50 6f 73 29 5b 22 6c 4d 6f 72 70 68 22 5d 20  nPos)["lMorph"] 
d710: 3d 20 6c 4d 6f 72 70 68 3b 0a 20 20 20 20 72 65  = lMorph;.    re
d720: 74 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a 0a 2f  turn true;.}.../
d730: 2f 2f 2f 20 44 69 73 61 6d 62 69 67 75 61 74 69  /// Disambiguati
d740: 6f 6e 20 66 6f 72 20 67 72 61 70 68 20 72 75 6c  on for graph rul
d750: 65 73 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 5f 73  es..function g_s
d760: 65 6c 65 63 74 20 28 64 54 6f 6b 65 6e 2c 20 73  elect (dToken, s
d770: 50 61 74 74 65 72 6e 2c 20 6c 44 65 66 61 75 6c  Pattern, lDefaul
d780: 74 3d 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 2f 2f  t=null) {.    //
d790: 20 73 65 6c 65 63 74 20 6d 6f 72 70 68 6f 6c 6f   select morpholo
d7a0: 67 69 65 73 20 66 6f 72 20 3c 64 54 6f 6b 65 6e  gies for <dToken
d7b0: 3e 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 3c  > according to <
d7c0: 73 50 61 74 74 65 72 6e 3e 2c 20 61 6c 77 61 79  sPattern>, alway
d7d0: 73 20 72 65 74 75 72 6e 20 74 72 75 65 0a 20 20  s return true.  
d7e0: 20 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20 28    let lMorph = (
d7f0: 64 54 6f 6b 65 6e 2e 68 61 73 4f 77 6e 50 72 6f  dToken.hasOwnPro
d800: 70 65 72 74 79 28 22 6c 4d 6f 72 70 68 22 29 29  perty("lMorph"))
d810: 20 3f 20 64 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70   ? dToken["lMorp
d820: 68 22 5d 20 3a 20 5f 6f 53 70 65 6c 6c 43 68 65  h"] : _oSpellChe
d830: 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28 64 54  cker.getMorph(dT
d840: 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 29 3b  oken["sValue"]);
d850: 0a 20 20 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e  .    if (lMorph.
d860: 6c 65 6e 67 74 68 20 3d 3d 3d 20 30 20 20 7c 7c  length === 0  ||
d870: 20 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d   lMorph.length =
d880: 3d 3d 20 31 29 20 7b 0a 20 20 20 20 20 20 20 20  == 1) {.        
d890: 69 66 20 28 6c 44 65 66 61 75 6c 74 29 20 7b 0a  if (lDefault) {.
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 64 54 6f 6b              dTok
d8b0: 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 20 3d 20 6c  en["lMorph"] = l
d8c0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
d8d0: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
d8e0: 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20  n true;.    }.  
d8f0: 20 20 6c 65 74 20 6c 53 65 6c 65 63 74 20 3d 20    let lSelect = 
d900: 6c 4d 6f 72 70 68 2e 66 69 6c 74 65 72 28 20 73  lMorph.filter( s
d910: 4d 6f 72 70 68 20 3d 3e 20 73 4d 6f 72 70 68 2e  Morph => sMorph.
d920: 73 65 61 72 63 68 28 73 50 61 74 74 65 72 6e 29  search(sPattern)
d930: 20 21 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69   !== -1 );.    i
d940: 66 20 28 6c 53 65 6c 65 63 74 2e 6c 65 6e 67 74  f (lSelect.lengt
d950: 68 20 3e 20 30 29 20 7b 0a 20 20 20 20 20 20 20  h > 0) {.       
d960: 20 69 66 20 28 6c 53 65 6c 65 63 74 2e 6c 65 6e   if (lSelect.len
d970: 67 74 68 20 21 3d 20 6c 4d 6f 72 70 68 2e 6c 65  gth != lMorph.le
d980: 6e 67 74 68 29 20 7b 0a 20 20 20 20 20 20 20 20  ngth) {.        
d990: 20 20 20 20 64 54 6f 6b 65 6e 5b 22 6c 4d 6f 72      dToken["lMor
d9a0: 70 68 22 5d 20 3d 20 6c 53 65 6c 65 63 74 3b 0a  ph"] = lSelect;.
d9b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20          }.    } 
d9c0: 65 6c 73 65 20 69 66 20 28 6c 44 65 66 61 75 6c  else if (lDefaul
d9d0: 74 29 20 7b 0a 20 20 20 20 20 20 20 20 64 54 6f  t) {.        dTo
d9e0: 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 20 3d 20  ken["lMorph"] = 
d9f0: 6c 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 7d 0a  lDefault;.    }.
da00: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b      return true;
da10: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 5f 65  .}..function g_e
da20: 78 63 6c 75 64 65 20 28 64 54 6f 6b 65 6e 2c 20  xclude (dToken, 
da30: 73 50 61 74 74 65 72 6e 2c 20 6c 44 65 66 61 75  sPattern, lDefau
da40: 6c 74 3d 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 2f  lt=null) {.    /
da50: 2f 20 73 65 6c 65 63 74 20 6d 6f 72 70 68 6f 6c  / select morphol
da60: 6f 67 69 65 73 20 66 6f 72 20 3c 64 54 6f 6b 65  ogies for <dToke
da70: 6e 3e 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  n> according to 
da80: 3c 73 50 61 74 74 65 72 6e 3e 2c 20 61 6c 77 61  <sPattern>, alwa
da90: 79 73 20 72 65 74 75 72 6e 20 74 72 75 65 0a 20  ys return true. 
daa0: 20 20 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20     let lMorph = 
dab0: 28 64 54 6f 6b 65 6e 2e 68 61 73 4f 77 6e 50 72  (dToken.hasOwnPr
dac0: 6f 70 65 72 74 79 28 22 6c 4d 6f 72 70 68 22 29  operty("lMorph")
dad0: 29 20 3f 20 64 54 6f 6b 65 6e 5b 22 6c 4d 6f 72  ) ? dToken["lMor
dae0: 70 68 22 5d 20 3a 20 5f 6f 53 70 65 6c 6c 43 68  ph"] : _oSpellCh
daf0: 65 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28 64  ecker.getMorph(d
db00: 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 29  Token["sValue"])
db10: 3b 0a 20 20 20 20 69 66 20 28 6c 4d 6f 72 70 68  ;.    if (lMorph
db20: 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20 30 20 20 7c  .length === 0  |
db30: 7c 20 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20  | lMorph.length 
db40: 3d 3d 3d 20 31 29 20 7b 0a 20 20 20 20 20 20 20  === 1) {.       
db50: 20 69 66 20 28 6c 44 65 66 61 75 6c 74 29 20 7b   if (lDefault) {
db60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 54 6f  .            dTo
db70: 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 20 3d 20  ken["lMorph"] = 
db80: 6c 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  lDefault;.      
db90: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
dba0: 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20  rn true;.    }. 
dbb0: 20 20 20 6c 65 74 20 6c 53 65 6c 65 63 74 20 3d     let lSelect =
dbc0: 20 6c 4d 6f 72 70 68 2e 66 69 6c 74 65 72 28 20   lMorph.filter( 
dbd0: 73 4d 6f 72 70 68 20 3d 3e 20 73 4d 6f 72 70 68  sMorph => sMorph
dbe0: 2e 73 65 61 72 63 68 28 73 50 61 74 74 65 72 6e  .search(sPattern
dbf0: 29 20 3d 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  ) === -1 );.    
dc00: 69 66 20 28 6c 53 65 6c 65 63 74 2e 6c 65 6e 67  if (lSelect.leng
dc10: 74 68 20 3e 20 30 29 20 7b 0a 20 20 20 20 20 20  th > 0) {.      
dc20: 20 20 69 66 20 28 6c 53 65 6c 65 63 74 2e 6c 65    if (lSelect.le
dc30: 6e 67 74 68 20 21 3d 20 6c 4d 6f 72 70 68 2e 6c  ngth != lMorph.l
dc40: 65 6e 67 74 68 29 20 7b 0a 20 20 20 20 20 20 20  ength) {.       
dc50: 20 20 20 20 20 64 54 6f 6b 65 6e 5b 22 6c 4d 6f       dToken["lMo
dc60: 72 70 68 22 5d 20 3d 20 6c 53 65 6c 65 63 74 3b  rph"] = lSelect;
dc70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
dc80: 20 65 6c 73 65 20 69 66 20 28 6c 44 65 66 61 75   else if (lDefau
dc90: 6c 74 29 20 7b 0a 20 20 20 20 20 20 20 20 64 54  lt) {.        dT
dca0: 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 20 3d  oken["lMorph"] =
dcb0: 20 6c 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 7d   lDefault;.    }
dcc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65  .    return true
dcd0: 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 5f  ;.}..function g_
dce0: 64 65 66 69 6e 65 20 28 64 54 6f 6b 65 6e 2c 20  define (dToken, 
dcf0: 6c 4d 6f 72 70 68 29 20 7b 0a 20 20 20 20 2f 2f  lMorph) {.    //
dd00: 20 73 65 74 20 6d 6f 72 70 68 6f 6c 6f 67 69 65   set morphologie
dd10: 73 20 6f 66 20 3c 64 54 6f 6b 65 6e 3e 2c 20 61  s of <dToken>, a
dd20: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 72 75  lways return tru
dd30: 65 0a 20 20 20 20 64 54 6f 6b 65 6e 5b 22 6c 4d  e.    dToken["lM
dd40: 6f 72 70 68 22 5d 20 3d 20 6c 4d 6f 72 70 68 3b  orph"] = lMorph;
dd50: 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65  .    return true
dd60: 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 5f  ;.}..function g_
dd70: 64 65 66 69 6e 65 5f 66 72 6f 6d 20 28 64 54 6f  define_from (dTo
dd80: 6b 65 6e 2c 20 6e 4c 65 66 74 3d 6e 75 6c 6c 2c  ken, nLeft=null,
dd90: 20 6e 52 69 67 68 74 3d 6e 75 6c 6c 29 20 7b 0a   nRight=null) {.
dda0: 20 20 20 20 6c 65 74 20 73 56 61 6c 75 65 20 3d      let sValue =
ddb0: 20 64 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22   dToken["sValue"
ddc0: 5d 3b 0a 20 20 20 20 69 66 20 28 6e 4c 65 66 74  ];.    if (nLeft
ddd0: 20 21 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20   !== null) {.   
dde0: 20 20 20 20 20 73 56 61 6c 75 65 20 3d 20 28 6e       sValue = (n
ddf0: 52 69 67 68 74 20 21 3d 3d 20 6e 75 6c 6c 29 20  Right !== null) 
de00: 3f 20 73 56 61 6c 75 65 2e 73 6c 69 63 65 28 6e  ? sValue.slice(n
de10: 4c 65 66 74 2c 20 6e 52 69 67 68 74 29 20 3a 20  Left, nRight) : 
de20: 73 56 61 6c 75 65 2e 73 6c 69 63 65 28 6e 4c 65  sValue.slice(nLe
de30: 66 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  ft);.    }.    d
de40: 54 6f 6b 65 6e 5b 22 6c 4d 6f 72 70 68 22 5d 20  Token["lMorph"] 
de50: 3d 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72  = _oSpellChecker
de60: 2e 67 65 74 4d 6f 72 70 68 28 73 56 61 6c 75 65  .getMorph(sValue
de70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72  );.    return tr
de80: 75 65 3b 0a 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  ue;.}...////////
de90: 20 47 52 41 4d 4d 41 52 20 43 48 45 43 4b 45 52   GRAMMAR CHECKER
dea0: 20 50 4c 55 47 49 4e 53 0a 0a 24 7b 70 6c 75 67   PLUGINS..${plug
deb0: 69 6e 73 4a 53 7d 0a 0a 0a 2f 2f 20 67 65 6e 65  insJS}...// gene
dec0: 72 61 74 65 64 20 63 6f 64 65 2c 20 64 6f 20 6e  rated code, do n
ded0: 6f 74 20 65 64 69 74 0a 63 6f 6e 73 74 20 6f 45  ot edit.const oE
dee0: 76 61 6c 46 75 6e 63 20 3d 20 7b 0a 20 20 20 20  valFunc = {.    
def0: 2f 2f 20 63 61 6c 6c 61 62 6c 65 73 20 66 6f 72  // callables for
df00: 20 72 65 67 65 78 20 72 75 6c 65 73 0a 24 7b 63   regex rules.${c
df10: 61 6c 6c 61 62 6c 65 73 4a 53 7d 0a 0a 20 20 20  allablesJS}..   
df20: 20 2f 2f 20 63 61 6c 6c 61 62 6c 65 73 20 66 6f   // callables fo
df30: 72 20 67 72 61 70 68 20 72 75 6c 65 73 0a 24 7b  r graph rules.${
df40: 67 72 61 70 68 5f 63 61 6c 6c 61 62 6c 65 73 4a  graph_callablesJ
df50: 53 7d 0a 7d 0a 0a 0a 69 66 20 28 74 79 70 65 6f  S}.}...if (typeo
df60: 66 28 65 78 70 6f 72 74 73 29 20 21 3d 3d 20 27  f(exports) !== '
df70: 75 6e 64 65 66 69 6e 65 64 27 29 20 7b 0a 20 20  undefined') {.  
df80: 20 20 65 78 70 6f 72 74 73 2e 6c 61 6e 67 20 3d    exports.lang =
df90: 20 67 63 5f 65 6e 67 69 6e 65 2e 6c 61 6e 67 3b   gc_engine.lang;
dfa0: 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 6c 6f 63  .    exports.loc
dfb0: 61 6c 65 73 20 3d 20 67 63 5f 65 6e 67 69 6e 65  ales = gc_engine
dfc0: 2e 6c 6f 63 61 6c 65 73 3b 0a 20 20 20 20 65 78  .locales;.    ex
dfd0: 70 6f 72 74 73 2e 70 6b 67 20 3d 20 67 63 5f 65  ports.pkg = gc_e
dfe0: 6e 67 69 6e 65 2e 70 6b 67 3b 0a 20 20 20 20 65  ngine.pkg;.    e
dff0: 78 70 6f 72 74 73 2e 6e 61 6d 65 20 3d 20 67 63  xports.name = gc
e000: 5f 65 6e 67 69 6e 65 2e 6e 61 6d 65 3b 0a 20 20  _engine.name;.  
e010: 20 20 65 78 70 6f 72 74 73 2e 76 65 72 73 69 6f    exports.versio
e020: 6e 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 76 65  n = gc_engine.ve
e030: 72 73 69 6f 6e 3b 0a 20 20 20 20 65 78 70 6f 72  rsion;.    expor
e040: 74 73 2e 61 75 74 68 6f 72 20 3d 20 67 63 5f 65  ts.author = gc_e
e050: 6e 67 69 6e 65 2e 61 75 74 68 6f 72 3b 0a 20 20  ngine.author;.  
e060: 20 20 2f 2f 20 69 6e 69 74 0a 20 20 20 20 65 78    // init.    ex
e070: 70 6f 72 74 73 2e 6c 6f 61 64 20 3d 20 67 63 5f  ports.load = gc_
e080: 65 6e 67 69 6e 65 2e 6c 6f 61 64 3b 0a 20 20 20  engine.load;.   
e090: 20 65 78 70 6f 72 74 73 2e 67 65 74 53 70 65 6c   exports.getSpel
e0a0: 6c 43 68 65 63 6b 65 72 20 3d 20 67 63 5f 65 6e  lChecker = gc_en
e0b0: 67 69 6e 65 2e 67 65 74 53 70 65 6c 6c 43 68 65  gine.getSpellChe
e0c0: 63 6b 65 72 3b 0a 20 20 20 20 2f 2f 20 73 65 6e  cker;.    // sen
e0d0: 74 65 6e 63 65 0a 20 20 20 20 65 78 70 6f 72 74  tence.    export
e0e0: 73 2e 5f 7a 45 6e 64 4f 66 53 65 6e 74 65 6e 63  s._zEndOfSentenc
e0f0: 65 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 5f 7a  e = gc_engine._z
e100: 45 6e 64 4f 66 53 65 6e 74 65 6e 63 65 3b 0a 20  EndOfSentence;. 
e110: 20 20 20 65 78 70 6f 72 74 73 2e 5f 7a 42 65 67     exports._zBeg
e120: 69 6e 4f 66 50 61 72 61 67 72 61 70 68 20 3d 20  inOfParagraph = 
e130: 67 63 5f 65 6e 67 69 6e 65 2e 5f 7a 42 65 67 69  gc_engine._zBegi
e140: 6e 4f 66 50 61 72 61 67 72 61 70 68 3b 0a 20 20  nOfParagraph;.  
e150: 20 20 65 78 70 6f 72 74 73 2e 5f 7a 45 6e 64 4f    exports._zEndO
e160: 66 50 61 72 61 67 72 61 70 68 20 3d 20 67 63 5f  fParagraph = gc_
e170: 65 6e 67 69 6e 65 2e 5f 7a 45 6e 64 4f 66 50 61  engine._zEndOfPa
e180: 72 61 67 72 61 70 68 3b 0a 20 20 20 20 65 78 70  ragraph;.    exp
e190: 6f 72 74 73 2e 67 65 74 53 65 6e 74 65 6e 63 65  orts.getSentence
e1a0: 42 6f 75 6e 64 61 72 69 65 73 20 3d 20 67 63 5f  Boundaries = gc_
e1b0: 65 6e 67 69 6e 65 2e 67 65 74 53 65 6e 74 65 6e  engine.getSenten
e1c0: 63 65 42 6f 75 6e 64 61 72 69 65 73 3b 0a 20 20  ceBoundaries;.  
e1d0: 20 20 2f 2f 20 72 75 6c 65 73 0a 20 20 20 20 65    // rules.    e
e1e0: 78 70 6f 72 74 73 2e 69 67 6e 6f 72 65 52 75 6c  xports.ignoreRul
e1f0: 65 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 69 67  e = gc_engine.ig
e200: 6e 6f 72 65 52 75 6c 65 3b 0a 20 20 20 20 65 78  noreRule;.    ex
e210: 70 6f 72 74 73 2e 72 65 73 65 74 49 67 6e 6f 72  ports.resetIgnor
e220: 65 52 75 6c 65 73 20 3d 20 67 63 5f 65 6e 67 69  eRules = gc_engi
e230: 6e 65 2e 72 65 73 65 74 49 67 6e 6f 72 65 52 75  ne.resetIgnoreRu
e240: 6c 65 73 3b 0a 20 20 20 20 65 78 70 6f 72 74 73  les;.    exports
e250: 2e 72 65 61 63 74 69 76 61 74 65 52 75 6c 65 20  .reactivateRule 
e260: 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 72 65 61 63  = gc_engine.reac
e270: 74 69 76 61 74 65 52 75 6c 65 3b 0a 20 20 20 20  tivateRule;.    
e280: 65 78 70 6f 72 74 73 2e 6c 69 73 74 52 75 6c 65  exports.listRule
e290: 73 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 6c 69  s = gc_engine.li
e2a0: 73 74 52 75 6c 65 73 3b 0a 20 20 20 20 65 78 70  stRules;.    exp
e2b0: 6f 72 74 73 2e 67 65 74 52 75 6c 65 73 20 3d 20  orts.getRules = 
e2c0: 67 63 5f 65 6e 67 69 6e 65 2e 67 65 74 52 75 6c  gc_engine.getRul
e2d0: 65 73 3b 0a 20 20 20 20 2f 2f 20 6f 70 74 69 6f  es;.    // optio
e2e0: 6e 73 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 73  ns.    exports.s
e2f0: 65 74 4f 70 74 69 6f 6e 20 3d 20 67 63 5f 65 6e  etOption = gc_en
e300: 67 69 6e 65 2e 73 65 74 4f 70 74 69 6f 6e 3b 0a  gine.setOption;.
e310: 20 20 20 20 65 78 70 6f 72 74 73 2e 73 65 74 4f      exports.setO
e320: 70 74 69 6f 6e 73 20 3d 20 67 63 5f 65 6e 67 69  ptions = gc_engi
e330: 6e 65 2e 73 65 74 4f 70 74 69 6f 6e 73 3b 0a 20  ne.setOptions;. 
e340: 20 20 20 65 78 70 6f 72 74 73 2e 67 65 74 4f 70     exports.getOp
e350: 74 69 6f 6e 73 20 3d 20 67 63 5f 65 6e 67 69 6e  tions = gc_engin
e360: 65 2e 67 65 74 4f 70 74 69 6f 6e 73 3b 0a 20 20  e.getOptions;.  
e370: 20 20 65 78 70 6f 72 74 73 2e 67 65 74 44 65 66    exports.getDef
e380: 61 75 6c 74 4f 70 74 69 6f 6e 73 20 3d 20 67 63  aultOptions = gc
e390: 5f 65 6e 67 69 6e 65 2e 67 65 74 44 65 66 61 75  _engine.getDefau
e3a0: 6c 74 4f 70 74 69 6f 6e 73 3b 0a 20 20 20 20 65  ltOptions;.    e
e3b0: 78 70 6f 72 74 73 2e 72 65 73 65 74 4f 70 74 69  xports.resetOpti
e3c0: 6f 6e 73 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e  ons = gc_engine.
e3d0: 72 65 73 65 74 4f 70 74 69 6f 6e 73 3b 0a 20 20  resetOptions;.  
e3e0: 20 20 2f 2f 20 6f 74 68 65 72 0a 20 20 20 20 65    // other.    e
e3f0: 78 70 6f 72 74 73 2e 54 65 78 74 50 61 72 73 65  xports.TextParse
e400: 72 20 3d 20 54 65 78 74 50 61 72 73 65 72 3b 0a  r = TextParser;.
e410: 7d 0a                                            }.