Grammalecte  Hex Artifact Content

Artifact e7bf2c39e95a91685d2d6180bee282619b8abef6ce5d1bdc445d4e813fc867cc:


0000: 2f 2f 20 47 72 61 6d 6d 61 72 20 63 68 65 63 6b  // Grammar check
0010: 65 72 20 65 6e 67 69 6e 65 0a 2f 2a 6a 73 6c 69  er engine./*jsli
0020: 6e 74 20 65 73 76 65 72 73 69 6f 6e 3a 20 36 2a  nt esversion: 6*
0030: 2f 0a 2f 2a 67 6c 6f 62 61 6c 20 63 6f 6e 73 6f  /./*global conso
0040: 6c 65 2c 72 65 71 75 69 72 65 2c 65 78 70 6f 72  le,require,expor
0050: 74 73 2a 2f 0a 0a 22 75 73 65 20 73 74 72 69 63  ts*/.."use stric
0060: 74 22 3b 0a 0a 24 7b 73 74 72 69 6e 67 7d 0a 24  t";..${string}.$
0070: 7b 72 65 67 65 78 7d 0a 24 7b 6d 61 70 7d 0a 0a  {regex}.${map}..
0080: 0a 69 66 20 28 74 79 70 65 6f 66 28 72 65 71 75  .if (typeof(requ
0090: 69 72 65 29 20 21 3d 3d 20 27 75 6e 64 65 66 69  ire) !== 'undefi
00a0: 6e 65 64 27 29 20 7b 0a 20 20 20 20 76 61 72 20  ned') {.    var 
00b0: 68 65 6c 70 65 72 73 20 3d 20 72 65 71 75 69 72  helpers = requir
00c0: 65 28 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72  e("resource://gr
00d0: 61 6d 6d 61 6c 65 63 74 65 2f 67 72 61 70 68 73  ammalecte/graphs
00e0: 70 65 6c 6c 2f 68 65 6c 70 65 72 73 2e 6a 73 22  pell/helpers.js"
00f0: 29 3b 0a 20 20 20 20 76 61 72 20 67 63 5f 6f 70  );.    var gc_op
0100: 74 69 6f 6e 73 20 3d 20 72 65 71 75 69 72 65 28  tions = require(
0110: 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d  "resource://gram
0120: 6d 61 6c 65 63 74 65 2f 24 7b 6c 61 6e 67 7d 2f  malecte/${lang}/
0130: 67 63 5f 6f 70 74 69 6f 6e 73 2e 6a 73 22 29 3b  gc_options.js");
0140: 0a 20 20 20 20 76 61 72 20 67 63 5f 72 75 6c 65  .    var gc_rule
0150: 73 20 3d 20 72 65 71 75 69 72 65 28 22 72 65 73  s = require("res
0160: 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65  ource://grammale
0170: 63 74 65 2f 24 7b 6c 61 6e 67 7d 2f 67 63 5f 72  cte/${lang}/gc_r
0180: 75 6c 65 73 2e 6a 73 22 29 3b 0a 20 20 20 20 76  ules.js");.    v
0190: 61 72 20 63 72 65 67 65 78 20 3d 20 72 65 71 75  ar cregex = requ
01a0: 69 72 65 28 22 72 65 73 6f 75 72 63 65 3a 2f 2f  ire("resource://
01b0: 67 72 61 6d 6d 61 6c 65 63 74 65 2f 24 7b 6c 61  grammalecte/${la
01c0: 6e 67 7d 2f 63 72 65 67 65 78 2e 6a 73 22 29 3b  ng}/cregex.js");
01d0: 0a 20 20 20 20 76 61 72 20 74 65 78 74 20 3d 20  .    var text = 
01e0: 72 65 71 75 69 72 65 28 22 72 65 73 6f 75 72 63  require("resourc
01f0: 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74 65 2f  e://grammalecte/
0200: 74 65 78 74 2e 6a 73 22 29 3b 0a 20 20 20 20 76  text.js");.    v
0210: 61 72 20 65 63 68 6f 20 3d 20 68 65 6c 70 65 72  ar echo = helper
0220: 73 2e 65 63 68 6f 3b 0a 7d 0a 65 6c 73 65 20 69  s.echo;.}.else i
0230: 66 20 28 74 79 70 65 6f 66 28 63 6f 6e 73 6f 6c  f (typeof(consol
0240: 65 29 20 21 3d 3d 20 22 75 6e 64 65 66 69 6e 65  e) !== "undefine
0250: 64 22 29 20 7b 0a 20 20 20 20 76 61 72 20 65 63  d") {.    var ec
0260: 68 6f 20 3d 20 66 75 6e 63 74 69 6f 6e 20 28 6f  ho = function (o
0270: 29 20 7b 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28  ) { console.log(
0280: 6f 29 3b 20 72 65 74 75 72 6e 20 74 72 75 65 3b  o); return true;
0290: 20 7d 3b 0a 7d 0a 65 6c 73 65 20 7b 0a 20 20 20   };.}.else {.   
02a0: 20 76 61 72 20 65 63 68 6f 20 3d 20 66 75 6e 63   var echo = func
02b0: 74 69 6f 6e 20 28 29 20 7b 20 72 65 74 75 72 6e  tion () { return
02c0: 20 74 72 75 65 3b 20 7d 0a 7d 0a 0a 66 75 6e 63   true; }.}..func
02d0: 74 69 6f 6e 20 63 61 70 69 74 61 6c 69 7a 65 41  tion capitalizeA
02e0: 72 72 61 79 20 28 61 41 72 72 61 79 29 20 7b 0a  rray (aArray) {.
02f0: 20 20 20 20 2f 2f 20 63 61 6e e2 80 99 74 20 6d      // can...t m
0300: 61 70 20 6f 6e 20 75 73 65 72 20 64 65 66 69 6e  ap on user defin
0310: 65 64 20 66 75 6e 63 74 69 6f 6e 3f 3f 0a 20 20  ed function??.  
0320: 20 20 6c 65 74 20 61 4e 65 77 20 3d 20 5b 5d 3b    let aNew = [];
0330: 0a 20 20 20 20 66 6f 72 20 28 6c 65 74 20 69 20  .    for (let i 
0340: 3d 20 30 3b 20 69 20 3c 20 61 41 72 72 61 79 2e  = 0; i < aArray.
0350: 6c 65 6e 67 74 68 3b 20 69 20 3d 20 69 20 2b 20  length; i = i + 
0360: 31 29 20 7b 0a 20 20 20 20 20 20 20 20 61 4e 65  1) {.        aNe
0370: 77 5b 69 5d 20 3d 20 61 41 72 72 61 79 5b 69 5d  w[i] = aArray[i]
0380: 2e 67 6c 5f 74 6f 43 61 70 69 74 61 6c 69 7a 65  .gl_toCapitalize
0390: 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ();.    }.    re
03a0: 74 75 72 6e 20 61 4e 65 77 3b 0a 7d 0a 0a 0a 2f  turn aNew;.}.../
03b0: 2f 20 64 61 74 61 0a 6c 65 74 20 5f 73 41 70 70  / data.let _sApp
03c0: 43 6f 6e 74 65 78 74 20 3d 20 22 22 3b 20 20 20  Context = "";   
03d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
03f0: 2f 20 77 68 61 74 20 73 6f 66 74 77 61 72 65 20  / what software 
0400: 69 73 20 72 75 6e 6e 69 6e 67 0a 6c 65 74 20 5f  is running.let _
0410: 64 4f 70 74 69 6f 6e 73 20 3d 20 6e 75 6c 6c 3b  dOptions = null;
0420: 0a 6c 65 74 20 5f 61 49 67 6e 6f 72 65 64 52 75  .let _aIgnoredRu
0430: 6c 65 73 20 3d 20 6e 65 77 20 53 65 74 28 29 3b  les = new Set();
0440: 0a 6c 65 74 20 5f 6f 53 70 65 6c 6c 43 68 65 63  .let _oSpellChec
0450: 6b 65 72 20 3d 20 6e 75 6c 6c 3b 0a 6c 65 74 20  ker = null;.let 
0460: 5f 64 41 6e 61 6c 79 73 65 73 20 3d 20 6e 65 77  _dAnalyses = new
0470: 20 4d 61 70 28 29 3b 20 20 20 20 20 20 20 20 20   Map();         
0480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0490: 20 20 20 20 2f 2f 20 63 61 63 68 65 20 66 6f 72      // cache for
04a0: 20 64 61 74 61 20 66 72 6f 6d 20 64 69 63 74 69   data from dicti
04b0: 6f 6e 61 72 79 0a 0a 0a 76 61 72 20 67 63 5f 65  onary...var gc_e
04c0: 6e 67 69 6e 65 20 3d 20 7b 0a 0a 20 20 20 20 2f  ngine = {..    /
04d0: 2f 2f 2f 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 73  /// Informations
04e0: 0a 0a 20 20 20 20 6c 61 6e 67 3a 20 22 24 7b 6c  ..    lang: "${l
04f0: 61 6e 67 7d 22 2c 0a 20 20 20 20 6c 6f 63 61 6c  ang}",.    local
0500: 65 73 3a 20 24 7b 6c 6f 63 7d 2c 0a 20 20 20 20  es: ${loc},.    
0510: 70 6b 67 3a 20 22 24 7b 69 6d 70 6c 6e 61 6d 65  pkg: "${implname
0520: 7d 22 2c 0a 20 20 20 20 6e 61 6d 65 3a 20 22 24  }",.    name: "$
0530: 7b 6e 61 6d 65 7d 22 2c 0a 20 20 20 20 76 65 72  {name}",.    ver
0540: 73 69 6f 6e 3a 20 22 24 7b 76 65 72 73 69 6f 6e  sion: "${version
0550: 7d 22 2c 0a 20 20 20 20 61 75 74 68 6f 72 3a 20  }",.    author: 
0560: 22 24 7b 61 75 74 68 6f 72 7d 22 2c 0a 0a 20 20  "${author}",..  
0570: 20 20 2f 2f 2f 2f 20 50 61 72 73 69 6e 67 0a 0a    //// Parsing..
0580: 20 20 20 20 70 61 72 73 65 3a 20 66 75 6e 63 74      parse: funct
0590: 69 6f 6e 20 28 73 54 65 78 74 2c 20 73 43 6f 75  ion (sText, sCou
05a0: 6e 74 72 79 3d 22 24 7b 63 6f 75 6e 74 72 79 5f  ntry="${country_
05b0: 64 65 66 61 75 6c 74 7d 22 2c 20 62 44 65 62 75  default}", bDebu
05c0: 67 3d 66 61 6c 73 65 2c 20 62 43 6f 6e 74 65 78  g=false, bContex
05d0: 74 3d 66 61 6c 73 65 29 20 7b 0a 20 20 20 20 20  t=false) {.     
05e0: 20 20 20 2f 2f 20 61 6e 61 6c 79 73 65 73 20 74     // analyses t
05f0: 68 65 20 70 61 72 61 67 72 61 70 68 20 73 54 65  he paragraph sTe
0600: 78 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20 6c  xt and returns l
0610: 69 73 74 20 6f 66 20 65 72 72 6f 72 73 0a 20 20  ist of errors.  
0620: 20 20 20 20 20 20 6c 65 74 20 64 45 72 72 6f 72        let dError
0630: 73 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 65  s;.        let e
0640: 72 72 73 3b 0a 20 20 20 20 20 20 20 20 6c 65 74  rrs;.        let
0650: 20 73 41 6c 74 20 3d 20 73 54 65 78 74 3b 0a 20   sAlt = sText;. 
0660: 20 20 20 20 20 20 20 6c 65 74 20 64 44 41 20 3d         let dDA =
0670: 20 6e 65 77 20 4d 61 70 28 29 3b 20 20 20 20 20   new Map();     
0680: 20 20 20 2f 2f 20 44 69 73 61 6d 6e 62 69 67 75     // Disamnbigu
0690: 61 74 6f 72 0a 20 20 20 20 20 20 20 20 6c 65 74  ator.        let
06a0: 20 64 50 72 69 6f 72 69 74 79 20 3d 20 6e 65 77   dPriority = new
06b0: 20 4d 61 70 28 29 3b 20 20 2f 2f 20 4b 65 79 20   Map();  // Key 
06c0: 3d 20 70 6f 73 69 74 69 6f 6e 3b 20 76 61 6c 75  = position; valu
06d0: 65 20 3d 20 70 72 69 6f 72 69 74 79 0a 20 20 20  e = priority.   
06e0: 20 20 20 20 20 6c 65 74 20 73 4e 65 77 20 3d 20       let sNew = 
06f0: 22 22 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20  "";..        // 
0700: 70 61 72 73 65 20 70 61 72 61 67 72 61 70 68 0a  parse paragraph.
0710: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
0720: 20 20 20 20 20 20 20 20 20 20 5b 73 4e 65 77 2c            [sNew,
0730: 20 64 45 72 72 6f 72 73 5d 20 3d 20 74 68 69 73   dErrors] = this
0740: 2e 5f 70 72 6f 6f 66 72 65 61 64 28 73 54 65 78  ._proofread(sTex
0750: 74 2c 20 73 41 6c 74 2c 20 30 2c 20 74 72 75 65  t, sAlt, 0, true
0760: 2c 20 64 44 41 2c 20 64 50 72 69 6f 72 69 74 79  , dDA, dPriority
0770: 2c 20 73 43 6f 75 6e 74 72 79 2c 20 62 44 65 62  , sCountry, bDeb
0780: 75 67 2c 20 62 43 6f 6e 74 65 78 74 29 3b 0a 20  ug, bContext);. 
0790: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73             if (s
07a0: 4e 65 77 29 20 7b 0a 20 20 20 20 20 20 20 20 20  New) {.         
07b0: 20 20 20 20 20 20 20 73 54 65 78 74 20 3d 20 73         sText = s
07c0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20  New;.           
07d0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
07e0: 20 20 20 20 20 63 61 74 63 68 20 28 65 29 20 7b       catch (e) {
07f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 68 65 6c  .            hel
0800: 70 65 72 73 2e 6c 6f 67 65 72 72 6f 72 28 65 29  pers.logerror(e)
0810: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
0820: 20 20 20 20 20 2f 2f 20 63 6c 65 61 6e 75 70 0a       // cleanup.
0830: 20 20 20 20 20 20 20 20 69 66 20 28 73 54 65 78          if (sTex
0840: 74 2e 69 6e 63 6c 75 64 65 73 28 22 c2 a0 22 29  t.includes("..")
0850: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0860: 73 54 65 78 74 20 3d 20 73 54 65 78 74 2e 72 65  sText = sText.re
0870: 70 6c 61 63 65 28 2f c2 a0 2f 67 2c 20 27 20 27  place(/../g, ' '
0880: 29 3b 20 2f 2f 20 6e 62 73 70 0a 20 20 20 20 20  ); // nbsp.     
0890: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20     }.        if 
08a0: 28 73 54 65 78 74 2e 69 6e 63 6c 75 64 65 73 28  (sText.includes(
08b0: 22 e2 80 af 22 29 29 20 7b 0a 20 20 20 20 20 20  "...")) {.      
08c0: 20 20 20 20 20 20 73 54 65 78 74 20 3d 20 73 54        sText = sT
08d0: 65 78 74 2e 72 65 70 6c 61 63 65 28 2f e2 80 af  ext.replace(/...
08e0: 2f 67 2c 20 27 20 27 29 3b 20 2f 2f 20 73 6e 62  /g, ' '); // snb
08f0: 73 70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  sp.        }.   
0900: 20 20 20 20 20 69 66 20 28 73 54 65 78 74 2e 69       if (sText.i
0910: 6e 63 6c 75 64 65 73 28 22 27 22 29 29 20 7b 0a  ncludes("'")) {.
0920: 20 20 20 20 20 20 20 20 20 20 20 20 73 54 65 78              sTex
0930: 74 20 3d 20 73 54 65 78 74 2e 72 65 70 6c 61 63  t = sText.replac
0940: 65 28 2f 27 2f 67 2c 20 22 e2 80 99 22 29 3b 0a  e(/'/g, "...");.
0950: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0960: 20 20 69 66 20 28 73 54 65 78 74 2e 69 6e 63 6c    if (sText.incl
0970: 75 64 65 73 28 22 e2 80 91 22 29 29 20 7b 0a 20  udes("...")) {. 
0980: 20 20 20 20 20 20 20 20 20 20 20 73 54 65 78 74             sText
0990: 20 3d 20 73 54 65 78 74 2e 72 65 70 6c 61 63 65   = sText.replace
09a0: 28 2f e2 80 91 2f 67 2c 20 22 2d 22 29 3b 20 2f  (/.../g, "-"); /
09b0: 2f 20 6e 6f 62 72 65 61 6b 64 61 73 68 0a 20 20  / nobreakdash.  
09c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
09d0: 20 2f 2f 20 70 61 72 73 65 20 73 65 6e 74 65 6e   // parse senten
09e0: 63 65 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28  ce.        for (
09f0: 6c 65 74 20 5b 69 53 74 61 72 74 2c 20 69 45 6e  let [iStart, iEn
0a00: 64 5d 20 6f 66 20 74 68 69 73 2e 5f 67 65 74 53  d] of this._getS
0a10: 65 6e 74 65 6e 63 65 42 6f 75 6e 64 61 72 69 65  entenceBoundarie
0a20: 73 28 73 54 65 78 74 29 29 20 7b 0a 20 20 20 20  s(sText)) {.    
0a30: 20 20 20 20 20 20 20 20 69 66 20 28 34 20 3c 20          if (4 < 
0a40: 28 69 45 6e 64 20 2d 20 69 53 74 61 72 74 29 20  (iEnd - iStart) 
0a50: 3c 20 32 30 30 30 29 20 7b 0a 20 20 20 20 20 20  < 2000) {.      
0a60: 20 20 20 20 20 20 20 20 20 20 64 44 41 2e 63 6c            dDA.cl
0a70: 65 61 72 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ear();.         
0a80: 20 20 20 20 20 20 20 2f 2f 68 65 6c 70 65 72 73         //helpers
0a90: 2e 65 63 68 6f 28 73 54 65 78 74 2e 73 6c 69 63  .echo(sText.slic
0aa0: 65 28 69 53 74 61 72 74 2c 20 69 45 6e 64 29 29  e(iStart, iEnd))
0ab0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
0ac0: 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20    try {.        
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 2c 20 65              [, e
0ae0: 72 72 73 5d 20 3d 20 74 68 69 73 2e 5f 70 72 6f  rrs] = this._pro
0af0: 6f 66 72 65 61 64 28 73 54 65 78 74 2e 73 6c 69  ofread(sText.sli
0b00: 63 65 28 69 53 74 61 72 74 2c 20 69 45 6e 64 29  ce(iStart, iEnd)
0b10: 2c 20 73 41 6c 74 2e 73 6c 69 63 65 28 69 53 74  , sAlt.slice(iSt
0b20: 61 72 74 2c 20 69 45 6e 64 29 2c 20 69 53 74 61  art, iEnd), iSta
0b30: 72 74 2c 20 66 61 6c 73 65 2c 20 64 44 41 2c 20  rt, false, dDA, 
0b40: 64 50 72 69 6f 72 69 74 79 2c 20 73 43 6f 75 6e  dPriority, sCoun
0b50: 74 72 79 2c 20 62 44 65 62 75 67 2c 20 62 43 6f  try, bDebug, bCo
0b60: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 64 45 72 72              dErr
0b80: 6f 72 73 2e 67 6c 5f 75 70 64 61 74 65 28 65 72  ors.gl_update(er
0b90: 72 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rs);.           
0ba0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
0bb0: 20 20 20 20 20 20 20 63 61 74 63 68 20 28 65 29         catch (e)
0bc0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
0bd0: 20 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e 6c         helpers.l
0be0: 6f 67 65 72 72 6f 72 28 65 29 3b 0a 20 20 20 20  ogerror(e);.    
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
0c00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
0c10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
0c20: 74 75 72 6e 20 41 72 72 61 79 2e 66 72 6f 6d 28  turn Array.from(
0c30: 64 45 72 72 6f 72 73 2e 76 61 6c 75 65 73 28 29  dErrors.values()
0c40: 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 5f  );.    },..    _
0c50: 7a 45 6e 64 4f 66 53 65 6e 74 65 6e 63 65 3a 20  zEndOfSentence: 
0c60: 6e 65 77 20 52 65 67 45 78 70 20 28 27 28 5b 2e  new RegExp ('([.
0c70: 3f 21 3a 3b e2 80 a6 5d 5b 20 2e 3f 21 e2 80 a6  ?!:;...][ .?!...
0c80: 20 c2 bb e2 80 9d 22 29 5d 2a 7c 2e 24 29 27 2c   .....")]*|.$)',
0c90: 20 22 67 22 29 2c 0a 20 20 20 20 5f 7a 42 65 67   "g"),.    _zBeg
0ca0: 69 6e 4f 66 50 61 72 61 67 72 61 70 68 3a 20 6e  inOfParagraph: n
0cb0: 65 77 20 52 65 67 45 78 70 20 28 22 5e 5b 2d 20  ew RegExp ("^[- 
0cc0: c2 a0 e2 80 93 e2 80 94 2e 2c 3b 3f 21 e2 80 a6  .........,;?!...
0cd0: 5d 2a 22 2c 20 22 69 67 22 29 2c 0a 20 20 20 20  ]*", "ig"),.    
0ce0: 5f 7a 45 6e 64 4f 66 50 61 72 61 67 72 61 70 68  _zEndOfParagraph
0cf0: 3a 20 6e 65 77 20 52 65 67 45 78 70 20 28 22 5b  : new RegExp ("[
0d00: 2d 20 c2 a0 2e 2c 3b 3f 21 e2 80 a6 e2 80 93 e2  - ...,;?!.......
0d10: 80 94 5d 2a 24 22 2c 20 22 69 67 22 29 2c 0a 0a  ..]*$", "ig"),..
0d20: 20 20 20 20 5f 67 65 74 53 65 6e 74 65 6e 63 65      _getSentence
0d30: 42 6f 75 6e 64 61 72 69 65 73 3a 20 66 75 6e 63  Boundaries: func
0d40: 74 69 6f 6e 2a 20 28 73 54 65 78 74 29 20 7b 0a  tion* (sText) {.
0d50: 20 20 20 20 20 20 20 20 6c 65 74 20 6d 42 65 67          let mBeg
0d60: 69 6e 4f 66 53 65 6e 74 65 6e 63 65 20 3d 20 74  inOfSentence = t
0d70: 68 69 73 2e 5f 7a 42 65 67 69 6e 4f 66 50 61 72  his._zBeginOfPar
0d80: 61 67 72 61 70 68 2e 65 78 65 63 28 73 54 65 78  agraph.exec(sTex
0d90: 74 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  t);.        let 
0da0: 69 53 74 61 72 74 20 3d 20 74 68 69 73 2e 5f 7a  iStart = this._z
0db0: 42 65 67 69 6e 4f 66 50 61 72 61 67 72 61 70 68  BeginOfParagraph
0dc0: 2e 6c 61 73 74 49 6e 64 65 78 3b 0a 20 20 20 20  .lastIndex;.    
0dd0: 20 20 20 20 6c 65 74 20 6d 3b 0a 20 20 20 20 20      let m;.     
0de0: 20 20 20 77 68 69 6c 65 20 28 28 6d 20 3d 20 74     while ((m = t
0df0: 68 69 73 2e 5f 7a 45 6e 64 4f 66 53 65 6e 74 65  his._zEndOfSente
0e00: 6e 63 65 2e 65 78 65 63 28 73 54 65 78 74 29 29  nce.exec(sText))
0e10: 20 21 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20   !== null) {.   
0e20: 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 5b           yield [
0e30: 69 53 74 61 72 74 2c 20 74 68 69 73 2e 5f 7a 45  iStart, this._zE
0e40: 6e 64 4f 66 53 65 6e 74 65 6e 63 65 2e 6c 61 73  ndOfSentence.las
0e50: 74 49 6e 64 65 78 5d 3b 0a 20 20 20 20 20 20 20  tIndex];.       
0e60: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 74 68       iStart = th
0e70: 69 73 2e 5f 7a 45 6e 64 4f 66 53 65 6e 74 65 6e  is._zEndOfSenten
0e80: 63 65 2e 6c 61 73 74 49 6e 64 65 78 3b 0a 20 20  ce.lastIndex;.  
0e90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 2c 0a 0a        }.    },..
0ea0: 20 20 20 20 5f 70 72 6f 6f 66 72 65 61 64 3a 20      _proofread: 
0eb0: 66 75 6e 63 74 69 6f 6e 20 28 73 2c 20 73 78 2c  function (s, sx,
0ec0: 20 6e 4f 66 66 73 65 74 2c 20 62 50 61 72 61 67   nOffset, bParag
0ed0: 72 61 70 68 2c 20 64 44 41 2c 20 64 50 72 69 6f  raph, dDA, dPrio
0ee0: 72 69 74 79 2c 20 73 43 6f 75 6e 74 72 79 2c 20  rity, sCountry, 
0ef0: 62 44 65 62 75 67 2c 20 62 43 6f 6e 74 65 78 74  bDebug, bContext
0f00: 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ) {.        let 
0f10: 64 45 72 72 73 20 3d 20 6e 65 77 20 4d 61 70 28  dErrs = new Map(
0f20: 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 62  );.        let b
0f30: 43 68 61 6e 67 65 20 3d 20 66 61 6c 73 65 3b 0a  Change = false;.
0f40: 20 20 20 20 20 20 20 20 6c 65 74 20 62 49 64 52          let bIdR
0f50: 75 6c 65 20 3d 20 6f 70 74 69 6f 6e 28 27 69 64  ule = option('id
0f60: 72 75 6c 65 27 29 3b 0a 20 20 20 20 20 20 20 20  rule');.        
0f70: 6c 65 74 20 6d 3b 0a 20 20 20 20 20 20 20 20 6c  let m;.        l
0f80: 65 74 20 62 43 6f 6e 64 4d 65 6d 6f 3b 0a 20 20  et bCondMemo;.  
0f90: 20 20 20 20 20 20 6c 65 74 20 6e 45 72 72 6f 72        let nError
0fa0: 53 74 61 72 74 3b 0a 0a 20 20 20 20 20 20 20 20  Start;..        
0fb0: 66 6f 72 20 28 6c 65 74 20 5b 73 4f 70 74 69 6f  for (let [sOptio
0fc0: 6e 2c 20 6c 52 75 6c 65 47 72 6f 75 70 5d 20 6f  n, lRuleGroup] o
0fd0: 66 20 74 68 69 73 2e 5f 67 65 74 52 75 6c 65 73  f this._getRules
0fe0: 28 62 50 61 72 61 67 72 61 70 68 29 29 20 7b 0a  (bParagraph)) {.
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
1000: 21 73 4f 70 74 69 6f 6e 20 7c 7c 20 6f 70 74 69  !sOption || opti
1010: 6f 6e 28 73 4f 70 74 69 6f 6e 29 29 20 7b 0a 20  on(sOption)) {. 
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1030: 6f 72 20 28 6c 65 74 20 5b 7a 52 65 67 65 78 2c  or (let [zRegex,
1040: 20 62 55 70 70 65 72 63 61 73 65 2c 20 73 4c 69   bUppercase, sLi
1050: 6e 65 49 64 2c 20 73 52 75 6c 65 49 64 2c 20 6e  neId, sRuleId, n
1060: 50 72 69 6f 72 69 74 79 2c 20 6c 41 63 74 69 6f  Priority, lActio
1070: 6e 73 2c 20 6c 47 72 6f 75 70 73 2c 20 6c 4e 65  ns, lGroups, lNe
1080: 67 4c 6f 6f 6b 42 65 66 6f 72 65 5d 20 6f 66 20  gLookBefore] of 
1090: 6c 52 75 6c 65 47 72 6f 75 70 29 20 7b 0a 20 20  lRuleGroup) {.  
10a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b0: 20 20 69 66 20 28 21 5f 61 49 67 6e 6f 72 65 64    if (!_aIgnored
10c0: 52 75 6c 65 73 2e 68 61 73 28 73 52 75 6c 65 49  Rules.has(sRuleI
10d0: 64 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  d)) {.          
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
10f0: 69 6c 65 20 28 28 6d 20 3d 20 7a 52 65 67 65 78  ile ((m = zRegex
1100: 2e 67 6c 5f 65 78 65 63 32 28 73 2c 20 6c 47 72  .gl_exec2(s, lGr
1110: 6f 75 70 73 2c 20 6c 4e 65 67 4c 6f 6f 6b 42 65  oups, lNegLookBe
1120: 66 6f 72 65 29 29 20 21 3d 3d 20 6e 75 6c 6c 29  fore)) !== null)
1130: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1150: 43 6f 6e 64 4d 65 6d 6f 20 3d 20 6e 75 6c 6c 3b  CondMemo = null;
1160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 69               /*i
1180: 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20  f (bDebug) {.   
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 65 6c               hel
11b0: 70 65 72 73 2e 65 63 68 6f 28 22 3e 3e 3e 3e 20  pers.echo(">>>> 
11c0: 52 75 6c 65 20 23 20 22 20 2b 20 73 4c 69 6e 65  Rule # " + sLine
11d0: 49 64 20 2b 20 22 20 2d 20 54 65 78 74 3a 20 22  Id + " - Text: "
11e0: 20 2b 20 73 20 2b 20 22 20 6f 70 74 3a 20 22 2b   + s + " opt: "+
11f0: 20 73 4f 70 74 69 6f 6e 29 3b 0a 20 20 20 20 20   sOption);.     
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1210: 20 20 20 20 20 20 20 7d 2a 2f 0a 20 20 20 20 20         }*/.     
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1230: 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20         for (let 
1240: 5b 73 46 75 6e 63 43 6f 6e 64 2c 20 63 41 63 74  [sFuncCond, cAct
1250: 69 6f 6e 54 79 70 65 2c 20 73 57 68 61 74 2c 20  ionType, sWhat, 
1260: 2e 2e 2e 65 41 63 74 5d 20 6f 66 20 6c 41 63 74  ...eAct] of lAct
1270: 69 6f 6e 73 29 20 7b 0a 20 20 20 20 20 20 20 20  ions) {.        
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 20 20 2f 2f 20 61 63 74 69 6f 6e 20 69 6e      // action in
12a0: 20 6c 41 63 74 69 6f 6e 73 3a 20 5b 20 63 6f 6e   lActions: [ con
12b0: 64 69 74 69 6f 6e 2c 20 61 63 74 69 6f 6e 20 74  dition, action t
12c0: 79 70 65 2c 20 72 65 70 6c 61 63 65 6d 65 6e 74  ype, replacement
12d0: 2f 73 75 67 67 65 73 74 69 6f 6e 2f 61 63 74 69  /suggestion/acti
12e0: 6f 6e 5b 2c 20 69 47 72 6f 75 70 5b 2c 20 6d 65  on[, iGroup[, me
12f0: 73 73 61 67 65 2c 20 55 52 4c 5d 5d 20 5d 0a 20  ssage, URL]] ]. 
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1320: 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ry {.           
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 20 20 20 20 20 20 20 20 20 2f 2f 68 65 6c 70 65           //helpe
1350: 72 73 2e 65 63 68 6f 28 6f 45 76 61 6c 46 75 6e  rs.echo(oEvalFun
1360: 63 5b 73 46 75 6e 63 43 6f 6e 64 5d 29 3b 0a 20  c[sFuncCond]);. 
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 20 20 20 62 43 6f 6e 64 4d 65 6d 6f 20 3d 20 28     bCondMemo = (
13a0: 21 73 46 75 6e 63 43 6f 6e 64 20 7c 7c 20 6f 45  !sFuncCond || oE
13b0: 76 61 6c 46 75 6e 63 5b 73 46 75 6e 63 43 6f 6e  valFunc[sFuncCon
13c0: 64 5d 28 73 2c 20 73 78 2c 20 6d 2c 20 64 44 41  d](s, sx, m, dDA
13d0: 2c 20 73 43 6f 75 6e 74 72 79 2c 20 62 43 6f 6e  , sCountry, bCon
13e0: 64 4d 65 6d 6f 29 29 3b 0a 20 20 20 20 20 20 20  dMemo));.       
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1410: 28 62 43 6f 6e 64 4d 65 6d 6f 29 20 7b 0a 20 20  (bCondMemo) {.  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 20 73 77 69 74 63 68 20 28 63 41        switch (cA
1450: 63 74 69 6f 6e 54 79 70 65 29 20 7b 0a 20 20 20  ctionType) {.   
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1470: 20 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 63 61 73 65 20 22 2d           case "-
1490: 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ":.             
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c0: 20 20 20 2f 2f 20 67 72 61 6d 6d 61 72 20 65 72     // grammar er
14d0: 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ror.            
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 20 20 20 20 20                  
1500: 20 20 20 20 2f 2f 68 65 6c 70 65 72 73 2e 65 63      //helpers.ec
1510: 68 6f 28 22 2d 3e 20 65 72 72 6f 72 20 64 65 74  ho("-> error det
1520: 65 63 74 65 64 20 69 6e 20 22 20 2b 20 73 4c 69  ected in " + sLi
1530: 6e 65 49 64 20 2b 20 22 5c 6e 7a 52 65 67 65 78  neId + "\nzRegex
1540: 3a 20 22 20 2b 20 7a 52 65 67 65 78 2e 73 6f 75  : " + zRegex.sou
1550: 72 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rce);.          
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 20 20 20 20 20 20 20 20                  
1580: 20 20 20 20 20 20 6e 45 72 72 6f 72 53 74 61 72        nErrorStar
1590: 74 20 3d 20 6e 4f 66 66 73 65 74 20 2b 20 6d 2e  t = nOffset + m.
15a0: 73 74 61 72 74 5b 65 41 63 74 5b 30 5d 5d 3b 0a  start[eAct[0]];.
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e0: 69 66 20 28 21 64 45 72 72 73 2e 68 61 73 28 6e  if (!dErrs.has(n
15f0: 45 72 72 6f 72 53 74 61 72 74 29 20 7c 7c 20 6e  ErrorStart) || n
1600: 50 72 69 6f 72 69 74 79 20 3e 20 64 50 72 69 6f  Priority > dPrio
1610: 72 69 74 79 2e 67 65 74 28 6e 45 72 72 6f 72 53  rity.get(nErrorS
1620: 74 61 72 74 29 29 20 7b 0a 20 20 20 20 20 20 20  tart)) {.       
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 45 72               dEr
1660: 72 73 2e 73 65 74 28 6e 45 72 72 6f 72 53 74 61  rs.set(nErrorSta
1670: 72 74 2c 20 74 68 69 73 2e 5f 63 72 65 61 74 65  rt, this._create
1680: 45 72 72 6f 72 28 73 2c 20 73 78 2c 20 73 57 68  Error(s, sx, sWh
1690: 61 74 2c 20 6e 4f 66 66 73 65 74 2c 20 6d 2c 20  at, nOffset, m, 
16a0: 65 41 63 74 5b 30 5d 2c 20 73 4c 69 6e 65 49 64  eAct[0], sLineId
16b0: 2c 20 73 52 75 6c 65 49 64 2c 20 62 55 70 70 65  , sRuleId, bUppe
16c0: 72 63 61 73 65 2c 20 65 41 63 74 5b 31 5d 2c 20  rcase, eAct[1], 
16d0: 65 41 63 74 5b 32 5d 2c 20 62 49 64 52 75 6c 65  eAct[2], bIdRule
16e0: 2c 20 73 4f 70 74 69 6f 6e 2c 20 62 43 6f 6e 74  , sOption, bCont
16f0: 65 78 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ext));.         
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 64 50 72 69 6f             dPrio
1730: 72 69 74 79 2e 73 65 74 28 6e 45 72 72 6f 72 53  rity.set(nErrorS
1740: 74 61 72 74 2c 20 6e 50 72 69 6f 72 69 74 79 29  tart, nPriority)
1750: 3b 0a 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 20 20                  
1780: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 63 61 73 65 20 22 7e 22 3a         case "~":
17f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 2f 2f 20 74 65 78 74 20 70 72 6f 63 65 73 73   // text process
1830: 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  or.             
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 20 20 20                  
1860: 20 20 20 2f 2f 68 65 6c 70 65 72 73 2e 65 63 68     //helpers.ech
1870: 6f 28 22 2d 3e 20 74 65 78 74 20 70 72 6f 63 65  o("-> text proce
1880: 73 73 6f 72 20 62 79 20 22 20 2b 20 73 4c 69 6e  ssor by " + sLin
1890: 65 49 64 20 2b 20 22 5c 6e 7a 52 65 67 65 78 3a  eId + "\nzRegex:
18a0: 20 22 20 2b 20 7a 52 65 67 65 78 2e 73 6f 75 72   " + zRegex.sour
18b0: 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ce);.           
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 20                  
18e0: 20 20 20 20 20 73 20 3d 20 74 68 69 73 2e 5f 72       s = this._r
18f0: 65 77 72 69 74 65 28 73 2c 20 73 57 68 61 74 2c  ewrite(s, sWhat,
1900: 20 65 41 63 74 5b 30 5d 2c 20 6d 2c 20 62 55 70   eAct[0], m, bUp
1910: 70 65 72 63 61 73 65 29 3b 0a 20 20 20 20 20 20  percase);.      
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 20 62 43 68 61 6e 67            bChang
1950: 65 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20  e = true;.      
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 20 20 20 20 20                  
1980: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62 44            if (bD
1990: 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20  ebug) {.        
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 68 65 6c 70              help
19d0: 65 72 73 2e 65 63 68 6f 28 22 7e 20 22 20 2b 20  ers.echo("~ " + 
19e0: 73 20 2b 20 22 20 20 2d 2d 20 22 20 2b 20 6d 5b  s + "  -- " + m[
19f0: 65 41 63 74 5b 30 5d 5d 20 2b 20 22 20 20 23 20  eAct[0]] + "  # 
1a00: 22 20 2b 20 73 4c 69 6e 65 49 64 29 3b 0a 20 20  " + sLineId);.  
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 20 20 20 20 20 20                  
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
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 63 61 73 65 20 22 3d 22 3a 0a 20 20 20     case "=":.   
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 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 2f 2f 20               // 
1ae0: 64 69 73 61 6d 62 69 67 75 61 74 69 6f 6e 0a 20  disambiguation. 
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 2f                 /
1b20: 2f 68 65 6c 70 65 72 73 2e 65 63 68 6f 28 22 2d  /helpers.echo("-
1b30: 3e 20 64 69 73 61 6d 62 69 67 75 61 74 69 6f 6e  > disambiguation
1b40: 20 62 79 20 22 20 2b 20 73 4c 69 6e 65 49 64 20   by " + sLineId 
1b50: 2b 20 22 5c 6e 7a 52 65 67 65 78 3a 20 22 20 2b  + "\nzRegex: " +
1b60: 20 7a 52 65 67 65 78 2e 73 6f 75 72 63 65 29 3b   zRegex.source);
1b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
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 6f 45 76 61 6c 46 75 6e 63 5b 73 57 68 61 74   oEvalFunc[sWhat
1bb0: 5d 28 73 2c 20 6d 2c 20 64 44 41 29 3b 0a 20 20  ](s, m, dDA);.  
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 20 20 20 20 20 20                  
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1bf0: 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20   (bDebug) {.    
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 68 65 6c 70 65 72 73 2e 65 63 68 6f 28 22 3d 20  helpers.echo("= 
1c40: 22 20 2b 20 6d 5b 30 5d 20 2b 20 22 20 20 23 20  " + m[0] + "  # 
1c50: 22 20 2b 20 73 4c 69 6e 65 49 64 20 2b 20 22 5c  " + sLineId + "\
1c60: 6e 44 41 3a 20 22 20 2b 20 64 44 41 2e 67 6c 5f  nDA: " + dDA.gl_
1c70: 74 6f 53 74 72 69 6e 67 28 29 29 3b 0a 20 20 20  toString());.   
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 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 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1ce0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 20 20 63 61 73 65 20 22 3e 22 3a 0a 20 20 20 20    case ">":.    
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 77              // w
1d50: 65 20 64 6f 20 6e 6f 74 68 69 6e 67 2c 20 74 68  e do nothing, th
1d60: 69 73 20 74 65 73 74 20 69 73 20 6a 75 73 74 20  is test is just 
1d70: 61 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 61  a condition to a
1d80: 70 70 6c 79 20 61 6c 6c 20 66 6f 6c 6c 6f 77 69  pply all followi
1d90: 6e 67 20 61 63 74 69 6f 6e 73 0a 20 20 20 20 20  ng actions.     
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1dd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
1e00: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20  fault:.         
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e 65         helpers.e
1e40: 63 68 6f 28 22 23 20 65 72 72 6f 72 3a 20 75 6e  cho("# error: un
1e50: 6b 6e 6f 77 6e 20 61 63 74 69 6f 6e 20 61 74 20  known action at 
1e60: 22 20 2b 20 73 4c 69 6e 65 49 64 29 3b 0a 20 20  " + sLineId);.  
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 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 7d 0a 20 20 20 20 20 20 20 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 7d 20 65 6c              } el
1ec0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
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 69 66 20               if 
1ef0: 28 63 41 63 74 69 6f 6e 54 79 70 65 20 3d 3d 20  (cActionType == 
1f00: 22 3e 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ">") {.         
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
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 7d 0a 20 20 20 20            }.    
1fb0: 20 20 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 63 61 74 63              catc
1fd0: 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20  h (e) {.        
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 68 65 6c 70              help
2000: 65 72 73 2e 65 63 68 6f 28 73 29 3b 0a 20 20 20  ers.echo(s);.   
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 20 68 65 6c 70 65 72 73 2e 65 63 68 6f 28 22 23   helpers.echo("#
2040: 20 6c 69 6e 65 20 69 64 3a 20 22 20 2b 20 73 4c   line id: " + sL
2050: 69 6e 65 49 64 20 2b 20 22 5c 6e 23 20 72 75 6c  ineId + "\n# rul
2060: 65 20 69 64 3a 20 22 20 2b 20 73 52 75 6c 65 49  e id: " + sRuleI
2070: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e          helpers.
20a0: 6c 6f 67 65 72 72 6f 72 28 65 29 3b 0a 20 20 20  logerror(e);.   
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2110: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2130: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2150: 66 20 28 62 43 68 61 6e 67 65 29 20 7b 0a 20 20  f (bChange) {.  
2160: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2170: 20 5b 73 2c 20 64 45 72 72 73 5d 3b 0a 20 20 20   [s, dErrs];.   
2180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2190: 65 74 75 72 6e 20 5b 66 61 6c 73 65 2c 20 64 45  eturn [false, dE
21a0: 72 72 73 5d 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20  rrs];.    },..  
21b0: 20 20 5f 63 72 65 61 74 65 45 72 72 6f 72 3a 20    _createError: 
21c0: 66 75 6e 63 74 69 6f 6e 20 28 73 2c 20 73 78 2c  function (s, sx,
21d0: 20 73 52 65 70 6c 2c 20 6e 4f 66 66 73 65 74 2c   sRepl, nOffset,
21e0: 20 6d 2c 20 69 47 72 6f 75 70 2c 20 73 4c 69 6e   m, iGroup, sLin
21f0: 65 49 64 2c 20 73 52 75 6c 65 49 64 2c 20 62 55  eId, sRuleId, bU
2200: 70 70 65 72 63 61 73 65 2c 20 73 4d 73 67 2c 20  ppercase, sMsg, 
2210: 73 55 52 4c 2c 20 62 49 64 52 75 6c 65 2c 20 73  sURL, bIdRule, s
2220: 4f 70 74 69 6f 6e 2c 20 62 43 6f 6e 74 65 78 74  Option, bContext
2230: 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ) {.        let 
2240: 6f 45 72 72 20 3d 20 7b 7d 3b 0a 20 20 20 20 20  oErr = {};.     
2250: 20 20 20 6f 45 72 72 5b 22 6e 53 74 61 72 74 22     oErr["nStart"
2260: 5d 20 3d 20 6e 4f 66 66 73 65 74 20 2b 20 6d 2e  ] = nOffset + m.
2270: 73 74 61 72 74 5b 69 47 72 6f 75 70 5d 3b 0a 20  start[iGroup];. 
2280: 20 20 20 20 20 20 20 6f 45 72 72 5b 22 6e 45 6e         oErr["nEn
2290: 64 22 5d 20 3d 20 6e 4f 66 66 73 65 74 20 2b 20  d"] = nOffset + 
22a0: 6d 2e 65 6e 64 5b 69 47 72 6f 75 70 5d 3b 0a 20  m.end[iGroup];. 
22b0: 20 20 20 20 20 20 20 6f 45 72 72 5b 22 73 4c 69         oErr["sLi
22c0: 6e 65 49 64 22 5d 20 3d 20 73 4c 69 6e 65 49 64  neId"] = sLineId
22d0: 3b 0a 20 20 20 20 20 20 20 20 6f 45 72 72 5b 22  ;.        oErr["
22e0: 73 52 75 6c 65 49 64 22 5d 20 3d 20 73 52 75 6c  sRuleId"] = sRul
22f0: 65 49 64 3b 0a 20 20 20 20 20 20 20 20 6f 45 72  eId;.        oEr
2300: 72 5b 22 73 54 79 70 65 22 5d 20 3d 20 28 73 4f  r["sType"] = (sO
2310: 70 74 69 6f 6e 29 20 3f 20 73 4f 70 74 69 6f 6e  ption) ? sOption
2320: 20 3a 20 22 6e 6f 74 79 70 65 22 3b 0a 20 20 20   : "notype";.   
2330: 20 20 20 20 20 2f 2f 20 73 75 67 67 65 73 74 69       // suggesti
2340: 6f 6e 73 0a 20 20 20 20 20 20 20 20 69 66 20 28  ons.        if (
2350: 73 52 65 70 6c 2e 73 6c 69 63 65 28 30 2c 31 29  sRepl.slice(0,1)
2360: 20 3d 3d 3d 20 22 3d 22 29 20 7b 0a 20 20 20 20   === "=") {.    
2370: 20 20 20 20 20 20 20 20 6c 65 74 20 73 75 67 67          let sugg
2380: 20 3d 20 6f 45 76 61 6c 46 75 6e 63 5b 73 52 65   = oEvalFunc[sRe
2390: 70 6c 2e 73 6c 69 63 65 28 31 29 5d 28 73 2c 20  pl.slice(1)](s, 
23a0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  m);.            
23b0: 69 66 20 28 73 75 67 67 29 20 7b 0a 20 20 20 20  if (sugg) {.    
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
23d0: 62 55 70 70 65 72 63 61 73 65 20 26 26 20 6d 5b  bUppercase && m[
23e0: 69 47 72 6f 75 70 5d 2e 73 6c 69 63 65 28 30 2c  iGroup].slice(0,
23f0: 31 29 2e 67 6c 5f 69 73 55 70 70 65 72 43 61 73  1).gl_isUpperCas
2400: 65 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  e()) {.         
2410: 20 20 20 20 20 20 20 20 20 20 20 6f 45 72 72 5b             oErr[
2420: 22 61 53 75 67 67 65 73 74 69 6f 6e 73 22 5d 20  "aSuggestions"] 
2430: 3d 20 63 61 70 69 74 61 6c 69 7a 65 41 72 72 61  = capitalizeArra
2440: 79 28 73 75 67 67 2e 73 70 6c 69 74 28 22 7c 22  y(sugg.split("|"
2450: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
2460: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 6f 45 72 72 5b 22 61 53 75 67 67 65 73 74 69   oErr["aSuggesti
2490: 6f 6e 73 22 5d 20 3d 20 73 75 67 67 2e 73 70 6c  ons"] = sugg.spl
24a0: 69 74 28 22 7c 22 29 3b 0a 20 20 20 20 20 20 20  it("|");.       
24b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24c0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 6f 45 72 72 5b 22 61 53 75 67 67 65 73 74 69 6f  oErr["aSuggestio
24f0: 6e 73 22 5d 20 3d 20 5b 5d 3b 0a 20 20 20 20 20  ns"] = [];.     
2500: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2510: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 52 65 70   } else if (sRep
2520: 6c 20 3d 3d 20 22 5f 22 29 20 7b 0a 20 20 20 20  l == "_") {.    
2530: 20 20 20 20 20 20 20 20 6f 45 72 72 5b 22 61 53          oErr["aS
2540: 75 67 67 65 73 74 69 6f 6e 73 22 5d 20 3d 20 5b  uggestions"] = [
2550: 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  ];.        } els
2560: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
2570: 69 66 20 28 62 55 70 70 65 72 63 61 73 65 20 26  if (bUppercase &
2580: 26 20 6d 5b 69 47 72 6f 75 70 5d 2e 73 6c 69 63  & m[iGroup].slic
2590: 65 28 30 2c 31 29 2e 67 6c 5f 69 73 55 70 70 65  e(0,1).gl_isUppe
25a0: 72 43 61 73 65 28 29 29 20 7b 0a 20 20 20 20 20  rCase()) {.     
25b0: 20 20 20 20 20 20 20 20 20 20 20 6f 45 72 72 5b             oErr[
25c0: 22 61 53 75 67 67 65 73 74 69 6f 6e 73 22 5d 20  "aSuggestions"] 
25d0: 3d 20 63 61 70 69 74 61 6c 69 7a 65 41 72 72 61  = capitalizeArra
25e0: 79 28 73 52 65 70 6c 2e 67 6c 5f 65 78 70 61 6e  y(sRepl.gl_expan
25f0: 64 28 6d 29 2e 73 70 6c 69 74 28 22 7c 22 29 29  d(m).split("|"))
2600: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ;.            } 
2610: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
2620: 20 20 20 20 20 20 20 6f 45 72 72 5b 22 61 53 75         oErr["aSu
2630: 67 67 65 73 74 69 6f 6e 73 22 5d 20 3d 20 73 52  ggestions"] = sR
2640: 65 70 6c 2e 67 6c 5f 65 78 70 61 6e 64 28 6d 29  epl.gl_expand(m)
2650: 2e 73 70 6c 69 74 28 22 7c 22 29 3b 0a 20 20 20  .split("|");.   
2660: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2670: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f 20     }.        // 
2680: 4d 65 73 73 61 67 65 0a 20 20 20 20 20 20 20 20  Message.        
2690: 6c 65 74 20 73 4d 65 73 73 61 67 65 20 3d 20 22  let sMessage = "
26a0: 22 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 73  ";.        if (s
26b0: 4d 73 67 2e 73 6c 69 63 65 28 30 2c 31 29 20 3d  Msg.slice(0,1) =
26c0: 3d 3d 20 22 3d 22 29 20 7b 0a 20 20 20 20 20 20  == "=") {.      
26d0: 20 20 20 20 20 20 73 4d 65 73 73 61 67 65 20 3d        sMessage =
26e0: 20 6f 45 76 61 6c 46 75 6e 63 5b 73 4d 73 67 2e   oEvalFunc[sMsg.
26f0: 73 6c 69 63 65 28 31 29 5d 28 73 2c 20 6d 29 3b  slice(1)](s, m);
2700: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
2710: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 4d  {.            sM
2720: 65 73 73 61 67 65 20 3d 20 73 4d 73 67 2e 67 6c  essage = sMsg.gl
2730: 5f 65 78 70 61 6e 64 28 6d 29 3b 0a 20 20 20 20  _expand(m);.    
2740: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2750: 20 28 62 49 64 52 75 6c 65 29 20 7b 0a 20 20 20   (bIdRule) {.   
2760: 20 20 20 20 20 20 20 20 20 73 4d 65 73 73 61 67           sMessag
2770: 65 20 2b 3d 20 22 20 23 23 22 20 2b 20 73 4c 69  e += " ##" + sLi
2780: 6e 65 49 64 20 2b 20 22 20 23 22 20 2b 20 73 52  neId + " #" + sR
2790: 75 6c 65 49 64 3b 0a 20 20 20 20 20 20 20 20 7d  uleId;.        }
27a0: 0a 20 20 20 20 20 20 20 20 6f 45 72 72 5b 22 73  .        oErr["s
27b0: 4d 65 73 73 61 67 65 22 5d 20 3d 20 73 4d 65 73  Message"] = sMes
27c0: 73 61 67 65 3b 0a 20 20 20 20 20 20 20 20 2f 2f  sage;.        //
27d0: 20 55 52 4c 0a 20 20 20 20 20 20 20 20 6f 45 72   URL.        oEr
27e0: 72 5b 22 55 52 4c 22 5d 20 3d 20 73 55 52 4c 20  r["URL"] = sURL 
27f0: 7c 7c 20 22 22 3b 0a 20 20 20 20 20 20 20 20 2f  || "";.        /
2800: 2f 20 43 6f 6e 74 65 78 74 0a 20 20 20 20 20 20  / Context.      
2810: 20 20 69 66 20 28 62 43 6f 6e 74 65 78 74 29 20    if (bContext) 
2820: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 45  {.            oE
2830: 72 72 5b 22 73 55 6e 64 65 72 6c 69 6e 65 64 22  rr["sUnderlined"
2840: 5d 20 3d 20 73 78 2e 73 6c 69 63 65 28 6d 2e 73  ] = sx.slice(m.s
2850: 74 61 72 74 5b 69 47 72 6f 75 70 5d 2c 20 6d 2e  tart[iGroup], m.
2860: 65 6e 64 5b 69 47 72 6f 75 70 5d 29 3b 0a 20 20  end[iGroup]);.  
2870: 20 20 20 20 20 20 20 20 20 20 6f 45 72 72 5b 22            oErr["
2880: 73 42 65 66 6f 72 65 22 5d 20 3d 20 73 78 2e 73  sBefore"] = sx.s
2890: 6c 69 63 65 28 4d 61 74 68 2e 6d 61 78 28 30 2c  lice(Math.max(0,
28a0: 20 6d 2e 73 74 61 72 74 5b 69 47 72 6f 75 70 5d   m.start[iGroup]
28b0: 2d 38 30 29 2c 20 6d 2e 73 74 61 72 74 5b 69 47  -80), m.start[iG
28c0: 72 6f 75 70 5d 29 3b 0a 20 20 20 20 20 20 20 20  roup]);.        
28d0: 20 20 20 20 6f 45 72 72 5b 22 73 41 66 74 65 72      oErr["sAfter
28e0: 22 5d 20 3d 20 73 78 2e 73 6c 69 63 65 28 6d 2e  "] = sx.slice(m.
28f0: 65 6e 64 5b 69 47 72 6f 75 70 5d 2c 20 6d 2e 65  end[iGroup], m.e
2900: 6e 64 5b 69 47 72 6f 75 70 5d 2b 38 30 29 3b 0a  nd[iGroup]+80);.
2910: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2920: 20 20 72 65 74 75 72 6e 20 6f 45 72 72 3b 0a 20    return oErr;. 
2930: 20 20 20 7d 2c 0a 0a 20 20 20 20 5f 72 65 77 72     },..    _rewr
2940: 69 74 65 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73  ite: function (s
2950: 2c 20 73 52 65 70 6c 2c 20 69 47 72 6f 75 70 2c  , sRepl, iGroup,
2960: 20 6d 2c 20 62 55 70 70 65 72 63 61 73 65 29 20   m, bUppercase) 
2970: 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 74 65 78  {.        // tex
2980: 74 20 70 72 6f 63 65 73 73 6f 72 3a 20 77 72 69  t processor: wri
2990: 74 65 20 73 52 65 70 6c 20 69 6e 20 73 20 61 74  te sRepl in s at
29a0: 20 69 47 72 6f 75 70 20 70 6f 73 69 74 69 6f 6e   iGroup position
29b0: 22 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6c 6e  ".        let ln
29c0: 20 3d 20 6d 2e 65 6e 64 5b 69 47 72 6f 75 70 5d   = m.end[iGroup]
29d0: 20 2d 20 6d 2e 73 74 61 72 74 5b 69 47 72 6f 75   - m.start[iGrou
29e0: 70 5d 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  p];.        let 
29f0: 73 4e 65 77 20 3d 20 22 22 3b 0a 20 20 20 20 20  sNew = "";.     
2a00: 20 20 20 69 66 20 28 73 52 65 70 6c 20 3d 3d 3d     if (sRepl ===
2a10: 20 22 2a 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "*") {.        
2a20: 20 20 20 20 73 4e 65 77 20 3d 20 22 20 22 2e 72      sNew = " ".r
2a30: 65 70 65 61 74 28 6c 6e 29 3b 0a 20 20 20 20 20  epeat(ln);.     
2a40: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 52     } else if (sR
2a50: 65 70 6c 20 3d 3d 3d 20 22 3e 22 20 7c 7c 20 73  epl === ">" || s
2a60: 52 65 70 6c 20 3d 3d 3d 20 22 5f 22 20 7c 7c 20  Repl === "_" || 
2a70: 73 52 65 70 6c 20 3d 3d 3d 20 22 7e 22 29 20 7b  sRepl === "~") {
2a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 4e 65  .            sNe
2a90: 77 20 3d 20 73 52 65 70 6c 20 2b 20 22 20 22 2e  w = sRepl + " ".
2aa0: 72 65 70 65 61 74 28 6c 6e 2d 31 29 3b 0a 20 20  repeat(ln-1);.  
2ab0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20        } else if 
2ac0: 28 73 52 65 70 6c 20 3d 3d 3d 20 22 40 22 29 20  (sRepl === "@") 
2ad0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 4e  {.            sN
2ae0: 65 77 20 3d 20 22 40 22 2e 72 65 70 65 61 74 28  ew = "@".repeat(
2af0: 6c 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  ln);.        } e
2b00: 6c 73 65 20 69 66 20 28 73 52 65 70 6c 2e 73 6c  lse if (sRepl.sl
2b10: 69 63 65 28 30 2c 31 29 20 3d 3d 3d 20 22 3d 22  ice(0,1) === "="
2b20: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2b30: 73 4e 65 77 20 3d 20 6f 45 76 61 6c 46 75 6e 63  sNew = oEvalFunc
2b40: 5b 73 52 65 70 6c 2e 73 6c 69 63 65 28 31 29 5d  [sRepl.slice(1)]
2b50: 28 73 2c 20 6d 29 3b 0a 20 20 20 20 20 20 20 20  (s, m);.        
2b60: 20 20 20 20 73 4e 65 77 20 3d 20 73 4e 65 77 20      sNew = sNew 
2b70: 2b 20 22 20 22 2e 72 65 70 65 61 74 28 6c 6e 2d  + " ".repeat(ln-
2b80: 73 4e 65 77 2e 6c 65 6e 67 74 68 29 3b 0a 20 20  sNew.length);.  
2b90: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62 55            if (bU
2ba0: 70 70 65 72 63 61 73 65 20 26 26 20 6d 5b 69 47  ppercase && m[iG
2bb0: 72 6f 75 70 5d 2e 73 6c 69 63 65 28 30 2c 31 29  roup].slice(0,1)
2bc0: 2e 67 6c 5f 69 73 55 70 70 65 72 43 61 73 65 28  .gl_isUpperCase(
2bd0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
2be0: 20 20 20 20 20 73 4e 65 77 20 3d 20 73 4e 65 77       sNew = sNew
2bf0: 2e 67 6c 5f 74 6f 43 61 70 69 74 61 6c 69 7a 65  .gl_toCapitalize
2c00: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
2c10: 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  }.        } else
2c20: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
2c30: 4e 65 77 20 3d 20 73 52 65 70 6c 2e 67 6c 5f 65  New = sRepl.gl_e
2c40: 78 70 61 6e 64 28 6d 29 3b 0a 20 20 20 20 20 20  xpand(m);.      
2c50: 20 20 20 20 20 20 73 4e 65 77 20 3d 20 73 4e 65        sNew = sNe
2c60: 77 20 2b 20 22 20 22 2e 72 65 70 65 61 74 28 6c  w + " ".repeat(l
2c70: 6e 2d 73 4e 65 77 2e 6c 65 6e 67 74 68 29 3b 0a  n-sNew.length);.
2c80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c90: 20 20 2f 2f 68 65 6c 70 65 72 73 2e 65 63 68 6f    //helpers.echo
2ca0: 28 22 5c 6e 22 2b 73 2b 22 5c 6e 73 74 61 72 74  ("\n"+s+"\nstart
2cb0: 3a 20 22 2b 6d 2e 73 74 61 72 74 5b 69 47 72 6f  : "+m.start[iGro
2cc0: 75 70 5d 2b 22 20 65 6e 64 3a 22 2b 6d 2e 65 6e  up]+" end:"+m.en
2cd0: 64 5b 69 47 72 6f 75 70 5d 29 0a 20 20 20 20 20  d[iGroup]).     
2ce0: 20 20 20 72 65 74 75 72 6e 20 73 2e 73 6c 69 63     return s.slic
2cf0: 65 28 30 2c 20 6d 2e 73 74 61 72 74 5b 69 47 72  e(0, m.start[iGr
2d00: 6f 75 70 5d 29 20 2b 20 73 4e 65 77 20 2b 20 73  oup]) + sNew + s
2d10: 2e 73 6c 69 63 65 28 6d 2e 65 6e 64 5b 69 47 72  .slice(m.end[iGr
2d20: 6f 75 70 5d 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20  oup]);.    },.. 
2d30: 20 20 20 2f 2f 20 41 63 74 69 6f 6e 73 20 6f 6e     // Actions on
2d40: 20 72 75 6c 65 73 0a 0a 20 20 20 20 69 67 6e 6f   rules..    igno
2d50: 72 65 52 75 6c 65 3a 20 66 75 6e 63 74 69 6f 6e  reRule: function
2d60: 20 28 73 52 75 6c 65 49 64 29 20 7b 0a 20 20 20   (sRuleId) {.   
2d70: 20 20 20 20 20 5f 61 49 67 6e 6f 72 65 64 52 75       _aIgnoredRu
2d80: 6c 65 73 2e 61 64 64 28 73 52 75 6c 65 49 64 29  les.add(sRuleId)
2d90: 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 72 65  ;.    },..    re
2da0: 73 65 74 49 67 6e 6f 72 65 52 75 6c 65 73 3a 20  setIgnoreRules: 
2db0: 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20  function () {.  
2dc0: 20 20 20 20 20 20 5f 61 49 67 6e 6f 72 65 64 52        _aIgnoredR
2dd0: 75 6c 65 73 2e 63 6c 65 61 72 28 29 3b 0a 20 20  ules.clear();.  
2de0: 20 20 7d 2c 0a 0a 20 20 20 20 72 65 61 63 74 69    },..    reacti
2df0: 76 61 74 65 52 75 6c 65 3a 20 66 75 6e 63 74 69  vateRule: functi
2e00: 6f 6e 20 28 73 52 75 6c 65 49 64 29 20 7b 0a 20  on (sRuleId) {. 
2e10: 20 20 20 20 20 20 20 5f 61 49 67 6e 6f 72 65 64         _aIgnored
2e20: 52 75 6c 65 73 2e 64 65 6c 65 74 65 28 73 52 75  Rules.delete(sRu
2e30: 6c 65 49 64 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20  leId);.    },.. 
2e40: 20 20 20 6c 69 73 74 52 75 6c 65 73 3a 20 66 75     listRules: fu
2e50: 6e 63 74 69 6f 6e 2a 20 28 73 46 69 6c 74 65 72  nction* (sFilter
2e60: 3d 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20  =null) {.       
2e70: 20 2f 2f 20 67 65 6e 65 72 61 74 6f 72 3a 20 72   // generator: r
2e80: 65 74 75 72 6e 73 20 74 75 70 6c 65 20 28 73 4f  eturns tuple (sO
2e90: 70 74 69 6f 6e 2c 20 73 4c 69 6e 65 49 64 2c 20  ption, sLineId, 
2ea0: 73 52 75 6c 65 49 64 29 0a 20 20 20 20 20 20 20  sRuleId).       
2eb0: 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20   try {.         
2ec0: 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 73 4f 70     for (let [sOp
2ed0: 74 69 6f 6e 2c 20 6c 52 75 6c 65 47 72 6f 75 70  tion, lRuleGroup
2ee0: 5d 20 6f 66 20 74 68 69 73 2e 5f 67 65 74 52 75  ] of this._getRu
2ef0: 6c 65 73 28 74 72 75 65 29 29 20 7b 0a 20 20 20  les(true)) {.   
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
2f10: 20 28 6c 65 74 20 5b 2c 2c 20 73 4c 69 6e 65 49   (let [,, sLineI
2f20: 64 2c 20 73 52 75 6c 65 49 64 2c 2c 5d 20 6f 66  d, sRuleId,,] of
2f30: 20 6c 52 75 6c 65 47 72 6f 75 70 29 20 7b 0a 20   lRuleGroup) {. 
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f50: 20 20 20 69 66 20 28 21 73 46 69 6c 74 65 72 20     if (!sFilter 
2f60: 7c 7c 20 73 52 75 6c 65 49 64 2e 74 65 73 74 28  || sRuleId.test(
2f70: 73 46 69 6c 74 65 72 29 29 20 7b 0a 20 20 20 20  sFilter)) {.    
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 20 20 79 69 65 6c 64 20 5b 73 4f 70 74 69      yield [sOpti
2fa0: 6f 6e 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75  on, sLineId, sRu
2fb0: 6c 65 49 64 5d 3b 0a 20 20 20 20 20 20 20 20 20  leId];.         
2fc0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2fe0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2ff0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65           for (le
3000: 74 20 5b 73 4f 70 74 69 6f 6e 2c 20 6c 52 75 6c  t [sOption, lRul
3010: 65 47 72 6f 75 70 5d 20 6f 66 20 74 68 69 73 2e  eGroup] of this.
3020: 5f 67 65 74 52 75 6c 65 73 28 66 61 6c 73 65 29  _getRules(false)
3030: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3040: 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 2c 2c      for (let [,,
3050: 20 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65 49   sLineId, sRuleI
3060: 64 2c 2c 5d 20 6f 66 20 6c 52 75 6c 65 47 72 6f  d,,] of lRuleGro
3070: 75 70 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  up) {.          
3080: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73            if (!s
3090: 46 69 6c 74 65 72 20 7c 7c 20 73 52 75 6c 65 49  Filter || sRuleI
30a0: 64 2e 74 65 73 74 28 73 46 69 6c 74 65 72 29 29  d.test(sFilter))
30b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
30c0: 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64             yield
30d0: 20 5b 73 4f 70 74 69 6f 6e 2c 20 73 4c 69 6e 65   [sOption, sLine
30e0: 49 64 2c 20 73 52 75 6c 65 49 64 5d 3b 0a 20 20  Id, sRuleId];.  
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3110: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3120: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
3130: 20 20 20 20 20 20 63 61 74 63 68 20 28 65 29 20        catch (e) 
3140: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 68 65  {.            he
3150: 6c 70 65 72 73 2e 6c 6f 67 65 72 72 6f 72 28 65  lpers.logerror(e
3160: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
3170: 20 7d 2c 0a 0a 20 20 20 20 5f 67 65 74 52 75 6c   },..    _getRul
3180: 65 73 3a 20 66 75 6e 63 74 69 6f 6e 20 28 62 50  es: function (bP
3190: 61 72 61 67 72 61 70 68 29 20 7b 0a 20 20 20 20  aragraph) {.    
31a0: 20 20 20 20 69 66 20 28 21 62 50 61 72 61 67 72      if (!bParagr
31b0: 61 70 68 29 20 7b 0a 20 20 20 20 20 20 20 20 20  aph) {.         
31c0: 20 20 20 72 65 74 75 72 6e 20 67 63 5f 72 75 6c     return gc_rul
31d0: 65 73 2e 6c 53 65 6e 74 65 6e 63 65 52 75 6c 65  es.lSentenceRule
31e0: 73 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  s;.        }.   
31f0: 20 20 20 20 20 72 65 74 75 72 6e 20 67 63 5f 72       return gc_r
3200: 75 6c 65 73 2e 6c 50 61 72 61 67 72 61 70 68 52  ules.lParagraphR
3210: 75 6c 65 73 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20  ules;.    },..  
3220: 20 20 2f 2f 2f 2f 20 49 6e 69 74 69 61 6c 69 7a    //// Initializ
3230: 61 74 69 6f 6e 0a 0a 20 20 20 20 6c 6f 61 64 3a  ation..    load:
3240: 20 66 75 6e 63 74 69 6f 6e 20 28 73 43 6f 6e 74   function (sCont
3250: 65 78 74 3d 22 4a 61 76 61 53 63 72 69 70 74 22  ext="JavaScript"
3260: 2c 20 73 50 61 74 68 3d 22 22 29 20 7b 0a 20 20  , sPath="") {.  
3270: 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20        try {.    
3280: 20 20 20 20 20 20 20 20 69 66 20 28 74 79 70 65          if (type
3290: 6f 66 28 72 65 71 75 69 72 65 29 20 21 3d 3d 20  of(require) !== 
32a0: 27 75 6e 64 65 66 69 6e 65 64 27 29 20 7b 0a 20  'undefined') {. 
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
32c0: 61 72 20 73 70 65 6c 6c 63 68 65 63 6b 65 72 20  ar spellchecker 
32d0: 3d 20 72 65 71 75 69 72 65 28 22 72 65 73 6f 75  = require("resou
32e0: 72 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74  rce://grammalect
32f0: 65 2f 67 72 61 70 68 73 70 65 6c 6c 2f 73 70 65  e/graphspell/spe
3300: 6c 6c 63 68 65 63 6b 65 72 2e 6a 73 22 29 3b 0a  llchecker.js");.
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3320: 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72 20 3d  _oSpellChecker =
3330: 20 6e 65 77 20 73 70 65 6c 6c 63 68 65 63 6b 65   new spellchecke
3340: 72 2e 53 70 65 6c 6c 43 68 65 63 6b 65 72 28 22  r.SpellChecker("
3350: 24 7b 6c 61 6e 67 7d 22 2c 20 22 22 2c 20 22 24  ${lang}", "", "$
3360: 7b 64 69 63 5f 66 69 6c 65 6e 61 6d 65 7d 2e 6a  {dic_filename}.j
3370: 73 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  son");.         
3380: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
3390: 20 20 20 20 20 20 20 20 20 20 20 20 5f 6f 53 70              _oSp
33a0: 65 6c 6c 43 68 65 63 6b 65 72 20 3d 20 6e 65 77  ellChecker = new
33b0: 20 53 70 65 6c 6c 43 68 65 63 6b 65 72 28 22 24   SpellChecker("$
33c0: 7b 6c 61 6e 67 7d 22 2c 20 73 50 61 74 68 2c 20  {lang}", sPath, 
33d0: 22 24 7b 64 69 63 5f 6d 61 69 6e 5f 66 69 6c 65  "${dic_main_file
33e0: 6e 61 6d 65 5f 6a 73 7d 22 2c 20 22 24 7b 64 69  name_js}", "${di
33f0: 63 5f 65 78 74 65 6e 64 65 64 5f 66 69 6c 65 6e  c_extended_filen
3400: 61 6d 65 5f 6a 73 7d 22 2c 20 22 24 7b 64 69 63  ame_js}", "${dic
3410: 5f 70 65 72 73 6f 6e 61 6c 5f 66 69 6c 65 6e 61  _personal_filena
3420: 6d 65 5f 6a 73 7d 22 29 3b 0a 20 20 20 20 20 20  me_js}");.      
3430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3440: 20 20 20 20 5f 73 41 70 70 43 6f 6e 74 65 78 74      _sAppContext
3450: 20 3d 20 73 43 6f 6e 74 65 78 74 3b 0a 20 20 20   = sContext;.   
3460: 20 20 20 20 20 20 20 20 20 5f 64 4f 70 74 69 6f           _dOptio
3470: 6e 73 20 3d 20 67 63 5f 6f 70 74 69 6f 6e 73 2e  ns = gc_options.
3480: 67 65 74 4f 70 74 69 6f 6e 73 28 73 43 6f 6e 74  getOptions(sCont
3490: 65 78 74 29 2e 67 6c 5f 73 68 61 6c 6c 6f 77 43  ext).gl_shallowC
34a0: 6f 70 79 28 29 3b 20 20 20 20 20 2f 2f 20 64 75  opy();     // du
34b0: 70 6c 69 63 61 74 69 6f 6e 20 6e 65 63 65 73 73  plication necess
34c0: 61 72 79 2c 20 74 6f 20 62 65 20 61 62 6c 65 20  ary, to be able 
34d0: 74 6f 20 72 65 73 65 74 20 74 6f 20 64 65 66 61  to reset to defa
34e0: 75 6c 74 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ult.        }.  
34f0: 20 20 20 20 20 20 63 61 74 63 68 20 28 65 29 20        catch (e) 
3500: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 68 65  {.            he
3510: 6c 70 65 72 73 2e 6c 6f 67 65 72 72 6f 72 28 65  lpers.logerror(e
3520: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
3530: 20 7d 2c 0a 0a 20 20 20 20 67 65 74 53 70 65 6c   },..    getSpel
3540: 6c 43 68 65 63 6b 65 72 3a 20 66 75 6e 63 74 69  lChecker: functi
3550: 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20  on () {.        
3560: 72 65 74 75 72 6e 20 5f 6f 53 70 65 6c 6c 43 68  return _oSpellCh
3570: 65 63 6b 65 72 3b 0a 20 20 20 20 7d 2c 0a 0a 20  ecker;.    },.. 
3580: 20 20 20 2f 2f 2f 2f 20 4f 70 74 69 6f 6e 73 0a     //// Options.
3590: 0a 20 20 20 20 73 65 74 4f 70 74 69 6f 6e 3a 20  .    setOption: 
35a0: 66 75 6e 63 74 69 6f 6e 20 28 73 4f 70 74 2c 20  function (sOpt, 
35b0: 62 56 61 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  bVal) {.        
35c0: 69 66 20 28 5f 64 4f 70 74 69 6f 6e 73 2e 68 61  if (_dOptions.ha
35d0: 73 28 73 4f 70 74 29 29 20 7b 0a 20 20 20 20 20  s(sOpt)) {.     
35e0: 20 20 20 20 20 20 20 5f 64 4f 70 74 69 6f 6e 73         _dOptions
35f0: 2e 73 65 74 28 73 4f 70 74 2c 20 62 56 61 6c 29  .set(sOpt, bVal)
3600: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3610: 7d 2c 0a 0a 20 20 20 20 73 65 74 4f 70 74 69 6f  },..    setOptio
3620: 6e 73 3a 20 66 75 6e 63 74 69 6f 6e 20 28 64 4f  ns: function (dO
3630: 70 74 29 20 7b 0a 20 20 20 20 20 20 20 20 5f 64  pt) {.        _d
3640: 4f 70 74 69 6f 6e 73 2e 67 6c 5f 75 70 64 61 74  Options.gl_updat
3650: 65 4f 6e 6c 79 45 78 69 73 74 69 6e 67 4b 65 79  eOnlyExistingKey
3660: 73 28 64 4f 70 74 29 3b 0a 20 20 20 20 7d 2c 0a  s(dOpt);.    },.
3670: 0a 20 20 20 20 67 65 74 4f 70 74 69 6f 6e 73 3a  .    getOptions:
3680: 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20   function () {. 
3690: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5f 64         return _d
36a0: 4f 70 74 69 6f 6e 73 3b 0a 20 20 20 20 7d 2c 0a  Options;.    },.
36b0: 0a 20 20 20 20 67 65 74 44 65 66 61 75 6c 74 4f  .    getDefaultO
36c0: 70 74 69 6f 6e 73 3a 20 66 75 6e 63 74 69 6f 6e  ptions: function
36d0: 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65   () {.        re
36e0: 74 75 72 6e 20 67 63 5f 6f 70 74 69 6f 6e 73 2e  turn gc_options.
36f0: 67 65 74 4f 70 74 69 6f 6e 73 28 5f 73 41 70 70  getOptions(_sApp
3700: 43 6f 6e 74 65 78 74 29 2e 67 6c 5f 73 68 61 6c  Context).gl_shal
3710: 6c 6f 77 43 6f 70 79 28 29 3b 0a 20 20 20 20 7d  lowCopy();.    }
3720: 2c 0a 0a 20 20 20 20 72 65 73 65 74 4f 70 74 69  ,..    resetOpti
3730: 6f 6e 73 3a 20 66 75 6e 63 74 69 6f 6e 20 28 29  ons: function ()
3740: 20 7b 0a 20 20 20 20 20 20 20 20 5f 64 4f 70 74   {.        _dOpt
3750: 69 6f 6e 73 20 3d 20 67 63 5f 6f 70 74 69 6f 6e  ions = gc_option
3760: 73 2e 67 65 74 4f 70 74 69 6f 6e 73 28 5f 73 41  s.getOptions(_sA
3770: 70 70 43 6f 6e 74 65 78 74 29 2e 67 6c 5f 73 68  ppContext).gl_sh
3780: 61 6c 6c 6f 77 43 6f 70 79 28 29 3b 0a 20 20 20  allowCopy();.   
3790: 20 7d 0a 7d 3b 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f   }.};...////////
37a0: 20 43 6f 6d 6d 6f 6e 20 66 75 6e 63 74 69 6f 6e   Common function
37b0: 73 0a 0a 66 75 6e 63 74 69 6f 6e 20 6f 70 74 69  s..function opti
37c0: 6f 6e 20 28 73 4f 70 74 29 20 7b 0a 20 20 20 20  on (sOpt) {.    
37d0: 2f 2f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  // return true i
37e0: 66 20 6f 70 74 69 6f 6e 20 73 4f 70 74 20 69 73  f option sOpt is
37f0: 20 61 63 74 69 76 65 0a 20 20 20 20 72 65 74 75   active.    retu
3800: 72 6e 20 5f 64 4f 70 74 69 6f 6e 73 2e 67 65 74  rn _dOptions.get
3810: 28 73 4f 70 74 29 3b 0a 7d 0a 0a 66 75 6e 63 74  (sOpt);.}..funct
3820: 69 6f 6e 20 64 69 73 70 6c 61 79 49 6e 66 6f 20  ion displayInfo 
3830: 28 64 44 41 2c 20 61 57 6f 72 64 29 20 7b 0a 20  (dDA, aWord) {. 
3840: 20 20 20 2f 2f 20 66 6f 72 20 64 65 62 75 67 67     // for debugg
3850: 69 6e 67 3a 20 69 6e 66 6f 20 6f 66 20 77 6f 72  ing: info of wor
3860: 64 0a 20 20 20 20 69 66 20 28 21 61 57 6f 72 64  d.    if (!aWord
3870: 29 20 7b 0a 20 20 20 20 20 20 20 20 68 65 6c 70  ) {.        help
3880: 65 72 73 2e 65 63 68 6f 28 22 3e 20 6e 6f 74 68  ers.echo("> noth
3890: 69 6e 67 20 74 6f 20 66 69 6e 64 22 29 3b 0a 20  ing to find");. 
38a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
38b0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
38c0: 20 28 21 5f 64 41 6e 61 6c 79 73 65 73 2e 68 61   (!_dAnalyses.ha
38d0: 73 28 61 57 6f 72 64 5b 31 5d 29 20 26 26 20 21  s(aWord[1]) && !
38e0: 5f 73 74 6f 72 65 4d 6f 72 70 68 46 72 6f 6d 46  _storeMorphFromF
38f0: 53 41 28 61 57 6f 72 64 5b 31 5d 29 29 20 7b 0a  SA(aWord[1])) {.
3900: 20 20 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e          helpers.
3910: 65 63 68 6f 28 22 3e 20 6e 6f 74 20 69 6e 20 46  echo("> not in F
3920: 53 41 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  SA");.        re
3930: 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d  turn true;.    }
3940: 0a 20 20 20 20 69 66 20 28 64 44 41 2e 68 61 73  .    if (dDA.has
3950: 28 61 57 6f 72 64 5b 30 5d 29 29 20 7b 0a 20 20  (aWord[0])) {.  
3960: 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e 65 63        helpers.ec
3970: 68 6f 28 22 44 41 3a 20 22 20 2b 20 64 44 41 2e  ho("DA: " + dDA.
3980: 67 65 74 28 61 57 6f 72 64 5b 30 5d 29 29 3b 0a  get(aWord[0]));.
3990: 20 20 20 20 7d 0a 20 20 20 20 68 65 6c 70 65 72      }.    helper
39a0: 73 2e 65 63 68 6f 28 22 46 53 41 3a 20 22 20 2b  s.echo("FSA: " +
39b0: 20 5f 64 41 6e 61 6c 79 73 65 73 2e 67 65 74 28   _dAnalyses.get(
39c0: 61 57 6f 72 64 5b 31 5d 29 29 3b 0a 20 20 20 20  aWord[1]));.    
39d0: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a  return true;.}..
39e0: 66 75 6e 63 74 69 6f 6e 20 5f 73 74 6f 72 65 4d  function _storeM
39f0: 6f 72 70 68 46 72 6f 6d 46 53 41 20 28 73 57 6f  orphFromFSA (sWo
3a00: 72 64 29 20 7b 0a 20 20 20 20 2f 2f 20 72 65 74  rd) {.    // ret
3a10: 72 69 65 76 65 73 20 6d 6f 72 70 68 6f 6c 6f 67  rieves morpholog
3a20: 69 65 73 20 6c 69 73 74 20 66 72 6f 6d 20 5f 6f  ies list from _o
3a30: 53 70 65 6c 6c 43 68 65 63 6b 65 72 20 2d 3e 20  SpellChecker -> 
3a40: 5f 64 41 6e 61 6c 79 73 65 73 0a 20 20 20 20 2f  _dAnalyses.    /
3a50: 2f 68 65 6c 70 65 72 73 2e 65 63 68 6f 28 22 72  /helpers.echo("r
3a60: 65 67 69 73 74 65 72 3a 20 22 2b 73 57 6f 72 64  egister: "+sWord
3a70: 20 2b 20 22 20 22 20 2b 20 5f 6f 53 70 65 6c 6c   + " " + _oSpell
3a80: 43 68 65 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68  Checker.getMorph
3a90: 28 73 57 6f 72 64 29 2e 74 6f 53 74 72 69 6e 67  (sWord).toString
3aa0: 28 29 29 0a 20 20 20 20 5f 64 41 6e 61 6c 79 73  ()).    _dAnalys
3ab0: 65 73 2e 73 65 74 28 73 57 6f 72 64 2c 20 5f 6f  es.set(sWord, _o
3ac0: 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74  SpellChecker.get
3ad0: 4d 6f 72 70 68 28 73 57 6f 72 64 29 29 3b 0a 20  Morph(sWord));. 
3ae0: 20 20 20 72 65 74 75 72 6e 20 21 21 5f 64 41 6e     return !!_dAn
3af0: 61 6c 79 73 65 73 2e 67 65 74 28 73 57 6f 72 64  alyses.get(sWord
3b00: 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 6d  );.}..function m
3b10: 6f 72 70 68 20 28 64 44 41 2c 20 61 57 6f 72 64  orph (dDA, aWord
3b20: 2c 20 73 50 61 74 74 65 72 6e 2c 20 62 53 74 72  , sPattern, bStr
3b30: 69 63 74 3d 74 72 75 65 2c 20 62 4e 6f 57 6f 72  ict=true, bNoWor
3b40: 64 3d 66 61 6c 73 65 29 20 7b 0a 20 20 20 20 2f  d=false) {.    /
3b50: 2f 20 61 6e 61 6c 79 73 65 20 61 20 74 75 70 6c  / analyse a tupl
3b60: 65 20 28 70 6f 73 69 74 69 6f 6e 2c 20 77 6f 72  e (position, wor
3b70: 64 29 2c 20 72 65 74 75 72 6e 20 74 72 75 65 20  d), return true 
3b80: 69 66 20 73 50 61 74 74 65 72 6e 20 69 6e 20 6d  if sPattern in m
3b90: 6f 72 70 68 6f 6c 6f 67 69 65 73 20 28 64 69 73  orphologies (dis
3ba0: 61 6d 62 69 67 75 61 74 69 6f 6e 20 6f 6e 29 0a  ambiguation on).
3bb0: 20 20 20 20 69 66 20 28 21 61 57 6f 72 64 29 20      if (!aWord) 
3bc0: 7b 0a 20 20 20 20 20 20 20 20 2f 2f 68 65 6c 70  {.        //help
3bd0: 65 72 73 2e 65 63 68 6f 28 22 6d 6f 72 70 68 3a  ers.echo("morph:
3be0: 20 6e 6f 77 6f 72 64 2c 20 72 65 74 75 72 6e 73   noword, returns
3bf0: 20 22 20 2b 20 62 4e 6f 57 6f 72 64 29 3b 0a 20   " + bNoWord);. 
3c00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 62 4e         return bN
3c10: 6f 57 6f 72 64 3b 0a 20 20 20 20 7d 0a 20 20 20  oWord;.    }.   
3c20: 20 2f 2f 68 65 6c 70 65 72 73 2e 65 63 68 6f 28   //helpers.echo(
3c30: 22 61 57 6f 72 64 3a 20 22 2b 61 57 6f 72 64 2e  "aWord: "+aWord.
3c40: 74 6f 53 74 72 69 6e 67 28 29 29 3b 0a 20 20 20  toString());.   
3c50: 20 69 66 20 28 21 5f 64 41 6e 61 6c 79 73 65 73   if (!_dAnalyses
3c60: 2e 68 61 73 28 61 57 6f 72 64 5b 31 5d 29 20 26  .has(aWord[1]) &
3c70: 26 20 21 5f 73 74 6f 72 65 4d 6f 72 70 68 46 72  & !_storeMorphFr
3c80: 6f 6d 46 53 41 28 61 57 6f 72 64 5b 31 5d 29 29  omFSA(aWord[1]))
3c90: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
3ca0: 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20  n false;.    }. 
3cb0: 20 20 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20     let lMorph = 
3cc0: 64 44 41 2e 68 61 73 28 61 57 6f 72 64 5b 30 5d  dDA.has(aWord[0]
3cd0: 29 20 3f 20 64 44 41 2e 67 65 74 28 61 57 6f 72  ) ? dDA.get(aWor
3ce0: 64 5b 30 5d 29 20 3a 20 5f 64 41 6e 61 6c 79 73  d[0]) : _dAnalys
3cf0: 65 73 2e 67 65 74 28 61 57 6f 72 64 5b 31 5d 29  es.get(aWord[1])
3d00: 3b 0a 20 20 20 20 2f 2f 68 65 6c 70 65 72 73 2e  ;.    //helpers.
3d10: 65 63 68 6f 28 22 6c 4d 6f 72 70 68 3a 20 22 2b  echo("lMorph: "+
3d20: 6c 4d 6f 72 70 68 2e 74 6f 53 74 72 69 6e 67 28  lMorph.toString(
3d30: 29 29 3b 0a 20 20 20 20 69 66 20 28 6c 4d 6f 72  ));.    if (lMor
3d40: 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20 30 29  ph.length === 0)
3d50: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
3d60: 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20  n false;.    }. 
3d70: 20 20 20 2f 2f 68 65 6c 70 65 72 73 2e 65 63 68     //helpers.ech
3d80: 6f 28 22 2a 2a 2a 22 29 3b 0a 20 20 20 20 69 66  o("***");.    if
3d90: 20 28 62 53 74 72 69 63 74 29 20 7b 0a 20 20 20   (bStrict) {.   
3da0: 20 20 20 20 20 72 65 74 75 72 6e 20 6c 4d 6f 72       return lMor
3db0: 70 68 2e 65 76 65 72 79 28 73 20 20 3d 3e 20 20  ph.every(s  =>  
3dc0: 28 73 2e 73 65 61 72 63 68 28 73 50 61 74 74 65  (s.search(sPatte
3dd0: 72 6e 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 20 20  rn) !== -1));.  
3de0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c    }.    return l
3df0: 4d 6f 72 70 68 2e 73 6f 6d 65 28 73 20 20 3d 3e  Morph.some(s  =>
3e00: 20 20 28 73 2e 73 65 61 72 63 68 28 73 50 61 74    (s.search(sPat
3e10: 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29 3b 0a  tern) !== -1));.
3e20: 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 6d 6f 72 70  }..function morp
3e30: 68 65 78 20 28 64 44 41 2c 20 61 57 6f 72 64 2c  hex (dDA, aWord,
3e40: 20 73 50 61 74 74 65 72 6e 2c 20 73 4e 65 67 50   sPattern, sNegP
3e50: 61 74 74 65 72 6e 2c 20 62 4e 6f 57 6f 72 64 3d  attern, bNoWord=
3e60: 66 61 6c 73 65 29 20 7b 0a 20 20 20 20 2f 2f 20  false) {.    // 
3e70: 61 6e 61 6c 79 73 65 20 61 20 74 75 70 6c 65 20  analyse a tuple 
3e80: 28 70 6f 73 69 74 69 6f 6e 2c 20 77 6f 72 64 29  (position, word)
3e90: 2c 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  , returns true i
3ea0: 66 20 6e 6f 74 20 73 4e 65 67 50 61 74 74 65 72  f not sNegPatter
3eb0: 6e 20 69 6e 20 77 6f 72 64 20 6d 6f 72 70 68 6f  n in word morpho
3ec0: 6c 6f 67 69 65 73 20 61 6e 64 20 73 50 61 74 74  logies and sPatt
3ed0: 65 72 6e 20 69 6e 20 77 6f 72 64 20 6d 6f 72 70  ern in word morp
3ee0: 68 6f 6c 6f 67 69 65 73 20 28 64 69 73 61 6d 62  hologies (disamb
3ef0: 69 67 75 61 74 69 6f 6e 20 6f 6e 29 0a 20 20 20  iguation on).   
3f00: 20 69 66 20 28 21 61 57 6f 72 64 29 20 7b 0a 20   if (!aWord) {. 
3f10: 20 20 20 20 20 20 20 2f 2f 68 65 6c 70 65 72 73         //helpers
3f20: 2e 65 63 68 6f 28 22 6d 6f 72 70 68 3a 20 6e 6f  .echo("morph: no
3f30: 77 6f 72 64 2c 20 72 65 74 75 72 6e 73 20 22 20  word, returns " 
3f40: 2b 20 62 4e 6f 57 6f 72 64 29 3b 0a 20 20 20 20  + bNoWord);.    
3f50: 20 20 20 20 72 65 74 75 72 6e 20 62 4e 6f 57 6f      return bNoWo
3f60: 72 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2f  rd;.    }.    //
3f70: 68 65 6c 70 65 72 73 2e 65 63 68 6f 28 22 61 57  helpers.echo("aW
3f80: 6f 72 64 3a 20 22 2b 61 57 6f 72 64 2e 74 6f 53  ord: "+aWord.toS
3f90: 74 72 69 6e 67 28 29 29 3b 0a 20 20 20 20 69 66  tring());.    if
3fa0: 20 28 21 5f 64 41 6e 61 6c 79 73 65 73 2e 68 61   (!_dAnalyses.ha
3fb0: 73 28 61 57 6f 72 64 5b 31 5d 29 20 26 26 20 21  s(aWord[1]) && !
3fc0: 5f 73 74 6f 72 65 4d 6f 72 70 68 46 72 6f 6d 46  _storeMorphFromF
3fd0: 53 41 28 61 57 6f 72 64 5b 31 5d 29 29 20 7b 0a  SA(aWord[1])) {.
3fe0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
3ff0: 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  alse;.    }.    
4000: 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20 64 44 41  let lMorph = dDA
4010: 2e 68 61 73 28 61 57 6f 72 64 5b 30 5d 29 20 3f  .has(aWord[0]) ?
4020: 20 64 44 41 2e 67 65 74 28 61 57 6f 72 64 5b 30   dDA.get(aWord[0
4030: 5d 29 20 3a 20 5f 64 41 6e 61 6c 79 73 65 73 2e  ]) : _dAnalyses.
4040: 67 65 74 28 61 57 6f 72 64 5b 31 5d 29 3b 0a 20  get(aWord[1]);. 
4050: 20 20 20 2f 2f 68 65 6c 70 65 72 73 2e 65 63 68     //helpers.ech
4060: 6f 28 22 6c 4d 6f 72 70 68 3a 20 22 2b 6c 4d 6f  o("lMorph: "+lMo
4070: 72 70 68 2e 74 6f 53 74 72 69 6e 67 28 29 29 3b  rph.toString());
4080: 0a 20 20 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e  .    if (lMorph.
4090: 6c 65 6e 67 74 68 20 3d 3d 3d 20 30 29 20 7b 0a  length === 0) {.
40a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
40b0: 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  alse;.    }.    
40c0: 2f 2f 68 65 6c 70 65 72 73 2e 65 63 68 6f 28 22  //helpers.echo("
40d0: 2a 2a 2a 22 29 3b 0a 20 20 20 20 2f 2f 20 63 68  ***");.    // ch
40e0: 65 63 6b 20 6e 65 67 61 74 69 76 65 20 63 6f 6e  eck negative con
40f0: 64 69 74 69 6f 6e 0a 20 20 20 20 69 66 20 28 6c  dition.    if (l
4100: 4d 6f 72 70 68 2e 73 6f 6d 65 28 73 20 20 3d 3e  Morph.some(s  =>
4110: 20 20 28 73 2e 73 65 61 72 63 68 28 73 4e 65 67    (s.search(sNeg
4120: 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29  Pattern) !== -1)
4130: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  )) {.        ret
4140: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d  urn false;.    }
4150: 0a 20 20 20 20 2f 2f 20 73 65 61 72 63 68 20 73  .    // search s
4160: 50 61 74 74 65 72 6e 0a 20 20 20 20 72 65 74 75  Pattern.    retu
4170: 72 6e 20 6c 4d 6f 72 70 68 2e 73 6f 6d 65 28 73  rn lMorph.some(s
4180: 20 20 3d 3e 20 20 28 73 2e 73 65 61 72 63 68 28    =>  (s.search(
4190: 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31  sPattern) !== -1
41a0: 29 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20  ));.}..function 
41b0: 61 6e 61 6c 79 73 65 20 28 73 57 6f 72 64 2c 20  analyse (sWord, 
41c0: 73 50 61 74 74 65 72 6e 2c 20 62 53 74 72 69 63  sPattern, bStric
41d0: 74 3d 74 72 75 65 29 20 7b 0a 20 20 20 20 2f 2f  t=true) {.    //
41e0: 20 61 6e 61 6c 79 73 65 20 61 20 77 6f 72 64 2c   analyse a word,
41f0: 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   return true if 
4200: 73 50 61 74 74 65 72 6e 20 69 6e 20 6d 6f 72 70  sPattern in morp
4210: 68 6f 6c 6f 67 69 65 73 20 28 64 69 73 61 6d 62  hologies (disamb
4220: 69 67 75 61 74 69 6f 6e 20 6f 66 66 29 0a 20 20  iguation off).  
4230: 20 20 69 66 20 28 21 5f 64 41 6e 61 6c 79 73 65    if (!_dAnalyse
4240: 73 2e 68 61 73 28 73 57 6f 72 64 29 20 26 26 20  s.has(sWord) && 
4250: 21 5f 73 74 6f 72 65 4d 6f 72 70 68 46 72 6f 6d  !_storeMorphFrom
4260: 46 53 41 28 73 57 6f 72 64 29 29 20 7b 0a 20 20  FSA(sWord)) {.  
4270: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
4280: 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  se;.    }.    if
4290: 20 28 62 53 74 72 69 63 74 29 20 7b 0a 20 20 20   (bStrict) {.   
42a0: 20 20 20 20 20 72 65 74 75 72 6e 20 5f 64 41 6e       return _dAn
42b0: 61 6c 79 73 65 73 2e 67 65 74 28 73 57 6f 72 64  alyses.get(sWord
42c0: 29 2e 65 76 65 72 79 28 73 20 20 3d 3e 20 20 28  ).every(s  =>  (
42d0: 73 2e 73 65 61 72 63 68 28 73 50 61 74 74 65 72  s.search(sPatter
42e0: 6e 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 20 20 20  n) !== -1));.   
42f0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 5f 64   }.    return _d
4300: 41 6e 61 6c 79 73 65 73 2e 67 65 74 28 73 57 6f  Analyses.get(sWo
4310: 72 64 29 2e 73 6f 6d 65 28 73 20 20 3d 3e 20 20  rd).some(s  =>  
4320: 28 73 2e 73 65 61 72 63 68 28 73 50 61 74 74 65  (s.search(sPatte
4330: 72 6e 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 7d 0a  rn) !== -1));.}.
4340: 0a 66 75 6e 63 74 69 6f 6e 20 61 6e 61 6c 79 73  .function analys
4350: 65 78 20 28 73 57 6f 72 64 2c 20 73 50 61 74 74  ex (sWord, sPatt
4360: 65 72 6e 2c 20 73 4e 65 67 50 61 74 74 65 72 6e  ern, sNegPattern
4370: 29 20 7b 0a 20 20 20 20 2f 2f 20 61 6e 61 6c 79  ) {.    // analy
4380: 73 65 20 61 20 77 6f 72 64 2c 20 72 65 74 75 72  se a word, retur
4390: 6e 73 20 54 72 75 65 20 69 66 20 6e 6f 74 20 73  ns True if not s
43a0: 4e 65 67 50 61 74 74 65 72 6e 20 69 6e 20 77 6f  NegPattern in wo
43b0: 72 64 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20  rd morphologies 
43c0: 61 6e 64 20 73 50 61 74 74 65 72 6e 20 69 6e 20  and sPattern in 
43d0: 77 6f 72 64 20 6d 6f 72 70 68 6f 6c 6f 67 69 65  word morphologie
43e0: 73 20 28 64 69 73 61 6d 62 69 67 75 61 74 69 6f  s (disambiguatio
43f0: 6e 20 6f 66 66 29 0a 20 20 20 20 69 66 20 28 21  n off).    if (!
4400: 5f 64 41 6e 61 6c 79 73 65 73 2e 68 61 73 28 73  _dAnalyses.has(s
4410: 57 6f 72 64 29 20 26 26 20 21 5f 73 74 6f 72 65  Word) && !_store
4420: 4d 6f 72 70 68 46 72 6f 6d 46 53 41 28 73 57 6f  MorphFromFSA(sWo
4430: 72 64 29 29 20 7b 0a 20 20 20 20 20 20 20 20 72  rd)) {.        r
4440: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20  eturn false;.   
4450: 20 7d 0a 20 20 20 20 2f 2f 20 63 68 65 63 6b 20   }.    // check 
4460: 6e 65 67 61 74 69 76 65 20 63 6f 6e 64 69 74 69  negative conditi
4470: 6f 6e 0a 20 20 20 20 69 66 20 28 5f 64 41 6e 61  on.    if (_dAna
4480: 6c 79 73 65 73 2e 67 65 74 28 73 57 6f 72 64 29  lyses.get(sWord)
4490: 2e 73 6f 6d 65 28 73 20 20 3d 3e 20 20 28 73 2e  .some(s  =>  (s.
44a0: 73 65 61 72 63 68 28 73 4e 65 67 50 61 74 74 65  search(sNegPatte
44b0: 72 6e 29 20 21 3d 3d 20 2d 31 29 29 29 20 7b 0a  rn) !== -1))) {.
44c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
44d0: 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  alse;.    }.    
44e0: 2f 2f 20 73 65 61 72 63 68 20 73 50 61 74 74 65  // search sPatte
44f0: 72 6e 0a 20 20 20 20 72 65 74 75 72 6e 20 5f 64  rn.    return _d
4500: 41 6e 61 6c 79 73 65 73 2e 67 65 74 28 73 57 6f  Analyses.get(sWo
4510: 72 64 29 2e 73 6f 6d 65 28 73 20 20 3d 3e 20 20  rd).some(s  =>  
4520: 28 73 2e 73 65 61 72 63 68 28 73 50 61 74 74 65  (s.search(sPatte
4530: 72 6e 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 7d 0a  rn) !== -1));.}.
4540: 0a 66 75 6e 63 74 69 6f 6e 20 73 74 65 6d 20 28  .function stem (
4550: 73 57 6f 72 64 29 20 7b 0a 20 20 20 20 2f 2f 20  sWord) {.    // 
4560: 72 65 74 75 72 6e 73 20 61 20 6c 69 73 74 20 6f  returns a list o
4570: 66 20 73 57 6f 72 64 27 73 20 73 74 65 6d 73 0a  f sWord's stems.
4580: 20 20 20 20 69 66 20 28 21 73 57 6f 72 64 29 20      if (!sWord) 
4590: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
45a0: 20 5b 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   [];.    }.    i
45b0: 66 20 28 21 5f 64 41 6e 61 6c 79 73 65 73 2e 68  f (!_dAnalyses.h
45c0: 61 73 28 73 57 6f 72 64 29 20 26 26 20 21 5f 73  as(sWord) && !_s
45d0: 74 6f 72 65 4d 6f 72 70 68 46 72 6f 6d 46 53 41  toreMorphFromFSA
45e0: 28 73 57 6f 72 64 29 29 20 7b 0a 20 20 20 20 20  (sWord)) {.     
45f0: 20 20 20 72 65 74 75 72 6e 20 5b 5d 3b 0a 20 20     return [];.  
4600: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 5f    }.    return _
4610: 64 41 6e 61 6c 79 73 65 73 2e 67 65 74 28 73 57  dAnalyses.get(sW
4620: 6f 72 64 29 2e 6d 61 70 28 20 73 20 3d 3e 20 73  ord).map( s => s
4630: 2e 73 6c 69 63 65 28 31 2c 20 73 2e 69 6e 64 65  .slice(1, s.inde
4640: 78 4f 66 28 22 20 22 29 29 20 29 3b 0a 7d 0a 0a  xOf(" ")) );.}..
4650: 0a 2f 2f 2f 2f 20 66 75 6e 63 74 69 6f 6e 73 20  .//// functions 
4660: 74 6f 20 67 65 74 20 74 65 78 74 20 6f 75 74 73  to get text outs
4670: 69 64 65 20 70 61 74 74 65 72 6e 20 73 63 6f 70  ide pattern scop
4680: 65 0a 0a 2f 2f 20 77 61 72 6e 69 6e 67 3a 20 63  e..// warning: c
4690: 68 65 63 6b 20 63 6f 6d 70 69 6c 65 5f 72 75 6c  heck compile_rul
46a0: 65 73 2e 70 79 20 74 6f 20 75 6e 64 65 72 73 74  es.py to underst
46b0: 61 6e 64 20 68 6f 77 20 69 74 20 77 6f 72 6b 73  and how it works
46c0: 0a 0a 66 75 6e 63 74 69 6f 6e 20 6e 65 78 74 77  ..function nextw
46d0: 6f 72 64 20 28 73 2c 20 69 53 74 61 72 74 2c 20  ord (s, iStart, 
46e0: 6e 29 20 7b 0a 20 20 20 20 2f 2f 20 67 65 74 20  n) {.    // get 
46f0: 74 68 65 20 6e 74 68 20 77 6f 72 64 20 6f 66 20  the nth word of 
4700: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
4710: 20 6f 72 20 65 6d 70 74 79 20 73 74 72 69 6e 67   or empty string
4720: 0a 20 20 20 20 6c 65 74 20 7a 20 3d 20 6e 65 77  .    let z = new
4730: 20 52 65 67 45 78 70 28 22 5e 28 3f 3a 20 2b 5b   RegExp("^(?: +[
4740: 61 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf  a-z..-..A-Z..-..
4750: c3 80 2d c3 96 30 2d 39 c3 98 2d c3 9f c4 80 2d  ..-..0-9..-....-
4760: ca af ef ac 81 2d ef ac 86 25 5f 2d 5d 2b 29 7b  .....-...%_-]+){
4770: 22 20 2b 20 28 6e 2d 31 29 2e 74 6f 53 74 72 69  " + (n-1).toStri
4780: 6e 67 28 29 20 2b 20 22 7d 20 2b 28 5b 61 2d 7a  ng() + "} +([a-z
4790: c3 a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d  ..-..A-Z..-....-
47a0: c3 96 30 2d 39 c3 98 2d c3 9f c4 80 2d ca af ef  ..0-9..-....-...
47b0: ac 81 2d ef ac 86 25 5f 2d 5d 2b 29 22 2c 20 22  ..-...%_-]+)", "
47c0: 69 67 22 29 3b 0a 20 20 20 20 6c 65 74 20 6d 20  ig");.    let m 
47d0: 3d 20 7a 2e 65 78 65 63 28 73 2e 73 6c 69 63 65  = z.exec(s.slice
47e0: 28 69 53 74 61 72 74 29 29 3b 0a 20 20 20 20 69  (iStart));.    i
47f0: 66 20 28 21 6d 29 20 7b 0a 20 20 20 20 20 20 20  f (!m) {.       
4800: 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20   return null;.  
4810: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b    }.    return [
4820: 69 53 74 61 72 74 20 2b 20 7a 2e 6c 61 73 74 49  iStart + z.lastI
4830: 6e 64 65 78 20 2d 20 6d 5b 31 5d 2e 6c 65 6e 67  ndex - m[1].leng
4840: 74 68 2c 20 6d 5b 31 5d 5d 3b 0a 7d 0a 0a 66 75  th, m[1]];.}..fu
4850: 6e 63 74 69 6f 6e 20 70 72 65 76 77 6f 72 64 20  nction prevword 
4860: 28 73 2c 20 69 45 6e 64 2c 20 6e 29 20 7b 0a 20  (s, iEnd, n) {. 
4870: 20 20 20 2f 2f 20 67 65 74 20 74 68 65 20 28 2d     // get the (-
4880: 29 6e 74 68 20 77 6f 72 64 20 6f 66 20 74 68 65  )nth word of the
4890: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 6f 72   input string or
48a0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 0a 20 20   empty string.  
48b0: 20 20 6c 65 74 20 7a 20 3d 20 6e 65 77 20 52 65    let z = new Re
48c0: 67 45 78 70 28 22 28 5b 61 2d 7a c3 a0 2d c3 b6  gExp("([a-z..-..
48d0: 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39  A-Z..-....-..0-9
48e0: c3 98 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac  ..-....-.....-..
48f0: 86 25 5f 2d 5d 2b 29 20 2b 28 3f 3a 5b 61 2d 7a  .%_-]+) +(?:[a-z
4900: c3 a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d  ..-..A-Z..-....-
4910: c3 96 30 2d 39 c3 98 2d c3 9f c4 80 2d ca af ef  ..0-9..-....-...
4920: ac 81 2d ef ac 86 25 5f 2d 5d 2b 20 2b 29 7b 22  ..-...%_-]+ +){"
4930: 20 2b 20 28 6e 2d 31 29 2e 74 6f 53 74 72 69 6e   + (n-1).toStrin
4940: 67 28 29 20 2b 20 22 7d 24 22 2c 20 22 69 22 29  g() + "}$", "i")
4950: 3b 0a 20 20 20 20 6c 65 74 20 6d 20 3d 20 7a 2e  ;.    let m = z.
4960: 65 78 65 63 28 73 2e 73 6c 69 63 65 28 30 2c 20  exec(s.slice(0, 
4970: 69 45 6e 64 29 29 3b 0a 20 20 20 20 69 66 20 28  iEnd));.    if (
4980: 21 6d 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  !m) {.        re
4990: 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20 20 7d  turn null;.    }
49a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 6d 2e 69  .    return [m.i
49b0: 6e 64 65 78 2c 20 6d 5b 31 5d 5d 3b 0a 7d 0a 0a  ndex, m[1]];.}..
49c0: 66 75 6e 63 74 69 6f 6e 20 6e 65 78 74 77 6f 72  function nextwor
49d0: 64 31 20 28 73 2c 20 69 53 74 61 72 74 29 20 7b  d1 (s, iStart) {
49e0: 0a 20 20 20 20 2f 2f 20 67 65 74 20 6e 65 78 74  .    // get next
49f0: 20 77 6f 72 64 20 28 6f 70 74 69 6d 69 7a 61 74   word (optimizat
4a00: 69 6f 6e 29 0a 20 20 20 20 6c 65 74 20 5f 7a 4e  ion).    let _zN
4a10: 65 78 74 57 6f 72 64 20 3d 20 6e 65 77 20 52 65  extWord = new Re
4a20: 67 45 78 70 20 28 22 5e 20 2b 28 5b 61 2d 7a c3  gExp ("^ +([a-z.
4a30: a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3  .-..A-Z..-....-.
4a40: 96 30 2d 39 c3 98 2d c3 9f c4 80 2d ca af ef ac  .0-9..-....-....
4a50: 81 2d ef ac 86 5f 5d 5b 61 2d 7a c3 a0 2d c3 b6  .-..._][a-z..-..
4a60: 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39  A-Z..-....-..0-9
4a70: c3 98 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac  ..-....-.....-..
4a80: 86 5f 2d 5d 2a 29 22 2c 20 22 69 67 22 29 3b 0a  ._-]*)", "ig");.
4a90: 20 20 20 20 6c 65 74 20 6d 20 3d 20 5f 7a 4e 65      let m = _zNe
4aa0: 78 74 57 6f 72 64 2e 65 78 65 63 28 73 2e 73 6c  xtWord.exec(s.sl
4ab0: 69 63 65 28 69 53 74 61 72 74 29 29 3b 0a 20 20  ice(iStart));.  
4ac0: 20 20 69 66 20 28 21 6d 29 20 7b 0a 20 20 20 20    if (!m) {.    
4ad0: 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b      return null;
4ae0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
4af0: 6e 20 5b 69 53 74 61 72 74 20 2b 20 5f 7a 4e 65  n [iStart + _zNe
4b00: 78 74 57 6f 72 64 2e 6c 61 73 74 49 6e 64 65 78  xtWord.lastIndex
4b10: 20 2d 20 6d 5b 31 5d 2e 6c 65 6e 67 74 68 2c 20   - m[1].length, 
4b20: 6d 5b 31 5d 5d 3b 0a 7d 0a 0a 63 6f 6e 73 74 20  m[1]];.}..const 
4b30: 5f 7a 50 72 65 76 57 6f 72 64 20 3d 20 6e 65 77  _zPrevWord = new
4b40: 20 52 65 67 45 78 70 20 28 22 28 5b 61 2d 7a c3   RegExp ("([a-z.
4b50: a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3  .-..A-Z..-....-.
4b60: 96 30 2d 39 c3 98 2d c3 9f c4 80 2d ca af ef ac  .0-9..-....-....
4b70: 81 2d ef ac 86 5f 5d 5b 61 2d 7a c3 a0 2d c3 b6  .-..._][a-z..-..
4b80: 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39  A-Z..-....-..0-9
4b90: c3 98 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac  ..-....-.....-..
4ba0: 86 5f 2d 5d 2a 29 20 2b 24 22 2c 20 22 69 22 29  ._-]*) +$", "i")
4bb0: 3b 0a 0a 66 75 6e 63 74 69 6f 6e 20 70 72 65 76  ;..function prev
4bc0: 77 6f 72 64 31 20 28 73 2c 20 69 45 6e 64 29 20  word1 (s, iEnd) 
4bd0: 7b 0a 20 20 20 20 2f 2f 20 67 65 74 20 70 72 65  {.    // get pre
4be0: 76 69 6f 75 73 20 77 6f 72 64 20 28 6f 70 74 69  vious word (opti
4bf0: 6d 69 7a 61 74 69 6f 6e 29 0a 20 20 20 20 6c 65  mization).    le
4c00: 74 20 6d 20 3d 20 5f 7a 50 72 65 76 57 6f 72 64  t m = _zPrevWord
4c10: 2e 65 78 65 63 28 73 2e 73 6c 69 63 65 28 30 2c  .exec(s.slice(0,
4c20: 20 69 45 6e 64 29 29 3b 0a 20 20 20 20 69 66 20   iEnd));.    if 
4c30: 28 21 6d 29 20 7b 0a 20 20 20 20 20 20 20 20 72  (!m) {.        r
4c40: 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20 20  eturn null;.    
4c50: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 6d 2e  }.    return [m.
4c60: 69 6e 64 65 78 2c 20 6d 5b 31 5d 5d 3b 0a 7d 0a  index, m[1]];.}.
4c70: 0a 66 75 6e 63 74 69 6f 6e 20 6c 6f 6f 6b 20 28  .function look (
4c80: 73 2c 20 7a 50 61 74 74 65 72 6e 2c 20 7a 4e 65  s, zPattern, zNe
4c90: 67 50 61 74 74 65 72 6e 3d 6e 75 6c 6c 29 20 7b  gPattern=null) {
4ca0: 0a 20 20 20 20 2f 2f 20 73 65 65 6b 20 7a 50 61  .    // seek zPa
4cb0: 74 74 65 72 6e 20 69 6e 20 73 20 28 62 65 66 6f  ttern in s (befo
4cc0: 72 65 2f 61 66 74 65 72 2f 66 75 6c 6c 74 65 78  re/after/fulltex
4cd0: 74 29 2c 20 69 66 20 61 6e 74 69 70 61 74 74 65  t), if antipatte
4ce0: 72 6e 20 7a 4e 65 67 50 61 74 74 65 72 6e 20 6e  rn zNegPattern n
4cf0: 6f 74 20 69 6e 20 73 0a 20 20 20 20 74 72 79 20  ot in s.    try 
4d00: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 7a 4e  {.        if (zN
4d10: 65 67 50 61 74 74 65 72 6e 20 26 26 20 7a 4e 65  egPattern && zNe
4d20: 67 50 61 74 74 65 72 6e 2e 74 65 73 74 28 73 29  gPattern.test(s)
4d30: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
4d40: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20  return false;.  
4d50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4d60: 72 65 74 75 72 6e 20 7a 50 61 74 74 65 72 6e 2e  return zPattern.
4d70: 74 65 73 74 28 73 29 3b 0a 20 20 20 20 7d 0a 20  test(s);.    }. 
4d80: 20 20 20 63 61 74 63 68 20 28 65 29 20 7b 0a 20     catch (e) {. 
4d90: 20 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e 6c         helpers.l
4da0: 6f 67 65 72 72 6f 72 28 65 29 3b 0a 20 20 20 20  ogerror(e);.    
4db0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c  }.    return fal
4dc0: 73 65 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20  se;.}..function 
4dd0: 6c 6f 6f 6b 5f 63 68 6b 31 20 28 64 44 41 2c 20  look_chk1 (dDA, 
4de0: 73 2c 20 6e 4f 66 66 73 65 74 2c 20 7a 50 61 74  s, nOffset, zPat
4df0: 74 65 72 6e 2c 20 73 50 61 74 74 65 72 6e 47 72  tern, sPatternGr
4e00: 6f 75 70 31 2c 20 73 4e 65 67 50 61 74 74 65 72  oup1, sNegPatter
4e10: 6e 47 72 6f 75 70 31 3d 6e 75 6c 6c 29 20 7b 0a  nGroup1=null) {.
4e20: 20 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 54      // returns T
4e30: 72 75 65 20 69 66 20 73 20 68 61 73 20 70 61 74  rue if s has pat
4e40: 74 65 72 6e 20 7a 50 61 74 74 65 72 6e 20 61 6e  tern zPattern an
4e50: 64 20 6d 2e 67 72 6f 75 70 28 31 29 20 68 61 73  d m.group(1) has
4e60: 20 70 61 74 74 65 72 6e 20 73 50 61 74 74 65 72   pattern sPatter
4e70: 6e 47 72 6f 75 70 31 0a 20 20 20 20 6c 65 74 20  nGroup1.    let 
4e80: 6d 20 3d 20 7a 50 61 74 74 65 72 6e 2e 67 6c 5f  m = zPattern.gl_
4e90: 65 78 65 63 32 28 73 2c 20 6e 75 6c 6c 29 3b 0a  exec2(s, null);.
4ea0: 20 20 20 20 69 66 20 28 21 6d 29 20 7b 0a 20 20      if (!m) {.  
4eb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
4ec0: 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 72  se;.    }.    tr
4ed0: 79 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  y {.        let 
4ee0: 73 57 6f 72 64 20 3d 20 6d 5b 31 5d 3b 0a 20 20  sWord = m[1];.  
4ef0: 20 20 20 20 20 20 6c 65 74 20 6e 50 6f 73 20 3d        let nPos =
4f00: 20 6d 2e 73 74 61 72 74 5b 31 5d 20 2b 20 6e 4f   m.start[1] + nO
4f10: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69  ffset;.        i
4f20: 66 20 28 73 4e 65 67 50 61 74 74 65 72 6e 47 72  f (sNegPatternGr
4f30: 6f 75 70 31 29 20 7b 0a 20 20 20 20 20 20 20 20  oup1) {.        
4f40: 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 72 70 68      return morph
4f50: 65 78 28 64 44 41 2c 20 5b 6e 50 6f 73 2c 20 73  ex(dDA, [nPos, s
4f60: 57 6f 72 64 5d 2c 20 73 50 61 74 74 65 72 6e 47  Word], sPatternG
4f70: 72 6f 75 70 31 2c 20 73 4e 65 67 50 61 74 74 65  roup1, sNegPatte
4f80: 72 6e 47 72 6f 75 70 31 29 3b 0a 20 20 20 20 20  rnGroup1);.     
4f90: 20 20 20 7d 20 0a 20 20 20 20 20 20 20 20 72 65     } .        re
4fa0: 74 75 72 6e 20 6d 6f 72 70 68 28 64 44 41 2c 20  turn morph(dDA, 
4fb0: 5b 6e 50 6f 73 2c 20 73 57 6f 72 64 5d 2c 20 73  [nPos, sWord], s
4fc0: 50 61 74 74 65 72 6e 47 72 6f 75 70 31 2c 20 66  PatternGroup1, f
4fd0: 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alse);.    }.   
4fe0: 20 63 61 74 63 68 20 28 65 29 20 7b 0a 20 20 20   catch (e) {.   
4ff0: 20 20 20 20 20 68 65 6c 70 65 72 73 2e 6c 6f 67       helpers.log
5000: 65 72 72 6f 72 28 65 29 3b 0a 20 20 20 20 20 20  error(e);.      
5010: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a    return false;.
5020: 20 20 20 20 7d 0a 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f      }.}...//////
5030: 2f 2f 20 44 69 73 61 6d 62 69 67 75 61 74 6f 72  // Disambiguator
5040: 0a 0a 66 75 6e 63 74 69 6f 6e 20 73 65 6c 65 63  ..function selec
5050: 74 20 28 64 44 41 2c 20 6e 50 6f 73 2c 20 73 57  t (dDA, nPos, sW
5060: 6f 72 64 2c 20 73 50 61 74 74 65 72 6e 2c 20 6c  ord, sPattern, l
5070: 44 65 66 61 75 6c 74 3d 6e 75 6c 6c 29 20 7b 0a  Default=null) {.
5080: 20 20 20 20 69 66 20 28 21 73 57 6f 72 64 29 20      if (!sWord) 
5090: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
50a0: 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20   true;.    }.   
50b0: 20 69 66 20 28 64 44 41 2e 68 61 73 28 6e 50 6f   if (dDA.has(nPo
50c0: 73 29 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  s)) {.        re
50d0: 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d  turn true;.    }
50e0: 0a 20 20 20 20 69 66 20 28 21 5f 64 41 6e 61 6c  .    if (!_dAnal
50f0: 79 73 65 73 2e 68 61 73 28 73 57 6f 72 64 29 20  yses.has(sWord) 
5100: 26 26 20 21 5f 73 74 6f 72 65 4d 6f 72 70 68 46  && !_storeMorphF
5110: 72 6f 6d 46 53 41 28 73 57 6f 72 64 29 29 20 7b  romFSA(sWord)) {
5120: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5130: 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  true;.    }.    
5140: 69 66 20 28 5f 64 41 6e 61 6c 79 73 65 73 2e 67  if (_dAnalyses.g
5150: 65 74 28 73 57 6f 72 64 29 2e 6c 65 6e 67 74 68  et(sWord).length
5160: 20 3d 3d 3d 20 31 29 20 7b 0a 20 20 20 20 20 20   === 1) {.      
5170: 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20    return true;. 
5180: 20 20 20 7d 0a 20 20 20 20 6c 65 74 20 6c 53 65     }.    let lSe
5190: 6c 65 63 74 20 3d 20 5f 64 41 6e 61 6c 79 73 65  lect = _dAnalyse
51a0: 73 2e 67 65 74 28 73 57 6f 72 64 29 2e 66 69 6c  s.get(sWord).fil
51b0: 74 65 72 28 20 73 4d 6f 72 70 68 20 3d 3e 20 73  ter( sMorph => s
51c0: 4d 6f 72 70 68 2e 73 65 61 72 63 68 28 73 50 61  Morph.search(sPa
51d0: 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 20 29 3b  ttern) !== -1 );
51e0: 0a 20 20 20 20 69 66 20 28 6c 53 65 6c 65 63 74  .    if (lSelect
51f0: 2e 6c 65 6e 67 74 68 20 3e 20 30 29 20 7b 0a 20  .length > 0) {. 
5200: 20 20 20 20 20 20 20 69 66 20 28 6c 53 65 6c 65         if (lSele
5210: 63 74 2e 6c 65 6e 67 74 68 20 21 3d 20 5f 64 41  ct.length != _dA
5220: 6e 61 6c 79 73 65 73 2e 67 65 74 28 73 57 6f 72  nalyses.get(sWor
5230: 64 29 2e 6c 65 6e 67 74 68 29 20 7b 0a 20 20 20  d).length) {.   
5240: 20 20 20 20 20 20 20 20 20 64 44 41 2e 73 65 74           dDA.set
5250: 28 6e 50 6f 73 2c 20 6c 53 65 6c 65 63 74 29 3b  (nPos, lSelect);
5260: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
5270: 20 65 6c 73 65 20 69 66 20 28 6c 44 65 66 61 75   else if (lDefau
5280: 6c 74 29 20 7b 0a 20 20 20 20 20 20 20 20 64 44  lt) {.        dD
5290: 41 2e 73 65 74 28 6e 50 6f 73 2c 20 6c 44 65 66  A.set(nPos, lDef
52a0: 61 75 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  aul);.    }.    
52b0: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a  return true;.}..
52c0: 66 75 6e 63 74 69 6f 6e 20 65 78 63 6c 75 64 65  function exclude
52d0: 20 28 64 44 41 2c 20 6e 50 6f 73 2c 20 73 57 6f   (dDA, nPos, sWo
52e0: 72 64 2c 20 73 50 61 74 74 65 72 6e 2c 20 6c 44  rd, sPattern, lD
52f0: 65 66 61 75 6c 74 3d 6e 75 6c 6c 29 20 7b 0a 20  efault=null) {. 
5300: 20 20 20 69 66 20 28 21 73 57 6f 72 64 29 20 7b     if (!sWord) {
5310: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5320: 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  true;.    }.    
5330: 69 66 20 28 64 44 41 2e 68 61 73 28 6e 50 6f 73  if (dDA.has(nPos
5340: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  )) {.        ret
5350: 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a  urn true;.    }.
5360: 20 20 20 20 69 66 20 28 21 5f 64 41 6e 61 6c 79      if (!_dAnaly
5370: 73 65 73 2e 68 61 73 28 73 57 6f 72 64 29 20 26  ses.has(sWord) &
5380: 26 20 21 5f 73 74 6f 72 65 4d 6f 72 70 68 46 72  & !_storeMorphFr
5390: 6f 6d 46 53 41 28 73 57 6f 72 64 29 29 20 7b 0a  omFSA(sWord)) {.
53a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
53b0: 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rue;.    }.    i
53c0: 66 20 28 5f 64 41 6e 61 6c 79 73 65 73 2e 67 65  f (_dAnalyses.ge
53d0: 74 28 73 57 6f 72 64 29 2e 6c 65 6e 67 74 68 20  t(sWord).length 
53e0: 3d 3d 3d 20 31 29 20 7b 0a 20 20 20 20 20 20 20  === 1) {.       
53f0: 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20   return true;.  
5400: 20 20 7d 0a 20 20 20 20 6c 65 74 20 6c 53 65 6c    }.    let lSel
5410: 65 63 74 20 3d 20 5f 64 41 6e 61 6c 79 73 65 73  ect = _dAnalyses
5420: 2e 67 65 74 28 73 57 6f 72 64 29 2e 66 69 6c 74  .get(sWord).filt
5430: 65 72 28 20 73 4d 6f 72 70 68 20 3d 3e 20 73 4d  er( sMorph => sM
5440: 6f 72 70 68 2e 73 65 61 72 63 68 28 73 50 61 74  orph.search(sPat
5450: 74 65 72 6e 29 20 3d 3d 3d 20 2d 31 20 29 3b 0a  tern) === -1 );.
5460: 20 20 20 20 69 66 20 28 6c 53 65 6c 65 63 74 2e      if (lSelect.
5470: 6c 65 6e 67 74 68 20 3e 20 30 29 20 7b 0a 20 20  length > 0) {.  
5480: 20 20 20 20 20 20 69 66 20 28 6c 53 65 6c 65 63        if (lSelec
5490: 74 2e 6c 65 6e 67 74 68 20 21 3d 20 5f 64 41 6e  t.length != _dAn
54a0: 61 6c 79 73 65 73 2e 67 65 74 28 73 57 6f 72 64  alyses.get(sWord
54b0: 29 2e 6c 65 6e 67 74 68 29 20 7b 0a 20 20 20 20  ).length) {.    
54c0: 20 20 20 20 20 20 20 20 64 44 41 2e 73 65 74 28          dDA.set(
54d0: 6e 50 6f 73 2c 20 6c 53 65 6c 65 63 74 29 3b 0a  nPos, lSelect);.
54e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20          }.    } 
54f0: 65 6c 73 65 20 69 66 20 28 6c 44 65 66 61 75 6c  else if (lDefaul
5500: 74 29 20 7b 0a 20 20 20 20 20 20 20 20 64 44 41  t) {.        dDA
5510: 2e 73 65 74 28 6e 50 6f 73 2c 20 6c 44 65 66 61  .set(nPos, lDefa
5520: 75 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ult);.    }.    
5530: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a  return true;.}..
5540: 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 65 20  function define 
5550: 28 64 44 41 2c 20 6e 50 6f 73 2c 20 6c 4d 6f 72  (dDA, nPos, lMor
5560: 70 68 29 20 7b 0a 20 20 20 20 64 44 41 2e 73 65  ph) {.    dDA.se
5570: 74 28 6e 50 6f 73 2c 20 6c 4d 6f 72 70 68 29 3b  t(nPos, lMorph);
5580: 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65  .    return true
5590: 3b 0a 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 20 47  ;.}...//////// G
55a0: 52 41 4d 4d 41 52 20 43 48 45 43 4b 45 52 20 50  RAMMAR CHECKER P
55b0: 4c 55 47 49 4e 53 0a 0a 24 7b 70 6c 75 67 69 6e  LUGINS..${plugin
55c0: 73 4a 53 7d 0a 0a 0a 24 7b 63 61 6c 6c 61 62 6c  sJS}...${callabl
55d0: 65 73 4a 53 7d 0a 0a 0a 0a 69 66 20 28 74 79 70  esJS}....if (typ
55e0: 65 6f 66 28 65 78 70 6f 72 74 73 29 20 21 3d 3d  eof(exports) !==
55f0: 20 27 75 6e 64 65 66 69 6e 65 64 27 29 20 7b 0a   'undefined') {.
5600: 20 20 20 20 65 78 70 6f 72 74 73 2e 6c 61 6e 67      exports.lang
5610: 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 6c 61 6e   = gc_engine.lan
5620: 67 3b 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 6c  g;.    exports.l
5630: 6f 63 61 6c 65 73 20 3d 20 67 63 5f 65 6e 67 69  ocales = gc_engi
5640: 6e 65 2e 6c 6f 63 61 6c 65 73 3b 0a 20 20 20 20  ne.locales;.    
5650: 65 78 70 6f 72 74 73 2e 70 6b 67 20 3d 20 67 63  exports.pkg = gc
5660: 5f 65 6e 67 69 6e 65 2e 70 6b 67 3b 0a 20 20 20  _engine.pkg;.   
5670: 20 65 78 70 6f 72 74 73 2e 6e 61 6d 65 20 3d 20   exports.name = 
5680: 67 63 5f 65 6e 67 69 6e 65 2e 6e 61 6d 65 3b 0a  gc_engine.name;.
5690: 20 20 20 20 65 78 70 6f 72 74 73 2e 76 65 72 73      exports.vers
56a0: 69 6f 6e 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e  ion = gc_engine.
56b0: 76 65 72 73 69 6f 6e 3b 0a 20 20 20 20 65 78 70  version;.    exp
56c0: 6f 72 74 73 2e 61 75 74 68 6f 72 20 3d 20 67 63  orts.author = gc
56d0: 5f 65 6e 67 69 6e 65 2e 61 75 74 68 6f 72 3b 0a  _engine.author;.
56e0: 20 20 20 20 65 78 70 6f 72 74 73 2e 70 61 72 73      exports.pars
56f0: 65 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 70 61  e = gc_engine.pa
5700: 72 73 65 3b 0a 20 20 20 20 65 78 70 6f 72 74 73  rse;.    exports
5710: 2e 5f 7a 45 6e 64 4f 66 53 65 6e 74 65 6e 63 65  ._zEndOfSentence
5720: 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 5f 7a 45   = gc_engine._zE
5730: 6e 64 4f 66 53 65 6e 74 65 6e 63 65 3b 0a 20 20  ndOfSentence;.  
5740: 20 20 65 78 70 6f 72 74 73 2e 5f 7a 42 65 67 69    exports._zBegi
5750: 6e 4f 66 50 61 72 61 67 72 61 70 68 20 3d 20 67  nOfParagraph = g
5760: 63 5f 65 6e 67 69 6e 65 2e 5f 7a 42 65 67 69 6e  c_engine._zBegin
5770: 4f 66 50 61 72 61 67 72 61 70 68 3b 0a 20 20 20  OfParagraph;.   
5780: 20 65 78 70 6f 72 74 73 2e 5f 7a 45 6e 64 4f 66   exports._zEndOf
5790: 50 61 72 61 67 72 61 70 68 20 3d 20 67 63 5f 65  Paragraph = gc_e
57a0: 6e 67 69 6e 65 2e 5f 7a 45 6e 64 4f 66 50 61 72  ngine._zEndOfPar
57b0: 61 67 72 61 70 68 3b 0a 20 20 20 20 65 78 70 6f  agraph;.    expo
57c0: 72 74 73 2e 5f 67 65 74 53 65 6e 74 65 6e 63 65  rts._getSentence
57d0: 42 6f 75 6e 64 61 72 69 65 73 20 3d 20 67 63 5f  Boundaries = gc_
57e0: 65 6e 67 69 6e 65 2e 5f 67 65 74 53 65 6e 74 65  engine._getSente
57f0: 6e 63 65 42 6f 75 6e 64 61 72 69 65 73 3b 0a 20  nceBoundaries;. 
5800: 20 20 20 65 78 70 6f 72 74 73 2e 5f 70 72 6f 6f     exports._proo
5810: 66 72 65 61 64 20 3d 20 67 63 5f 65 6e 67 69 6e  fread = gc_engin
5820: 65 2e 5f 70 72 6f 6f 66 72 65 61 64 3b 0a 20 20  e._proofread;.  
5830: 20 20 65 78 70 6f 72 74 73 2e 5f 63 72 65 61 74    exports._creat
5840: 65 45 72 72 6f 72 20 3d 20 67 63 5f 65 6e 67 69  eError = gc_engi
5850: 6e 65 2e 5f 63 72 65 61 74 65 45 72 72 6f 72 3b  ne._createError;
5860: 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 5f 72 65  .    exports._re
5870: 77 72 69 74 65 20 3d 20 67 63 5f 65 6e 67 69 6e  write = gc_engin
5880: 65 2e 5f 72 65 77 72 69 74 65 3b 0a 20 20 20 20  e._rewrite;.    
5890: 65 78 70 6f 72 74 73 2e 69 67 6e 6f 72 65 52 75  exports.ignoreRu
58a0: 6c 65 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 69  le = gc_engine.i
58b0: 67 6e 6f 72 65 52 75 6c 65 3b 0a 20 20 20 20 65  gnoreRule;.    e
58c0: 78 70 6f 72 74 73 2e 72 65 73 65 74 49 67 6e 6f  xports.resetIgno
58d0: 72 65 52 75 6c 65 73 20 3d 20 67 63 5f 65 6e 67  reRules = gc_eng
58e0: 69 6e 65 2e 72 65 73 65 74 49 67 6e 6f 72 65 52  ine.resetIgnoreR
58f0: 75 6c 65 73 3b 0a 20 20 20 20 65 78 70 6f 72 74  ules;.    export
5900: 73 2e 72 65 61 63 74 69 76 61 74 65 52 75 6c 65  s.reactivateRule
5910: 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 72 65 61   = gc_engine.rea
5920: 63 74 69 76 61 74 65 52 75 6c 65 3b 0a 20 20 20  ctivateRule;.   
5930: 20 65 78 70 6f 72 74 73 2e 6c 69 73 74 52 75 6c   exports.listRul
5940: 65 73 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 6c  es = gc_engine.l
5950: 69 73 74 52 75 6c 65 73 3b 0a 20 20 20 20 65 78  istRules;.    ex
5960: 70 6f 72 74 73 2e 5f 67 65 74 52 75 6c 65 73 20  ports._getRules 
5970: 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 5f 67 65 74  = gc_engine._get
5980: 52 75 6c 65 73 3b 0a 20 20 20 20 65 78 70 6f 72  Rules;.    expor
5990: 74 73 2e 6c 6f 61 64 20 3d 20 67 63 5f 65 6e 67  ts.load = gc_eng
59a0: 69 6e 65 2e 6c 6f 61 64 3b 0a 20 20 20 20 65 78  ine.load;.    ex
59b0: 70 6f 72 74 73 2e 67 65 74 53 70 65 6c 6c 43 68  ports.getSpellCh
59c0: 65 63 6b 65 72 20 3d 20 67 63 5f 65 6e 67 69 6e  ecker = gc_engin
59d0: 65 2e 67 65 74 53 70 65 6c 6c 43 68 65 63 6b 65  e.getSpellChecke
59e0: 72 3b 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 73  r;.    exports.s
59f0: 65 74 4f 70 74 69 6f 6e 20 3d 20 67 63 5f 65 6e  etOption = gc_en
5a00: 67 69 6e 65 2e 73 65 74 4f 70 74 69 6f 6e 3b 0a  gine.setOption;.
5a10: 20 20 20 20 65 78 70 6f 72 74 73 2e 73 65 74 4f      exports.setO
5a20: 70 74 69 6f 6e 73 20 3d 20 67 63 5f 65 6e 67 69  ptions = gc_engi
5a30: 6e 65 2e 73 65 74 4f 70 74 69 6f 6e 73 3b 0a 20  ne.setOptions;. 
5a40: 20 20 20 65 78 70 6f 72 74 73 2e 67 65 74 4f 70     exports.getOp
5a50: 74 69 6f 6e 73 20 3d 20 67 63 5f 65 6e 67 69 6e  tions = gc_engin
5a60: 65 2e 67 65 74 4f 70 74 69 6f 6e 73 3b 0a 20 20  e.getOptions;.  
5a70: 20 20 65 78 70 6f 72 74 73 2e 67 65 74 44 65 66    exports.getDef
5a80: 61 75 6c 74 4f 70 74 69 6f 6e 73 20 3d 20 67 63  aultOptions = gc
5a90: 5f 65 6e 67 69 6e 65 2e 67 65 74 44 65 66 61 75  _engine.getDefau
5aa0: 6c 74 4f 70 74 69 6f 6e 73 3b 0a 20 20 20 20 65  ltOptions;.    e
5ab0: 78 70 6f 72 74 73 2e 72 65 73 65 74 4f 70 74 69  xports.resetOpti
5ac0: 6f 6e 73 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e  ons = gc_engine.
5ad0: 72 65 73 65 74 4f 70 74 69 6f 6e 73 3b 0a 7d 0a  resetOptions;.}.