Grammalecte  Hex Artifact Content

Artifact 5d601e44574b27c96bb41c2a2dac5040b35ea4766661438abe738b9ca2ff6e6d:


0000: 2f 2f 20 47 72 61 6d 6d 61 72 20 63 68 65 63 6b  // Grammar check
0010: 65 72 20 65 6e 67 69 6e 65 0a 0a 2f 2f 22 75 73  er engine..//"us
0020: 65 20 73 74 72 69 63 74 22 3b 0a 0a 24 7b 73 74  e strict";..${st
0030: 72 69 6e 67 7d 0a 24 7b 72 65 67 65 78 7d 0a 24  ring}.${regex}.$
0040: 7b 6d 61 70 7d 0a 0a 0a 69 66 20 28 74 79 70 65  {map}...if (type
0050: 6f 66 28 72 65 71 75 69 72 65 29 20 21 3d 3d 20  of(require) !== 
0060: 27 75 6e 64 65 66 69 6e 65 64 27 29 20 7b 0a 20  'undefined') {. 
0070: 20 20 20 76 61 72 20 68 65 6c 70 65 72 73 20 3d     var helpers =
0080: 20 72 65 71 75 69 72 65 28 22 72 65 73 6f 75 72   require("resour
0090: 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74 65  ce://grammalecte
00a0: 2f 68 65 6c 70 65 72 73 2e 6a 73 22 29 3b 0a 20  /helpers.js");. 
00b0: 20 20 20 76 61 72 20 65 63 68 6f 20 3d 20 72 65     var echo = re
00c0: 71 75 69 72 65 28 22 72 65 73 6f 75 72 63 65 3a  quire("resource:
00d0: 2f 2f 67 72 61 6d 6d 61 6c 65 63 74 65 2f 68 65  //grammalecte/he
00e0: 6c 70 65 72 73 2e 6a 73 22 29 2e 65 63 68 6f 3b  lpers.js").echo;
00f0: 0a 20 20 20 20 76 61 72 20 67 63 5f 6f 70 74 69  .    var gc_opti
0100: 6f 6e 73 20 3d 20 72 65 71 75 69 72 65 28 22 72  ons = require("r
0110: 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d 61  esource://gramma
0120: 6c 65 63 74 65 2f 24 7b 6c 61 6e 67 7d 2f 67 63  lecte/${lang}/gc
0130: 5f 6f 70 74 69 6f 6e 73 2e 6a 73 22 29 3b 0a 20  _options.js");. 
0140: 20 20 20 76 61 72 20 67 63 5f 72 75 6c 65 73 20     var gc_rules 
0150: 3d 20 72 65 71 75 69 72 65 28 22 72 65 73 6f 75  = require("resou
0160: 72 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74  rce://grammalect
0170: 65 2f 24 7b 6c 61 6e 67 7d 2f 67 63 5f 72 75 6c  e/${lang}/gc_rul
0180: 65 73 2e 6a 73 22 29 3b 0a 20 20 20 20 76 61 72  es.js");.    var
0190: 20 63 72 65 67 65 78 20 3d 20 72 65 71 75 69 72   cregex = requir
01a0: 65 28 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72  e("resource://gr
01b0: 61 6d 6d 61 6c 65 63 74 65 2f 24 7b 6c 61 6e 67  ammalecte/${lang
01c0: 7d 2f 63 72 65 67 65 78 2e 6a 73 22 29 3b 0a 20  }/cregex.js");. 
01d0: 20 20 20 76 61 72 20 74 65 78 74 20 3d 20 72 65     var text = re
01e0: 71 75 69 72 65 28 22 72 65 73 6f 75 72 63 65 3a  quire("resource:
01f0: 2f 2f 67 72 61 6d 6d 61 6c 65 63 74 65 2f 74 65  //grammalecte/te
0200: 78 74 2e 6a 73 22 29 3b 0a 7d 0a 0a 0a 66 75 6e  xt.js");.}...fun
0210: 63 74 69 6f 6e 20 63 61 70 69 74 61 6c 69 7a 65  ction capitalize
0220: 41 72 72 61 79 20 28 61 41 72 72 61 79 29 20 7b  Array (aArray) {
0230: 0a 20 20 20 20 2f 2f 20 63 61 6e e2 80 99 74 20  .    // can...t 
0240: 6d 61 70 20 6f 6e 20 75 73 65 72 20 64 65 66 69  map on user defi
0250: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 3f 3f 0a 20  ned function??. 
0260: 20 20 20 6c 65 74 20 61 4e 65 77 20 3d 20 5b 5d     let aNew = []
0270: 3b 0a 20 20 20 20 66 6f 72 20 28 6c 65 74 20 69  ;.    for (let i
0280: 20 3d 20 30 3b 20 69 20 3c 20 61 41 72 72 61 79   = 0; i < aArray
0290: 2e 6c 65 6e 67 74 68 3b 20 69 20 3d 20 69 20 2b  .length; i = i +
02a0: 20 31 29 20 7b 0a 20 20 20 20 20 20 20 20 61 4e   1) {.        aN
02b0: 65 77 5b 69 5d 20 3d 20 61 41 72 72 61 79 5b 69  ew[i] = aArray[i
02c0: 5d 2e 67 6c 5f 74 6f 43 61 70 69 74 61 6c 69 7a  ].gl_toCapitaliz
02d0: 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  e();.    }.    r
02e0: 65 74 75 72 6e 20 61 4e 65 77 3b 0a 7d 0a 0a 0a  eturn aNew;.}...
02f0: 2f 2f 20 64 61 74 61 0a 6c 65 74 20 5f 73 41 70  // data.let _sAp
0300: 70 43 6f 6e 74 65 78 74 20 3d 20 22 22 3b 20 20  pContext = "";  
0310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0330: 2f 2f 20 77 68 61 74 20 73 6f 66 74 77 61 72 65  // what software
0340: 20 69 73 20 72 75 6e 6e 69 6e 67 0a 6c 65 74 20   is running.let 
0350: 5f 64 4f 70 74 69 6f 6e 73 20 3d 20 6e 75 6c 6c  _dOptions = null
0360: 3b 0a 6c 65 74 20 5f 61 49 67 6e 6f 72 65 64 52  ;.let _aIgnoredR
0370: 75 6c 65 73 20 3d 20 6e 65 77 20 53 65 74 28 29  ules = new Set()
0380: 3b 0a 6c 65 74 20 5f 6f 44 69 63 74 20 3d 20 6e  ;.let _oDict = n
0390: 75 6c 6c 3b 0a 6c 65 74 20 5f 64 41 6e 61 6c 79  ull;.let _dAnaly
03a0: 73 65 73 20 3d 20 6e 65 77 20 4d 61 70 28 29 3b  ses = new Map();
03b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
03d0: 63 61 63 68 65 20 66 6f 72 20 64 61 74 61 20 66  cache for data f
03e0: 72 6f 6d 20 64 69 63 74 69 6f 6e 61 72 79 0a 0a  rom dictionary..
03f0: 0a 76 61 72 20 67 63 5f 65 6e 67 69 6e 65 20 3d  .var gc_engine =
0400: 20 7b 0a 0a 20 20 20 20 2f 2f 2f 2f 20 49 6e 66   {..    //// Inf
0410: 6f 72 6d 61 74 69 6f 6e 73 0a 0a 20 20 20 20 6c  ormations..    l
0420: 61 6e 67 3a 20 22 24 7b 6c 61 6e 67 7d 22 2c 0a  ang: "${lang}",.
0430: 20 20 20 20 6c 6f 63 61 6c 65 73 3a 20 24 7b 6c      locales: ${l
0440: 6f 63 7d 2c 0a 20 20 20 20 70 6b 67 3a 20 22 24  oc},.    pkg: "$
0450: 7b 69 6d 70 6c 6e 61 6d 65 7d 22 2c 0a 20 20 20  {implname}",.   
0460: 20 6e 61 6d 65 3a 20 22 24 7b 6e 61 6d 65 7d 22   name: "${name}"
0470: 2c 0a 20 20 20 20 76 65 72 73 69 6f 6e 3a 20 22  ,.    version: "
0480: 24 7b 76 65 72 73 69 6f 6e 7d 22 2c 0a 20 20 20  ${version}",.   
0490: 20 61 75 74 68 6f 72 3a 20 22 24 7b 61 75 74 68   author: "${auth
04a0: 6f 72 7d 22 2c 0a 0a 20 20 20 20 2f 2f 2f 2f 20  or}",..    //// 
04b0: 50 61 72 73 69 6e 67 0a 0a 20 20 20 20 70 61 72  Parsing..    par
04c0: 73 65 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73 54  se: function (sT
04d0: 65 78 74 2c 20 73 43 6f 75 6e 74 72 79 3d 22 24  ext, sCountry="$
04e0: 7b 63 6f 75 6e 74 72 79 5f 64 65 66 61 75 6c 74  {country_default
04f0: 7d 22 2c 20 62 44 65 62 75 67 3d 66 61 6c 73 65  }", bDebug=false
0500: 2c 20 62 43 6f 6e 74 65 78 74 3d 66 61 6c 73 65  , bContext=false
0510: 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 61  ) {.        // a
0520: 6e 61 6c 79 73 65 73 20 74 68 65 20 70 61 72 61  nalyses the para
0530: 67 72 61 70 68 20 73 54 65 78 74 20 61 6e 64 20  graph sText and 
0540: 72 65 74 75 72 6e 73 20 6c 69 73 74 20 6f 66 20  returns list of 
0550: 65 72 72 6f 72 73 0a 20 20 20 20 20 20 20 20 6c  errors.        l
0560: 65 74 20 64 45 72 72 6f 72 73 3b 0a 20 20 20 20  et dErrors;.    
0570: 20 20 20 20 6c 65 74 20 65 72 72 73 3b 0a 20 20      let errs;.  
0580: 20 20 20 20 20 20 6c 65 74 20 73 41 6c 74 20 3d        let sAlt =
0590: 20 73 54 65 78 74 3b 0a 20 20 20 20 20 20 20 20   sText;.        
05a0: 6c 65 74 20 64 44 41 20 3d 20 6e 65 77 20 4d 61  let dDA = new Ma
05b0: 70 28 29 3b 20 20 20 20 20 20 20 20 2f 2f 20 44  p();        // D
05c0: 69 73 61 6d 6e 62 69 67 75 61 74 6f 72 0a 20 20  isamnbiguator.  
05d0: 20 20 20 20 20 20 6c 65 74 20 64 50 72 69 6f 72        let dPrior
05e0: 69 74 79 20 3d 20 6e 65 77 20 4d 61 70 28 29 3b  ity = new Map();
05f0: 20 20 2f 2f 20 4b 65 79 20 3d 20 70 6f 73 69 74    // Key = posit
0600: 69 6f 6e 3b 20 76 61 6c 75 65 20 3d 20 70 72 69  ion; value = pri
0610: 6f 72 69 74 79 0a 20 20 20 20 20 20 20 20 6c 65  ority.        le
0620: 74 20 73 4e 65 77 20 3d 20 22 22 3b 0a 0a 20 20  t sNew = "";..  
0630: 20 20 20 20 20 20 2f 2f 20 70 61 72 73 65 20 70        // parse p
0640: 61 72 61 67 72 61 70 68 0a 20 20 20 20 20 20 20  aragraph.       
0650: 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20   try {.         
0660: 20 20 20 5b 73 4e 65 77 2c 20 64 45 72 72 6f 72     [sNew, dError
0670: 73 5d 20 3d 20 74 68 69 73 2e 5f 70 72 6f 6f 66  s] = this._proof
0680: 72 65 61 64 28 73 54 65 78 74 2c 20 73 41 6c 74  read(sText, sAlt
0690: 2c 20 30 2c 20 74 72 75 65 2c 20 64 44 41 2c 20  , 0, true, dDA, 
06a0: 64 50 72 69 6f 72 69 74 79 2c 20 73 43 6f 75 6e  dPriority, sCoun
06b0: 74 72 79 2c 20 62 44 65 62 75 67 2c 20 62 43 6f  try, bDebug, bCo
06c0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
06d0: 20 20 20 20 69 66 20 28 73 4e 65 77 29 20 7b 0a      if (sNew) {.
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06f0: 73 54 65 78 74 20 3d 20 73 4e 65 77 3b 0a 20 20  sText = sNew;.  
0700: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
0710: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
0720: 74 63 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20  tch (e) {.      
0730: 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e 6c 6f        helpers.lo
0740: 67 65 72 72 6f 72 28 65 29 3b 0a 20 20 20 20 20  gerror(e);.     
0750: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2f     }..        //
0760: 20 63 6c 65 61 6e 75 70 0a 20 20 20 20 20 20 20   cleanup.       
0770: 20 69 66 20 28 73 54 65 78 74 2e 69 6e 63 6c 75   if (sText.inclu
0780: 64 65 73 28 22 c2 a0 22 29 29 20 7b 0a 20 20 20  des("..")) {.   
0790: 20 20 20 20 20 20 20 20 20 73 54 65 78 74 20 3d           sText =
07a0: 20 73 54 65 78 74 2e 72 65 70 6c 61 63 65 28 2f   sText.replace(/
07b0: c2 a0 2f 67 2c 20 27 20 27 29 3b 20 2f 2f 20 6e  ../g, ' '); // n
07c0: 62 73 70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  bsp.        }.  
07d0: 20 20 20 20 20 20 69 66 20 28 73 54 65 78 74 2e        if (sText.
07e0: 69 6e 63 6c 75 64 65 73 28 22 e2 80 af 22 29 29  includes("..."))
07f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
0800: 54 65 78 74 20 3d 20 73 54 65 78 74 2e 72 65 70  Text = sText.rep
0810: 6c 61 63 65 28 2f e2 80 af 2f 67 2c 20 27 20 27  lace(/.../g, ' '
0820: 29 3b 20 2f 2f 20 73 6e 62 73 70 0a 20 20 20 20  ); // snbsp.    
0830: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
0840: 20 28 73 54 65 78 74 2e 69 6e 63 6c 75 64 65 73   (sText.includes
0850: 28 22 27 22 29 29 20 7b 0a 20 20 20 20 20 20 20  ("'")) {.       
0860: 20 20 20 20 20 73 54 65 78 74 20 3d 20 73 54 65       sText = sTe
0870: 78 74 2e 72 65 70 6c 61 63 65 28 2f 27 2f 67 2c  xt.replace(/'/g,
0880: 20 22 e2 80 99 22 29 3b 0a 20 20 20 20 20 20 20   "...");.       
0890: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 73   }.        if (s
08a0: 54 65 78 74 2e 69 6e 63 6c 75 64 65 73 28 22 e2  Text.includes(".
08b0: 80 91 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ..")) {.        
08c0: 20 20 20 20 73 54 65 78 74 20 3d 20 73 54 65 78      sText = sTex
08d0: 74 2e 72 65 70 6c 61 63 65 28 2f e2 80 91 2f 67  t.replace(/.../g
08e0: 2c 20 22 2d 22 29 3b 20 2f 2f 20 6e 6f 62 72 65  , "-"); // nobre
08f0: 61 6b 64 61 73 68 0a 20 20 20 20 20 20 20 20 7d  akdash.        }
0900: 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 70 61 72  ..        // par
0910: 73 65 20 73 65 6e 74 65 6e 63 65 0a 20 20 20 20  se sentence.    
0920: 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 69 53      for (let [iS
0930: 74 61 72 74 2c 20 69 45 6e 64 5d 20 6f 66 20 74  tart, iEnd] of t
0940: 68 69 73 2e 5f 67 65 74 53 65 6e 74 65 6e 63 65  his._getSentence
0950: 42 6f 75 6e 64 61 72 69 65 73 28 73 54 65 78 74  Boundaries(sText
0960: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
0970: 20 69 66 20 28 34 20 3c 20 28 69 45 6e 64 20 2d   if (4 < (iEnd -
0980: 20 69 53 74 61 72 74 29 20 3c 20 32 30 30 30 29   iStart) < 2000)
0990: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
09a0: 20 20 20 64 44 41 2e 63 6c 65 61 72 28 29 3b 0a     dDA.clear();.
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09c0: 2f 2f 65 63 68 6f 28 73 54 65 78 74 2e 73 6c 69  //echo(sText.sli
09d0: 63 65 28 69 53 74 61 72 74 2c 20 69 45 6e 64 29  ce(iStart, iEnd)
09e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
09f0: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 4e               [sN
0a10: 65 77 2c 20 65 72 72 73 5d 20 3d 20 74 68 69 73  ew, errs] = this
0a20: 2e 5f 70 72 6f 6f 66 72 65 61 64 28 73 54 65 78  ._proofread(sTex
0a30: 74 2e 73 6c 69 63 65 28 69 53 74 61 72 74 2c 20  t.slice(iStart, 
0a40: 69 45 6e 64 29 2c 20 73 41 6c 74 2e 73 6c 69 63  iEnd), sAlt.slic
0a50: 65 28 69 53 74 61 72 74 2c 20 69 45 6e 64 29 2c  e(iStart, iEnd),
0a60: 20 69 53 74 61 72 74 2c 20 66 61 6c 73 65 2c 20   iStart, false, 
0a70: 64 44 41 2c 20 64 50 72 69 6f 72 69 74 79 2c 20  dDA, dPriority, 
0a80: 73 43 6f 75 6e 74 72 79 2c 20 62 44 65 62 75 67  sCountry, bDebug
0a90: 2c 20 62 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , bContext);.   
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 20 64 45 72 72 6f 72 73 2e 67 6c 5f 75 70 64 61   dErrors.gl_upda
0ac0: 74 65 28 65 72 72 73 29 3b 0a 20 20 20 20 20 20  te(errs);.      
0ad0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
0af0: 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20  h (e) {.        
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 68 65 6c 70              help
0b10: 65 72 73 2e 6c 6f 67 65 72 72 6f 72 28 65 29 3b  ers.logerror(e);
0b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0b30: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
0b40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
0b50: 20 20 20 72 65 74 75 72 6e 20 41 72 72 61 79 2e     return Array.
0b60: 66 72 6f 6d 28 64 45 72 72 6f 72 73 2e 76 61 6c  from(dErrors.val
0b70: 75 65 73 28 29 29 3b 0a 20 20 20 20 7d 2c 0a 0a  ues());.    },..
0b80: 20 20 20 20 5f 7a 45 6e 64 4f 66 53 65 6e 74 65      _zEndOfSente
0b90: 6e 63 65 3a 20 6e 65 77 20 52 65 67 45 78 70 20  nce: new RegExp 
0ba0: 28 27 28 5b 2e 3f 21 3a 3b e2 80 a6 5d 5b 20 2e  ('([.?!:;...][ .
0bb0: 3f 21 e2 80 a6 20 c2 bb e2 80 9d 22 29 5d 2a 7c  ?!... .....")]*|
0bc0: 2e 24 29 27 2c 20 22 67 22 29 2c 0a 20 20 20 20  .$)', "g"),.    
0bd0: 5f 7a 42 65 67 69 6e 4f 66 50 61 72 61 67 72 61  _zBeginOfParagra
0be0: 70 68 3a 20 6e 65 77 20 52 65 67 45 78 70 20 28  ph: new RegExp (
0bf0: 22 5e 5b 2d 20 c2 a0 e2 80 93 e2 80 94 2e 2c 3b  "^[- .........,;
0c00: 3f 21 e2 80 a6 5d 2a 22 2c 20 22 69 67 22 29 2c  ?!...]*", "ig"),
0c10: 0a 20 20 20 20 5f 7a 45 6e 64 4f 66 50 61 72 61  .    _zEndOfPara
0c20: 67 72 61 70 68 3a 20 6e 65 77 20 52 65 67 45 78  graph: new RegEx
0c30: 70 20 28 22 5b 2d 20 c2 a0 2e 2c 3b 3f 21 e2 80  p ("[- ...,;?!..
0c40: a6 e2 80 93 e2 80 94 5d 2a 24 22 2c 20 22 69 67  .......]*$", "ig
0c50: 22 29 2c 0a 0a 20 20 20 20 5f 67 65 74 53 65 6e  "),..    _getSen
0c60: 74 65 6e 63 65 42 6f 75 6e 64 61 72 69 65 73 3a  tenceBoundaries:
0c70: 20 66 75 6e 63 74 69 6f 6e 2a 20 28 73 54 65 78   function* (sTex
0c80: 74 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74  t) {.        let
0c90: 20 6d 42 65 67 69 6e 4f 66 53 65 6e 74 65 6e 63   mBeginOfSentenc
0ca0: 65 20 3d 20 74 68 69 73 2e 5f 7a 42 65 67 69 6e  e = this._zBegin
0cb0: 4f 66 50 61 72 61 67 72 61 70 68 2e 65 78 65 63  OfParagraph.exec
0cc0: 28 73 54 65 78 74 29 0a 20 20 20 20 20 20 20 20  (sText).        
0cd0: 6c 65 74 20 69 53 74 61 72 74 20 3d 20 74 68 69  let iStart = thi
0ce0: 73 2e 5f 7a 42 65 67 69 6e 4f 66 50 61 72 61 67  s._zBeginOfParag
0cf0: 72 61 70 68 2e 6c 61 73 74 49 6e 64 65 78 3b 0a  raph.lastIndex;.
0d00: 20 20 20 20 20 20 20 20 6c 65 74 20 6d 3b 0a 20          let m;. 
0d10: 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 28 6d         while ((m
0d20: 20 3d 20 74 68 69 73 2e 5f 7a 45 6e 64 4f 66 53   = this._zEndOfS
0d30: 65 6e 74 65 6e 63 65 2e 65 78 65 63 28 73 54 65  entence.exec(sTe
0d40: 78 74 29 29 20 21 3d 3d 20 6e 75 6c 6c 29 20 7b  xt)) !== null) {
0d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65  .            yie
0d60: 6c 64 20 5b 69 53 74 61 72 74 2c 20 74 68 69 73  ld [iStart, this
0d70: 2e 5f 7a 45 6e 64 4f 66 53 65 6e 74 65 6e 63 65  ._zEndOfSentence
0d80: 2e 6c 61 73 74 49 6e 64 65 78 5d 3b 0a 20 20 20  .lastIndex];.   
0d90: 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20           iStart 
0da0: 3d 20 74 68 69 73 2e 5f 7a 45 6e 64 4f 66 53 65  = this._zEndOfSe
0db0: 6e 74 65 6e 63 65 2e 6c 61 73 74 49 6e 64 65 78  ntence.lastIndex
0dc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
0dd0: 7d 2c 0a 0a 20 20 20 20 5f 70 72 6f 6f 66 72 65  },..    _proofre
0de0: 61 64 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73 2c  ad: function (s,
0df0: 20 73 78 2c 20 6e 4f 66 66 73 65 74 2c 20 62 50   sx, nOffset, bP
0e00: 61 72 61 67 72 61 70 68 2c 20 64 44 41 2c 20 64  aragraph, dDA, d
0e10: 50 72 69 6f 72 69 74 79 2c 20 73 43 6f 75 6e 74  Priority, sCount
0e20: 72 79 2c 20 62 44 65 62 75 67 2c 20 62 43 6f 6e  ry, bDebug, bCon
0e30: 74 65 78 74 29 20 7b 0a 20 20 20 20 20 20 20 20  text) {.        
0e40: 6c 65 74 20 64 45 72 72 73 20 3d 20 6e 65 77 20  let dErrs = new 
0e50: 4d 61 70 28 29 3b 0a 20 20 20 20 20 20 20 20 6c  Map();.        l
0e60: 65 74 20 62 43 68 61 6e 67 65 20 3d 20 66 61 6c  et bChange = fal
0e70: 73 65 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  se;.        let 
0e80: 62 49 64 52 75 6c 65 20 3d 20 6f 70 74 69 6f 6e  bIdRule = option
0e90: 28 27 69 64 72 75 6c 65 27 29 3b 0a 20 20 20 20  ('idrule');.    
0ea0: 20 20 20 20 6c 65 74 20 6d 3b 0a 20 20 20 20 20      let m;.     
0eb0: 20 20 20 6c 65 74 20 62 43 6f 6e 64 4d 65 6d 6f     let bCondMemo
0ec0: 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6e 45  ;.        let nE
0ed0: 72 72 6f 72 53 74 61 72 74 3b 0a 0a 20 20 20 20  rrorStart;..    
0ee0: 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 73 4f      for (let [sO
0ef0: 70 74 69 6f 6e 2c 20 6c 52 75 6c 65 47 72 6f 75  ption, lRuleGrou
0f00: 70 5d 20 6f 66 20 74 68 69 73 2e 5f 67 65 74 52  p] of this._getR
0f10: 75 6c 65 73 28 62 50 61 72 61 67 72 61 70 68 29  ules(bParagraph)
0f20: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0f30: 69 66 20 28 21 73 4f 70 74 69 6f 6e 20 7c 7c 20  if (!sOption || 
0f40: 6f 70 74 69 6f 6e 28 73 4f 70 74 69 6f 6e 29 29  option(sOption))
0f50: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
0f60: 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 7a 52 65     for (let [zRe
0f70: 67 65 78 2c 20 62 55 70 70 65 72 63 61 73 65 2c  gex, bUppercase,
0f80: 20 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65 49   sLineId, sRuleI
0f90: 64 2c 20 6e 50 72 69 6f 72 69 74 79 2c 20 6c 41  d, nPriority, lA
0fa0: 63 74 69 6f 6e 73 2c 20 6c 47 72 6f 75 70 73 2c  ctions, lGroups,
0fb0: 20 6c 4e 65 67 4c 6f 6f 6b 42 65 66 6f 72 65 5d   lNegLookBefore]
0fc0: 20 6f 66 20 6c 52 75 6c 65 47 72 6f 75 70 29 20   of lRuleGroup) 
0fd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
0fe0: 20 20 20 20 20 20 69 66 20 28 21 5f 61 49 67 6e        if (!_aIgn
0ff0: 6f 72 65 64 52 75 6c 65 73 2e 68 61 73 28 73 52  oredRules.has(sR
1000: 75 6c 65 49 64 29 29 20 7b 0a 20 20 20 20 20 20  uleId)) {.      
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 20 20 77 68 69 6c 65 20 28 28 6d 20 3d 20 7a 52    while ((m = zR
1030: 65 67 65 78 2e 67 6c 5f 65 78 65 63 32 28 73 2c  egex.gl_exec2(s,
1040: 20 6c 47 72 6f 75 70 73 2c 20 6c 4e 65 67 4c 6f   lGroups, lNegLo
1050: 6f 6b 42 65 66 6f 72 65 29 29 20 21 3d 3d 20 6e  okBefore)) !== n
1060: 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ull) {.         
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1080: 20 20 20 62 43 6f 6e 64 4d 65 6d 6f 20 3d 20 6e     bCondMemo = n
1090: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ull;.           
10a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b0: 20 2f 2a 69 66 20 28 62 44 65 62 75 67 29 20 7b   /*if (bDebug) {
10c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 65 63 68 6f 28 22 3e 3e 3e 3e 20 52 75 6c 65   echo(">>>> Rule
10f0: 20 23 20 22 20 2b 20 73 4c 69 6e 65 49 64 20 2b   # " + sLineId +
1100: 20 22 20 2d 20 54 65 78 74 3a 20 22 20 2b 20 73   " - Text: " + s
1110: 20 2b 20 22 20 6f 70 74 3a 20 22 2b 20 73 4f 70   + " opt: "+ sOp
1120: 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  tion);.         
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1140: 20 20 20 7d 2a 2f 0a 20 20 20 20 20 20 20 20 20     }*/.         
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1160: 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 73 46 75     for (let [sFu
1170: 6e 63 43 6f 6e 64 2c 20 63 41 63 74 69 6f 6e 54  ncCond, cActionT
1180: 79 70 65 2c 20 73 57 68 61 74 2c 20 2e 2e 2e 65  ype, sWhat, ...e
1190: 41 63 74 5d 20 6f 66 20 6c 41 63 74 69 6f 6e 73  Act] of lActions
11a0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c0: 2f 2f 20 61 63 74 69 6f 6e 20 69 6e 20 6c 41 63  // action in lAc
11d0: 74 69 6f 6e 73 3a 20 5b 20 63 6f 6e 64 69 74 69  tions: [ conditi
11e0: 6f 6e 2c 20 61 63 74 69 6f 6e 20 74 79 70 65 2c  on, action type,
11f0: 20 72 65 70 6c 61 63 65 6d 65 6e 74 2f 73 75 67   replacement/sug
1200: 67 65 73 74 69 6f 6e 2f 61 63 74 69 6f 6e 5b 2c  gestion/action[,
1210: 20 69 47 72 6f 75 70 5b 2c 20 6d 65 73 73 61 67   iGroup[, messag
1220: 65 2c 20 55 52 4c 5d 5d 20 5d 0a 20 20 20 20 20  e, URL]] ].     
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1240: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 20 7b             try {
1250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1270: 20 20 20 20 20 2f 2f 65 63 68 6f 28 6f 45 76 61       //echo(oEva
1280: 6c 46 75 6e 63 5b 73 46 75 6e 63 43 6f 6e 64 5d  lFunc[sFuncCond]
1290: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b0: 20 20 20 20 20 20 20 62 43 6f 6e 64 4d 65 6d 6f         bCondMemo
12c0: 20 3d 20 28 21 73 46 75 6e 63 43 6f 6e 64 20 7c   = (!sFuncCond |
12d0: 7c 20 6f 45 76 61 6c 46 75 6e 63 5b 73 46 75 6e  | oEvalFunc[sFun
12e0: 63 43 6f 6e 64 5d 28 73 2c 20 73 78 2c 20 6d 2c  cCond](s, sx, m,
12f0: 20 64 44 41 2c 20 73 43 6f 75 6e 74 72 79 2c 20   dDA, sCountry, 
1300: 62 43 6f 6e 64 4d 65 6d 6f 29 29 0a 20 20 20 20  bCondMemo)).    
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1330: 69 66 20 28 62 43 6f 6e 64 4d 65 6d 6f 29 20 7b  if (bCondMemo) {
1340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 20           switch 
1370: 28 63 41 63 74 69 6f 6e 54 79 70 65 29 20 7b 0a  (cActionType) {.
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
13b0: 20 22 2d 22 3a 0a 20 20 20 20 20 20 20 20 20 20   "-":.          
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 2f 2f 20 67 72 61 6d 6d 61 72        // grammar
13f0: 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 2f 2f 65 63 68 6f 28 22 2d         //echo("-
1430: 3e 20 65 72 72 6f 72 20 64 65 74 65 63 74 65 64  > error detected
1440: 20 69 6e 20 22 20 2b 20 73 4c 69 6e 65 49 64 20   in " + sLineId 
1450: 2b 20 22 5c 6e 7a 52 65 67 65 78 3a 20 22 20 2b  + "\nzRegex: " +
1460: 20 7a 52 65 67 65 78 2e 73 6f 75 72 63 65 29 3b   zRegex.source);
1470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 6e 45 72 72 6f 72 53 74 61 72 74 20 3d 20 6e   nErrorStart = n
14b0: 4f 66 66 73 65 74 20 2b 20 6d 2e 73 74 61 72 74  Offset + m.start
14c0: 5b 65 41 63 74 5b 30 5d 5d 3b 0a 20 20 20 20 20  [eAct[0]];.     
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
1500: 64 45 72 72 73 2e 68 61 73 28 6e 45 72 72 6f 72  dErrs.has(nError
1510: 53 74 61 72 74 29 20 7c 7c 20 6e 50 72 69 6f 72  Start) || nPrior
1520: 69 74 79 20 3e 20 64 50 72 69 6f 72 69 74 79 2e  ity > dPriority.
1530: 67 65 74 28 6e 45 72 72 6f 72 53 74 61 72 74 29  get(nErrorStart)
1540: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 20 20 20 20 20 20 20 64 45 72 72 73 2e 73 65          dErrs.se
1580: 74 28 6e 45 72 72 6f 72 53 74 61 72 74 2c 20 74  t(nErrorStart, t
1590: 68 69 73 2e 5f 63 72 65 61 74 65 45 72 72 6f 72  his._createError
15a0: 28 73 2c 20 73 78 2c 20 73 57 68 61 74 2c 20 6e  (s, sx, sWhat, n
15b0: 4f 66 66 73 65 74 2c 20 6d 2c 20 65 41 63 74 5b  Offset, m, eAct[
15c0: 30 5d 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75  0], sLineId, sRu
15d0: 6c 65 49 64 2c 20 62 55 70 70 65 72 63 61 73 65  leId, bUppercase
15e0: 2c 20 65 41 63 74 5b 31 5d 2c 20 65 41 63 74 5b  , eAct[1], eAct[
15f0: 32 5d 2c 20 62 49 64 52 75 6c 65 2c 20 73 4f 70  2], bIdRule, sOp
1600: 74 69 6f 6e 2c 20 62 43 6f 6e 74 65 78 74 29 29  tion, bContext))
1610: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1640: 20 20 20 20 20 20 64 50 72 69 6f 72 69 74 79 2e        dPriority.
1650: 73 65 74 28 6e 45 72 72 6f 72 53 74 61 72 74 2c  set(nErrorStart,
1660: 20 6e 50 72 69 6f 72 69 74 79 29 3b 0a 20 20 20   nPriority);.   
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
16d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1700: 20 20 63 61 73 65 20 22 7e 22 3a 0a 20 20 20 20    case "~":.    
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74              // t
1740: 65 78 74 20 70 72 6f 63 65 73 73 6f 72 0a 20 20  ext processor.  
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1780: 65 63 68 6f 28 22 2d 3e 20 74 65 78 74 20 70 72  echo("-> text pr
1790: 6f 63 65 73 73 6f 72 20 62 79 20 22 20 2b 20 73  ocessor by " + s
17a0: 4c 69 6e 65 49 64 20 2b 20 22 5c 6e 7a 52 65 67  LineId + "\nzReg
17b0: 65 78 3a 20 22 20 2b 20 7a 52 65 67 65 78 2e 73  ex: " + zRegex.s
17c0: 6f 75 72 63 65 29 3b 0a 20 20 20 20 20 20 20 20  ource);.        
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 73 20 3d 20 74 68 69 73          s = this
1800: 2e 5f 72 65 77 72 69 74 65 28 73 2c 20 73 57 68  ._rewrite(s, sWh
1810: 61 74 2c 20 65 41 63 74 5b 30 5d 2c 20 6d 2c 20  at, eAct[0], m, 
1820: 62 55 70 70 65 72 63 61 73 65 29 3b 0a 20 20 20  bUppercase);.   
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 43 68               bCh
1860: 61 6e 67 65 20 3d 20 74 72 75 65 3b 0a 20 20 20  ange = true;.   
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
18a0: 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20 20  (bDebug) {.     
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
18e0: 63 68 6f 28 22 7e 20 22 20 2b 20 73 20 2b 20 22  cho("~ " + s + "
18f0: 20 20 2d 2d 20 22 20 2b 20 6d 5b 65 41 63 74 5b    -- " + m[eAct[
1900: 30 5d 5d 20 2b 20 22 20 20 23 20 22 20 2b 20 73  0]] + "  # " + s
1910: 4c 69 6e 65 49 64 29 3b 0a 20 20 20 20 20 20 20  LineId);.       
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1980: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
19b0: 73 65 20 22 3d 22 3a 0a 20 20 20 20 20 20 20 20  se "=":.        
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e0: 20 20 20 20 20 20 20 20 2f 2f 20 64 69 73 61 6d          // disam
19f0: 62 69 67 75 61 74 69 6f 6e 0a 20 20 20 20 20 20  biguation.      
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a20: 20 20 20 20 20 20 20 20 20 20 2f 2f 65 63 68 6f            //echo
1a30: 28 22 2d 3e 20 64 69 73 61 6d 62 69 67 75 61 74  ("-> disambiguat
1a40: 69 6f 6e 20 62 79 20 22 20 2b 20 73 4c 69 6e 65  ion by " + sLine
1a50: 49 64 20 2b 20 22 5c 6e 7a 52 65 67 65 78 3a 20  Id + "\nzRegex: 
1a60: 22 20 2b 20 7a 52 65 67 65 78 2e 73 6f 75 72 63  " + zRegex.sourc
1a70: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 6f 45 76 61 6c 46 75 6e 63 5b 73 57      oEvalFunc[sW
1ab0: 68 61 74 5d 28 73 2c 20 6d 2c 20 64 44 41 29 3b  hat](s, m, dDA);
1ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20   if (bDebug) {. 
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 20 20 65 63 68 6f 28 22 3d 20 22 20 2b 20 6d     echo("= " + m
1b40: 5b 30 5d 20 2b 20 22 20 20 23 20 22 20 2b 20 73  [0] + "  # " + s
1b50: 4c 69 6e 65 49 64 20 2b 20 22 5c 6e 44 41 3a 20  LineId + "\nDA: 
1b60: 22 20 2b 20 64 44 41 2e 67 6c 5f 74 6f 53 74 72  " + dDA.gl_toStr
1b70: 69 6e 67 28 29 29 3b 0a 20 20 20 20 20 20 20 20  ing());.        
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
1c10: 65 20 22 3e 22 3a 0a 20 20 20 20 20 20 20 20 20  e ">":.         
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 20 2f 2f 20 77 65 20 64 6f 20         // we do 
1c50: 6e 6f 74 68 69 6e 67 2c 20 74 68 69 73 20 74 65  nothing, this te
1c60: 73 74 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e  st is just a con
1c70: 64 69 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  dition to apply 
1c80: 61 6c 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 63  all following ac
1c90: 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20  tions.          
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
1d00: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 65 63 68 6f 28 22 23 20 65 72 72 6f 72 3a    echo("# error:
1d40: 20 75 6e 6b 6e 6f 77 6e 20 61 63 74 69 6f 6e 20   unknown action 
1d50: 61 74 20 22 20 2b 20 73 4c 69 6e 65 49 64 29 3b  at " + sLineId);
1d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1db0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 69 66 20 28 63 41 63 74 69 6f 6e 54 79 70 65 20  if (cActionType 
1df0: 3d 3d 20 22 3e 22 29 20 7b 0a 20 20 20 20 20 20  == ">") {.      
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1ec0: 61 74 63 68 20 28 65 29 20 7b 0a 20 20 20 20 20  atch (e) {.     
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
1ef0: 63 68 6f 28 73 29 3b 0a 20 20 20 20 20 20 20 20  cho(s);.        
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 65 63 68 6f              echo
1f20: 28 22 23 20 6c 69 6e 65 20 69 64 3a 20 22 20 2b  ("# line id: " +
1f30: 20 73 4c 69 6e 65 49 64 20 2b 20 22 5c 6e 23 20   sLineId + "\n# 
1f40: 72 75 6c 65 20 69 64 3a 20 22 20 2b 20 73 52 75  rule id: " + sRu
1f50: 6c 65 49 64 29 3b 0a 20 20 20 20 20 20 20 20 20  leId);.         
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 20 20 20 20 20 20 20 20 20 20 20 68 65 6c 70 65             helpe
1f80: 72 73 2e 6c 6f 67 65 72 72 6f 72 28 65 29 3b 0a  rs.logerror(e);.
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2010: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2020: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2030: 20 20 69 66 20 28 62 43 68 61 6e 67 65 29 20 7b    if (bChange) {
2040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2050: 75 72 6e 20 5b 73 2c 20 64 45 72 72 73 5d 3b 0a  urn [s, dErrs];.
2060: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2070: 20 20 72 65 74 75 72 6e 20 5b 66 61 6c 73 65 2c    return [false,
2080: 20 64 45 72 72 73 5d 3b 0a 20 20 20 20 7d 2c 0a   dErrs];.    },.
2090: 0a 20 20 20 20 5f 63 72 65 61 74 65 45 72 72 6f  .    _createErro
20a0: 72 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73 2c 20  r: function (s, 
20b0: 73 78 2c 20 73 52 65 70 6c 2c 20 6e 4f 66 66 73  sx, sRepl, nOffs
20c0: 65 74 2c 20 6d 2c 20 69 47 72 6f 75 70 2c 20 73  et, m, iGroup, s
20d0: 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65 49 64 2c  LineId, sRuleId,
20e0: 20 62 55 70 70 65 72 63 61 73 65 2c 20 73 4d 73   bUppercase, sMs
20f0: 67 2c 20 73 55 52 4c 2c 20 62 49 64 52 75 6c 65  g, sURL, bIdRule
2100: 2c 20 73 4f 70 74 69 6f 6e 2c 20 62 43 6f 6e 74  , sOption, bCont
2110: 65 78 74 29 20 7b 0a 20 20 20 20 20 20 20 20 6c  ext) {.        l
2120: 65 74 20 6f 45 72 72 20 3d 20 7b 7d 3b 0a 20 20  et oErr = {};.  
2130: 20 20 20 20 20 20 6f 45 72 72 5b 22 6e 53 74 61        oErr["nSta
2140: 72 74 22 5d 20 3d 20 6e 4f 66 66 73 65 74 20 2b  rt"] = nOffset +
2150: 20 6d 2e 73 74 61 72 74 5b 69 47 72 6f 75 70 5d   m.start[iGroup]
2160: 3b 0a 20 20 20 20 20 20 20 20 6f 45 72 72 5b 22  ;.        oErr["
2170: 6e 45 6e 64 22 5d 20 3d 20 6e 4f 66 66 73 65 74  nEnd"] = nOffset
2180: 20 2b 20 6d 2e 65 6e 64 5b 69 47 72 6f 75 70 5d   + m.end[iGroup]
2190: 3b 0a 20 20 20 20 20 20 20 20 6f 45 72 72 5b 22  ;.        oErr["
21a0: 73 4c 69 6e 65 49 64 22 5d 20 3d 20 73 4c 69 6e  sLineId"] = sLin
21b0: 65 49 64 3b 0a 20 20 20 20 20 20 20 20 6f 45 72  eId;.        oEr
21c0: 72 5b 22 73 52 75 6c 65 49 64 22 5d 20 3d 20 73  r["sRuleId"] = s
21d0: 52 75 6c 65 49 64 3b 0a 20 20 20 20 20 20 20 20  RuleId;.        
21e0: 6f 45 72 72 5b 22 73 54 79 70 65 22 5d 20 3d 20  oErr["sType"] = 
21f0: 28 73 4f 70 74 69 6f 6e 29 20 3f 20 73 4f 70 74  (sOption) ? sOpt
2200: 69 6f 6e 20 3a 20 22 6e 6f 74 79 70 65 22 3b 0a  ion : "notype";.
2210: 20 20 20 20 20 20 20 20 2f 2f 20 73 75 67 67 65          // sugge
2220: 73 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 69  stions.        i
2230: 66 20 28 73 52 65 70 6c 5b 30 5d 20 3d 3d 3d 20  f (sRepl[0] === 
2240: 22 3d 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20  "=") {.         
2250: 20 20 20 6c 65 74 20 73 75 67 67 20 3d 20 6f 45     let sugg = oE
2260: 76 61 6c 46 75 6e 63 5b 73 52 65 70 6c 2e 73 6c  valFunc[sRepl.sl
2270: 69 63 65 28 31 29 5d 28 73 2c 20 6d 29 3b 0a 20  ice(1)](s, m);. 
2280: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73             if (s
2290: 75 67 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ugg) {.         
22a0: 20 20 20 20 20 20 20 69 66 20 28 62 55 70 70 65         if (bUppe
22b0: 72 63 61 73 65 20 26 26 20 6d 5b 69 47 72 6f 75  rcase && m[iGrou
22c0: 70 5d 2e 73 6c 69 63 65 28 30 2c 31 29 2e 67 6c  p].slice(0,1).gl
22d0: 5f 69 73 55 70 70 65 72 43 61 73 65 28 29 29 20  _isUpperCase()) 
22e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22f0: 20 20 20 20 20 20 6f 45 72 72 5b 22 61 53 75 67        oErr["aSug
2300: 67 65 73 74 69 6f 6e 73 22 5d 20 3d 20 63 61 70  gestions"] = cap
2310: 69 74 61 6c 69 7a 65 41 72 72 61 79 28 73 75 67  italizeArray(sug
2320: 67 2e 73 70 6c 69 74 28 22 7c 22 29 29 3b 0a 20  g.split("|"));. 
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2340: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
2350: 20 20 20 20 20 20 20 20 20 20 20 20 6f 45 72 72              oErr
2360: 5b 22 61 53 75 67 67 65 73 74 69 6f 6e 73 22 5d  ["aSuggestions"]
2370: 20 3d 20 73 75 67 67 2e 73 70 6c 69 74 28 22 7c   = sugg.split("|
2380: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
2390: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23a0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
23b0: 20 20 20 20 20 20 20 20 20 20 20 6f 45 72 72 5b             oErr[
23c0: 22 61 53 75 67 67 65 73 74 69 6f 6e 73 22 5d 20  "aSuggestions"] 
23d0: 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  = [];.          
23e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c    }.        } el
23f0: 73 65 20 69 66 20 28 73 52 65 70 6c 20 3d 3d 20  se if (sRepl == 
2400: 22 5f 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20  "_") {.         
2410: 20 20 20 6f 45 72 72 5b 22 61 53 75 67 67 65 73     oErr["aSugges
2420: 74 69 6f 6e 73 22 5d 20 3d 20 5b 5d 3b 0a 20 20  tions"] = [];.  
2430: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
2440: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62             if (b
2450: 55 70 70 65 72 63 61 73 65 20 26 26 20 6d 5b 69  Uppercase && m[i
2460: 47 72 6f 75 70 5d 2e 73 6c 69 63 65 28 30 2c 31  Group].slice(0,1
2470: 29 2e 67 6c 5f 69 73 55 70 70 65 72 43 61 73 65  ).gl_isUpperCase
2480: 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ()) {.          
2490: 20 20 20 20 20 20 6f 45 72 72 5b 22 61 53 75 67        oErr["aSug
24a0: 67 65 73 74 69 6f 6e 73 22 5d 20 3d 20 63 61 70  gestions"] = cap
24b0: 69 74 61 6c 69 7a 65 41 72 72 61 79 28 73 52 65  italizeArray(sRe
24c0: 70 6c 2e 67 6c 5f 65 78 70 61 6e 64 28 6d 29 2e  pl.gl_expand(m).
24d0: 73 70 6c 69 74 28 22 7c 22 29 29 3b 0a 20 20 20  split("|"));.   
24e0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
24f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2500: 20 20 6f 45 72 72 5b 22 61 53 75 67 67 65 73 74    oErr["aSuggest
2510: 69 6f 6e 73 22 5d 20 3d 20 73 52 65 70 6c 2e 67  ions"] = sRepl.g
2520: 6c 5f 65 78 70 61 6e 64 28 6d 29 2e 73 70 6c 69  l_expand(m).spli
2530: 74 28 22 7c 22 29 3b 0a 20 20 20 20 20 20 20 20  t("|");.        
2540: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2550: 20 20 20 20 20 20 20 20 2f 2f 20 4d 65 73 73 61          // Messa
2560: 67 65 0a 20 20 20 20 20 20 20 20 6c 65 74 20 73  ge.        let s
2570: 4d 65 73 73 61 67 65 20 3d 20 22 22 3b 0a 20 20  Message = "";.  
2580: 20 20 20 20 20 20 69 66 20 28 73 4d 73 67 5b 30        if (sMsg[0
2590: 5d 20 3d 3d 3d 20 22 3d 22 29 20 7b 0a 20 20 20  ] === "=") {.   
25a0: 20 20 20 20 20 20 20 20 20 73 4d 65 73 73 61 67           sMessag
25b0: 65 20 3d 20 6f 45 76 61 6c 46 75 6e 63 5b 73 4d  e = oEvalFunc[sM
25c0: 73 67 2e 73 6c 69 63 65 28 31 29 5d 28 73 2c 20  sg.slice(1)](s, 
25d0: 6d 29 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  m).        } els
25e0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
25f0: 73 4d 65 73 73 61 67 65 20 3d 20 73 4d 73 67 2e  sMessage = sMsg.
2600: 67 6c 5f 65 78 70 61 6e 64 28 6d 29 3b 0a 20 20  gl_expand(m);.  
2610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2620: 69 66 20 28 62 49 64 52 75 6c 65 29 20 7b 0a 20  if (bIdRule) {. 
2630: 20 20 20 20 20 20 20 20 20 20 20 73 4d 65 73 73             sMess
2640: 61 67 65 20 2b 3d 20 22 20 23 23 22 20 2b 20 73  age += " ##" + s
2650: 4c 69 6e 65 49 64 20 2b 20 22 20 23 22 20 2b 20  LineId + " #" + 
2660: 73 52 75 6c 65 49 64 3b 0a 20 20 20 20 20 20 20  sRuleId;.       
2670: 20 7d 0a 20 20 20 20 20 20 20 20 6f 45 72 72 5b   }.        oErr[
2680: 22 73 4d 65 73 73 61 67 65 22 5d 20 3d 20 73 4d  "sMessage"] = sM
2690: 65 73 73 61 67 65 3b 0a 20 20 20 20 20 20 20 20  essage;.        
26a0: 2f 2f 20 55 52 4c 0a 20 20 20 20 20 20 20 20 6f  // URL.        o
26b0: 45 72 72 5b 22 55 52 4c 22 5d 20 3d 20 73 55 52  Err["URL"] = sUR
26c0: 4c 20 7c 7c 20 22 22 3b 0a 20 20 20 20 20 20 20  L || "";.       
26d0: 20 2f 2f 20 43 6f 6e 74 65 78 74 0a 20 20 20 20   // Context.    
26e0: 20 20 20 20 69 66 20 28 62 43 6f 6e 74 65 78 74      if (bContext
26f0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2700: 6f 45 72 72 5b 22 73 55 6e 64 65 72 6c 69 6e 65  oErr["sUnderline
2710: 64 22 5d 20 3d 20 73 78 2e 73 6c 69 63 65 28 6d  d"] = sx.slice(m
2720: 2e 73 74 61 72 74 5b 69 47 72 6f 75 70 5d 2c 20  .start[iGroup], 
2730: 6d 2e 65 6e 64 5b 69 47 72 6f 75 70 5d 29 3b 0a  m.end[iGroup]);.
2740: 20 20 20 20 20 20 20 20 20 20 20 20 6f 45 72 72              oErr
2750: 5b 22 73 42 65 66 6f 72 65 22 5d 20 3d 20 73 78  ["sBefore"] = sx
2760: 2e 73 6c 69 63 65 28 4d 61 74 68 2e 6d 61 78 28  .slice(Math.max(
2770: 30 2c 20 6d 2e 73 74 61 72 74 5b 69 47 72 6f 75  0, m.start[iGrou
2780: 70 5d 2d 38 30 29 2c 20 6d 2e 73 74 61 72 74 5b  p]-80), m.start[
2790: 69 47 72 6f 75 70 5d 29 3b 0a 20 20 20 20 20 20  iGroup]);.      
27a0: 20 20 20 20 20 20 6f 45 72 72 5b 22 73 41 66 74        oErr["sAft
27b0: 65 72 22 5d 20 3d 20 73 78 2e 73 6c 69 63 65 28  er"] = sx.slice(
27c0: 6d 2e 65 6e 64 5b 69 47 72 6f 75 70 5d 2c 20 6d  m.end[iGroup], m
27d0: 2e 65 6e 64 5b 69 47 72 6f 75 70 5d 2b 38 30 29  .end[iGroup]+80)
27e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27f0: 20 20 20 20 72 65 74 75 72 6e 20 6f 45 72 72 3b      return oErr;
2800: 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 5f 72 65  .    },..    _re
2810: 77 72 69 74 65 3a 20 66 75 6e 63 74 69 6f 6e 20  write: function 
2820: 28 73 2c 20 73 52 65 70 6c 2c 20 69 47 72 6f 75  (s, sRepl, iGrou
2830: 70 2c 20 6d 2c 20 62 55 70 70 65 72 63 61 73 65  p, m, bUppercase
2840: 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 74  ) {.        // t
2850: 65 78 74 20 70 72 6f 63 65 73 73 6f 72 3a 20 77  ext processor: w
2860: 72 69 74 65 20 73 52 65 70 6c 20 69 6e 20 73 20  rite sRepl in s 
2870: 61 74 20 69 47 72 6f 75 70 20 70 6f 73 69 74 69  at iGroup positi
2880: 6f 6e 22 0a 20 20 20 20 20 20 20 20 6c 65 74 20  on".        let 
2890: 6c 6e 20 3d 20 6d 2e 65 6e 64 5b 69 47 72 6f 75  ln = m.end[iGrou
28a0: 70 5d 20 2d 20 6d 2e 73 74 61 72 74 5b 69 47 72  p] - m.start[iGr
28b0: 6f 75 70 5d 3b 0a 20 20 20 20 20 20 20 20 6c 65  oup];.        le
28c0: 74 20 73 4e 65 77 20 3d 20 22 22 3b 0a 20 20 20  t sNew = "";.   
28d0: 20 20 20 20 20 69 66 20 28 73 52 65 70 6c 20 3d       if (sRepl =
28e0: 3d 3d 20 22 2a 22 29 20 7b 0a 20 20 20 20 20 20  == "*") {.      
28f0: 20 20 20 20 20 20 73 4e 65 77 20 3d 20 22 20 22        sNew = " "
2900: 2e 72 65 70 65 61 74 28 6c 6e 29 3b 0a 20 20 20  .repeat(ln);.   
2910: 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28       } else if (
2920: 73 52 65 70 6c 20 3d 3d 3d 20 22 3e 22 20 7c 7c  sRepl === ">" ||
2930: 20 73 52 65 70 6c 20 3d 3d 3d 20 22 5f 22 20 7c   sRepl === "_" |
2940: 7c 20 73 52 65 70 6c 20 3d 3d 3d 20 22 7e 22 29  | sRepl === "~")
2950: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
2960: 4e 65 77 20 3d 20 73 52 65 70 6c 20 2b 20 22 20  New = sRepl + " 
2970: 22 2e 72 65 70 65 61 74 28 6c 6e 2d 31 29 3b 0a  ".repeat(ln-1);.
2980: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69          } else i
2990: 66 20 28 73 52 65 70 6c 20 3d 3d 3d 20 22 40 22  f (sRepl === "@"
29a0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
29b0: 73 4e 65 77 20 3d 20 22 40 22 2e 72 65 70 65 61  sNew = "@".repea
29c0: 74 28 6c 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  t(ln);.        }
29d0: 20 65 6c 73 65 20 69 66 20 28 73 52 65 70 6c 2e   else if (sRepl.
29e0: 73 6c 69 63 65 28 30 2c 31 29 20 3d 3d 3d 20 22  slice(0,1) === "
29f0: 3d 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  =") {.          
2a00: 20 20 73 4e 65 77 20 3d 20 6f 45 76 61 6c 46 75    sNew = oEvalFu
2a10: 6e 63 5b 73 52 65 70 6c 2e 73 6c 69 63 65 28 31  nc[sRepl.slice(1
2a20: 29 5d 28 73 2c 20 6d 29 3b 0a 20 20 20 20 20 20  )](s, m);.      
2a30: 20 20 20 20 20 20 73 4e 65 77 20 3d 20 73 4e 65        sNew = sNe
2a40: 77 20 2b 20 22 20 22 2e 72 65 70 65 61 74 28 6c  w + " ".repeat(l
2a50: 6e 2d 73 4e 65 77 2e 6c 65 6e 67 74 68 29 3b 0a  n-sNew.length);.
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
2a70: 62 55 70 70 65 72 63 61 73 65 20 26 26 20 6d 5b  bUppercase && m[
2a80: 69 47 72 6f 75 70 5d 2e 73 6c 69 63 65 28 30 2c  iGroup].slice(0,
2a90: 31 29 2e 67 6c 5f 69 73 55 70 70 65 72 43 61 73  1).gl_isUpperCas
2aa0: 65 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  e()) {.         
2ab0: 20 20 20 20 20 20 20 73 4e 65 77 20 3d 20 73 4e         sNew = sN
2ac0: 65 77 2e 67 6c 5f 74 6f 43 61 70 69 74 61 6c 69  ew.gl_toCapitali
2ad0: 7a 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ze();.          
2ae0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c    }.        } el
2af0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
2b00: 20 73 4e 65 77 20 3d 20 73 52 65 70 6c 2e 67 6c   sNew = sRepl.gl
2b10: 5f 65 78 70 61 6e 64 28 6d 29 3b 0a 20 20 20 20  _expand(m);.    
2b20: 20 20 20 20 20 20 20 20 73 4e 65 77 20 3d 20 73          sNew = s
2b30: 4e 65 77 20 2b 20 22 20 22 2e 72 65 70 65 61 74  New + " ".repeat
2b40: 28 6c 6e 2d 73 4e 65 77 2e 6c 65 6e 67 74 68 29  (ln-sNew.length)
2b50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b60: 20 20 20 20 2f 2f 65 63 68 6f 28 22 5c 6e 22 2b      //echo("\n"+
2b70: 73 2b 22 5c 6e 73 74 61 72 74 3a 20 22 2b 6d 2e  s+"\nstart: "+m.
2b80: 73 74 61 72 74 5b 69 47 72 6f 75 70 5d 2b 22 20  start[iGroup]+" 
2b90: 65 6e 64 3a 22 2b 6d 2e 65 6e 64 5b 69 47 72 6f  end:"+m.end[iGro
2ba0: 75 70 5d 29 0a 20 20 20 20 20 20 20 20 72 65 74  up]).        ret
2bb0: 75 72 6e 20 73 2e 73 6c 69 63 65 28 30 2c 20 6d  urn s.slice(0, m
2bc0: 2e 73 74 61 72 74 5b 69 47 72 6f 75 70 5d 29 20  .start[iGroup]) 
2bd0: 2b 20 73 4e 65 77 20 2b 20 73 2e 73 6c 69 63 65  + sNew + s.slice
2be0: 28 6d 2e 65 6e 64 5b 69 47 72 6f 75 70 5d 29 3b  (m.end[iGroup]);
2bf0: 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 2f 2f 20  .    },..    // 
2c00: 41 63 74 69 6f 6e 73 20 6f 6e 20 72 75 6c 65 73  Actions on rules
2c10: 0a 0a 20 20 20 20 69 67 6e 6f 72 65 52 75 6c 65  ..    ignoreRule
2c20: 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73 52 75 6c  : function (sRul
2c30: 65 49 64 29 20 7b 0a 20 20 20 20 20 20 20 20 5f  eId) {.        _
2c40: 61 49 67 6e 6f 72 65 64 52 75 6c 65 73 2e 61 64  aIgnoredRules.ad
2c50: 64 28 73 52 75 6c 65 49 64 29 3b 0a 20 20 20 20  d(sRuleId);.    
2c60: 7d 2c 0a 0a 20 20 20 20 72 65 73 65 74 49 67 6e  },..    resetIgn
2c70: 6f 72 65 52 75 6c 65 73 3a 20 66 75 6e 63 74 69  oreRules: functi
2c80: 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20  on () {.        
2c90: 5f 61 49 67 6e 6f 72 65 64 52 75 6c 65 73 2e 63  _aIgnoredRules.c
2ca0: 6c 65 61 72 28 29 3b 0a 20 20 20 20 7d 2c 0a 0a  lear();.    },..
2cb0: 20 20 20 20 72 65 61 63 74 69 76 61 74 65 52 75      reactivateRu
2cc0: 6c 65 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73 52  le: function (sR
2cd0: 75 6c 65 49 64 29 20 7b 0a 20 20 20 20 20 20 20  uleId) {.       
2ce0: 20 5f 61 49 67 6e 6f 72 65 64 52 75 6c 65 73 2e   _aIgnoredRules.
2cf0: 64 65 6c 65 74 65 28 73 52 75 6c 65 49 64 29 3b  delete(sRuleId);
2d00: 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 6c 69 73  .    },..    lis
2d10: 74 52 75 6c 65 73 3a 20 66 75 6e 63 74 69 6f 6e  tRules: function
2d20: 2a 20 28 73 46 69 6c 74 65 72 3d 6e 75 6c 6c 29  * (sFilter=null)
2d30: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 67 65   {.        // ge
2d40: 6e 65 72 61 74 6f 72 3a 20 72 65 74 75 72 6e 73  nerator: returns
2d50: 20 74 75 70 6c 65 20 28 73 4f 70 74 69 6f 6e 2c   tuple (sOption,
2d60: 20 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65 49   sLineId, sRuleI
2d70: 64 29 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b  d).        try {
2d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
2d90: 20 28 6c 65 74 20 5b 73 4f 70 74 69 6f 6e 2c 20   (let [sOption, 
2da0: 6c 52 75 6c 65 47 72 6f 75 70 5d 20 6f 66 20 74  lRuleGroup] of t
2db0: 68 69 73 2e 5f 67 65 74 52 75 6c 65 73 28 74 72  his._getRules(tr
2dc0: 75 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ue)) {.         
2dd0: 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20         for (let 
2de0: 5b 78 31 2c 20 78 32 2c 20 73 4c 69 6e 65 49 64  [x1, x2, sLineId
2df0: 2c 20 73 52 75 6c 65 49 64 2c 20 78 33 2c 20 78  , sRuleId, x3, x
2e00: 34 5d 20 6f 66 20 6c 52 75 6c 65 47 72 6f 75 70  4] of lRuleGroup
2e10: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2e20: 20 20 20 20 20 20 20 20 69 66 20 28 21 73 46 69          if (!sFi
2e30: 6c 74 65 72 20 7c 7c 20 73 52 75 6c 65 49 64 2e  lter || sRuleId.
2e40: 74 65 73 74 28 73 46 69 6c 74 65 72 29 29 20 7b  test(sFilter)) {
2e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e60: 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 5b           yield [
2e70: 73 4f 70 74 69 6f 6e 2c 20 73 4c 69 6e 65 49 64  sOption, sLineId
2e80: 2c 20 73 52 75 6c 65 49 64 5d 3b 0a 20 20 20 20  , sRuleId];.    
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2eb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2ec0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  }.            fo
2ed0: 72 20 28 6c 65 74 20 5b 73 4f 70 74 69 6f 6e 2c  r (let [sOption,
2ee0: 20 6c 52 75 6c 65 47 72 6f 75 70 5d 20 6f 66 20   lRuleGroup] of 
2ef0: 74 68 69 73 2e 5f 67 65 74 52 75 6c 65 73 28 66  this._getRules(f
2f00: 61 6c 73 65 29 29 20 7b 0a 20 20 20 20 20 20 20  alse)) {.       
2f10: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65           for (le
2f20: 74 20 5b 78 31 2c 20 78 32 2c 20 73 4c 69 6e 65  t [x1, x2, sLine
2f30: 49 64 2c 20 73 52 75 6c 65 49 64 2c 20 78 33 2c  Id, sRuleId, x3,
2f40: 20 78 34 5d 20 6f 66 20 6c 52 75 6c 65 47 72 6f   x4] of lRuleGro
2f50: 75 70 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  up) {.          
2f60: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73            if (!s
2f70: 46 69 6c 74 65 72 20 7c 7c 20 73 52 75 6c 65 49  Filter || sRuleI
2f80: 64 2e 74 65 73 74 28 73 46 69 6c 74 65 72 29 29  d.test(sFilter))
2f90: 20 7b 0a 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 79 69 65 6c 64             yield
2fb0: 20 5b 73 4f 70 74 69 6f 6e 2c 20 73 4c 69 6e 65   [sOption, sLine
2fc0: 49 64 2c 20 73 52 75 6c 65 49 64 5d 3b 0a 20 20  Id, sRuleId];.  
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3000: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
3010: 20 20 20 20 20 20 63 61 74 63 68 20 28 65 29 20        catch (e) 
3020: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 68 65  {.            he
3030: 6c 70 65 72 73 2e 6c 6f 67 65 72 72 6f 72 28 65  lpers.logerror(e
3040: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
3050: 20 7d 2c 0a 0a 20 20 20 20 5f 67 65 74 52 75 6c   },..    _getRul
3060: 65 73 3a 20 66 75 6e 63 74 69 6f 6e 20 28 62 50  es: function (bP
3070: 61 72 61 67 72 61 70 68 29 20 7b 0a 20 20 20 20  aragraph) {.    
3080: 20 20 20 20 69 66 20 28 21 62 50 61 72 61 67 72      if (!bParagr
3090: 61 70 68 29 20 7b 0a 20 20 20 20 20 20 20 20 20  aph) {.         
30a0: 20 20 20 72 65 74 75 72 6e 20 67 63 5f 72 75 6c     return gc_rul
30b0: 65 73 2e 6c 53 65 6e 74 65 6e 63 65 52 75 6c 65  es.lSentenceRule
30c0: 73 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  s;.        }.   
30d0: 20 20 20 20 20 72 65 74 75 72 6e 20 67 63 5f 72       return gc_r
30e0: 75 6c 65 73 2e 6c 50 61 72 61 67 72 61 70 68 52  ules.lParagraphR
30f0: 75 6c 65 73 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20  ules;.    },..  
3100: 20 20 2f 2f 2f 2f 20 49 6e 69 74 69 61 6c 69 7a    //// Initializ
3110: 61 74 69 6f 6e 0a 0a 20 20 20 20 6c 6f 61 64 3a  ation..    load:
3120: 20 66 75 6e 63 74 69 6f 6e 20 28 73 43 6f 6e 74   function (sCont
3130: 65 78 74 3d 22 4a 61 76 61 53 63 72 69 70 74 22  ext="JavaScript"
3140: 29 20 7b 0a 20 20 20 20 20 20 20 20 74 72 79 20  ) {.        try 
3150: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
3160: 20 28 74 79 70 65 6f 66 28 72 65 71 75 69 72 65   (typeof(require
3170: 29 20 21 3d 3d 20 27 75 6e 64 65 66 69 6e 65 64  ) !== 'undefined
3180: 27 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ') {.           
3190: 20 20 20 20 20 76 61 72 20 69 62 64 61 77 67 20       var ibdawg 
31a0: 3d 20 72 65 71 75 69 72 65 28 22 72 65 73 6f 75  = require("resou
31b0: 72 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74  rce://grammalect
31c0: 65 2f 69 62 64 61 77 67 2e 6a 73 22 29 3b 0a 20  e/ibdawg.js");. 
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5f                 _
31e0: 6f 44 69 63 74 20 3d 20 6e 65 77 20 69 62 64 61  oDict = new ibda
31f0: 77 67 2e 49 42 44 41 57 47 28 22 24 7b 64 69 63  wg.IBDAWG("${dic
3200: 5f 6e 61 6d 65 7d 2e 6a 73 6f 6e 22 29 3b 0a 20  _name}.json");. 
3210: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
3220: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
3230: 20 20 20 20 5f 6f 44 69 63 74 20 3d 20 6e 65 77      _oDict = new
3240: 20 49 42 44 41 57 47 28 22 24 7b 64 69 63 5f 6e   IBDAWG("${dic_n
3250: 61 6d 65 7d 2e 6a 73 6f 6e 22 29 3b 0a 20 20 20  ame}.json");.   
3260: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3270: 20 20 20 20 20 20 20 5f 73 41 70 70 43 6f 6e 74         _sAppCont
3280: 65 78 74 20 3d 20 73 43 6f 6e 74 65 78 74 3b 0a  ext = sContext;.
3290: 20 20 20 20 20 20 20 20 20 20 20 20 5f 64 4f 70              _dOp
32a0: 74 69 6f 6e 73 20 3d 20 67 63 5f 6f 70 74 69 6f  tions = gc_optio
32b0: 6e 73 2e 67 65 74 4f 70 74 69 6f 6e 73 28 73 43  ns.getOptions(sC
32c0: 6f 6e 74 65 78 74 29 2e 67 6c 5f 73 68 61 6c 6c  ontext).gl_shall
32d0: 6f 77 43 6f 70 79 28 29 3b 20 20 20 20 20 2f 2f  owCopy();     //
32e0: 20 64 75 70 6c 69 63 61 74 69 6f 6e 20 6e 65 63   duplication nec
32f0: 65 73 73 61 72 79 2c 20 74 6f 20 62 65 20 61 62  essary, to be ab
3300: 6c 65 20 74 6f 20 72 65 73 65 74 20 74 6f 20 64  le to reset to d
3310: 65 66 61 75 6c 74 0a 20 20 20 20 20 20 20 20 7d  efault.        }
3320: 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28  .        catch (
3330: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
3340: 20 68 65 6c 70 65 72 73 2e 6c 6f 67 65 72 72 6f   helpers.logerro
3350: 72 28 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  r(e);.        }.
3360: 20 20 20 20 7d 2c 0a 0a 20 20 20 20 67 65 74 44      },..    getD
3370: 69 63 74 69 6f 6e 61 72 79 3a 20 66 75 6e 63 74  ictionary: funct
3380: 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 20  ion () {.       
3390: 20 72 65 74 75 72 6e 20 5f 6f 44 69 63 74 3b 0a   return _oDict;.
33a0: 20 20 20 20 7d 2c 0a 0a 20 20 20 20 2f 2f 2f 2f      },..    ////
33b0: 20 4f 70 74 69 6f 6e 73 0a 0a 20 20 20 20 73 65   Options..    se
33c0: 74 4f 70 74 69 6f 6e 3a 20 66 75 6e 63 74 69 6f  tOption: functio
33d0: 6e 20 28 73 4f 70 74 2c 20 62 56 61 6c 29 20 7b  n (sOpt, bVal) {
33e0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 5f 64 4f  .        if (_dO
33f0: 70 74 69 6f 6e 73 2e 68 61 73 28 73 4f 70 74 29  ptions.has(sOpt)
3400: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3410: 5f 64 4f 70 74 69 6f 6e 73 2e 73 65 74 28 73 4f  _dOptions.set(sO
3420: 70 74 2c 20 62 56 61 6c 29 3b 0a 20 20 20 20 20  pt, bVal);.     
3430: 20 20 20 7d 0a 20 20 20 20 7d 2c 0a 0a 20 20 20     }.    },..   
3440: 20 73 65 74 4f 70 74 69 6f 6e 73 3a 20 66 75 6e   setOptions: fun
3450: 63 74 69 6f 6e 20 28 64 4f 70 74 29 20 7b 0a 20  ction (dOpt) {. 
3460: 20 20 20 20 20 20 20 5f 64 4f 70 74 69 6f 6e 73         _dOptions
3470: 2e 67 6c 5f 75 70 64 61 74 65 4f 6e 6c 79 45 78  .gl_updateOnlyEx
3480: 69 73 74 69 6e 67 4b 65 79 73 28 64 4f 70 74 29  istingKeys(dOpt)
3490: 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 67 65  ;.    },..    ge
34a0: 74 4f 70 74 69 6f 6e 73 3a 20 66 75 6e 63 74 69  tOptions: functi
34b0: 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20  on () {.        
34c0: 72 65 74 75 72 6e 20 5f 64 4f 70 74 69 6f 6e 73  return _dOptions
34d0: 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 67 65  ;.    },..    ge
34e0: 74 44 65 66 61 75 6c 74 4f 70 74 69 6f 6e 73 3a  tDefaultOptions:
34f0: 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20   function () {. 
3500: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 67 63         return gc
3510: 5f 6f 70 74 69 6f 6e 73 2e 67 65 74 4f 70 74 69  _options.getOpti
3520: 6f 6e 73 28 5f 73 41 70 70 43 6f 6e 74 65 78 74  ons(_sAppContext
3530: 29 2e 67 6c 5f 73 68 61 6c 6c 6f 77 43 6f 70 79  ).gl_shallowCopy
3540: 28 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20  ();.    },..    
3550: 72 65 73 65 74 4f 70 74 69 6f 6e 73 3a 20 66 75  resetOptions: fu
3560: 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20  nction () {.    
3570: 20 20 20 20 5f 64 4f 70 74 69 6f 6e 73 20 3d 20      _dOptions = 
3580: 67 63 5f 6f 70 74 69 6f 6e 73 2e 67 65 74 4f 70  gc_options.getOp
3590: 74 69 6f 6e 73 28 5f 73 41 70 70 43 6f 6e 74 65  tions(_sAppConte
35a0: 78 74 29 2e 67 6c 5f 73 68 61 6c 6c 6f 77 43 6f  xt).gl_shallowCo
35b0: 70 79 28 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 0a  py();.    }.}...
35c0: 2f 2f 2f 2f 2f 2f 2f 2f 20 43 6f 6d 6d 6f 6e 20  //////// Common 
35d0: 66 75 6e 63 74 69 6f 6e 73 0a 0a 66 75 6e 63 74  functions..funct
35e0: 69 6f 6e 20 6f 70 74 69 6f 6e 20 28 73 4f 70 74  ion option (sOpt
35f0: 29 20 7b 0a 20 20 20 20 2f 2f 20 72 65 74 75 72  ) {.    // retur
3600: 6e 20 74 72 75 65 20 69 66 20 6f 70 74 69 6f 6e  n true if option
3610: 20 73 4f 70 74 20 69 73 20 61 63 74 69 76 65 0a   sOpt is active.
3620: 20 20 20 20 72 65 74 75 72 6e 20 5f 64 4f 70 74      return _dOpt
3630: 69 6f 6e 73 2e 67 65 74 28 73 4f 70 74 29 3b 0a  ions.get(sOpt);.
3640: 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 64 69 73 70  }..function disp
3650: 6c 61 79 49 6e 66 6f 20 28 64 44 41 2c 20 61 57  layInfo (dDA, aW
3660: 6f 72 64 29 20 7b 0a 20 20 20 20 2f 2f 20 66 6f  ord) {.    // fo
3670: 72 20 64 65 62 75 67 67 69 6e 67 3a 20 69 6e 66  r debugging: inf
3680: 6f 20 6f 66 20 77 6f 72 64 0a 20 20 20 20 69 66  o of word.    if
3690: 20 28 21 61 57 6f 72 64 29 20 7b 0a 20 20 20 20   (!aWord) {.    
36a0: 20 20 20 20 65 63 68 6f 28 22 3e 20 6e 6f 74 68      echo("> noth
36b0: 69 6e 67 20 74 6f 20 66 69 6e 64 22 29 3b 0a 20  ing to find");. 
36c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
36d0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
36e0: 20 28 21 5f 64 41 6e 61 6c 79 73 65 73 2e 68 61   (!_dAnalyses.ha
36f0: 73 28 61 57 6f 72 64 5b 31 5d 29 20 26 26 20 21  s(aWord[1]) && !
3700: 5f 73 74 6f 72 65 4d 6f 72 70 68 46 72 6f 6d 46  _storeMorphFromF
3710: 53 41 28 61 57 6f 72 64 5b 31 5d 29 29 20 7b 0a  SA(aWord[1])) {.
3720: 20 20 20 20 20 20 20 20 65 63 68 6f 28 22 3e 20          echo("> 
3730: 6e 6f 74 20 69 6e 20 46 53 41 22 29 3b 0a 20 20  not in FSA");.  
3740: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
3750: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  e;.    }.    if 
3760: 28 64 44 41 2e 68 61 73 28 61 57 6f 72 64 5b 30  (dDA.has(aWord[0
3770: 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 20 65 63  ])) {.        ec
3780: 68 6f 28 22 44 41 3a 20 22 20 2b 20 64 44 41 2e  ho("DA: " + dDA.
3790: 67 65 74 28 61 57 6f 72 64 5b 30 5d 29 29 3b 0a  get(aWord[0]));.
37a0: 20 20 20 20 7d 0a 20 20 20 20 65 63 68 6f 28 22      }.    echo("
37b0: 46 53 41 3a 20 22 20 2b 20 5f 64 41 6e 61 6c 79  FSA: " + _dAnaly
37c0: 73 65 73 2e 67 65 74 28 61 57 6f 72 64 5b 31 5d  ses.get(aWord[1]
37d0: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 74  ));.    return t
37e0: 72 75 65 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e  rue;.}..function
37f0: 20 5f 73 74 6f 72 65 4d 6f 72 70 68 46 72 6f 6d   _storeMorphFrom
3800: 46 53 41 20 28 73 57 6f 72 64 29 20 7b 0a 20 20  FSA (sWord) {.  
3810: 20 20 2f 2f 20 72 65 74 72 69 65 76 65 73 20 6d    // retrieves m
3820: 6f 72 70 68 6f 6c 6f 67 69 65 73 20 6c 69 73 74  orphologies list
3830: 20 66 72 6f 6d 20 5f 6f 44 69 63 74 20 2d 3e 20   from _oDict -> 
3840: 5f 64 41 6e 61 6c 79 73 65 73 0a 20 20 20 20 2f  _dAnalyses.    /
3850: 2f 65 63 68 6f 28 22 72 65 67 69 73 74 65 72 3a  /echo("register:
3860: 20 22 2b 73 57 6f 72 64 20 2b 20 22 20 22 20 2b   "+sWord + " " +
3870: 20 5f 6f 44 69 63 74 2e 67 65 74 4d 6f 72 70 68   _oDict.getMorph
3880: 28 73 57 6f 72 64 29 2e 74 6f 53 74 72 69 6e 67  (sWord).toString
3890: 28 29 29 0a 20 20 20 20 5f 64 41 6e 61 6c 79 73  ()).    _dAnalys
38a0: 65 73 2e 73 65 74 28 73 57 6f 72 64 2c 20 5f 6f  es.set(sWord, _o
38b0: 44 69 63 74 2e 67 65 74 4d 6f 72 70 68 28 73 57  Dict.getMorph(sW
38c0: 6f 72 64 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ord));.    retur
38d0: 6e 20 21 21 5f 64 41 6e 61 6c 79 73 65 73 2e 67  n !!_dAnalyses.g
38e0: 65 74 28 73 57 6f 72 64 29 3b 0a 7d 0a 0a 66 75  et(sWord);.}..fu
38f0: 6e 63 74 69 6f 6e 20 6d 6f 72 70 68 20 28 64 44  nction morph (dD
3900: 41 2c 20 61 57 6f 72 64 2c 20 73 50 61 74 74 65  A, aWord, sPatte
3910: 72 6e 2c 20 62 53 74 72 69 63 74 3d 74 72 75 65  rn, bStrict=true
3920: 2c 20 62 4e 6f 57 6f 72 64 3d 66 61 6c 73 65 29  , bNoWord=false)
3930: 20 7b 0a 20 20 20 20 2f 2f 20 61 6e 61 6c 79 73   {.    // analys
3940: 65 20 61 20 74 75 70 6c 65 20 28 70 6f 73 69 74  e a tuple (posit
3950: 69 6f 6e 2c 20 77 6f 72 64 29 2c 20 72 65 74 75  ion, word), retu
3960: 72 6e 20 74 72 75 65 20 69 66 20 73 50 61 74 74  rn true if sPatt
3970: 65 72 6e 20 69 6e 20 6d 6f 72 70 68 6f 6c 6f 67  ern in morpholog
3980: 69 65 73 20 28 64 69 73 61 6d 62 69 67 75 61 74  ies (disambiguat
3990: 69 6f 6e 20 6f 6e 29 0a 20 20 20 20 69 66 20 28  ion on).    if (
39a0: 21 61 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20  !aWord) {.      
39b0: 20 20 2f 2f 65 63 68 6f 28 22 6d 6f 72 70 68 3a    //echo("morph:
39c0: 20 6e 6f 77 6f 72 64 2c 20 72 65 74 75 72 6e 73   noword, returns
39d0: 20 22 20 2b 20 62 4e 6f 57 6f 72 64 29 3b 0a 20   " + bNoWord);. 
39e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 62 4e         return bN
39f0: 6f 57 6f 72 64 3b 0a 20 20 20 20 7d 0a 20 20 20  oWord;.    }.   
3a00: 20 2f 2f 65 63 68 6f 28 22 61 57 6f 72 64 3a 20   //echo("aWord: 
3a10: 22 2b 61 57 6f 72 64 2e 74 6f 53 74 72 69 6e 67  "+aWord.toString
3a20: 28 29 29 3b 0a 20 20 20 20 69 66 20 28 21 5f 64  ());.    if (!_d
3a30: 41 6e 61 6c 79 73 65 73 2e 68 61 73 28 61 57 6f  Analyses.has(aWo
3a40: 72 64 5b 31 5d 29 20 26 26 20 21 5f 73 74 6f 72  rd[1]) && !_stor
3a50: 65 4d 6f 72 70 68 46 72 6f 6d 46 53 41 28 61 57  eMorphFromFSA(aW
3a60: 6f 72 64 5b 31 5d 29 29 20 7b 0a 20 20 20 20 20  ord[1])) {.     
3a70: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
3a80: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 74 20 6c  .    }.    let l
3a90: 4d 6f 72 70 68 20 3d 20 64 44 41 2e 68 61 73 28  Morph = dDA.has(
3aa0: 61 57 6f 72 64 5b 30 5d 29 20 3f 20 64 44 41 2e  aWord[0]) ? dDA.
3ab0: 67 65 74 28 61 57 6f 72 64 5b 30 5d 29 20 3a 20  get(aWord[0]) : 
3ac0: 5f 64 41 6e 61 6c 79 73 65 73 2e 67 65 74 28 61  _dAnalyses.get(a
3ad0: 57 6f 72 64 5b 31 5d 29 3b 0a 20 20 20 20 2f 2f  Word[1]);.    //
3ae0: 65 63 68 6f 28 22 6c 4d 6f 72 70 68 3a 20 22 2b  echo("lMorph: "+
3af0: 6c 4d 6f 72 70 68 2e 74 6f 53 74 72 69 6e 67 28  lMorph.toString(
3b00: 29 29 3b 0a 20 20 20 20 69 66 20 28 6c 4d 6f 72  ));.    if (lMor
3b10: 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20 30 29  ph.length === 0)
3b20: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
3b30: 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20  n false;.    }. 
3b40: 20 20 20 2f 2f 65 63 68 6f 28 22 2a 2a 2a 22 29     //echo("***")
3b50: 3b 0a 20 20 20 20 69 66 20 28 62 53 74 72 69 63  ;.    if (bStric
3b60: 74 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  t) {.        ret
3b70: 75 72 6e 20 6c 4d 6f 72 70 68 2e 65 76 65 72 79  urn lMorph.every
3b80: 28 73 20 20 3d 3e 20 20 28 73 2e 73 65 61 72 63  (s  =>  (s.searc
3b90: 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20  h(sPattern) !== 
3ba0: 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  -1));.    }.    
3bb0: 72 65 74 75 72 6e 20 6c 4d 6f 72 70 68 2e 73 6f  return lMorph.so
3bc0: 6d 65 28 73 20 20 3d 3e 20 20 28 73 2e 73 65 61  me(s  =>  (s.sea
3bd0: 72 63 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d  rch(sPattern) !=
3be0: 3d 20 2d 31 29 29 3b 0a 7d 0a 0a 66 75 6e 63 74  = -1));.}..funct
3bf0: 69 6f 6e 20 6d 6f 72 70 68 65 78 20 28 64 44 41  ion morphex (dDA
3c00: 2c 20 61 57 6f 72 64 2c 20 73 50 61 74 74 65 72  , aWord, sPatter
3c10: 6e 2c 20 73 4e 65 67 50 61 74 74 65 72 6e 2c 20  n, sNegPattern, 
3c20: 62 4e 6f 57 6f 72 64 3d 66 61 6c 73 65 29 20 7b  bNoWord=false) {
3c30: 0a 20 20 20 20 2f 2f 20 61 6e 61 6c 79 73 65 20  .    // analyse 
3c40: 61 20 74 75 70 6c 65 20 28 70 6f 73 69 74 69 6f  a tuple (positio
3c50: 6e 2c 20 77 6f 72 64 29 2c 20 72 65 74 75 72 6e  n, word), return
3c60: 73 20 74 72 75 65 20 69 66 20 6e 6f 74 20 73 4e  s true if not sN
3c70: 65 67 50 61 74 74 65 72 6e 20 69 6e 20 77 6f 72  egPattern in wor
3c80: 64 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20 61  d morphologies a
3c90: 6e 64 20 73 50 61 74 74 65 72 6e 20 69 6e 20 77  nd sPattern in w
3ca0: 6f 72 64 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73  ord morphologies
3cb0: 20 28 64 69 73 61 6d 62 69 67 75 61 74 69 6f 6e   (disambiguation
3cc0: 20 6f 6e 29 0a 20 20 20 20 69 66 20 28 21 61 57   on).    if (!aW
3cd0: 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  ord) {.        /
3ce0: 2f 65 63 68 6f 28 22 6d 6f 72 70 68 3a 20 6e 6f  /echo("morph: no
3cf0: 77 6f 72 64 2c 20 72 65 74 75 72 6e 73 20 22 20  word, returns " 
3d00: 2b 20 62 4e 6f 57 6f 72 64 29 3b 0a 20 20 20 20  + bNoWord);.    
3d10: 20 20 20 20 72 65 74 75 72 6e 20 62 4e 6f 57 6f      return bNoWo
3d20: 72 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2f  rd;.    }.    //
3d30: 65 63 68 6f 28 22 61 57 6f 72 64 3a 20 22 2b 61  echo("aWord: "+a
3d40: 57 6f 72 64 2e 74 6f 53 74 72 69 6e 67 28 29 29  Word.toString())
3d50: 3b 0a 20 20 20 20 69 66 20 28 21 5f 64 41 6e 61  ;.    if (!_dAna
3d60: 6c 79 73 65 73 2e 68 61 73 28 61 57 6f 72 64 5b  lyses.has(aWord[
3d70: 31 5d 29 20 26 26 20 21 5f 73 74 6f 72 65 4d 6f  1]) && !_storeMo
3d80: 72 70 68 46 72 6f 6d 46 53 41 28 61 57 6f 72 64  rphFromFSA(aWord
3d90: 5b 31 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 20  [1])) {.        
3da0: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20  return false;.  
3db0: 20 20 7d 0a 20 20 20 20 6c 65 74 20 6c 4d 6f 72    }.    let lMor
3dc0: 70 68 20 3d 20 64 44 41 2e 68 61 73 28 61 57 6f  ph = dDA.has(aWo
3dd0: 72 64 5b 30 5d 29 20 3f 20 64 44 41 2e 67 65 74  rd[0]) ? dDA.get
3de0: 28 61 57 6f 72 64 5b 30 5d 29 20 3a 20 5f 64 41  (aWord[0]) : _dA
3df0: 6e 61 6c 79 73 65 73 2e 67 65 74 28 61 57 6f 72  nalyses.get(aWor
3e00: 64 5b 31 5d 29 3b 0a 20 20 20 20 2f 2f 65 63 68  d[1]);.    //ech
3e10: 6f 28 22 6c 4d 6f 72 70 68 3a 20 22 2b 6c 4d 6f  o("lMorph: "+lMo
3e20: 72 70 68 2e 74 6f 53 74 72 69 6e 67 28 29 29 3b  rph.toString());
3e30: 0a 20 20 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e  .    if (lMorph.
3e40: 6c 65 6e 67 74 68 20 3d 3d 3d 20 30 29 20 7b 0a  length === 0) {.
3e50: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
3e60: 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  alse;.    }.    
3e70: 2f 2f 65 63 68 6f 28 22 2a 2a 2a 22 29 3b 0a 20  //echo("***");. 
3e80: 20 20 20 2f 2f 20 63 68 65 63 6b 20 6e 65 67 61     // check nega
3e90: 74 69 76 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20  tive condition. 
3ea0: 20 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e 73 6f     if (lMorph.so
3eb0: 6d 65 28 73 20 20 3d 3e 20 20 28 73 2e 73 65 61  me(s  =>  (s.sea
3ec0: 72 63 68 28 73 4e 65 67 50 61 74 74 65 72 6e 29  rch(sNegPattern)
3ed0: 20 21 3d 3d 20 2d 31 29 29 29 20 7b 0a 20 20 20   !== -1))) {.   
3ee0: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
3ef0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2f 20  e;.    }.    // 
3f00: 73 65 61 72 63 68 20 73 50 61 74 74 65 72 6e 0a  search sPattern.
3f10: 20 20 20 20 72 65 74 75 72 6e 20 6c 4d 6f 72 70      return lMorp
3f20: 68 2e 73 6f 6d 65 28 73 20 20 3d 3e 20 20 28 73  h.some(s  =>  (s
3f30: 2e 73 65 61 72 63 68 28 73 50 61 74 74 65 72 6e  .search(sPattern
3f40: 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 7d 0a 0a 66  ) !== -1));.}..f
3f50: 75 6e 63 74 69 6f 6e 20 61 6e 61 6c 79 73 65 20  unction analyse 
3f60: 28 73 57 6f 72 64 2c 20 73 50 61 74 74 65 72 6e  (sWord, sPattern
3f70: 2c 20 62 53 74 72 69 63 74 3d 74 72 75 65 29 20  , bStrict=true) 
3f80: 7b 0a 20 20 20 20 2f 2f 20 61 6e 61 6c 79 73 65  {.    // analyse
3f90: 20 61 20 77 6f 72 64 2c 20 72 65 74 75 72 6e 20   a word, return 
3fa0: 74 72 75 65 20 69 66 20 73 50 61 74 74 65 72 6e  true if sPattern
3fb0: 20 69 6e 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73   in morphologies
3fc0: 20 28 64 69 73 61 6d 62 69 67 75 61 74 69 6f 6e   (disambiguation
3fd0: 20 6f 66 66 29 0a 20 20 20 20 69 66 20 28 21 5f   off).    if (!_
3fe0: 64 41 6e 61 6c 79 73 65 73 2e 68 61 73 28 73 57  dAnalyses.has(sW
3ff0: 6f 72 64 29 20 26 26 20 21 5f 73 74 6f 72 65 4d  ord) && !_storeM
4000: 6f 72 70 68 46 72 6f 6d 46 53 41 28 73 57 6f 72  orphFromFSA(sWor
4010: 64 29 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  d)) {.        re
4020: 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20  turn false;.    
4030: 7d 0a 20 20 20 20 69 66 20 28 62 53 74 72 69 63  }.    if (bStric
4040: 74 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  t) {.        ret
4050: 75 72 6e 20 5f 64 41 6e 61 6c 79 73 65 73 2e 67  urn _dAnalyses.g
4060: 65 74 28 73 57 6f 72 64 29 2e 65 76 65 72 79 28  et(sWord).every(
4070: 73 20 20 3d 3e 20 20 28 73 2e 73 65 61 72 63 68  s  =>  (s.search
4080: 28 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d  (sPattern) !== -
4090: 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  1));.    }.    r
40a0: 65 74 75 72 6e 20 5f 64 41 6e 61 6c 79 73 65 73  eturn _dAnalyses
40b0: 2e 67 65 74 28 73 57 6f 72 64 29 2e 73 6f 6d 65  .get(sWord).some
40c0: 28 73 20 20 3d 3e 20 20 28 73 2e 73 65 61 72 63  (s  =>  (s.searc
40d0: 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20  h(sPattern) !== 
40e0: 2d 31 29 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f  -1));.}..functio
40f0: 6e 20 61 6e 61 6c 79 73 65 78 20 28 73 57 6f 72  n analysex (sWor
4100: 64 2c 20 73 50 61 74 74 65 72 6e 2c 20 73 4e 65  d, sPattern, sNe
4110: 67 50 61 74 74 65 72 6e 29 20 7b 0a 20 20 20 20  gPattern) {.    
4120: 2f 2f 20 61 6e 61 6c 79 73 65 20 61 20 77 6f 72  // analyse a wor
4130: 64 2c 20 72 65 74 75 72 6e 73 20 54 72 75 65 20  d, returns True 
4140: 69 66 20 6e 6f 74 20 73 4e 65 67 50 61 74 74 65  if not sNegPatte
4150: 72 6e 20 69 6e 20 77 6f 72 64 20 6d 6f 72 70 68  rn in word morph
4160: 6f 6c 6f 67 69 65 73 20 61 6e 64 20 73 50 61 74  ologies and sPat
4170: 74 65 72 6e 20 69 6e 20 77 6f 72 64 20 6d 6f 72  tern in word mor
4180: 70 68 6f 6c 6f 67 69 65 73 20 28 64 69 73 61 6d  phologies (disam
4190: 62 69 67 75 61 74 69 6f 6e 20 6f 66 66 29 0a 20  biguation off). 
41a0: 20 20 20 69 66 20 28 21 5f 64 41 6e 61 6c 79 73     if (!_dAnalys
41b0: 65 73 2e 68 61 73 28 73 57 6f 72 64 29 20 26 26  es.has(sWord) &&
41c0: 20 21 5f 73 74 6f 72 65 4d 6f 72 70 68 46 72 6f   !_storeMorphFro
41d0: 6d 46 53 41 28 73 57 6f 72 64 29 29 20 7b 0a 20  mFSA(sWord)) {. 
41e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
41f0: 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  lse;.    }.    /
4200: 2f 20 63 68 65 63 6b 20 6e 65 67 61 74 69 76 65  / check negative
4210: 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20 20 20 69   condition.    i
4220: 66 20 28 5f 64 41 6e 61 6c 79 73 65 73 2e 67 65  f (_dAnalyses.ge
4230: 74 28 73 57 6f 72 64 29 2e 73 6f 6d 65 28 73 20  t(sWord).some(s 
4240: 20 3d 3e 20 20 28 73 2e 73 65 61 72 63 68 28 73   =>  (s.search(s
4250: 4e 65 67 50 61 74 74 65 72 6e 29 20 21 3d 3d 20  NegPattern) !== 
4260: 2d 31 29 29 29 20 7b 0a 20 20 20 20 20 20 20 20  -1))) {.        
4270: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20  return false;.  
4280: 20 20 7d 0a 20 20 20 20 2f 2f 20 73 65 61 72 63    }.    // searc
4290: 68 20 73 50 61 74 74 65 72 6e 0a 20 20 20 20 72  h sPattern.    r
42a0: 65 74 75 72 6e 20 5f 64 41 6e 61 6c 79 73 65 73  eturn _dAnalyses
42b0: 2e 67 65 74 28 73 57 6f 72 64 29 2e 73 6f 6d 65  .get(sWord).some
42c0: 28 73 20 20 3d 3e 20 20 28 73 2e 73 65 61 72 63  (s  =>  (s.searc
42d0: 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20  h(sPattern) !== 
42e0: 2d 31 29 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f  -1));.}..functio
42f0: 6e 20 73 74 65 6d 20 28 73 57 6f 72 64 29 20 7b  n stem (sWord) {
4300: 0a 20 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20  .    // returns 
4310: 61 20 6c 69 73 74 20 6f 66 20 73 57 6f 72 64 27  a list of sWord'
4320: 73 20 73 74 65 6d 73 0a 20 20 20 20 69 66 20 28  s stems.    if (
4330: 21 73 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20  !sWord) {.      
4340: 20 20 72 65 74 75 72 6e 20 5b 5d 3b 0a 20 20 20    return [];.   
4350: 20 7d 0a 20 20 20 20 69 66 20 28 21 5f 64 41 6e   }.    if (!_dAn
4360: 61 6c 79 73 65 73 2e 68 61 73 28 73 57 6f 72 64  alyses.has(sWord
4370: 29 20 26 26 20 21 5f 73 74 6f 72 65 4d 6f 72 70  ) && !_storeMorp
4380: 68 46 72 6f 6d 46 53 41 28 73 57 6f 72 64 29 29  hFromFSA(sWord))
4390: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
43a0: 6e 20 5b 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n [];.    }.    
43b0: 72 65 74 75 72 6e 20 5b 20 66 6f 72 20 28 73 20  return [ for (s 
43c0: 6f 66 20 5f 64 41 6e 61 6c 79 73 65 73 2e 67 65  of _dAnalyses.ge
43d0: 74 28 73 57 6f 72 64 29 29 20 20 73 2e 73 6c 69  t(sWord))  s.sli
43e0: 63 65 28 31 2c 20 73 2e 69 6e 64 65 78 4f 66 28  ce(1, s.indexOf(
43f0: 22 20 22 29 29 20 5d 3b 0a 7d 0a 0a 0a 2f 2f 2f  " ")) ];.}...///
4400: 2f 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 67  / functions to g
4410: 65 74 20 74 65 78 74 20 6f 75 74 73 69 64 65 20  et text outside 
4420: 70 61 74 74 65 72 6e 20 73 63 6f 70 65 0a 0a 2f  pattern scope../
4430: 2f 20 77 61 72 6e 69 6e 67 3a 20 63 68 65 63 6b  / warning: check
4440: 20 63 6f 6d 70 69 6c 65 5f 72 75 6c 65 73 2e 70   compile_rules.p
4450: 79 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  y to understand 
4460: 68 6f 77 20 69 74 20 77 6f 72 6b 73 0a 0a 66 75  how it works..fu
4470: 6e 63 74 69 6f 6e 20 6e 65 78 74 77 6f 72 64 20  nction nextword 
4480: 28 73 2c 20 69 53 74 61 72 74 2c 20 6e 29 20 7b  (s, iStart, n) {
4490: 0a 20 20 20 20 2f 2f 20 67 65 74 20 74 68 65 20  .    // get the 
44a0: 6e 74 68 20 77 6f 72 64 20 6f 66 20 74 68 65 20  nth word of the 
44b0: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 6f 72 20  input string or 
44c0: 65 6d 70 74 79 20 73 74 72 69 6e 67 0a 20 20 20  empty string.   
44d0: 20 6c 65 74 20 7a 20 3d 20 6e 65 77 20 52 65 67   let z = new Reg
44e0: 45 78 70 28 22 5e 28 20 2b 5b 61 2d 7a c3 a0 2d  Exp("^( +[a-z..-
44f0: c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3 96 30  ..A-Z..-....-..0
4500: 2d 39 c3 98 2d c3 9f c4 80 2d ca af ef ac 81 2d  -9..-....-.....-
4510: ef ac 86 25 5f 2d 5d 2b 29 7b 22 20 2b 20 28 6e  ...%_-]+){" + (n
4520: 2d 31 29 2e 74 6f 53 74 72 69 6e 67 28 29 20 2b  -1).toString() +
4530: 20 22 7d 20 2b 28 5b 61 2d 7a c3 a0 2d c3 b6 41   "} +([a-z..-..A
4540: 2d 5a c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39 c3  -Z..-....-..0-9.
4550: 98 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac 86  .-....-.....-...
4560: 25 5f 2d 5d 2b 29 22 2c 20 22 69 22 29 3b 0a 20  %_-]+)", "i");. 
4570: 20 20 20 6c 65 74 20 6d 20 3d 20 7a 2e 65 78 65     let m = z.exe
4580: 63 28 73 2e 73 6c 69 63 65 28 69 53 74 61 72 74  c(s.slice(iStart
4590: 29 29 3b 0a 20 20 20 20 69 66 20 28 21 6d 29 20  ));.    if (!m) 
45a0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
45b0: 20 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20   null;.    }.   
45c0: 20 72 65 74 75 72 6e 20 5b 69 53 74 61 72 74 20   return [iStart 
45d0: 2b 20 52 65 67 45 78 70 2e 6c 61 73 74 49 6e 64  + RegExp.lastInd
45e0: 65 78 20 2d 20 6d 5b 32 5d 2e 6c 65 6e 67 74 68  ex - m[2].length
45f0: 2c 20 6d 5b 32 5d 5d 3b 0a 7d 0a 0a 66 75 6e 63  , m[2]];.}..func
4600: 74 69 6f 6e 20 70 72 65 76 77 6f 72 64 20 28 73  tion prevword (s
4610: 2c 20 69 45 6e 64 2c 20 6e 29 20 7b 0a 20 20 20  , iEnd, n) {.   
4620: 20 2f 2f 20 67 65 74 20 74 68 65 20 28 2d 29 6e   // get the (-)n
4630: 74 68 20 77 6f 72 64 20 6f 66 20 74 68 65 20 69  th word of the i
4640: 6e 70 75 74 20 73 74 72 69 6e 67 20 6f 72 20 65  nput string or e
4650: 6d 70 74 79 20 73 74 72 69 6e 67 0a 20 20 20 20  mpty string.    
4660: 6c 65 74 20 7a 20 3d 20 6e 65 77 20 52 65 67 45  let z = new RegE
4670: 78 70 28 22 28 5b 61 2d 7a c3 a0 2d c3 b6 41 2d  xp("([a-z..-..A-
4680: 5a c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39 c3 98  Z..-....-..0-9..
4690: 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac 86 25  -....-.....-...%
46a0: 5f 2d 5d 2b 29 20 2b 28 5b 61 2d 7a c3 a0 2d c3  _-]+) +([a-z..-.
46b0: b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3 96 30 2d  .A-Z..-....-..0-
46c0: 39 c3 98 2d c3 9f c4 80 2d ca af ef ac 81 2d ef  9..-....-.....-.
46d0: ac 86 25 5f 2d 5d 2b 20 2b 29 7b 22 20 2b 20 28  ..%_-]+ +){" + (
46e0: 6e 2d 31 29 2e 74 6f 53 74 72 69 6e 67 28 29 20  n-1).toString() 
46f0: 2b 20 22 7d 24 22 2c 20 22 69 22 29 3b 0a 20 20  + "}$", "i");.  
4700: 20 20 6c 65 74 20 6d 20 3d 20 7a 2e 65 78 65 63    let m = z.exec
4710: 28 73 2e 73 6c 69 63 65 28 30 2c 20 69 45 6e 64  (s.slice(0, iEnd
4720: 29 29 3b 0a 20 20 20 20 69 66 20 28 21 6d 29 20  ));.    if (!m) 
4730: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
4740: 20 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20   null;.    }.   
4750: 20 72 65 74 75 72 6e 20 5b 6d 2e 69 6e 64 65 78   return [m.index
4760: 2c 20 6d 5b 31 5d 5d 3b 0a 7d 0a 0a 63 6f 6e 73  , m[1]];.}..cons
4770: 74 20 5f 7a 4e 65 78 74 57 6f 72 64 20 3d 20 6e  t _zNextWord = n
4780: 65 77 20 52 65 67 45 78 70 20 28 22 5e 20 2b 28  ew RegExp ("^ +(
4790: 5b 61 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8 2d c3  [a-z..-..A-Z..-.
47a0: bf c3 80 2d c3 96 30 2d 39 c3 98 2d c3 9f c4 80  ...-..0-9..-....
47b0: 2d ca af ef ac 81 2d ef ac 86 5f 5d 5b 61 2d 7a  -.....-..._][a-z
47c0: c3 a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d  ..-..A-Z..-....-
47d0: c3 96 30 2d 39 c3 98 2d c3 9f c4 80 2d ca af ef  ..0-9..-....-...
47e0: ac 81 2d ef ac 86 5f 2d 5d 2a 29 22 2c 20 22 69  ..-..._-]*)", "i
47f0: 22 29 3b 0a 63 6f 6e 73 74 20 5f 7a 50 72 65 76  ");.const _zPrev
4800: 57 6f 72 64 20 3d 20 6e 65 77 20 52 65 67 45 78  Word = new RegEx
4810: 70 20 28 22 28 5b 61 2d 7a c3 a0 2d c3 b6 41 2d  p ("([a-z..-..A-
4820: 5a c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39 c3 98  Z..-....-..0-9..
4830: 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac 86 5f  -....-.....-..._
4840: 5d 5b 61 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8 2d  ][a-z..-..A-Z..-
4850: c3 bf c3 80 2d c3 96 30 2d 39 c3 98 2d c3 9f c4  ....-..0-9..-...
4860: 80 2d ca af ef ac 81 2d ef ac 86 5f 2d 5d 2a 29  .-.....-..._-]*)
4870: 20 2b 24 22 2c 20 22 69 22 29 3b 0a 0a 66 75 6e   +$", "i");..fun
4880: 63 74 69 6f 6e 20 6e 65 78 74 77 6f 72 64 31 20  ction nextword1 
4890: 28 73 2c 20 69 53 74 61 72 74 29 20 7b 0a 20 20  (s, iStart) {.  
48a0: 20 20 2f 2f 20 67 65 74 20 6e 65 78 74 20 77 6f    // get next wo
48b0: 72 64 20 28 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  rd (optimization
48c0: 29 0a 20 20 20 20 6c 65 74 20 6d 20 3d 20 5f 7a  ).    let m = _z
48d0: 4e 65 78 74 57 6f 72 64 2e 65 78 65 63 28 73 2e  NextWord.exec(s.
48e0: 73 6c 69 63 65 28 69 53 74 61 72 74 29 29 3b 0a  slice(iStart));.
48f0: 20 20 20 20 69 66 20 28 21 6d 29 20 7b 0a 20 20      if (!m) {.  
4900: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c        return nul
4910: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  l;.    }.    ret
4920: 75 72 6e 20 5b 69 53 74 61 72 74 20 2b 20 52 65  urn [iStart + Re
4930: 67 45 78 70 2e 6c 61 73 74 49 6e 64 65 78 20 2d  gExp.lastIndex -
4940: 20 6d 5b 31 5d 2e 6c 65 6e 67 74 68 2c 20 6d 5b   m[1].length, m[
4950: 31 5d 5d 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e  1]];.}..function
4960: 20 70 72 65 76 77 6f 72 64 31 20 28 73 2c 20 69   prevword1 (s, i
4970: 45 6e 64 29 20 7b 0a 20 20 20 20 2f 2f 20 67 65  End) {.    // ge
4980: 74 20 70 72 65 76 69 6f 75 73 20 77 6f 72 64 20  t previous word 
4990: 28 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 29 0a 20  (optimization). 
49a0: 20 20 20 2f 2f 65 63 68 6f 28 22 70 72 65 76 31     //echo("prev1
49b0: 2c 20 73 3a 22 2b 73 29 3b 0a 20 20 20 20 2f 2f  , s:"+s);.    //
49c0: 65 63 68 6f 28 22 70 72 65 76 31 2c 20 73 2e 73  echo("prev1, s.s
49d0: 6c 69 63 65 28 30 2c 20 69 45 6e 64 29 3a 22 2b  lice(0, iEnd):"+
49e0: 73 2e 73 6c 69 63 65 28 30 2c 20 69 45 6e 64 29  s.slice(0, iEnd)
49f0: 29 3b 0a 20 20 20 20 6c 65 74 20 6d 20 3d 20 5f  );.    let m = _
4a00: 7a 50 72 65 76 57 6f 72 64 2e 65 78 65 63 28 73  zPrevWord.exec(s
4a10: 2e 73 6c 69 63 65 28 30 2c 20 69 45 6e 64 29 29  .slice(0, iEnd))
4a20: 3b 0a 20 20 20 20 2f 2f 65 63 68 6f 28 22 70 72  ;.    //echo("pr
4a30: 65 76 31 2c 20 6d 3a 22 2b 6d 29 3b 0a 20 20 20  ev1, m:"+m);.   
4a40: 20 69 66 20 28 21 6d 29 20 7b 0a 20 20 20 20 20   if (!m) {.     
4a50: 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a     return null;.
4a60: 20 20 20 20 7d 0a 20 20 20 20 2f 2f 65 63 68 6f      }.    //echo
4a70: 28 22 70 72 65 76 31 3a 20 22 20 2b 20 6d 2e 69  ("prev1: " + m.i
4a80: 6e 64 65 78 20 2b 20 22 20 22 20 2b 20 6d 5b 31  ndex + " " + m[1
4a90: 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 5b  ]);.    return [
4aa0: 6d 2e 69 6e 64 65 78 2c 20 6d 5b 31 5d 5d 3b 0a  m.index, m[1]];.
4ab0: 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 6c 6f 6f 6b  }..function look
4ac0: 20 28 73 2c 20 7a 50 61 74 74 65 72 6e 2c 20 7a   (s, zPattern, z
4ad0: 4e 65 67 50 61 74 74 65 72 6e 3d 6e 75 6c 6c 29  NegPattern=null)
4ae0: 20 7b 0a 20 20 20 20 2f 2f 20 73 65 65 6b 20 7a   {.    // seek z
4af0: 50 61 74 74 65 72 6e 20 69 6e 20 73 20 28 62 65  Pattern in s (be
4b00: 66 6f 72 65 2f 61 66 74 65 72 2f 66 75 6c 6c 74  fore/after/fullt
4b10: 65 78 74 29 2c 20 69 66 20 61 6e 74 69 70 61 74  ext), if antipat
4b20: 74 65 72 6e 20 7a 4e 65 67 50 61 74 74 65 72 6e  tern zNegPattern
4b30: 20 6e 6f 74 20 69 6e 20 73 0a 20 20 20 20 74 72   not in s.    tr
4b40: 79 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  y {.        if (
4b50: 7a 4e 65 67 50 61 74 74 65 72 6e 20 26 26 20 7a  zNegPattern && z
4b60: 4e 65 67 50 61 74 74 65 72 6e 2e 74 65 73 74 28  NegPattern.test(
4b70: 73 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  s)) {.          
4b80: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a    return false;.
4b90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4ba0: 20 20 72 65 74 75 72 6e 20 7a 50 61 74 74 65 72    return zPatter
4bb0: 6e 2e 74 65 73 74 28 73 29 3b 0a 20 20 20 20 7d  n.test(s);.    }
4bc0: 0a 20 20 20 20 63 61 74 63 68 20 28 65 29 20 7b  .    catch (e) {
4bd0: 0a 20 20 20 20 20 20 20 20 68 65 6c 70 65 72 73  .        helpers
4be0: 2e 6c 6f 67 65 72 72 6f 72 28 65 29 3b 0a 20 20  .logerror(e);.  
4bf0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 66    }.    return f
4c00: 61 6c 73 65 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f  alse;.}..functio
4c10: 6e 20 6c 6f 6f 6b 5f 63 68 6b 31 20 28 64 44 41  n look_chk1 (dDA
4c20: 2c 20 73 2c 20 6e 4f 66 66 73 65 74 2c 20 7a 50  , s, nOffset, zP
4c30: 61 74 74 65 72 6e 2c 20 73 50 61 74 74 65 72 6e  attern, sPattern
4c40: 47 72 6f 75 70 31 2c 20 73 4e 65 67 50 61 74 74  Group1, sNegPatt
4c50: 65 72 6e 47 72 6f 75 70 31 3d 6e 75 6c 6c 29 20  ernGroup1=null) 
4c60: 7b 0a 20 20 20 20 2f 2f 20 72 65 74 75 72 6e 73  {.    // returns
4c70: 20 54 72 75 65 20 69 66 20 73 20 68 61 73 20 70   True if s has p
4c80: 61 74 74 65 72 6e 20 7a 50 61 74 74 65 72 6e 20  attern zPattern 
4c90: 61 6e 64 20 6d 2e 67 72 6f 75 70 28 31 29 20 68  and m.group(1) h
4ca0: 61 73 20 70 61 74 74 65 72 6e 20 73 50 61 74 74  as pattern sPatt
4cb0: 65 72 6e 47 72 6f 75 70 31 0a 20 20 20 20 6c 65  ernGroup1.    le
4cc0: 74 20 6d 20 3d 20 7a 50 61 74 74 65 72 6e 2e 67  t m = zPattern.g
4cd0: 6c 5f 65 78 65 63 32 28 73 2c 20 6e 75 6c 6c 29  l_exec2(s, null)
4ce0: 3b 0a 20 20 20 20 69 66 20 28 21 6d 29 20 7b 0a  ;.    if (!m) {.
4cf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
4d00: 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  alse;.    }.    
4d10: 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 6c 65  try {.        le
4d20: 74 20 73 57 6f 72 64 20 3d 20 6d 5b 31 5d 3b 0a  t sWord = m[1];.
4d30: 20 20 20 20 20 20 20 20 6c 65 74 20 6e 50 6f 73          let nPos
4d40: 20 3d 20 6d 2e 73 74 61 72 74 5b 31 5d 20 2b 20   = m.start[1] + 
4d50: 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  nOffset;.       
4d60: 20 69 66 20 28 73 4e 65 67 50 61 74 74 65 72 6e   if (sNegPattern
4d70: 47 72 6f 75 70 31 29 20 7b 0a 20 20 20 20 20 20  Group1) {.      
4d80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 72        return mor
4d90: 70 68 65 78 28 64 44 41 2c 20 5b 6e 50 6f 73 2c  phex(dDA, [nPos,
4da0: 20 73 57 6f 72 64 5d 2c 20 73 50 61 74 74 65 72   sWord], sPatter
4db0: 6e 47 72 6f 75 70 31 2c 20 73 4e 65 67 50 61 74  nGroup1, sNegPat
4dc0: 74 65 72 6e 47 72 6f 75 70 31 29 3b 0a 20 20 20  ternGroup1);.   
4dd0: 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 20 20       } .        
4de0: 72 65 74 75 72 6e 20 6d 6f 72 70 68 28 64 44 41  return morph(dDA
4df0: 2c 20 5b 6e 50 6f 73 2c 20 73 57 6f 72 64 5d 2c  , [nPos, sWord],
4e00: 20 73 50 61 74 74 65 72 6e 47 72 6f 75 70 31 2c   sPatternGroup1,
4e10: 20 66 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20   false);.    }. 
4e20: 20 20 20 63 61 74 63 68 20 28 65 29 20 7b 0a 20     catch (e) {. 
4e30: 20 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e 6c         helpers.l
4e40: 6f 67 65 72 72 6f 72 28 65 29 3b 0a 20 20 20 20  ogerror(e);.    
4e50: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
4e60: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 2f 2f 2f 2f  ;.    }.}...////
4e70: 2f 2f 2f 2f 20 44 69 73 61 6d 62 69 67 75 61 74  //// Disambiguat
4e80: 6f 72 0a 0a 66 75 6e 63 74 69 6f 6e 20 73 65 6c  or..function sel
4e90: 65 63 74 20 28 64 44 41 2c 20 6e 50 6f 73 2c 20  ect (dDA, nPos, 
4ea0: 73 57 6f 72 64 2c 20 73 50 61 74 74 65 72 6e 2c  sWord, sPattern,
4eb0: 20 6c 44 65 66 61 75 6c 74 3d 6e 75 6c 6c 29 20   lDefault=null) 
4ec0: 7b 0a 20 20 20 20 69 66 20 28 21 73 57 6f 72 64  {.    if (!sWord
4ed0: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
4ee0: 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20  rn true;.    }. 
4ef0: 20 20 20 69 66 20 28 64 44 41 2e 68 61 73 28 6e     if (dDA.has(n
4f00: 50 6f 73 29 29 20 7b 0a 20 20 20 20 20 20 20 20  Pos)) {.        
4f10: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20  return true;.   
4f20: 20 7d 0a 20 20 20 20 69 66 20 28 21 5f 64 41 6e   }.    if (!_dAn
4f30: 61 6c 79 73 65 73 2e 68 61 73 28 73 57 6f 72 64  alyses.has(sWord
4f40: 29 20 26 26 20 21 5f 73 74 6f 72 65 4d 6f 72 70  ) && !_storeMorp
4f50: 68 46 72 6f 6d 46 53 41 28 73 57 6f 72 64 29 29  hFromFSA(sWord))
4f60: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
4f70: 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20  n true;.    }.  
4f80: 20 20 2f 2f 65 63 68 6f 28 22 6d 6f 72 70 68 3a    //echo("morph:
4f90: 20 22 2b 5f 64 41 6e 61 6c 79 73 65 73 2e 67 65   "+_dAnalyses.ge
4fa0: 74 28 73 57 6f 72 64 29 2e 74 6f 53 74 72 69 6e  t(sWord).toStrin
4fb0: 67 28 29 29 3b 0a 20 20 20 20 69 66 20 28 5f 64  g());.    if (_d
4fc0: 41 6e 61 6c 79 73 65 73 2e 67 65 74 28 73 57 6f  Analyses.get(sWo
4fd0: 72 64 29 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20 31  rd).length === 1
4fe0: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
4ff0: 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20  rn true;.    }. 
5000: 20 20 20 6c 65 74 20 6c 53 65 6c 65 63 74 20 3d     let lSelect =
5010: 20 5b 20 66 6f 72 20 28 73 4d 6f 72 70 68 20 6f   [ for (sMorph o
5020: 66 20 5f 64 41 6e 61 6c 79 73 65 73 2e 67 65 74  f _dAnalyses.get
5030: 28 73 57 6f 72 64 29 29 20 20 69 66 20 28 73 4d  (sWord))  if (sM
5040: 6f 72 70 68 2e 73 65 61 72 63 68 28 73 50 61 74  orph.search(sPat
5050: 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29 20 20 73  tern) !== -1)  s
5060: 4d 6f 72 70 68 20 5d 3b 0a 20 20 20 20 2f 2f 65  Morph ];.    //e
5070: 63 68 6f 28 22 6c 53 65 6c 65 63 74 3a 20 22 2b  cho("lSelect: "+
5080: 6c 53 65 6c 65 63 74 2e 74 6f 53 74 72 69 6e 67  lSelect.toString
5090: 28 29 29 3b 0a 20 20 20 20 69 66 20 28 6c 53 65  ());.    if (lSe
50a0: 6c 65 63 74 2e 6c 65 6e 67 74 68 20 3e 20 30 29  lect.length > 0)
50b0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 6c   {.        if (l
50c0: 53 65 6c 65 63 74 2e 6c 65 6e 67 74 68 20 21 3d  Select.length !=
50d0: 20 5f 64 41 6e 61 6c 79 73 65 73 2e 67 65 74 28   _dAnalyses.get(
50e0: 73 57 6f 72 64 29 2e 6c 65 6e 67 74 68 29 20 7b  sWord).length) {
50f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 44 41  .            dDA
5100: 2e 73 65 74 28 6e 50 6f 73 2c 20 6c 53 65 6c 65  .set(nPos, lSele
5110: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ct);.        }. 
5120: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6c 44     } else if (lD
5130: 65 66 61 75 6c 74 29 20 7b 0a 20 20 20 20 20 20  efault) {.      
5140: 20 20 64 44 41 2e 73 65 74 28 6e 50 6f 73 2c 20    dDA.set(nPos, 
5150: 6c 44 65 66 61 75 6c 29 3b 0a 20 20 20 20 7d 0a  lDefaul);.    }.
5160: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b      return true;
5170: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 65 78 63  .}..function exc
5180: 6c 75 64 65 20 28 64 44 41 2c 20 6e 50 6f 73 2c  lude (dDA, nPos,
5190: 20 73 57 6f 72 64 2c 20 73 50 61 74 74 65 72 6e   sWord, sPattern
51a0: 2c 20 6c 44 65 66 61 75 6c 74 3d 6e 75 6c 6c 29  , lDefault=null)
51b0: 20 7b 0a 20 20 20 20 69 66 20 28 21 73 57 6f 72   {.    if (!sWor
51c0: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d) {.        ret
51d0: 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a  urn true;.    }.
51e0: 20 20 20 20 69 66 20 28 64 44 41 2e 68 61 73 28      if (dDA.has(
51f0: 6e 50 6f 73 29 29 20 7b 0a 20 20 20 20 20 20 20  nPos)) {.       
5200: 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20   return true;.  
5210: 20 20 7d 0a 20 20 20 20 69 66 20 28 21 5f 64 41    }.    if (!_dA
5220: 6e 61 6c 79 73 65 73 2e 68 61 73 28 73 57 6f 72  nalyses.has(sWor
5230: 64 29 20 26 26 20 21 5f 73 74 6f 72 65 4d 6f 72  d) && !_storeMor
5240: 70 68 46 72 6f 6d 46 53 41 28 73 57 6f 72 64 29  phFromFSA(sWord)
5250: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
5260: 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20  rn true;.    }. 
5270: 20 20 20 69 66 20 28 5f 64 41 6e 61 6c 79 73 65     if (_dAnalyse
5280: 73 2e 67 65 74 28 73 57 6f 72 64 29 2e 6c 65 6e  s.get(sWord).len
5290: 67 74 68 20 3d 3d 3d 20 31 29 20 7b 0a 20 20 20  gth === 1) {.   
52a0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
52b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 74 20  ;.    }.    let 
52c0: 6c 53 65 6c 65 63 74 20 3d 20 5b 20 66 6f 72 20  lSelect = [ for 
52d0: 28 73 4d 6f 72 70 68 20 6f 66 20 5f 64 41 6e 61  (sMorph of _dAna
52e0: 6c 79 73 65 73 2e 67 65 74 28 73 57 6f 72 64 29  lyses.get(sWord)
52f0: 29 20 20 69 66 20 28 73 4d 6f 72 70 68 2e 73 65  )  if (sMorph.se
5300: 61 72 63 68 28 73 50 61 74 74 65 72 6e 29 20 3d  arch(sPattern) =
5310: 3d 3d 20 2d 31 29 20 20 73 4d 6f 72 70 68 20 5d  == -1)  sMorph ]
5320: 3b 0a 20 20 20 20 2f 2f 65 63 68 6f 28 22 6c 53  ;.    //echo("lS
5330: 65 6c 65 63 74 3a 20 22 2b 6c 53 65 6c 65 63 74  elect: "+lSelect
5340: 2e 74 6f 53 74 72 69 6e 67 28 29 29 3b 0a 20 20  .toString());.  
5350: 20 20 69 66 20 28 6c 53 65 6c 65 63 74 2e 6c 65    if (lSelect.le
5360: 6e 67 74 68 20 3e 20 30 29 20 7b 0a 20 20 20 20  ngth > 0) {.    
5370: 20 20 20 20 69 66 20 28 6c 53 65 6c 65 63 74 2e      if (lSelect.
5380: 6c 65 6e 67 74 68 20 21 3d 20 5f 64 41 6e 61 6c  length != _dAnal
5390: 79 73 65 73 2e 67 65 74 28 73 57 6f 72 64 29 2e  yses.get(sWord).
53a0: 6c 65 6e 67 74 68 29 20 7b 0a 20 20 20 20 20 20  length) {.      
53b0: 20 20 20 20 20 20 64 44 41 2e 73 65 74 28 6e 50        dDA.set(nP
53c0: 6f 73 2c 20 6c 53 65 6c 65 63 74 29 3b 0a 20 20  os, lSelect);.  
53d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
53e0: 73 65 20 69 66 20 28 6c 44 65 66 61 75 6c 74 29  se if (lDefault)
53f0: 20 7b 0a 20 20 20 20 20 20 20 20 64 44 41 2e 73   {.        dDA.s
5400: 65 74 28 6e 50 6f 73 2c 20 6c 44 65 66 61 75 6c  et(nPos, lDefaul
5410: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  t);.    }.    re
5420: 74 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a 66 75  turn true;.}..fu
5430: 6e 63 74 69 6f 6e 20 64 65 66 69 6e 65 20 28 64  nction define (d
5440: 44 41 2c 20 6e 50 6f 73 2c 20 6c 4d 6f 72 70 68  DA, nPos, lMorph
5450: 29 20 7b 0a 20 20 20 20 64 44 41 2e 73 65 74 28  ) {.    dDA.set(
5460: 6e 50 6f 73 2c 20 6c 4d 6f 72 70 68 29 3b 0a 20  nPos, lMorph);. 
5470: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a     return true;.
5480: 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 20 47 52 41  }...//////// GRA
5490: 4d 4d 41 52 20 43 48 45 43 4b 45 52 20 50 4c 55  MMAR CHECKER PLU
54a0: 47 49 4e 53 0a 0a 24 7b 70 6c 75 67 69 6e 73 4a  GINS..${pluginsJ
54b0: 53 7d 0a 0a 0a 24 7b 63 61 6c 6c 61 62 6c 65 73  S}...${callables
54c0: 4a 53 7d 0a 0a 0a 0a 69 66 20 28 74 79 70 65 6f  JS}....if (typeo
54d0: 66 28 65 78 70 6f 72 74 73 29 20 21 3d 3d 20 27  f(exports) !== '
54e0: 75 6e 64 65 66 69 6e 65 64 27 29 20 7b 0a 20 20  undefined') {.  
54f0: 20 20 65 78 70 6f 72 74 73 2e 6c 61 6e 67 20 3d    exports.lang =
5500: 20 67 63 5f 65 6e 67 69 6e 65 2e 6c 61 6e 67 3b   gc_engine.lang;
5510: 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 6c 6f 63  .    exports.loc
5520: 61 6c 65 73 20 3d 20 67 63 5f 65 6e 67 69 6e 65  ales = gc_engine
5530: 2e 6c 6f 63 61 6c 65 73 3b 0a 20 20 20 20 65 78  .locales;.    ex
5540: 70 6f 72 74 73 2e 70 6b 67 20 3d 20 67 63 5f 65  ports.pkg = gc_e
5550: 6e 67 69 6e 65 2e 70 6b 67 3b 0a 20 20 20 20 65  ngine.pkg;.    e
5560: 78 70 6f 72 74 73 2e 6e 61 6d 65 20 3d 20 67 63  xports.name = gc
5570: 5f 65 6e 67 69 6e 65 2e 6e 61 6d 65 3b 0a 20 20  _engine.name;.  
5580: 20 20 65 78 70 6f 72 74 73 2e 76 65 72 73 69 6f    exports.versio
5590: 6e 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 76 65  n = gc_engine.ve
55a0: 72 73 69 6f 6e 3b 0a 20 20 20 20 65 78 70 6f 72  rsion;.    expor
55b0: 74 73 2e 61 75 74 68 6f 72 20 3d 20 67 63 5f 65  ts.author = gc_e
55c0: 6e 67 69 6e 65 2e 61 75 74 68 6f 72 3b 0a 20 20  ngine.author;.  
55d0: 20 20 65 78 70 6f 72 74 73 2e 70 61 72 73 65 20    exports.parse 
55e0: 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 70 61 72 73  = gc_engine.pars
55f0: 65 3b 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 5f  e;.    exports._
5600: 7a 45 6e 64 4f 66 53 65 6e 74 65 6e 63 65 20 3d  zEndOfSentence =
5610: 20 67 63 5f 65 6e 67 69 6e 65 2e 5f 7a 45 6e 64   gc_engine._zEnd
5620: 4f 66 53 65 6e 74 65 6e 63 65 3b 0a 20 20 20 20  OfSentence;.    
5630: 65 78 70 6f 72 74 73 2e 5f 7a 42 65 67 69 6e 4f  exports._zBeginO
5640: 66 50 61 72 61 67 72 61 70 68 20 3d 20 67 63 5f  fParagraph = gc_
5650: 65 6e 67 69 6e 65 2e 5f 7a 42 65 67 69 6e 4f 66  engine._zBeginOf
5660: 50 61 72 61 67 72 61 70 68 3b 0a 20 20 20 20 65  Paragraph;.    e
5670: 78 70 6f 72 74 73 2e 5f 7a 45 6e 64 4f 66 50 61  xports._zEndOfPa
5680: 72 61 67 72 61 70 68 20 3d 20 67 63 5f 65 6e 67  ragraph = gc_eng
5690: 69 6e 65 2e 5f 7a 45 6e 64 4f 66 50 61 72 61 67  ine._zEndOfParag
56a0: 72 61 70 68 3b 0a 20 20 20 20 65 78 70 6f 72 74  raph;.    export
56b0: 73 2e 5f 67 65 74 53 65 6e 74 65 6e 63 65 42 6f  s._getSentenceBo
56c0: 75 6e 64 61 72 69 65 73 20 3d 20 67 63 5f 65 6e  undaries = gc_en
56d0: 67 69 6e 65 2e 5f 67 65 74 53 65 6e 74 65 6e 63  gine._getSentenc
56e0: 65 42 6f 75 6e 64 61 72 69 65 73 3b 0a 20 20 20  eBoundaries;.   
56f0: 20 65 78 70 6f 72 74 73 2e 5f 70 72 6f 6f 66 72   exports._proofr
5700: 65 61 64 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e  ead = gc_engine.
5710: 5f 70 72 6f 6f 66 72 65 61 64 3b 0a 20 20 20 20  _proofread;.    
5720: 65 78 70 6f 72 74 73 2e 5f 63 72 65 61 74 65 45  exports._createE
5730: 72 72 6f 72 20 3d 20 67 63 5f 65 6e 67 69 6e 65  rror = gc_engine
5740: 2e 5f 63 72 65 61 74 65 45 72 72 6f 72 3b 0a 20  ._createError;. 
5750: 20 20 20 65 78 70 6f 72 74 73 2e 5f 72 65 77 72     exports._rewr
5760: 69 74 65 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e  ite = gc_engine.
5770: 5f 72 65 77 72 69 74 65 3b 0a 20 20 20 20 65 78  _rewrite;.    ex
5780: 70 6f 72 74 73 2e 69 67 6e 6f 72 65 52 75 6c 65  ports.ignoreRule
5790: 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 69 67 6e   = gc_engine.ign
57a0: 6f 72 65 52 75 6c 65 3b 0a 20 20 20 20 65 78 70  oreRule;.    exp
57b0: 6f 72 74 73 2e 72 65 73 65 74 49 67 6e 6f 72 65  orts.resetIgnore
57c0: 52 75 6c 65 73 20 3d 20 67 63 5f 65 6e 67 69 6e  Rules = gc_engin
57d0: 65 2e 72 65 73 65 74 49 67 6e 6f 72 65 52 75 6c  e.resetIgnoreRul
57e0: 65 73 3b 0a 20 20 20 20 65 78 70 6f 72 74 73 2e  es;.    exports.
57f0: 72 65 61 63 74 69 76 61 74 65 52 75 6c 65 20 3d  reactivateRule =
5800: 20 67 63 5f 65 6e 67 69 6e 65 2e 72 65 61 63 74   gc_engine.react
5810: 69 76 61 74 65 52 75 6c 65 3b 0a 20 20 20 20 65  ivateRule;.    e
5820: 78 70 6f 72 74 73 2e 6c 69 73 74 52 75 6c 65 73  xports.listRules
5830: 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 6c 69 73   = gc_engine.lis
5840: 74 52 75 6c 65 73 3b 0a 20 20 20 20 65 78 70 6f  tRules;.    expo
5850: 72 74 73 2e 5f 67 65 74 52 75 6c 65 73 20 3d 20  rts._getRules = 
5860: 67 63 5f 65 6e 67 69 6e 65 2e 5f 67 65 74 52 75  gc_engine._getRu
5870: 6c 65 73 3b 0a 20 20 20 20 65 78 70 6f 72 74 73  les;.    exports
5880: 2e 6c 6f 61 64 20 3d 20 67 63 5f 65 6e 67 69 6e  .load = gc_engin
5890: 65 2e 6c 6f 61 64 3b 0a 20 20 20 20 65 78 70 6f  e.load;.    expo
58a0: 72 74 73 2e 67 65 74 44 69 63 74 69 6f 6e 61 72  rts.getDictionar
58b0: 79 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 67 65  y = gc_engine.ge
58c0: 74 44 69 63 74 69 6f 6e 61 72 79 3b 0a 20 20 20  tDictionary;.   
58d0: 20 65 78 70 6f 72 74 73 2e 73 65 74 4f 70 74 69   exports.setOpti
58e0: 6f 6e 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 73  on = gc_engine.s
58f0: 65 74 4f 70 74 69 6f 6e 3b 0a 20 20 20 20 65 78  etOption;.    ex
5900: 70 6f 72 74 73 2e 73 65 74 4f 70 74 69 6f 6e 73  ports.setOptions
5910: 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 73 65 74   = gc_engine.set
5920: 4f 70 74 69 6f 6e 73 3b 0a 20 20 20 20 65 78 70  Options;.    exp
5930: 6f 72 74 73 2e 67 65 74 4f 70 74 69 6f 6e 73 20  orts.getOptions 
5940: 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 67 65 74 4f  = gc_engine.getO
5950: 70 74 69 6f 6e 73 3b 0a 20 20 20 20 65 78 70 6f  ptions;.    expo
5960: 72 74 73 2e 67 65 74 44 65 66 61 75 6c 74 4f 70  rts.getDefaultOp
5970: 74 69 6f 6e 73 20 3d 20 67 63 5f 65 6e 67 69 6e  tions = gc_engin
5980: 65 2e 67 65 74 44 65 66 61 75 6c 74 4f 70 74 69  e.getDefaultOpti
5990: 6f 6e 73 3b 0a 20 20 20 20 65 78 70 6f 72 74 73  ons;.    exports
59a0: 2e 72 65 73 65 74 4f 70 74 69 6f 6e 73 20 3d 20  .resetOptions = 
59b0: 67 63 5f 65 6e 67 69 6e 65 2e 72 65 73 65 74 4f  gc_engine.resetO
59c0: 70 74 69 6f 6e 73 3b 0a 7d 0a                    ptions;.}.