Grammalecte  Hex Artifact Content

Artifact 12095116ac67ba91553f8f3d80d7c7e64416d3e87d5fb7393ad5c15ccf61e9e6:


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 0a 0a 76 61  ker = null;...va
0460: 72 20 67 63 5f 65 6e 67 69 6e 65 20 3d 20 7b 0a  r gc_engine = {.
0470: 0a 20 20 20 20 2f 2f 2f 2f 20 49 6e 66 6f 72 6d  .    //// Inform
0480: 61 74 69 6f 6e 73 0a 0a 20 20 20 20 6c 61 6e 67  ations..    lang
0490: 3a 20 22 24 7b 6c 61 6e 67 7d 22 2c 0a 20 20 20  : "${lang}",.   
04a0: 20 6c 6f 63 61 6c 65 73 3a 20 24 7b 6c 6f 63 7d   locales: ${loc}
04b0: 2c 0a 20 20 20 20 70 6b 67 3a 20 22 24 7b 69 6d  ,.    pkg: "${im
04c0: 70 6c 6e 61 6d 65 7d 22 2c 0a 20 20 20 20 6e 61  plname}",.    na
04d0: 6d 65 3a 20 22 24 7b 6e 61 6d 65 7d 22 2c 0a 20  me: "${name}",. 
04e0: 20 20 20 76 65 72 73 69 6f 6e 3a 20 22 24 7b 76     version: "${v
04f0: 65 72 73 69 6f 6e 7d 22 2c 0a 20 20 20 20 61 75  ersion}",.    au
0500: 74 68 6f 72 3a 20 22 24 7b 61 75 74 68 6f 72 7d  thor: "${author}
0510: 22 2c 0a 0a 20 20 20 20 2f 2f 2f 2f 20 50 61 72  ",..    //// Par
0520: 73 69 6e 67 0a 0a 20 20 20 20 70 61 72 73 65 3a  sing..    parse:
0530: 20 66 75 6e 63 74 69 6f 6e 20 28 73 54 65 78 74   function (sText
0540: 2c 20 73 43 6f 75 6e 74 72 79 3d 22 24 7b 63 6f  , sCountry="${co
0550: 75 6e 74 72 79 5f 64 65 66 61 75 6c 74 7d 22 2c  untry_default}",
0560: 20 62 44 65 62 75 67 3d 66 61 6c 73 65 2c 20 62   bDebug=false, b
0570: 43 6f 6e 74 65 78 74 3d 66 61 6c 73 65 29 20 7b  Context=false) {
0580: 0a 20 20 20 20 20 20 20 20 2f 2f 20 61 6e 61 6c  .        // anal
0590: 79 73 65 73 20 74 68 65 20 70 61 72 61 67 72 61  yses the paragra
05a0: 70 68 20 73 54 65 78 74 20 61 6e 64 20 72 65 74  ph sText and ret
05b0: 75 72 6e 73 20 6c 69 73 74 20 6f 66 20 65 72 72  urns list of err
05c0: 6f 72 73 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ors.        let 
05d0: 64 45 72 72 6f 72 73 3b 0a 20 20 20 20 20 20 20  dErrors;.       
05e0: 20 6c 65 74 20 65 72 72 73 3b 0a 20 20 20 20 20   let errs;.     
05f0: 20 20 20 6c 65 74 20 73 41 6c 74 20 3d 20 73 54     let sAlt = sT
0600: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 6c 65 74  ext;.        let
0610: 20 64 44 41 20 3d 20 6e 65 77 20 4d 61 70 28 29   dDA = new Map()
0620: 3b 20 20 20 20 20 20 20 20 2f 2f 20 44 69 73 61  ;        // Disa
0630: 6d 6e 62 69 67 75 61 74 6f 72 0a 20 20 20 20 20  mnbiguator.     
0640: 20 20 20 6c 65 74 20 64 50 72 69 6f 72 69 74 79     let dPriority
0650: 20 3d 20 6e 65 77 20 4d 61 70 28 29 3b 20 20 2f   = new Map();  /
0660: 2f 20 4b 65 79 20 3d 20 70 6f 73 69 74 69 6f 6e  / Key = position
0670: 3b 20 76 61 6c 75 65 20 3d 20 70 72 69 6f 72 69  ; value = priori
0680: 74 79 0a 20 20 20 20 20 20 20 20 6c 65 74 20 73  ty.        let s
0690: 4e 65 77 20 3d 20 22 22 3b 0a 0a 20 20 20 20 20  New = "";..     
06a0: 20 20 20 2f 2f 20 70 61 72 73 65 20 70 61 72 61     // parse para
06b0: 67 72 61 70 68 0a 20 20 20 20 20 20 20 20 74 72  graph.        tr
06c0: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
06d0: 5b 73 4e 65 77 2c 20 64 45 72 72 6f 72 73 5d 20  [sNew, dErrors] 
06e0: 3d 20 74 68 69 73 2e 5f 70 72 6f 6f 66 72 65 61  = this._proofrea
06f0: 64 28 73 54 65 78 74 2c 20 73 41 6c 74 2c 20 30  d(sText, sAlt, 0
0700: 2c 20 74 72 75 65 2c 20 64 44 41 2c 20 64 50 72  , true, dDA, dPr
0710: 69 6f 72 69 74 79 2c 20 73 43 6f 75 6e 74 72 79  iority, sCountry
0720: 2c 20 62 44 65 62 75 67 2c 20 62 43 6f 6e 74 65  , bDebug, bConte
0730: 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xt);.           
0740: 20 69 66 20 28 73 4e 65 77 29 20 7b 0a 20 20 20   if (sNew) {.   
0750: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 54 65               sTe
0760: 78 74 20 3d 20 73 4e 65 77 3b 0a 20 20 20 20 20  xt = sNew;.     
0770: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
0780: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68   }.        catch
0790: 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20   (e) {.         
07a0: 20 20 20 68 65 6c 70 65 72 73 2e 6c 6f 67 65 72     helpers.loger
07b0: 72 6f 72 28 65 29 3b 0a 20 20 20 20 20 20 20 20  ror(e);.        
07c0: 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 63 6c  }..        // cl
07d0: 65 61 6e 75 70 0a 20 20 20 20 20 20 20 20 69 66  eanup.        if
07e0: 20 28 73 54 65 78 74 2e 69 6e 63 6c 75 64 65 73   (sText.includes
07f0: 28 22 c2 a0 22 29 29 20 7b 0a 20 20 20 20 20 20  ("..")) {.      
0800: 20 20 20 20 20 20 73 54 65 78 74 20 3d 20 73 54        sText = sT
0810: 65 78 74 2e 72 65 70 6c 61 63 65 28 2f c2 a0 2f  ext.replace(/../
0820: 67 2c 20 27 20 27 29 3b 20 2f 2f 20 6e 62 73 70  g, ' '); // nbsp
0830: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
0840: 20 20 20 69 66 20 28 73 54 65 78 74 2e 69 6e 63     if (sText.inc
0850: 6c 75 64 65 73 28 22 e2 80 af 22 29 29 20 7b 0a  ludes("...")) {.
0860: 20 20 20 20 20 20 20 20 20 20 20 20 73 54 65 78              sTex
0870: 74 20 3d 20 73 54 65 78 74 2e 72 65 70 6c 61 63  t = sText.replac
0880: 65 28 2f e2 80 af 2f 67 2c 20 27 20 27 29 3b 20  e(/.../g, ' '); 
0890: 2f 2f 20 73 6e 62 73 70 0a 20 20 20 20 20 20 20  // snbsp.       
08a0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 73   }.        if (s
08b0: 54 65 78 74 2e 69 6e 63 6c 75 64 65 73 28 22 27  Text.includes("'
08c0: 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ")) {.          
08d0: 20 20 73 54 65 78 74 20 3d 20 73 54 65 78 74 2e    sText = sText.
08e0: 72 65 70 6c 61 63 65 28 2f 27 2f 67 2c 20 22 e2  replace(/'/g, ".
08f0: 80 99 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ..");.        }.
0900: 20 20 20 20 20 20 20 20 69 66 20 28 73 54 65 78          if (sTex
0910: 74 2e 69 6e 63 6c 75 64 65 73 28 22 e2 80 91 22  t.includes("..."
0920: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
0930: 20 73 54 65 78 74 20 3d 20 73 54 65 78 74 2e 72   sText = sText.r
0940: 65 70 6c 61 63 65 28 2f e2 80 91 2f 67 2c 20 22  eplace(/.../g, "
0950: 2d 22 29 3b 20 2f 2f 20 6e 6f 62 72 65 61 6b 64  -"); // nobreakd
0960: 61 73 68 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ash.        }.. 
0970: 20 20 20 20 20 20 20 2f 2f 20 70 61 72 73 65 20         // parse 
0980: 73 65 6e 74 65 6e 63 65 0a 20 20 20 20 20 20 20  sentence.       
0990: 20 66 6f 72 20 28 6c 65 74 20 5b 69 53 74 61 72   for (let [iStar
09a0: 74 2c 20 69 45 6e 64 5d 20 6f 66 20 74 68 69 73  t, iEnd] of this
09b0: 2e 5f 67 65 74 53 65 6e 74 65 6e 63 65 42 6f 75  ._getSentenceBou
09c0: 6e 64 61 72 69 65 73 28 73 54 65 78 74 29 29 20  ndaries(sText)) 
09d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
09e0: 20 28 34 20 3c 20 28 69 45 6e 64 20 2d 20 69 53   (4 < (iEnd - iS
09f0: 74 61 72 74 29 20 3c 20 32 30 30 30 29 20 7b 0a  tart) < 2000) {.
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a10: 64 44 41 2e 63 6c 65 61 72 28 29 3b 0a 20 20 20  dDA.clear();.   
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 68               //h
0a30: 65 6c 70 65 72 73 2e 65 63 68 6f 28 73 54 65 78  elpers.echo(sTex
0a40: 74 2e 73 6c 69 63 65 28 69 53 74 61 72 74 2c 20  t.slice(iStart, 
0a50: 69 45 6e 64 29 29 3b 0a 20 20 20 20 20 20 20 20  iEnd));.        
0a60: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 5b 2c 20 65 72 72 73 5d 20 3d 20 74 68 69    [, errs] = thi
0a90: 73 2e 5f 70 72 6f 6f 66 72 65 61 64 28 73 54 65  s._proofread(sTe
0aa0: 78 74 2e 73 6c 69 63 65 28 69 53 74 61 72 74 2c  xt.slice(iStart,
0ab0: 20 69 45 6e 64 29 2c 20 73 41 6c 74 2e 73 6c 69   iEnd), sAlt.sli
0ac0: 63 65 28 69 53 74 61 72 74 2c 20 69 45 6e 64 29  ce(iStart, iEnd)
0ad0: 2c 20 69 53 74 61 72 74 2c 20 66 61 6c 73 65 2c  , iStart, false,
0ae0: 20 64 44 41 2c 20 64 50 72 69 6f 72 69 74 79 2c   dDA, dPriority,
0af0: 20 73 43 6f 75 6e 74 72 79 2c 20 62 44 65 62 75   sCountry, bDebu
0b00: 67 2c 20 62 43 6f 6e 74 65 78 74 29 3b 0a 20 20  g, bContext);.  
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b20: 20 20 64 45 72 72 6f 72 73 2e 67 6c 5f 75 70 64    dErrors.gl_upd
0b30: 61 74 65 28 65 72 72 73 29 3b 0a 20 20 20 20 20  ate(errs);.     
0b40: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74               cat
0b60: 63 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20  ch (e) {.       
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 65 6c               hel
0b80: 70 65 72 73 2e 6c 6f 67 65 72 72 6f 72 28 65 29  pers.logerror(e)
0b90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
0ba0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
0bb0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
0bc0: 20 20 20 20 72 65 74 75 72 6e 20 41 72 72 61 79      return Array
0bd0: 2e 66 72 6f 6d 28 64 45 72 72 6f 72 73 2e 76 61  .from(dErrors.va
0be0: 6c 75 65 73 28 29 29 3b 0a 20 20 20 20 7d 2c 0a  lues());.    },.
0bf0: 0a 20 20 20 20 5f 7a 45 6e 64 4f 66 53 65 6e 74  .    _zEndOfSent
0c00: 65 6e 63 65 3a 20 6e 65 77 20 52 65 67 45 78 70  ence: new RegExp
0c10: 20 28 27 28 5b 2e 3f 21 3a 3b e2 80 a6 5d 5b 20   ('([.?!:;...][ 
0c20: 2e 3f 21 e2 80 a6 20 c2 bb e2 80 9d 22 29 5d 2a  .?!... .....")]*
0c30: 7c 2e 24 29 27 2c 20 22 67 22 29 2c 0a 20 20 20  |.$)', "g"),.   
0c40: 20 5f 7a 42 65 67 69 6e 4f 66 50 61 72 61 67 72   _zBeginOfParagr
0c50: 61 70 68 3a 20 6e 65 77 20 52 65 67 45 78 70 20  aph: new RegExp 
0c60: 28 22 5e 5b 2d 20 c2 a0 e2 80 93 e2 80 94 2e 2c  ("^[- .........,
0c70: 3b 3f 21 e2 80 a6 5d 2a 22 2c 20 22 69 67 22 29  ;?!...]*", "ig")
0c80: 2c 0a 20 20 20 20 5f 7a 45 6e 64 4f 66 50 61 72  ,.    _zEndOfPar
0c90: 61 67 72 61 70 68 3a 20 6e 65 77 20 52 65 67 45  agraph: new RegE
0ca0: 78 70 20 28 22 5b 2d 20 c2 a0 2e 2c 3b 3f 21 e2  xp ("[- ...,;?!.
0cb0: 80 a6 e2 80 93 e2 80 94 5d 2a 24 22 2c 20 22 69  ........]*$", "i
0cc0: 67 22 29 2c 0a 0a 20 20 20 20 5f 67 65 74 53 65  g"),..    _getSe
0cd0: 6e 74 65 6e 63 65 42 6f 75 6e 64 61 72 69 65 73  ntenceBoundaries
0ce0: 3a 20 66 75 6e 63 74 69 6f 6e 2a 20 28 73 54 65  : function* (sTe
0cf0: 78 74 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65  xt) {.        le
0d00: 74 20 6d 42 65 67 69 6e 4f 66 53 65 6e 74 65 6e  t mBeginOfSenten
0d10: 63 65 20 3d 20 74 68 69 73 2e 5f 7a 42 65 67 69  ce = this._zBegi
0d20: 6e 4f 66 50 61 72 61 67 72 61 70 68 2e 65 78 65  nOfParagraph.exe
0d30: 63 28 73 54 65 78 74 29 3b 0a 20 20 20 20 20 20  c(sText);.      
0d40: 20 20 6c 65 74 20 69 53 74 61 72 74 20 3d 20 74    let iStart = t
0d50: 68 69 73 2e 5f 7a 42 65 67 69 6e 4f 66 50 61 72  his._zBeginOfPar
0d60: 61 67 72 61 70 68 2e 6c 61 73 74 49 6e 64 65 78  agraph.lastIndex
0d70: 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d 3b  ;.        let m;
0d80: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28  .        while (
0d90: 28 6d 20 3d 20 74 68 69 73 2e 5f 7a 45 6e 64 4f  (m = this._zEndO
0da0: 66 53 65 6e 74 65 6e 63 65 2e 65 78 65 63 28 73  fSentence.exec(s
0db0: 54 65 78 74 29 29 20 21 3d 3d 20 6e 75 6c 6c 29  Text)) !== null)
0dc0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 79   {.            y
0dd0: 69 65 6c 64 20 5b 69 53 74 61 72 74 2c 20 74 68  ield [iStart, th
0de0: 69 73 2e 5f 7a 45 6e 64 4f 66 53 65 6e 74 65 6e  is._zEndOfSenten
0df0: 63 65 2e 6c 61 73 74 49 6e 64 65 78 5d 3b 0a 20  ce.lastIndex];. 
0e00: 20 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72             iStar
0e10: 74 20 3d 20 74 68 69 73 2e 5f 7a 45 6e 64 4f 66  t = this._zEndOf
0e20: 53 65 6e 74 65 6e 63 65 2e 6c 61 73 74 49 6e 64  Sentence.lastInd
0e30: 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ex;.        }.  
0e40: 20 20 7d 2c 0a 0a 20 20 20 20 5f 70 72 6f 6f 66    },..    _proof
0e50: 72 65 61 64 3a 20 66 75 6e 63 74 69 6f 6e 20 28  read: function (
0e60: 73 2c 20 73 78 2c 20 6e 4f 66 66 73 65 74 2c 20  s, sx, nOffset, 
0e70: 62 50 61 72 61 67 72 61 70 68 2c 20 64 44 41 2c  bParagraph, dDA,
0e80: 20 64 50 72 69 6f 72 69 74 79 2c 20 73 43 6f 75   dPriority, sCou
0e90: 6e 74 72 79 2c 20 62 44 65 62 75 67 2c 20 62 43  ntry, bDebug, bC
0ea0: 6f 6e 74 65 78 74 29 20 7b 0a 20 20 20 20 20 20  ontext) {.      
0eb0: 20 20 6c 65 74 20 64 45 72 72 73 20 3d 20 6e 65    let dErrs = ne
0ec0: 77 20 4d 61 70 28 29 3b 0a 20 20 20 20 20 20 20  w Map();.       
0ed0: 20 6c 65 74 20 62 43 68 61 6e 67 65 20 3d 20 66   let bChange = f
0ee0: 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 6c 65  alse;.        le
0ef0: 74 20 62 49 64 52 75 6c 65 20 3d 20 6f 70 74 69  t bIdRule = opti
0f00: 6f 6e 28 27 69 64 72 75 6c 65 27 29 3b 0a 20 20  on('idrule');.  
0f10: 20 20 20 20 20 20 6c 65 74 20 6d 3b 0a 20 20 20        let m;.   
0f20: 20 20 20 20 20 6c 65 74 20 62 43 6f 6e 64 4d 65       let bCondMe
0f30: 6d 6f 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  mo;.        let 
0f40: 6e 45 72 72 6f 72 53 74 61 72 74 3b 0a 0a 20 20  nErrorStart;..  
0f50: 20 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b        for (let [
0f60: 73 4f 70 74 69 6f 6e 2c 20 6c 52 75 6c 65 47 72  sOption, lRuleGr
0f70: 6f 75 70 5d 20 6f 66 20 74 68 69 73 2e 5f 67 65  oup] of this._ge
0f80: 74 52 75 6c 65 73 28 62 50 61 72 61 67 72 61 70  tRules(bParagrap
0f90: 68 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  h)) {.          
0fa0: 20 20 69 66 20 28 21 73 4f 70 74 69 6f 6e 20 7c    if (!sOption |
0fb0: 7c 20 6f 70 74 69 6f 6e 28 73 4f 70 74 69 6f 6e  | option(sOption
0fc0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  )) {.           
0fd0: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 7a       for (let [z
0fe0: 52 65 67 65 78 2c 20 62 55 70 70 65 72 63 61 73  Regex, bUppercas
0ff0: 65 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c  e, sLineId, sRul
1000: 65 49 64 2c 20 6e 50 72 69 6f 72 69 74 79 2c 20  eId, nPriority, 
1010: 6c 41 63 74 69 6f 6e 73 2c 20 6c 47 72 6f 75 70  lActions, lGroup
1020: 73 2c 20 6c 4e 65 67 4c 6f 6f 6b 42 65 66 6f 72  s, lNegLookBefor
1030: 65 5d 20 6f 66 20 6c 52 75 6c 65 47 72 6f 75 70  e] of lRuleGroup
1040: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
1050: 20 20 20 20 20 20 20 20 69 66 20 28 21 5f 61 49          if (!_aI
1060: 67 6e 6f 72 65 64 52 75 6c 65 73 2e 68 61 73 28  gnoredRules.has(
1070: 73 52 75 6c 65 49 64 29 29 20 7b 0a 20 20 20 20  sRuleId)) {.    
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1090: 20 20 20 20 77 68 69 6c 65 20 28 28 6d 20 3d 20      while ((m = 
10a0: 7a 52 65 67 65 78 2e 67 6c 5f 65 78 65 63 32 28  zRegex.gl_exec2(
10b0: 73 2c 20 6c 47 72 6f 75 70 73 2c 20 6c 4e 65 67  s, lGroups, lNeg
10c0: 4c 6f 6f 6b 42 65 66 6f 72 65 29 29 20 21 3d 3d  LookBefore)) !==
10d0: 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20   null) {.       
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 20 20 20 62 43 6f 6e 64 4d 65 6d 6f 20 3d       bCondMemo =
1100: 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20   null;.         
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1120: 20 20 20 2f 2a 69 66 20 28 62 44 65 62 75 67 29     /*if (bDebug)
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 20                  
1150: 20 20 20 68 65 6c 70 65 72 73 2e 65 63 68 6f 28     helpers.echo(
1160: 22 3e 3e 3e 3e 20 52 75 6c 65 20 23 20 22 20 2b  ">>>> Rule # " +
1170: 20 73 4c 69 6e 65 49 64 20 2b 20 22 20 2d 20 54   sLineId + " - T
1180: 65 78 74 3a 20 22 20 2b 20 73 20 2b 20 22 20 6f  ext: " + s + " o
1190: 70 74 3a 20 22 2b 20 73 4f 70 74 69 6f 6e 29 3b  pt: "+ sOption);
11a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2a 2f               }*/
11c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
11e0: 20 28 6c 65 74 20 5b 73 46 75 6e 63 43 6f 6e 64   (let [sFuncCond
11f0: 2c 20 63 41 63 74 69 6f 6e 54 79 70 65 2c 20 73  , cActionType, s
1200: 57 68 61 74 2c 20 2e 2e 2e 65 41 63 74 5d 20 6f  What, ...eAct] o
1210: 66 20 6c 41 63 74 69 6f 6e 73 29 20 7b 0a 20 20  f lActions) {.  
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 20 20 20 2f 2f 20 61 63 74            // act
1240: 69 6f 6e 20 69 6e 20 6c 41 63 74 69 6f 6e 73 3a  ion in lActions:
1250: 20 5b 20 63 6f 6e 64 69 74 69 6f 6e 2c 20 61 63   [ condition, ac
1260: 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 70 6c 61  tion type, repla
1270: 63 65 6d 65 6e 74 2f 73 75 67 67 65 73 74 69 6f  cement/suggestio
1280: 6e 2f 61 63 74 69 6f 6e 5b 2c 20 69 47 72 6f 75  n/action[, iGrou
1290: 70 5b 2c 20 6d 65 73 73 61 67 65 2c 20 55 52 4c  p[, message, URL
12a0: 5d 5d 20 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ]] ].           
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20       try {.     
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12f0: 2f 68 65 6c 70 65 72 73 2e 65 63 68 6f 28 6f 45  /helpers.echo(oE
1300: 76 61 6c 46 75 6e 63 5b 73 46 75 6e 63 43 6f 6e  valFunc[sFuncCon
1310: 64 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  d]);.           
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1330: 20 20 20 20 20 20 20 20 20 62 43 6f 6e 64 4d 65           bCondMe
1340: 6d 6f 20 3d 20 28 21 73 46 75 6e 63 43 6f 6e 64  mo = (!sFuncCond
1350: 20 7c 7c 20 6f 45 76 61 6c 46 75 6e 63 5b 73 46   || oEvalFunc[sF
1360: 75 6e 63 43 6f 6e 64 5d 28 73 2c 20 73 78 2c 20  uncCond](s, sx, 
1370: 6d 2c 20 64 44 41 2c 20 73 43 6f 75 6e 74 72 79  m, dDA, sCountry
1380: 2c 20 62 43 6f 6e 64 4d 65 6d 6f 29 29 3b 0a 20  , bCondMemo));. 
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 69 66 20 28 62 43 6f 6e 64 4d 65 6d 6f     if (bCondMemo
13c0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74              swit
13f0: 63 68 20 28 63 41 63 74 69 6f 6e 54 79 70 65 29  ch (cActionType)
1400: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1430: 61 73 65 20 22 2d 22 3a 0a 20 20 20 20 20 20 20  ase "-":.       
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 20 20 20 20 20 20 20 20 20 2f 2f 20 67 72 61 6d           // gram
1470: 6d 61 72 20 65 72 72 6f 72 0a 20 20 20 20 20 20  mar error.      
1480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 20 20 20 20 20 20 20 20 2f 2f 68 65 6c 70            //help
14b0: 65 72 73 2e 65 63 68 6f 28 22 2d 3e 20 65 72 72  ers.echo("-> err
14c0: 6f 72 20 64 65 74 65 63 74 65 64 20 69 6e 20 22  or detected in "
14d0: 20 2b 20 73 4c 69 6e 65 49 64 20 2b 20 22 5c 6e   + sLineId + "\n
14e0: 7a 52 65 67 65 78 3a 20 22 20 2b 20 7a 52 65 67  zRegex: " + zReg
14f0: 65 78 2e 73 6f 75 72 63 65 29 3b 0a 20 20 20 20  ex.source);.    
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1520: 20 20 20 20 20 20 20 20 20 20 20 20 6e 45 72 72              nErr
1530: 6f 72 53 74 61 72 74 20 3d 20 6e 4f 66 66 73 65  orStart = nOffse
1540: 74 20 2b 20 6d 2e 73 74 61 72 74 5b 65 41 63 74  t + m.start[eAct
1550: 5b 30 5d 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [0]];.          
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 69 66 20 28 21 64 45 72 72 73        if (!dErrs
1590: 2e 68 61 73 28 6e 45 72 72 6f 72 53 74 61 72 74  .has(nErrorStart
15a0: 29 20 7c 7c 20 6e 50 72 69 6f 72 69 74 79 20 3e  ) || nPriority >
15b0: 20 64 50 72 69 6f 72 69 74 79 2e 67 65 74 28 6e   dPriority.get(n
15c0: 45 72 72 6f 72 53 74 61 72 74 29 29 20 7b 0a 20  ErrorStart)) {. 
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 64 45 72 72 73 2e 73 65 74 28 6e 45 72     dErrs.set(nEr
1610: 72 6f 72 53 74 61 72 74 2c 20 74 68 69 73 2e 5f  rorStart, this._
1620: 63 72 65 61 74 65 45 72 72 6f 72 28 73 2c 20 73  createError(s, s
1630: 78 2c 20 73 57 68 61 74 2c 20 6e 4f 66 66 73 65  x, sWhat, nOffse
1640: 74 2c 20 6d 2c 20 65 41 63 74 5b 30 5d 2c 20 73  t, m, eAct[0], s
1650: 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65 49 64 2c  LineId, sRuleId,
1660: 20 62 55 70 70 65 72 63 61 73 65 2c 20 65 41 63   bUppercase, eAc
1670: 74 5b 31 5d 2c 20 65 41 63 74 5b 32 5d 2c 20 62  t[1], eAct[2], b
1680: 49 64 52 75 6c 65 2c 20 73 4f 70 74 69 6f 6e 2c  IdRule, sOption,
1690: 20 62 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20   bContext));.   
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 64 50 72 69 6f 72 69 74 79 2e 73 65 74 28 6e   dPriority.set(n
16e0: 45 72 72 6f 72 53 74 61 72 74 2c 20 6e 50 72 69  ErrorStart, nPri
16f0: 6f 72 69 74 79 29 3b 0a 20 20 20 20 20 20 20 20  ority);.        
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 7d 0a 20 20 20 20 20 20          }.      
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1760: 0a 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 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
1790: 65 20 22 7e 22 3a 0a 20 20 20 20 20 20 20 20 20  e "~":.         
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 20 20 20 20 20 20 20 2f 2f 20 74 65 78 74 20 70         // text p
17d0: 72 6f 63 65 73 73 6f 72 0a 20 20 20 20 20 20 20  rocessor.       
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 20 20 20 20 20 2f 2f 68 65 6c 70 65           //helpe
1810: 72 73 2e 65 63 68 6f 28 22 2d 3e 20 74 65 78 74  rs.echo("-> text
1820: 20 70 72 6f 63 65 73 73 6f 72 20 62 79 20 22 20   processor by " 
1830: 2b 20 73 4c 69 6e 65 49 64 20 2b 20 22 5c 6e 7a  + sLineId + "\nz
1840: 52 65 67 65 78 3a 20 22 20 2b 20 7a 52 65 67 65  Regex: " + zRege
1850: 78 2e 73 6f 75 72 63 65 29 3b 0a 20 20 20 20 20  x.source);.     
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 20 20 20 20 20 20 20 20 20 20 20 73 20 3d 20 74             s = t
1890: 68 69 73 2e 5f 72 65 77 72 69 74 65 28 73 2c 20  his._rewrite(s, 
18a0: 73 57 68 61 74 2c 20 65 41 63 74 5b 30 5d 2c 20  sWhat, eAct[0], 
18b0: 6d 2c 20 62 55 70 70 65 72 63 61 73 65 29 3b 0a  m, bUppercase);.
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 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 62 43 68 61 6e 67 65 20 3d 20 74 72 75 65 3b 0a  bChange = true;.
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 69 66 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20  if (bDebug) {.  
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 68 65 6c 70 65 72 73 2e 65 63 68 6f 28 22    helpers.echo("
1980: 7e 20 22 20 2b 20 73 20 2b 20 22 20 20 2d 2d 20  ~ " + s + "  -- 
1990: 22 20 2b 20 6d 5b 65 41 63 74 5b 30 5d 5d 20 2b  " + m[eAct[0]] +
19a0: 20 22 20 20 23 20 22 20 2b 20 73 4c 69 6e 65 49   "  # " + sLineI
19b0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
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 20 20                  
1a40: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 22 3d           case "=
1a50: 22 3a 0a 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: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a80: 20 20 20 2f 2f 20 64 69 73 61 6d 62 69 67 75 61     // disambigua
1a90: 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20  tion.           
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 2f 2f 68 65 6c 70 65 72 73 2e 65       //helpers.e
1ad0: 63 68 6f 28 22 2d 3e 20 64 69 73 61 6d 62 69 67  cho("-> disambig
1ae0: 75 61 74 69 6f 6e 20 62 79 20 22 20 2b 20 73 4c  uation by " + sL
1af0: 69 6e 65 49 64 20 2b 20 22 5c 6e 7a 52 65 67 65  ineId + "\nzRege
1b00: 78 3a 20 22 20 2b 20 7a 52 65 67 65 78 2e 73 6f  x: " + zRegex.so
1b10: 75 72 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  urce);.         
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b40: 20 20 20 20 20 20 20 6f 45 76 61 6c 46 75 6e 63         oEvalFunc
1b50: 5b 73 57 68 61 74 5d 28 73 2c 20 6d 2c 20 64 44  [sWhat](s, m, dD
1b60: 41 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  A);.            
1b70: 20 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 69 66 20 28 62 44 65 62 75 67 29 20      if (bDebug) 
1ba0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e 65 63        helpers.ec
1be0: 68 6f 28 22 3d 20 22 20 2b 20 6d 5b 30 5d 20 2b  ho("= " + m[0] +
1bf0: 20 22 20 20 23 20 22 20 2b 20 73 4c 69 6e 65 49   "  # " + sLineI
1c00: 64 20 2b 20 22 5c 6e 44 41 3a 20 22 20 2b 20 64  d + "\nDA: " + d
1c10: 44 41 2e 67 6c 5f 74 6f 53 74 72 69 6e 67 28 29  DA.gl_toString()
1c20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
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 20 20 20                  
1cb0: 20 20 20 20 20 20 20 20 63 61 73 65 20 22 3e 22          case ">"
1cc0: 3a 0a 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 20                  
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 2f 2f 20 77 65 20 64 6f 20 6e 6f 74 68 69    // we do nothi
1d00: 6e 67 2c 20 74 68 69 73 20 74 65 73 74 20 69 73  ng, this test is
1d10: 20 6a 75 73 74 20 61 20 63 6f 6e 64 69 74 69 6f   just a conditio
1d20: 6e 20 74 6f 20 61 70 70 6c 79 20 61 6c 6c 20 66  n to apply all f
1d30: 6f 6c 6c 6f 77 69 6e 67 20 61 63 74 69 6f 6e 73  ollowing actions
1d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
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 20 20 20 20 20                  
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 65 6c               hel
1de0: 70 65 72 73 2e 65 63 68 6f 28 22 23 20 65 72 72  pers.echo("# err
1df0: 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 61 63 74 69  or: unknown acti
1e00: 6f 6e 20 61 74 20 22 20 2b 20 73 4c 69 6e 65 49  on at " + sLineI
1e10: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
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 20 20 20 20 20 7d 0a 20 20              }.  
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
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 69 66 20 28 63 41 63 74 69 6f 6e 54 79     if (cActionTy
1ea0: 70 65 20 3d 3d 20 22 3e 22 29 20 7b 0a 20 20 20  pe == ">") {.   
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 20 20 20 20 20 20 20 20 7d 0a 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 7d 0a                }.
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 20 20 63 61 74 63 68 20 28 65 29 20 7b 0a 20 20    catch (e) {.  
1f80: 20 20 20 20 20 20 20 20 20 20 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 68 65 6c 70 65 72 73 2e 65 63 68 6f 28 73    helpers.echo(s
1fb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 20 20 20 20 20 20 68 65 6c 70 65 72 73 2e 65         helpers.e
1fe0: 63 68 6f 28 22 23 20 6c 69 6e 65 20 69 64 3a 20  cho("# line id: 
1ff0: 22 20 2b 20 73 4c 69 6e 65 49 64 20 2b 20 22 5c  " + sLineId + "\
2000: 6e 23 20 72 75 6c 65 20 69 64 3a 20 22 20 2b 20  n# rule id: " + 
2010: 73 52 75 6c 65 49 64 29 3b 0a 20 20 20 20 20 20  sRuleId);.      
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 65                he
2040: 6c 70 65 72 73 2e 6c 6f 67 65 72 72 6f 72 28 65  lpers.logerror(e
2050: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
20a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
20d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
20e0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
20f0: 20 20 20 20 20 69 66 20 28 62 43 68 61 6e 67 65       if (bChange
2100: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2110: 72 65 74 75 72 6e 20 5b 73 2c 20 64 45 72 72 73  return [s, dErrs
2120: 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
2130: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 61 6c       return [fal
2140: 73 65 2c 20 64 45 72 72 73 5d 3b 0a 20 20 20 20  se, dErrs];.    
2150: 7d 2c 0a 0a 20 20 20 20 5f 63 72 65 61 74 65 45  },..    _createE
2160: 72 72 6f 72 3a 20 66 75 6e 63 74 69 6f 6e 20 28  rror: function (
2170: 73 2c 20 73 78 2c 20 73 52 65 70 6c 2c 20 6e 4f  s, sx, sRepl, nO
2180: 66 66 73 65 74 2c 20 6d 2c 20 69 47 72 6f 75 70  ffset, m, iGroup
2190: 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65  , sLineId, sRule
21a0: 49 64 2c 20 62 55 70 70 65 72 63 61 73 65 2c 20  Id, bUppercase, 
21b0: 73 4d 73 67 2c 20 73 55 52 4c 2c 20 62 49 64 52  sMsg, sURL, bIdR
21c0: 75 6c 65 2c 20 73 4f 70 74 69 6f 6e 2c 20 62 43  ule, sOption, bC
21d0: 6f 6e 74 65 78 74 29 20 7b 0a 20 20 20 20 20 20  ontext) {.      
21e0: 20 20 6c 65 74 20 6f 45 72 72 20 3d 20 7b 7d 3b    let oErr = {};
21f0: 0a 20 20 20 20 20 20 20 20 6f 45 72 72 5b 22 6e  .        oErr["n
2200: 53 74 61 72 74 22 5d 20 3d 20 6e 4f 66 66 73 65  Start"] = nOffse
2210: 74 20 2b 20 6d 2e 73 74 61 72 74 5b 69 47 72 6f  t + m.start[iGro
2220: 75 70 5d 3b 0a 20 20 20 20 20 20 20 20 6f 45 72  up];.        oEr
2230: 72 5b 22 6e 45 6e 64 22 5d 20 3d 20 6e 4f 66 66  r["nEnd"] = nOff
2240: 73 65 74 20 2b 20 6d 2e 65 6e 64 5b 69 47 72 6f  set + m.end[iGro
2250: 75 70 5d 3b 0a 20 20 20 20 20 20 20 20 6f 45 72  up];.        oEr
2260: 72 5b 22 73 4c 69 6e 65 49 64 22 5d 20 3d 20 73  r["sLineId"] = s
2270: 4c 69 6e 65 49 64 3b 0a 20 20 20 20 20 20 20 20  LineId;.        
2280: 6f 45 72 72 5b 22 73 52 75 6c 65 49 64 22 5d 20  oErr["sRuleId"] 
2290: 3d 20 73 52 75 6c 65 49 64 3b 0a 20 20 20 20 20  = sRuleId;.     
22a0: 20 20 20 6f 45 72 72 5b 22 73 54 79 70 65 22 5d     oErr["sType"]
22b0: 20 3d 20 28 73 4f 70 74 69 6f 6e 29 20 3f 20 73   = (sOption) ? s
22c0: 4f 70 74 69 6f 6e 20 3a 20 22 6e 6f 74 79 70 65  Option : "notype
22d0: 22 3b 0a 20 20 20 20 20 20 20 20 2f 2f 20 73 75  ";.        // su
22e0: 67 67 65 73 74 69 6f 6e 73 0a 20 20 20 20 20 20  ggestions.      
22f0: 20 20 69 66 20 28 73 52 65 70 6c 2e 73 6c 69 63    if (sRepl.slic
2300: 65 28 30 2c 31 29 20 3d 3d 3d 20 22 3d 22 29 20  e(0,1) === "=") 
2310: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  {.            le
2320: 74 20 73 75 67 67 20 3d 20 6f 45 76 61 6c 46 75  t sugg = oEvalFu
2330: 6e 63 5b 73 52 65 70 6c 2e 73 6c 69 63 65 28 31  nc[sRepl.slice(1
2340: 29 5d 28 73 2c 20 6d 29 3b 0a 20 20 20 20 20 20  )](s, m);.      
2350: 20 20 20 20 20 20 69 66 20 28 73 75 67 67 29 20        if (sugg) 
2360: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2370: 20 20 69 66 20 28 62 55 70 70 65 72 63 61 73 65    if (bUppercase
2380: 20 26 26 20 6d 5b 69 47 72 6f 75 70 5d 2e 73 6c   && m[iGroup].sl
2390: 69 63 65 28 30 2c 31 29 2e 67 6c 5f 69 73 55 70  ice(0,1).gl_isUp
23a0: 70 65 72 43 61 73 65 28 29 29 20 7b 0a 20 20 20  perCase()) {.   
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 6f 45 72 72 5b 22 61 53 75 67 67 65 73 74 69   oErr["aSuggesti
23d0: 6f 6e 73 22 5d 20 3d 20 63 61 70 69 74 61 6c 69  ons"] = capitali
23e0: 7a 65 41 72 72 61 79 28 73 75 67 67 2e 73 70 6c  zeArray(sugg.spl
23f0: 69 74 28 22 7c 22 29 29 3b 0a 20 20 20 20 20 20  it("|"));.      
2400: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
2410: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2420: 20 20 20 20 20 20 20 6f 45 72 72 5b 22 61 53 75         oErr["aSu
2430: 67 67 65 73 74 69 6f 6e 73 22 5d 20 3d 20 73 75  ggestions"] = su
2440: 67 67 2e 73 70 6c 69 74 28 22 7c 22 29 3b 0a 20  gg.split("|");. 
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
2470: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
2480: 20 20 20 20 20 20 6f 45 72 72 5b 22 61 53 75 67        oErr["aSug
2490: 67 65 73 74 69 6f 6e 73 22 5d 20 3d 20 5b 5d 3b  gestions"] = [];
24a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
24b0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66         } else if
24c0: 20 28 73 52 65 70 6c 20 3d 3d 20 22 5f 22 29 20   (sRepl == "_") 
24d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 45  {.            oE
24e0: 72 72 5b 22 61 53 75 67 67 65 73 74 69 6f 6e 73  rr["aSuggestions
24f0: 22 5d 20 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20  "] = [];.       
2500: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
2510: 20 20 20 20 20 20 69 66 20 28 62 55 70 70 65 72        if (bUpper
2520: 63 61 73 65 20 26 26 20 6d 5b 69 47 72 6f 75 70  case && m[iGroup
2530: 5d 2e 73 6c 69 63 65 28 30 2c 31 29 2e 67 6c 5f  ].slice(0,1).gl_
2540: 69 73 55 70 70 65 72 43 61 73 65 28 29 29 20 7b  isUpperCase()) {
2550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2560: 20 6f 45 72 72 5b 22 61 53 75 67 67 65 73 74 69   oErr["aSuggesti
2570: 6f 6e 73 22 5d 20 3d 20 63 61 70 69 74 61 6c 69  ons"] = capitali
2580: 7a 65 41 72 72 61 79 28 73 52 65 70 6c 2e 67 6c  zeArray(sRepl.gl
2590: 5f 65 78 70 61 6e 64 28 6d 29 2e 73 70 6c 69 74  _expand(m).split
25a0: 28 22 7c 22 29 29 3b 0a 20 20 20 20 20 20 20 20  ("|"));.        
25b0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 45 72               oEr
25d0: 72 5b 22 61 53 75 67 67 65 73 74 69 6f 6e 73 22  r["aSuggestions"
25e0: 5d 20 3d 20 73 52 65 70 6c 2e 67 6c 5f 65 78 70  ] = sRepl.gl_exp
25f0: 61 6e 64 28 6d 29 2e 73 70 6c 69 74 28 22 7c 22  and(m).split("|"
2600: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2610: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2620: 20 20 20 2f 2f 20 4d 65 73 73 61 67 65 0a 20 20     // Message.  
2630: 20 20 20 20 20 20 6c 65 74 20 73 4d 65 73 73 61        let sMessa
2640: 67 65 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20  ge = "";.       
2650: 20 69 66 20 28 73 4d 73 67 2e 73 6c 69 63 65 28   if (sMsg.slice(
2660: 30 2c 31 29 20 3d 3d 3d 20 22 3d 22 29 20 7b 0a  0,1) === "=") {.
2670: 20 20 20 20 20 20 20 20 20 20 20 20 73 4d 65 73              sMes
2680: 73 61 67 65 20 3d 20 6f 45 76 61 6c 46 75 6e 63  sage = oEvalFunc
2690: 5b 73 4d 73 67 2e 73 6c 69 63 65 28 31 29 5d 28  [sMsg.slice(1)](
26a0: 73 2c 20 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d  s, m);.        }
26b0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
26c0: 20 20 20 20 73 4d 65 73 73 61 67 65 20 3d 20 73      sMessage = s
26d0: 4d 73 67 2e 67 6c 5f 65 78 70 61 6e 64 28 6d 29  Msg.gl_expand(m)
26e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26f0: 20 20 20 20 69 66 20 28 62 49 64 52 75 6c 65 29      if (bIdRule)
2700: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
2710: 4d 65 73 73 61 67 65 20 2b 3d 20 22 20 23 23 22  Message += " ##"
2720: 20 2b 20 73 4c 69 6e 65 49 64 20 2b 20 22 20 23   + sLineId + " #
2730: 22 20 2b 20 73 52 75 6c 65 49 64 3b 0a 20 20 20  " + sRuleId;.   
2740: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f       }.        o
2750: 45 72 72 5b 22 73 4d 65 73 73 61 67 65 22 5d 20  Err["sMessage"] 
2760: 3d 20 73 4d 65 73 73 61 67 65 3b 0a 20 20 20 20  = sMessage;.    
2770: 20 20 20 20 2f 2f 20 55 52 4c 0a 20 20 20 20 20      // URL.     
2780: 20 20 20 6f 45 72 72 5b 22 55 52 4c 22 5d 20 3d     oErr["URL"] =
2790: 20 73 55 52 4c 20 7c 7c 20 22 22 3b 0a 20 20 20   sURL || "";.   
27a0: 20 20 20 20 20 2f 2f 20 43 6f 6e 74 65 78 74 0a       // Context.
27b0: 20 20 20 20 20 20 20 20 69 66 20 28 62 43 6f 6e          if (bCon
27c0: 74 65 78 74 29 20 7b 0a 20 20 20 20 20 20 20 20  text) {.        
27d0: 20 20 20 20 6f 45 72 72 5b 22 73 55 6e 64 65 72      oErr["sUnder
27e0: 6c 69 6e 65 64 22 5d 20 3d 20 73 78 2e 73 6c 69  lined"] = sx.sli
27f0: 63 65 28 6d 2e 73 74 61 72 74 5b 69 47 72 6f 75  ce(m.start[iGrou
2800: 70 5d 2c 20 6d 2e 65 6e 64 5b 69 47 72 6f 75 70  p], m.end[iGroup
2810: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
2820: 6f 45 72 72 5b 22 73 42 65 66 6f 72 65 22 5d 20  oErr["sBefore"] 
2830: 3d 20 73 78 2e 73 6c 69 63 65 28 4d 61 74 68 2e  = sx.slice(Math.
2840: 6d 61 78 28 30 2c 20 6d 2e 73 74 61 72 74 5b 69  max(0, m.start[i
2850: 47 72 6f 75 70 5d 2d 38 30 29 2c 20 6d 2e 73 74  Group]-80), m.st
2860: 61 72 74 5b 69 47 72 6f 75 70 5d 29 3b 0a 20 20  art[iGroup]);.  
2870: 20 20 20 20 20 20 20 20 20 20 6f 45 72 72 5b 22            oErr["
2880: 73 41 66 74 65 72 22 5d 20 3d 20 73 78 2e 73 6c  sAfter"] = sx.sl
2890: 69 63 65 28 6d 2e 65 6e 64 5b 69 47 72 6f 75 70  ice(m.end[iGroup
28a0: 5d 2c 20 6d 2e 65 6e 64 5b 69 47 72 6f 75 70 5d  ], m.end[iGroup]
28b0: 2b 38 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  +80);.        }.
28c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6f          return o
28d0: 45 72 72 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20  Err;.    },..   
28e0: 20 5f 72 65 77 72 69 74 65 3a 20 66 75 6e 63 74   _rewrite: funct
28f0: 69 6f 6e 20 28 73 2c 20 73 52 65 70 6c 2c 20 69  ion (s, sRepl, i
2900: 47 72 6f 75 70 2c 20 6d 2c 20 62 55 70 70 65 72  Group, m, bUpper
2910: 63 61 73 65 29 20 7b 0a 20 20 20 20 20 20 20 20  case) {.        
2920: 2f 2f 20 74 65 78 74 20 70 72 6f 63 65 73 73 6f  // text processo
2930: 72 3a 20 77 72 69 74 65 20 73 52 65 70 6c 20 69  r: write sRepl i
2940: 6e 20 73 20 61 74 20 69 47 72 6f 75 70 20 70 6f  n s at iGroup po
2950: 73 69 74 69 6f 6e 22 0a 20 20 20 20 20 20 20 20  sition".        
2960: 6c 65 74 20 6c 6e 20 3d 20 6d 2e 65 6e 64 5b 69  let ln = m.end[i
2970: 47 72 6f 75 70 5d 20 2d 20 6d 2e 73 74 61 72 74  Group] - m.start
2980: 5b 69 47 72 6f 75 70 5d 3b 0a 20 20 20 20 20 20  [iGroup];.      
2990: 20 20 6c 65 74 20 73 4e 65 77 20 3d 20 22 22 3b    let sNew = "";
29a0: 0a 20 20 20 20 20 20 20 20 69 66 20 28 73 52 65  .        if (sRe
29b0: 70 6c 20 3d 3d 3d 20 22 2a 22 29 20 7b 0a 20 20  pl === "*") {.  
29c0: 20 20 20 20 20 20 20 20 20 20 73 4e 65 77 20 3d            sNew =
29d0: 20 22 20 22 2e 72 65 70 65 61 74 28 6c 6e 29 3b   " ".repeat(ln);
29e0: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
29f0: 69 66 20 28 73 52 65 70 6c 20 3d 3d 3d 20 22 3e  if (sRepl === ">
2a00: 22 20 7c 7c 20 73 52 65 70 6c 20 3d 3d 3d 20 22  " || sRepl === "
2a10: 5f 22 20 7c 7c 20 73 52 65 70 6c 20 3d 3d 3d 20  _" || sRepl === 
2a20: 22 7e 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20  "~") {.         
2a30: 20 20 20 73 4e 65 77 20 3d 20 73 52 65 70 6c 20     sNew = sRepl 
2a40: 2b 20 22 20 22 2e 72 65 70 65 61 74 28 6c 6e 2d  + " ".repeat(ln-
2a50: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  1);.        } el
2a60: 73 65 20 69 66 20 28 73 52 65 70 6c 20 3d 3d 3d  se if (sRepl ===
2a70: 20 22 40 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "@") {.        
2a80: 20 20 20 20 73 4e 65 77 20 3d 20 22 40 22 2e 72      sNew = "@".r
2a90: 65 70 65 61 74 28 6c 6e 29 3b 0a 20 20 20 20 20  epeat(ln);.     
2aa0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 52     } else if (sR
2ab0: 65 70 6c 2e 73 6c 69 63 65 28 30 2c 31 29 20 3d  epl.slice(0,1) =
2ac0: 3d 3d 20 22 3d 22 29 20 7b 0a 20 20 20 20 20 20  == "=") {.      
2ad0: 20 20 20 20 20 20 73 4e 65 77 20 3d 20 6f 45 76        sNew = oEv
2ae0: 61 6c 46 75 6e 63 5b 73 52 65 70 6c 2e 73 6c 69  alFunc[sRepl.sli
2af0: 63 65 28 31 29 5d 28 73 2c 20 6d 29 3b 0a 20 20  ce(1)](s, m);.  
2b00: 20 20 20 20 20 20 20 20 20 20 73 4e 65 77 20 3d            sNew =
2b10: 20 73 4e 65 77 20 2b 20 22 20 22 2e 72 65 70 65   sNew + " ".repe
2b20: 61 74 28 6c 6e 2d 73 4e 65 77 2e 6c 65 6e 67 74  at(ln-sNew.lengt
2b30: 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  h);.            
2b40: 69 66 20 28 62 55 70 70 65 72 63 61 73 65 20 26  if (bUppercase &
2b50: 26 20 6d 5b 69 47 72 6f 75 70 5d 2e 73 6c 69 63  & m[iGroup].slic
2b60: 65 28 30 2c 31 29 2e 67 6c 5f 69 73 55 70 70 65  e(0,1).gl_isUppe
2b70: 72 43 61 73 65 28 29 29 20 7b 0a 20 20 20 20 20  rCase()) {.     
2b80: 20 20 20 20 20 20 20 20 20 20 20 73 4e 65 77 20             sNew 
2b90: 3d 20 73 4e 65 77 2e 67 6c 5f 74 6f 43 61 70 69  = sNew.gl_toCapi
2ba0: 74 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20 20 20  talize();.      
2bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bc0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
2bd0: 20 20 20 20 20 73 4e 65 77 20 3d 20 73 52 65 70       sNew = sRep
2be0: 6c 2e 67 6c 5f 65 78 70 61 6e 64 28 6d 29 3b 0a  l.gl_expand(m);.
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 73 4e 65 77              sNew
2c00: 20 3d 20 73 4e 65 77 20 2b 20 22 20 22 2e 72 65   = sNew + " ".re
2c10: 70 65 61 74 28 6c 6e 2d 73 4e 65 77 2e 6c 65 6e  peat(ln-sNew.len
2c20: 67 74 68 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gth);.        }.
2c30: 20 20 20 20 20 20 20 20 2f 2f 68 65 6c 70 65 72          //helper
2c40: 73 2e 65 63 68 6f 28 22 5c 6e 22 2b 73 2b 22 5c  s.echo("\n"+s+"\
2c50: 6e 73 74 61 72 74 3a 20 22 2b 6d 2e 73 74 61 72  nstart: "+m.star
2c60: 74 5b 69 47 72 6f 75 70 5d 2b 22 20 65 6e 64 3a  t[iGroup]+" end:
2c70: 22 2b 6d 2e 65 6e 64 5b 69 47 72 6f 75 70 5d 29  "+m.end[iGroup])
2c80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2c90: 73 2e 73 6c 69 63 65 28 30 2c 20 6d 2e 73 74 61  s.slice(0, m.sta
2ca0: 72 74 5b 69 47 72 6f 75 70 5d 29 20 2b 20 73 4e  rt[iGroup]) + sN
2cb0: 65 77 20 2b 20 73 2e 73 6c 69 63 65 28 6d 2e 65  ew + s.slice(m.e
2cc0: 6e 64 5b 69 47 72 6f 75 70 5d 29 3b 0a 20 20 20  nd[iGroup]);.   
2cd0: 20 7d 2c 0a 0a 20 20 20 20 2f 2f 20 41 63 74 69   },..    // Acti
2ce0: 6f 6e 73 20 6f 6e 20 72 75 6c 65 73 0a 0a 20 20  ons on rules..  
2cf0: 20 20 69 67 6e 6f 72 65 52 75 6c 65 3a 20 66 75    ignoreRule: fu
2d00: 6e 63 74 69 6f 6e 20 28 73 52 75 6c 65 49 64 29  nction (sRuleId)
2d10: 20 7b 0a 20 20 20 20 20 20 20 20 5f 61 49 67 6e   {.        _aIgn
2d20: 6f 72 65 64 52 75 6c 65 73 2e 61 64 64 28 73 52  oredRules.add(sR
2d30: 75 6c 65 49 64 29 3b 0a 20 20 20 20 7d 2c 0a 0a  uleId);.    },..
2d40: 20 20 20 20 72 65 73 65 74 49 67 6e 6f 72 65 52      resetIgnoreR
2d50: 75 6c 65 73 3a 20 66 75 6e 63 74 69 6f 6e 20 28  ules: function (
2d60: 29 20 7b 0a 20 20 20 20 20 20 20 20 5f 61 49 67  ) {.        _aIg
2d70: 6e 6f 72 65 64 52 75 6c 65 73 2e 63 6c 65 61 72  noredRules.clear
2d80: 28 29 3b 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20  ();.    },..    
2d90: 72 65 61 63 74 69 76 61 74 65 52 75 6c 65 3a 20  reactivateRule: 
2da0: 66 75 6e 63 74 69 6f 6e 20 28 73 52 75 6c 65 49  function (sRuleI
2db0: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 5f 61 49  d) {.        _aI
2dc0: 67 6e 6f 72 65 64 52 75 6c 65 73 2e 64 65 6c 65  gnoredRules.dele
2dd0: 74 65 28 73 52 75 6c 65 49 64 29 3b 0a 20 20 20  te(sRuleId);.   
2de0: 20 7d 2c 0a 0a 20 20 20 20 6c 69 73 74 52 75 6c   },..    listRul
2df0: 65 73 3a 20 66 75 6e 63 74 69 6f 6e 2a 20 28 73  es: function* (s
2e00: 46 69 6c 74 65 72 3d 6e 75 6c 6c 29 20 7b 0a 20  Filter=null) {. 
2e10: 20 20 20 20 20 20 20 2f 2f 20 67 65 6e 65 72 61         // genera
2e20: 74 6f 72 3a 20 72 65 74 75 72 6e 73 20 74 75 70  tor: returns tup
2e30: 6c 65 20 28 73 4f 70 74 69 6f 6e 2c 20 73 4c 69  le (sOption, sLi
2e40: 6e 65 49 64 2c 20 73 52 75 6c 65 49 64 29 0a 20  neId, sRuleId). 
2e50: 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20         try {.   
2e60: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c 65           for (le
2e70: 74 20 5b 73 4f 70 74 69 6f 6e 2c 20 6c 52 75 6c  t [sOption, lRul
2e80: 65 47 72 6f 75 70 5d 20 6f 66 20 74 68 69 73 2e  eGroup] of this.
2e90: 5f 67 65 74 52 75 6c 65 73 28 74 72 75 65 29 29  _getRules(true))
2ea0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2eb0: 20 20 20 66 6f 72 20 28 6c 65 74 20 5b 2c 2c 20     for (let [,, 
2ec0: 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65 49 64  sLineId, sRuleId
2ed0: 2c 2c 5d 20 6f 66 20 6c 52 75 6c 65 47 72 6f 75  ,,] of lRuleGrou
2ee0: 70 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p) {.           
2ef0: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73 46           if (!sF
2f00: 69 6c 74 65 72 20 7c 7c 20 73 52 75 6c 65 49 64  ilter || sRuleId
2f10: 2e 74 65 73 74 28 73 46 69 6c 74 65 72 29 29 20  .test(sFilter)) 
2f20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2f30: 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
2f40: 5b 73 4f 70 74 69 6f 6e 2c 20 73 4c 69 6e 65 49  [sOption, sLineI
2f50: 64 2c 20 73 52 75 6c 65 49 64 5d 3b 0a 20 20 20  d, sRuleId];.   
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f70: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2f80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2f90: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   }.            f
2fa0: 6f 72 20 28 6c 65 74 20 5b 73 4f 70 74 69 6f 6e  or (let [sOption
2fb0: 2c 20 6c 52 75 6c 65 47 72 6f 75 70 5d 20 6f 66  , lRuleGroup] of
2fc0: 20 74 68 69 73 2e 5f 67 65 74 52 75 6c 65 73 28   this._getRules(
2fd0: 66 61 6c 73 65 29 29 20 7b 0a 20 20 20 20 20 20  false)) {.      
2fe0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 6c            for (l
2ff0: 65 74 20 5b 2c 2c 20 73 4c 69 6e 65 49 64 2c 20  et [,, sLineId, 
3000: 73 52 75 6c 65 49 64 2c 2c 5d 20 6f 66 20 6c 52  sRuleId,,] of lR
3010: 75 6c 65 47 72 6f 75 70 29 20 7b 0a 20 20 20 20  uleGroup) {.    
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3030: 69 66 20 28 21 73 46 69 6c 74 65 72 20 7c 7c 20  if (!sFilter || 
3040: 73 52 75 6c 65 49 64 2e 74 65 73 74 28 73 46 69  sRuleId.test(sFi
3050: 6c 74 65 72 29 29 20 7b 0a 20 20 20 20 20 20 20  lter)) {.       
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3070: 20 79 69 65 6c 64 20 5b 73 4f 70 74 69 6f 6e 2c   yield [sOption,
3080: 20 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65 49   sLineId, sRuleI
3090: 64 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d];.            
30a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 74 63    }.        catc
30e0: 68 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20  h (e) {.        
30f0: 20 20 20 20 68 65 6c 70 65 72 73 2e 6c 6f 67 65      helpers.loge
3100: 72 72 6f 72 28 65 29 3b 0a 20 20 20 20 20 20 20  rror(e);.       
3110: 20 7d 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 5f   }.    },..    _
3120: 67 65 74 52 75 6c 65 73 3a 20 66 75 6e 63 74 69  getRules: functi
3130: 6f 6e 20 28 62 50 61 72 61 67 72 61 70 68 29 20  on (bParagraph) 
3140: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 62  {.        if (!b
3150: 50 61 72 61 67 72 61 70 68 29 20 7b 0a 20 20 20  Paragraph) {.   
3160: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
3170: 67 63 5f 72 75 6c 65 73 2e 6c 53 65 6e 74 65 6e  gc_rules.lSenten
3180: 63 65 52 75 6c 65 73 3b 0a 20 20 20 20 20 20 20  ceRules;.       
3190: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
31a0: 6e 20 67 63 5f 72 75 6c 65 73 2e 6c 50 61 72 61  n gc_rules.lPara
31b0: 67 72 61 70 68 52 75 6c 65 73 3b 0a 20 20 20 20  graphRules;.    
31c0: 7d 2c 0a 0a 20 20 20 20 2f 2f 2f 2f 20 49 6e 69  },..    //// Ini
31d0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 0a 20 20 20  tialization..   
31e0: 20 6c 6f 61 64 3a 20 66 75 6e 63 74 69 6f 6e 20   load: function 
31f0: 28 73 43 6f 6e 74 65 78 74 3d 22 4a 61 76 61 53  (sContext="JavaS
3200: 63 72 69 70 74 22 2c 20 73 50 61 74 68 3d 22 22  cript", sPath=""
3210: 29 20 7b 0a 20 20 20 20 20 20 20 20 74 72 79 20  ) {.        try 
3220: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
3230: 20 28 74 79 70 65 6f 66 28 72 65 71 75 69 72 65   (typeof(require
3240: 29 20 21 3d 3d 20 27 75 6e 64 65 66 69 6e 65 64  ) !== 'undefined
3250: 27 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ') {.           
3260: 20 20 20 20 20 76 61 72 20 73 70 65 6c 6c 63 68       var spellch
3270: 65 63 6b 65 72 20 3d 20 72 65 71 75 69 72 65 28  ecker = require(
3280: 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d  "resource://gram
3290: 6d 61 6c 65 63 74 65 2f 67 72 61 70 68 73 70 65  malecte/graphspe
32a0: 6c 6c 2f 73 70 65 6c 6c 63 68 65 63 6b 65 72 2e  ll/spellchecker.
32b0: 6a 73 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  js");.          
32c0: 20 20 20 20 20 20 5f 6f 53 70 65 6c 6c 43 68 65        _oSpellChe
32d0: 63 6b 65 72 20 3d 20 6e 65 77 20 73 70 65 6c 6c  cker = new spell
32e0: 63 68 65 63 6b 65 72 2e 53 70 65 6c 6c 43 68 65  checker.SpellChe
32f0: 63 6b 65 72 28 22 24 7b 6c 61 6e 67 7d 22 2c 20  cker("${lang}", 
3300: 22 22 2c 20 22 24 7b 64 69 63 5f 6d 61 69 6e 5f  "", "${dic_main_
3310: 66 69 6c 65 6e 61 6d 65 5f 6a 73 7d 22 2c 20 22  filename_js}", "
3320: 24 7b 64 69 63 5f 65 78 74 65 6e 64 65 64 5f 66  ${dic_extended_f
3330: 69 6c 65 6e 61 6d 65 5f 6a 73 7d 22 2c 20 22 24  ilename_js}", "$
3340: 7b 64 69 63 5f 63 6f 6d 6d 75 6e 69 74 79 5f 66  {dic_community_f
3350: 69 6c 65 6e 61 6d 65 5f 6a 73 7d 22 2c 20 22 24  ilename_js}", "$
3360: 7b 64 69 63 5f 70 65 72 73 6f 6e 61 6c 5f 66 69  {dic_personal_fi
3370: 6c 65 6e 61 6d 65 5f 6a 73 7d 22 29 3b 0a 20 20  lename_js}");.  
3380: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
3390: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
33a0: 20 20 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65     _oSpellChecke
33b0: 72 20 3d 20 6e 65 77 20 53 70 65 6c 6c 43 68 65  r = new SpellChe
33c0: 63 6b 65 72 28 22 24 7b 6c 61 6e 67 7d 22 2c 20  cker("${lang}", 
33d0: 73 50 61 74 68 2c 20 22 24 7b 64 69 63 5f 6d 61  sPath, "${dic_ma
33e0: 69 6e 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 7d 22  in_filename_js}"
33f0: 2c 20 22 24 7b 64 69 63 5f 65 78 74 65 6e 64 65  , "${dic_extende
3400: 64 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 7d 22 2c  d_filename_js}",
3410: 20 22 24 7b 64 69 63 5f 63 6f 6d 6d 75 6e 69 74   "${dic_communit
3420: 79 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 7d 22 2c  y_filename_js}",
3430: 20 22 24 7b 64 69 63 5f 70 65 72 73 6f 6e 61 6c   "${dic_personal
3440: 5f 66 69 6c 65 6e 61 6d 65 5f 6a 73 7d 22 29 3b  _filename_js}");
3450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3460: 20 20 20 20 20 20 20 20 20 20 20 5f 73 41 70 70             _sApp
3470: 43 6f 6e 74 65 78 74 20 3d 20 73 43 6f 6e 74 65  Context = sConte
3480: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  xt;.            
3490: 5f 64 4f 70 74 69 6f 6e 73 20 3d 20 67 63 5f 6f  _dOptions = gc_o
34a0: 70 74 69 6f 6e 73 2e 67 65 74 4f 70 74 69 6f 6e  ptions.getOption
34b0: 73 28 73 43 6f 6e 74 65 78 74 29 2e 67 6c 5f 73  s(sContext).gl_s
34c0: 68 61 6c 6c 6f 77 43 6f 70 79 28 29 3b 20 20 20  hallowCopy();   
34d0: 20 20 2f 2f 20 64 75 70 6c 69 63 61 74 69 6f 6e    // duplication
34e0: 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20 62   necessary, to b
34f0: 65 20 61 62 6c 65 20 74 6f 20 72 65 73 65 74 20  e able to reset 
3500: 74 6f 20 64 65 66 61 75 6c 74 0a 20 20 20 20 20  to default.     
3510: 20 20 20 20 20 20 20 5f 6f 53 70 65 6c 6c 43 68         _oSpellCh
3520: 65 63 6b 65 72 2e 61 63 74 69 76 61 74 65 53 74  ecker.activateSt
3530: 6f 72 61 67 65 28 29 3b 0a 20 20 20 20 20 20 20  orage();.       
3540: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68   }.        catch
3550: 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20   (e) {.         
3560: 20 20 20 68 65 6c 70 65 72 73 2e 6c 6f 67 65 72     helpers.loger
3570: 72 6f 72 28 65 29 3b 0a 20 20 20 20 20 20 20 20  ror(e);.        
3580: 7d 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 67 65  }.    },..    ge
3590: 74 53 70 65 6c 6c 43 68 65 63 6b 65 72 3a 20 66  tSpellChecker: f
35a0: 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20  unction () {.   
35b0: 20 20 20 20 20 72 65 74 75 72 6e 20 5f 6f 53 70       return _oSp
35c0: 65 6c 6c 43 68 65 63 6b 65 72 3b 0a 20 20 20 20  ellChecker;.    
35d0: 7d 2c 0a 0a 20 20 20 20 2f 2f 2f 2f 20 4f 70 74  },..    //// Opt
35e0: 69 6f 6e 73 0a 0a 20 20 20 20 73 65 74 4f 70 74  ions..    setOpt
35f0: 69 6f 6e 3a 20 66 75 6e 63 74 69 6f 6e 20 28 73  ion: function (s
3600: 4f 70 74 2c 20 62 56 61 6c 29 20 7b 0a 20 20 20  Opt, bVal) {.   
3610: 20 20 20 20 20 69 66 20 28 5f 64 4f 70 74 69 6f       if (_dOptio
3620: 6e 73 2e 68 61 73 28 73 4f 70 74 29 29 20 7b 0a  ns.has(sOpt)) {.
3630: 20 20 20 20 20 20 20 20 20 20 20 20 5f 64 4f 70              _dOp
3640: 74 69 6f 6e 73 2e 73 65 74 28 73 4f 70 74 2c 20  tions.set(sOpt, 
3650: 62 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  bVal);.        }
3660: 0a 20 20 20 20 7d 2c 0a 0a 20 20 20 20 73 65 74  .    },..    set
3670: 4f 70 74 69 6f 6e 73 3a 20 66 75 6e 63 74 69 6f  Options: functio
3680: 6e 20 28 64 4f 70 74 29 20 7b 0a 20 20 20 20 20  n (dOpt) {.     
3690: 20 20 20 5f 64 4f 70 74 69 6f 6e 73 2e 67 6c 5f     _dOptions.gl_
36a0: 75 70 64 61 74 65 4f 6e 6c 79 45 78 69 73 74 69  updateOnlyExisti
36b0: 6e 67 4b 65 79 73 28 64 4f 70 74 29 3b 0a 20 20  ngKeys(dOpt);.  
36c0: 20 20 7d 2c 0a 0a 20 20 20 20 67 65 74 4f 70 74    },..    getOpt
36d0: 69 6f 6e 73 3a 20 66 75 6e 63 74 69 6f 6e 20 28  ions: function (
36e0: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
36f0: 72 6e 20 5f 64 4f 70 74 69 6f 6e 73 3b 0a 20 20  rn _dOptions;.  
3700: 20 20 7d 2c 0a 0a 20 20 20 20 67 65 74 44 65 66    },..    getDef
3710: 61 75 6c 74 4f 70 74 69 6f 6e 73 3a 20 66 75 6e  aultOptions: fun
3720: 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20  ction () {.     
3730: 20 20 20 72 65 74 75 72 6e 20 67 63 5f 6f 70 74     return gc_opt
3740: 69 6f 6e 73 2e 67 65 74 4f 70 74 69 6f 6e 73 28  ions.getOptions(
3750: 5f 73 41 70 70 43 6f 6e 74 65 78 74 29 2e 67 6c  _sAppContext).gl
3760: 5f 73 68 61 6c 6c 6f 77 43 6f 70 79 28 29 3b 0a  _shallowCopy();.
3770: 20 20 20 20 7d 2c 0a 0a 20 20 20 20 72 65 73 65      },..    rese
3780: 74 4f 70 74 69 6f 6e 73 3a 20 66 75 6e 63 74 69  tOptions: functi
3790: 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20  on () {.        
37a0: 5f 64 4f 70 74 69 6f 6e 73 20 3d 20 67 63 5f 6f  _dOptions = gc_o
37b0: 70 74 69 6f 6e 73 2e 67 65 74 4f 70 74 69 6f 6e  ptions.getOption
37c0: 73 28 5f 73 41 70 70 43 6f 6e 74 65 78 74 29 2e  s(_sAppContext).
37d0: 67 6c 5f 73 68 61 6c 6c 6f 77 43 6f 70 79 28 29  gl_shallowCopy()
37e0: 3b 0a 20 20 20 20 7d 0a 7d 3b 0a 0a 0a 2f 2f 2f  ;.    }.};...///
37f0: 2f 2f 2f 2f 2f 20 43 6f 6d 6d 6f 6e 20 66 75 6e  ///// Common fun
3800: 63 74 69 6f 6e 73 0a 0a 66 75 6e 63 74 69 6f 6e  ctions..function
3810: 20 6f 70 74 69 6f 6e 20 28 73 4f 70 74 29 20 7b   option (sOpt) {
3820: 0a 20 20 20 20 2f 2f 20 72 65 74 75 72 6e 20 74  .    // return t
3830: 72 75 65 20 69 66 20 6f 70 74 69 6f 6e 20 73 4f  rue if option sO
3840: 70 74 20 69 73 20 61 63 74 69 76 65 0a 20 20 20  pt is active.   
3850: 20 72 65 74 75 72 6e 20 5f 64 4f 70 74 69 6f 6e   return _dOption
3860: 73 2e 67 65 74 28 73 4f 70 74 29 3b 0a 7d 0a 0a  s.get(sOpt);.}..
3870: 66 75 6e 63 74 69 6f 6e 20 64 69 73 70 6c 61 79  function display
3880: 49 6e 66 6f 20 28 64 44 41 2c 20 61 57 6f 72 64  Info (dDA, aWord
3890: 29 20 7b 0a 20 20 20 20 2f 2f 20 66 6f 72 20 64  ) {.    // for d
38a0: 65 62 75 67 67 69 6e 67 3a 20 69 6e 66 6f 20 6f  ebugging: info o
38b0: 66 20 77 6f 72 64 0a 20 20 20 20 69 66 20 28 21  f word.    if (!
38c0: 61 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20  aWord) {.       
38d0: 20 68 65 6c 70 65 72 73 2e 65 63 68 6f 28 22 3e   helpers.echo(">
38e0: 20 6e 6f 74 68 69 6e 67 20 74 6f 20 66 69 6e 64   nothing to find
38f0: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
3900: 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20  rn true;.    }. 
3910: 20 20 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20     let lMorph = 
3920: 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67  _oSpellChecker.g
3930: 65 74 4d 6f 72 70 68 28 61 57 6f 72 64 5b 31 5d  etMorph(aWord[1]
3940: 29 3b 0a 20 20 20 20 69 66 20 28 6c 4d 6f 72 70  );.    if (lMorp
3950: 68 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20 30 29 20  h.length === 0) 
3960: 7b 0a 20 20 20 20 20 20 20 20 68 65 6c 70 65 72  {.        helper
3970: 73 2e 65 63 68 6f 28 22 3e 20 6e 6f 74 20 69 6e  s.echo("> not in
3980: 20 64 69 63 74 69 6f 6e 61 72 79 22 29 3b 0a 20   dictionary");. 
3990: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
39a0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
39b0: 20 28 64 44 41 2e 68 61 73 28 61 57 6f 72 64 5b   (dDA.has(aWord[
39c0: 30 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 20 68  0])) {.        h
39d0: 65 6c 70 65 72 73 2e 65 63 68 6f 28 22 44 41 3a  elpers.echo("DA:
39e0: 20 22 20 2b 20 64 44 41 2e 67 65 74 28 61 57 6f   " + dDA.get(aWo
39f0: 72 64 5b 30 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  rd[0]));.    }. 
3a00: 20 20 20 68 65 6c 70 65 72 73 2e 65 63 68 6f 28     helpers.echo(
3a10: 22 46 53 41 3a 20 22 20 2b 20 6c 4d 6f 72 70 68  "FSA: " + lMorph
3a20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72  );.    return tr
3a30: 75 65 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20  ue;.}..function 
3a40: 6d 6f 72 70 68 20 28 64 44 41 2c 20 61 57 6f 72  morph (dDA, aWor
3a50: 64 2c 20 73 50 61 74 74 65 72 6e 2c 20 62 53 74  d, sPattern, bSt
3a60: 72 69 63 74 3d 74 72 75 65 2c 20 62 4e 6f 57 6f  rict=true, bNoWo
3a70: 72 64 3d 66 61 6c 73 65 29 20 7b 0a 20 20 20 20  rd=false) {.    
3a80: 2f 2f 20 61 6e 61 6c 79 73 65 20 61 20 74 75 70  // analyse a tup
3a90: 6c 65 20 28 70 6f 73 69 74 69 6f 6e 2c 20 77 6f  le (position, wo
3aa0: 72 64 29 2c 20 72 65 74 75 72 6e 20 74 72 75 65  rd), return true
3ab0: 20 69 66 20 73 50 61 74 74 65 72 6e 20 69 6e 20   if sPattern in 
3ac0: 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20 28 64 69  morphologies (di
3ad0: 73 61 6d 62 69 67 75 61 74 69 6f 6e 20 6f 6e 29  sambiguation on)
3ae0: 0a 20 20 20 20 69 66 20 28 21 61 57 6f 72 64 29  .    if (!aWord)
3af0: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 68 65 6c   {.        //hel
3b00: 70 65 72 73 2e 65 63 68 6f 28 22 6d 6f 72 70 68  pers.echo("morph
3b10: 3a 20 6e 6f 77 6f 72 64 2c 20 72 65 74 75 72 6e  : noword, return
3b20: 73 20 22 20 2b 20 62 4e 6f 57 6f 72 64 29 3b 0a  s " + bNoWord);.
3b30: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 62          return b
3b40: 4e 6f 57 6f 72 64 3b 0a 20 20 20 20 7d 0a 20 20  NoWord;.    }.  
3b50: 20 20 2f 2f 68 65 6c 70 65 72 73 2e 65 63 68 6f    //helpers.echo
3b60: 28 22 61 57 6f 72 64 3a 20 22 2b 61 57 6f 72 64  ("aWord: "+aWord
3b70: 2e 74 6f 53 74 72 69 6e 67 28 29 29 3b 0a 20 20  .toString());.  
3b80: 20 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20 64    let lMorph = d
3b90: 44 41 2e 68 61 73 28 61 57 6f 72 64 5b 30 5d 29  DA.has(aWord[0])
3ba0: 20 3f 20 64 44 41 2e 67 65 74 28 61 57 6f 72 64   ? dDA.get(aWord
3bb0: 5b 30 5d 29 20 3a 20 5f 6f 53 70 65 6c 6c 43 68  [0]) : _oSpellCh
3bc0: 65 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28 61  ecker.getMorph(a
3bd0: 57 6f 72 64 5b 31 5d 29 3b 0a 20 20 20 20 2f 2f  Word[1]);.    //
3be0: 68 65 6c 70 65 72 73 2e 65 63 68 6f 28 22 6c 4d  helpers.echo("lM
3bf0: 6f 72 70 68 3a 20 22 2b 6c 4d 6f 72 70 68 2e 74  orph: "+lMorph.t
3c00: 6f 53 74 72 69 6e 67 28 29 29 3b 0a 20 20 20 20  oString());.    
3c10: 69 66 20 28 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74  if (lMorph.lengt
3c20: 68 20 3d 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  h === 0) {.     
3c30: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
3c40: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2f 68 65 6c  .    }.    //hel
3c50: 70 65 72 73 2e 65 63 68 6f 28 22 2a 2a 2a 22 29  pers.echo("***")
3c60: 3b 0a 20 20 20 20 69 66 20 28 62 53 74 72 69 63  ;.    if (bStric
3c70: 74 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  t) {.        ret
3c80: 75 72 6e 20 6c 4d 6f 72 70 68 2e 65 76 65 72 79  urn lMorph.every
3c90: 28 73 20 20 3d 3e 20 20 28 73 2e 73 65 61 72 63  (s  =>  (s.searc
3ca0: 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20  h(sPattern) !== 
3cb0: 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  -1));.    }.    
3cc0: 72 65 74 75 72 6e 20 6c 4d 6f 72 70 68 2e 73 6f  return lMorph.so
3cd0: 6d 65 28 73 20 20 3d 3e 20 20 28 73 2e 73 65 61  me(s  =>  (s.sea
3ce0: 72 63 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d  rch(sPattern) !=
3cf0: 3d 20 2d 31 29 29 3b 0a 7d 0a 0a 66 75 6e 63 74  = -1));.}..funct
3d00: 69 6f 6e 20 6d 6f 72 70 68 65 78 20 28 64 44 41  ion morphex (dDA
3d10: 2c 20 61 57 6f 72 64 2c 20 73 50 61 74 74 65 72  , aWord, sPatter
3d20: 6e 2c 20 73 4e 65 67 50 61 74 74 65 72 6e 2c 20  n, sNegPattern, 
3d30: 62 4e 6f 57 6f 72 64 3d 66 61 6c 73 65 29 20 7b  bNoWord=false) {
3d40: 0a 20 20 20 20 2f 2f 20 61 6e 61 6c 79 73 65 20  .    // analyse 
3d50: 61 20 74 75 70 6c 65 20 28 70 6f 73 69 74 69 6f  a tuple (positio
3d60: 6e 2c 20 77 6f 72 64 29 2c 20 72 65 74 75 72 6e  n, word), return
3d70: 73 20 74 72 75 65 20 69 66 20 6e 6f 74 20 73 4e  s true if not sN
3d80: 65 67 50 61 74 74 65 72 6e 20 69 6e 20 77 6f 72  egPattern in wor
3d90: 64 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20 61  d morphologies a
3da0: 6e 64 20 73 50 61 74 74 65 72 6e 20 69 6e 20 77  nd sPattern in w
3db0: 6f 72 64 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73  ord morphologies
3dc0: 20 28 64 69 73 61 6d 62 69 67 75 61 74 69 6f 6e   (disambiguation
3dd0: 20 6f 6e 29 0a 20 20 20 20 69 66 20 28 21 61 57   on).    if (!aW
3de0: 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  ord) {.        /
3df0: 2f 68 65 6c 70 65 72 73 2e 65 63 68 6f 28 22 6d  /helpers.echo("m
3e00: 6f 72 70 68 3a 20 6e 6f 77 6f 72 64 2c 20 72 65  orph: noword, re
3e10: 74 75 72 6e 73 20 22 20 2b 20 62 4e 6f 57 6f 72  turns " + bNoWor
3e20: 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  d);.        retu
3e30: 72 6e 20 62 4e 6f 57 6f 72 64 3b 0a 20 20 20 20  rn bNoWord;.    
3e40: 7d 0a 20 20 20 20 2f 2f 68 65 6c 70 65 72 73 2e  }.    //helpers.
3e50: 65 63 68 6f 28 22 61 57 6f 72 64 3a 20 22 2b 61  echo("aWord: "+a
3e60: 57 6f 72 64 2e 74 6f 53 74 72 69 6e 67 28 29 29  Word.toString())
3e70: 3b 0a 20 20 20 20 6c 65 74 20 6c 4d 6f 72 70 68  ;.    let lMorph
3e80: 20 3d 20 64 44 41 2e 68 61 73 28 61 57 6f 72 64   = dDA.has(aWord
3e90: 5b 30 5d 29 20 3f 20 64 44 41 2e 67 65 74 28 61  [0]) ? dDA.get(a
3ea0: 57 6f 72 64 5b 30 5d 29 20 3a 20 5f 6f 53 70 65  Word[0]) : _oSpe
3eb0: 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74 4d 6f 72  llChecker.getMor
3ec0: 70 68 28 61 57 6f 72 64 5b 31 5d 29 3b 0a 20 20  ph(aWord[1]);.  
3ed0: 20 20 2f 2f 68 65 6c 70 65 72 73 2e 65 63 68 6f    //helpers.echo
3ee0: 28 22 6c 4d 6f 72 70 68 3a 20 22 2b 6c 4d 6f 72  ("lMorph: "+lMor
3ef0: 70 68 2e 74 6f 53 74 72 69 6e 67 28 29 29 3b 0a  ph.toString());.
3f00: 20 20 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e 6c      if (lMorph.l
3f10: 65 6e 67 74 68 20 3d 3d 3d 20 30 29 20 7b 0a 20  ength === 0) {. 
3f20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
3f30: 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  lse;.    }.    /
3f40: 2f 68 65 6c 70 65 72 73 2e 65 63 68 6f 28 22 2a  /helpers.echo("*
3f50: 2a 2a 22 29 3b 0a 20 20 20 20 2f 2f 20 63 68 65  **");.    // che
3f60: 63 6b 20 6e 65 67 61 74 69 76 65 20 63 6f 6e 64  ck negative cond
3f70: 69 74 69 6f 6e 0a 20 20 20 20 69 66 20 28 6c 4d  ition.    if (lM
3f80: 6f 72 70 68 2e 73 6f 6d 65 28 73 20 20 3d 3e 20  orph.some(s  => 
3f90: 20 28 73 2e 73 65 61 72 63 68 28 73 4e 65 67 50   (s.search(sNegP
3fa0: 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29  attern) !== -1))
3fb0: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
3fc0: 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a  rn false;.    }.
3fd0: 20 20 20 20 2f 2f 20 73 65 61 72 63 68 20 73 50      // search sP
3fe0: 61 74 74 65 72 6e 0a 20 20 20 20 72 65 74 75 72  attern.    retur
3ff0: 6e 20 6c 4d 6f 72 70 68 2e 73 6f 6d 65 28 73 20  n lMorph.some(s 
4000: 20 3d 3e 20 20 28 73 2e 73 65 61 72 63 68 28 73   =>  (s.search(s
4010: 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29  Pattern) !== -1)
4020: 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 61  );.}..function a
4030: 6e 61 6c 79 73 65 20 28 73 57 6f 72 64 2c 20 73  nalyse (sWord, s
4040: 50 61 74 74 65 72 6e 2c 20 62 53 74 72 69 63 74  Pattern, bStrict
4050: 3d 74 72 75 65 29 20 7b 0a 20 20 20 20 2f 2f 20  =true) {.    // 
4060: 61 6e 61 6c 79 73 65 20 61 20 77 6f 72 64 2c 20  analyse a word, 
4070: 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 73  return true if s
4080: 50 61 74 74 65 72 6e 20 69 6e 20 6d 6f 72 70 68  Pattern in morph
4090: 6f 6c 6f 67 69 65 73 20 28 64 69 73 61 6d 62 69  ologies (disambi
40a0: 67 75 61 74 69 6f 6e 20 6f 66 66 29 0a 20 20 20  guation off).   
40b0: 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20 5f 6f   let lMorph = _o
40c0: 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74  SpellChecker.get
40d0: 4d 6f 72 70 68 28 73 57 6f 72 64 29 3b 0a 20 20  Morph(sWord);.  
40e0: 20 20 69 66 20 28 6c 4d 6f 72 70 68 2e 6c 65 6e    if (lMorph.len
40f0: 67 74 68 20 3d 3d 3d 20 30 29 20 7b 0a 20 20 20  gth === 0) {.   
4100: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
4110: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  e;.    }.    if 
4120: 28 62 53 74 72 69 63 74 29 20 7b 0a 20 20 20 20  (bStrict) {.    
4130: 20 20 20 20 72 65 74 75 72 6e 20 6c 4d 6f 72 70      return lMorp
4140: 68 2e 65 76 65 72 79 28 73 20 20 3d 3e 20 20 28  h.every(s  =>  (
4150: 73 2e 73 65 61 72 63 68 28 73 50 61 74 74 65 72  s.search(sPatter
4160: 6e 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 20 20 20  n) !== -1));.   
4170: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 4d   }.    return lM
4180: 6f 72 70 68 2e 73 6f 6d 65 28 73 20 20 3d 3e 20  orph.some(s  => 
4190: 20 28 73 2e 73 65 61 72 63 68 28 73 50 61 74 74   (s.search(sPatt
41a0: 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 7d  ern) !== -1));.}
41b0: 0a 0a 66 75 6e 63 74 69 6f 6e 20 61 6e 61 6c 79  ..function analy
41c0: 73 65 78 20 28 73 57 6f 72 64 2c 20 73 50 61 74  sex (sWord, sPat
41d0: 74 65 72 6e 2c 20 73 4e 65 67 50 61 74 74 65 72  tern, sNegPatter
41e0: 6e 29 20 7b 0a 20 20 20 20 2f 2f 20 61 6e 61 6c  n) {.    // anal
41f0: 79 73 65 20 61 20 77 6f 72 64 2c 20 72 65 74 75  yse a word, retu
4200: 72 6e 73 20 54 72 75 65 20 69 66 20 6e 6f 74 20  rns True if not 
4210: 73 4e 65 67 50 61 74 74 65 72 6e 20 69 6e 20 77  sNegPattern in w
4220: 6f 72 64 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73  ord morphologies
4230: 20 61 6e 64 20 73 50 61 74 74 65 72 6e 20 69 6e   and sPattern in
4240: 20 77 6f 72 64 20 6d 6f 72 70 68 6f 6c 6f 67 69   word morphologi
4250: 65 73 20 28 64 69 73 61 6d 62 69 67 75 61 74 69  es (disambiguati
4260: 6f 6e 20 6f 66 66 29 0a 20 20 20 20 6c 65 74 20  on off).    let 
4270: 6c 4d 6f 72 70 68 20 3d 20 5f 6f 53 70 65 6c 6c  lMorph = _oSpell
4280: 43 68 65 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68  Checker.getMorph
4290: 28 73 57 6f 72 64 29 3b 0a 20 20 20 20 69 66 20  (sWord);.    if 
42a0: 28 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d  (lMorph.length =
42b0: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20  == 0) {.        
42c0: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20  return false;.  
42d0: 20 20 7d 0a 20 20 20 20 2f 2f 20 63 68 65 63 6b    }.    // check
42e0: 20 6e 65 67 61 74 69 76 65 20 63 6f 6e 64 69 74   negative condit
42f0: 69 6f 6e 0a 20 20 20 20 69 66 20 28 6c 4d 6f 72  ion.    if (lMor
4300: 70 68 2e 73 6f 6d 65 28 73 20 20 3d 3e 20 20 28  ph.some(s  =>  (
4310: 73 2e 73 65 61 72 63 68 28 73 4e 65 67 50 61 74  s.search(sNegPat
4320: 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29 29 20  tern) !== -1))) 
4330: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
4340: 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20   false;.    }.  
4350: 20 20 2f 2f 20 73 65 61 72 63 68 20 73 50 61 74    // search sPat
4360: 74 65 72 6e 0a 20 20 20 20 72 65 74 75 72 6e 20  tern.    return 
4370: 6c 4d 6f 72 70 68 2e 73 6f 6d 65 28 73 20 20 3d  lMorph.some(s  =
4380: 3e 20 20 28 73 2e 73 65 61 72 63 68 28 73 50 61  >  (s.search(sPa
4390: 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29 3b  ttern) !== -1));
43a0: 0a 7d 0a 0a 0a 2f 2f 2f 2f 20 66 75 6e 63 74 69  .}...//// functi
43b0: 6f 6e 73 20 74 6f 20 67 65 74 20 74 65 78 74 20  ons to get text 
43c0: 6f 75 74 73 69 64 65 20 70 61 74 74 65 72 6e 20  outside pattern 
43d0: 73 63 6f 70 65 0a 0a 2f 2f 20 77 61 72 6e 69 6e  scope..// warnin
43e0: 67 3a 20 63 68 65 63 6b 20 63 6f 6d 70 69 6c 65  g: check compile
43f0: 5f 72 75 6c 65 73 2e 70 79 20 74 6f 20 75 6e 64  _rules.py to und
4400: 65 72 73 74 61 6e 64 20 68 6f 77 20 69 74 20 77  erstand how it w
4410: 6f 72 6b 73 0a 0a 66 75 6e 63 74 69 6f 6e 20 6e  orks..function n
4420: 65 78 74 77 6f 72 64 20 28 73 2c 20 69 53 74 61  extword (s, iSta
4430: 72 74 2c 20 6e 29 20 7b 0a 20 20 20 20 2f 2f 20  rt, n) {.    // 
4440: 67 65 74 20 74 68 65 20 6e 74 68 20 77 6f 72 64  get the nth word
4450: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73 74   of the input st
4460: 72 69 6e 67 20 6f 72 20 65 6d 70 74 79 20 73 74  ring or empty st
4470: 72 69 6e 67 0a 20 20 20 20 6c 65 74 20 7a 20 3d  ring.    let z =
4480: 20 6e 65 77 20 52 65 67 45 78 70 28 22 5e 28 3f   new RegExp("^(?
4490: 3a 20 2b 5b 61 2d 7a c3 a0 2d c3 b6 41 2d 5a c3  : +[a-z..-..A-Z.
44a0: b8 2d c3 bf c3 80 2d c3 96 30 2d 39 c3 98 2d c3  .-....-..0-9..-.
44b0: 9f c4 80 2d ca af ef ac 81 2d ef ac 86 25 5f 2d  ...-.....-...%_-
44c0: 5d 2b 29 7b 22 20 2b 20 28 6e 2d 31 29 2e 74 6f  ]+){" + (n-1).to
44d0: 53 74 72 69 6e 67 28 29 20 2b 20 22 7d 20 2b 28  String() + "} +(
44e0: 5b 61 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8 2d c3  [a-z..-..A-Z..-.
44f0: bf c3 80 2d c3 96 30 2d 39 c3 98 2d c3 9f c4 80  ...-..0-9..-....
4500: 2d ca af ef ac 81 2d ef ac 86 25 5f 2d 5d 2b 29  -.....-...%_-]+)
4510: 22 2c 20 22 69 67 22 29 3b 0a 20 20 20 20 6c 65  ", "ig");.    le
4520: 74 20 6d 20 3d 20 7a 2e 65 78 65 63 28 73 2e 73  t m = z.exec(s.s
4530: 6c 69 63 65 28 69 53 74 61 72 74 29 29 3b 0a 20  lice(iStart));. 
4540: 20 20 20 69 66 20 28 21 6d 29 20 7b 0a 20 20 20     if (!m) {.   
4550: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c       return null
4560: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
4570: 72 6e 20 5b 69 53 74 61 72 74 20 2b 20 7a 2e 6c  rn [iStart + z.l
4580: 61 73 74 49 6e 64 65 78 20 2d 20 6d 5b 31 5d 2e  astIndex - m[1].
4590: 6c 65 6e 67 74 68 2c 20 6d 5b 31 5d 5d 3b 0a 7d  length, m[1]];.}
45a0: 0a 0a 66 75 6e 63 74 69 6f 6e 20 70 72 65 76 77  ..function prevw
45b0: 6f 72 64 20 28 73 2c 20 69 45 6e 64 2c 20 6e 29  ord (s, iEnd, n)
45c0: 20 7b 0a 20 20 20 20 2f 2f 20 67 65 74 20 74 68   {.    // get th
45d0: 65 20 28 2d 29 6e 74 68 20 77 6f 72 64 20 6f 66  e (-)nth word of
45e0: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
45f0: 67 20 6f 72 20 65 6d 70 74 79 20 73 74 72 69 6e  g or empty strin
4600: 67 0a 20 20 20 20 6c 65 74 20 7a 20 3d 20 6e 65  g.    let z = ne
4610: 77 20 52 65 67 45 78 70 28 22 28 5b 61 2d 7a c3  w RegExp("([a-z.
4620: a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3  .-..A-Z..-....-.
4630: 96 30 2d 39 c3 98 2d c3 9f c4 80 2d ca af ef ac  .0-9..-....-....
4640: 81 2d ef ac 86 25 5f 2d 5d 2b 29 20 2b 28 3f 3a  .-...%_-]+) +(?:
4650: 5b 61 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8 2d c3  [a-z..-..A-Z..-.
4660: bf c3 80 2d c3 96 30 2d 39 c3 98 2d c3 9f c4 80  ...-..0-9..-....
4670: 2d ca af ef ac 81 2d ef ac 86 25 5f 2d 5d 2b 20  -.....-...%_-]+ 
4680: 2b 29 7b 22 20 2b 20 28 6e 2d 31 29 2e 74 6f 53  +){" + (n-1).toS
4690: 74 72 69 6e 67 28 29 20 2b 20 22 7d 24 22 2c 20  tring() + "}$", 
46a0: 22 69 22 29 3b 0a 20 20 20 20 6c 65 74 20 6d 20  "i");.    let m 
46b0: 3d 20 7a 2e 65 78 65 63 28 73 2e 73 6c 69 63 65  = z.exec(s.slice
46c0: 28 30 2c 20 69 45 6e 64 29 29 3b 0a 20 20 20 20  (0, iEnd));.    
46d0: 69 66 20 28 21 6d 29 20 7b 0a 20 20 20 20 20 20  if (!m) {.      
46e0: 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20    return null;. 
46f0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
4700: 5b 6d 2e 69 6e 64 65 78 2c 20 6d 5b 31 5d 5d 3b  [m.index, m[1]];
4710: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 6e 65 78  .}..function nex
4720: 74 77 6f 72 64 31 20 28 73 2c 20 69 53 74 61 72  tword1 (s, iStar
4730: 74 29 20 7b 0a 20 20 20 20 2f 2f 20 67 65 74 20  t) {.    // get 
4740: 6e 65 78 74 20 77 6f 72 64 20 28 6f 70 74 69 6d  next word (optim
4750: 69 7a 61 74 69 6f 6e 29 0a 20 20 20 20 6c 65 74  ization).    let
4760: 20 5f 7a 4e 65 78 74 57 6f 72 64 20 3d 20 6e 65   _zNextWord = ne
4770: 77 20 52 65 67 45 78 70 20 28 22 5e 20 2b 28 5b  w RegExp ("^ +([
4780: 61 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf  a-z..-..A-Z..-..
4790: c3 80 2d c3 96 30 2d 39 c3 98 2d c3 9f c4 80 2d  ..-..0-9..-....-
47a0: ca af ef ac 81 2d ef ac 86 5f 5d 5b 61 2d 7a c3  .....-..._][a-z.
47b0: a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3  .-..A-Z..-....-.
47c0: 96 30 2d 39 c3 98 2d c3 9f c4 80 2d ca af ef ac  .0-9..-....-....
47d0: 81 2d ef ac 86 5f 2d 5d 2a 29 22 2c 20 22 69 67  .-..._-]*)", "ig
47e0: 22 29 3b 0a 20 20 20 20 6c 65 74 20 6d 20 3d 20  ");.    let m = 
47f0: 5f 7a 4e 65 78 74 57 6f 72 64 2e 65 78 65 63 28  _zNextWord.exec(
4800: 73 2e 73 6c 69 63 65 28 69 53 74 61 72 74 29 29  s.slice(iStart))
4810: 3b 0a 20 20 20 20 69 66 20 28 21 6d 29 20 7b 0a  ;.    if (!m) {.
4820: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
4830: 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ull;.    }.    r
4840: 65 74 75 72 6e 20 5b 69 53 74 61 72 74 20 2b 20  eturn [iStart + 
4850: 5f 7a 4e 65 78 74 57 6f 72 64 2e 6c 61 73 74 49  _zNextWord.lastI
4860: 6e 64 65 78 20 2d 20 6d 5b 31 5d 2e 6c 65 6e 67  ndex - m[1].leng
4870: 74 68 2c 20 6d 5b 31 5d 5d 3b 0a 7d 0a 0a 63 6f  th, m[1]];.}..co
4880: 6e 73 74 20 5f 7a 50 72 65 76 57 6f 72 64 20 3d  nst _zPrevWord =
4890: 20 6e 65 77 20 52 65 67 45 78 70 20 28 22 28 5b   new RegExp ("([
48a0: 61 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf  a-z..-..A-Z..-..
48b0: c3 80 2d c3 96 30 2d 39 c3 98 2d c3 9f c4 80 2d  ..-..0-9..-....-
48c0: ca af ef ac 81 2d ef ac 86 5f 5d 5b 61 2d 7a c3  .....-..._][a-z.
48d0: a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3  .-..A-Z..-....-.
48e0: 96 30 2d 39 c3 98 2d c3 9f c4 80 2d ca af ef ac  .0-9..-....-....
48f0: 81 2d ef ac 86 5f 2d 5d 2a 29 20 2b 24 22 2c 20  .-..._-]*) +$", 
4900: 22 69 22 29 3b 0a 0a 66 75 6e 63 74 69 6f 6e 20  "i");..function 
4910: 70 72 65 76 77 6f 72 64 31 20 28 73 2c 20 69 45  prevword1 (s, iE
4920: 6e 64 29 20 7b 0a 20 20 20 20 2f 2f 20 67 65 74  nd) {.    // get
4930: 20 70 72 65 76 69 6f 75 73 20 77 6f 72 64 20 28   previous word (
4940: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 29 0a 20 20  optimization).  
4950: 20 20 6c 65 74 20 6d 20 3d 20 5f 7a 50 72 65 76    let m = _zPrev
4960: 57 6f 72 64 2e 65 78 65 63 28 73 2e 73 6c 69 63  Word.exec(s.slic
4970: 65 28 30 2c 20 69 45 6e 64 29 29 3b 0a 20 20 20  e(0, iEnd));.   
4980: 20 69 66 20 28 21 6d 29 20 7b 0a 20 20 20 20 20   if (!m) {.     
4990: 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a     return null;.
49a0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
49b0: 20 5b 6d 2e 69 6e 64 65 78 2c 20 6d 5b 31 5d 5d   [m.index, m[1]]
49c0: 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 6c 6f  ;.}..function lo
49d0: 6f 6b 20 28 73 2c 20 7a 50 61 74 74 65 72 6e 2c  ok (s, zPattern,
49e0: 20 7a 4e 65 67 50 61 74 74 65 72 6e 3d 6e 75 6c   zNegPattern=nul
49f0: 6c 29 20 7b 0a 20 20 20 20 2f 2f 20 73 65 65 6b  l) {.    // seek
4a00: 20 7a 50 61 74 74 65 72 6e 20 69 6e 20 73 20 28   zPattern in s (
4a10: 62 65 66 6f 72 65 2f 61 66 74 65 72 2f 66 75 6c  before/after/ful
4a20: 6c 74 65 78 74 29 2c 20 69 66 20 61 6e 74 69 70  ltext), if antip
4a30: 61 74 74 65 72 6e 20 7a 4e 65 67 50 61 74 74 65  attern zNegPatte
4a40: 72 6e 20 6e 6f 74 20 69 6e 20 73 0a 20 20 20 20  rn not in s.    
4a50: 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 69 66  try {.        if
4a60: 20 28 7a 4e 65 67 50 61 74 74 65 72 6e 20 26 26   (zNegPattern &&
4a70: 20 7a 4e 65 67 50 61 74 74 65 72 6e 2e 74 65 73   zNegPattern.tes
4a80: 74 28 73 29 29 20 7b 0a 20 20 20 20 20 20 20 20  t(s)) {.        
4a90: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
4aa0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4ab0: 20 20 20 20 72 65 74 75 72 6e 20 7a 50 61 74 74      return zPatt
4ac0: 65 72 6e 2e 74 65 73 74 28 73 29 3b 0a 20 20 20  ern.test(s);.   
4ad0: 20 7d 0a 20 20 20 20 63 61 74 63 68 20 28 65 29   }.    catch (e)
4ae0: 20 7b 0a 20 20 20 20 20 20 20 20 68 65 6c 70 65   {.        helpe
4af0: 72 73 2e 6c 6f 67 65 72 72 6f 72 28 65 29 3b 0a  rs.logerror(e);.
4b00: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
4b10: 20 66 61 6c 73 65 3b 0a 7d 0a 0a 66 75 6e 63 74   false;.}..funct
4b20: 69 6f 6e 20 6c 6f 6f 6b 5f 63 68 6b 31 20 28 64  ion look_chk1 (d
4b30: 44 41 2c 20 73 2c 20 6e 4f 66 66 73 65 74 2c 20  DA, s, nOffset, 
4b40: 7a 50 61 74 74 65 72 6e 2c 20 73 50 61 74 74 65  zPattern, sPatte
4b50: 72 6e 47 72 6f 75 70 31 2c 20 73 4e 65 67 50 61  rnGroup1, sNegPa
4b60: 74 74 65 72 6e 47 72 6f 75 70 31 3d 6e 75 6c 6c  tternGroup1=null
4b70: 29 20 7b 0a 20 20 20 20 2f 2f 20 72 65 74 75 72  ) {.    // retur
4b80: 6e 73 20 54 72 75 65 20 69 66 20 73 20 68 61 73  ns True if s has
4b90: 20 70 61 74 74 65 72 6e 20 7a 50 61 74 74 65 72   pattern zPatter
4ba0: 6e 20 61 6e 64 20 6d 2e 67 72 6f 75 70 28 31 29  n and m.group(1)
4bb0: 20 68 61 73 20 70 61 74 74 65 72 6e 20 73 50 61   has pattern sPa
4bc0: 74 74 65 72 6e 47 72 6f 75 70 31 0a 20 20 20 20  tternGroup1.    
4bd0: 6c 65 74 20 6d 20 3d 20 7a 50 61 74 74 65 72 6e  let m = zPattern
4be0: 2e 67 6c 5f 65 78 65 63 32 28 73 2c 20 6e 75 6c  .gl_exec2(s, nul
4bf0: 6c 29 3b 0a 20 20 20 20 69 66 20 28 21 6d 29 20  l);.    if (!m) 
4c00: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
4c10: 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20   false;.    }.  
4c20: 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20    try {.        
4c30: 6c 65 74 20 73 57 6f 72 64 20 3d 20 6d 5b 31 5d  let sWord = m[1]
4c40: 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6e 50  ;.        let nP
4c50: 6f 73 20 3d 20 6d 2e 73 74 61 72 74 5b 31 5d 20  os = m.start[1] 
4c60: 2b 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  + nOffset;.     
4c70: 20 20 20 69 66 20 28 73 4e 65 67 50 61 74 74 65     if (sNegPatte
4c80: 72 6e 47 72 6f 75 70 31 29 20 7b 0a 20 20 20 20  rnGroup1) {.    
4c90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d          return m
4ca0: 6f 72 70 68 65 78 28 64 44 41 2c 20 5b 6e 50 6f  orphex(dDA, [nPo
4cb0: 73 2c 20 73 57 6f 72 64 5d 2c 20 73 50 61 74 74  s, sWord], sPatt
4cc0: 65 72 6e 47 72 6f 75 70 31 2c 20 73 4e 65 67 50  ernGroup1, sNegP
4cd0: 61 74 74 65 72 6e 47 72 6f 75 70 31 29 3b 0a 20  atternGroup1);. 
4ce0: 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
4cf0: 20 20 72 65 74 75 72 6e 20 6d 6f 72 70 68 28 64    return morph(d
4d00: 44 41 2c 20 5b 6e 50 6f 73 2c 20 73 57 6f 72 64  DA, [nPos, sWord
4d10: 5d 2c 20 73 50 61 74 74 65 72 6e 47 72 6f 75 70  ], sPatternGroup
4d20: 31 2c 20 66 61 6c 73 65 29 3b 0a 20 20 20 20 7d  1, false);.    }
4d30: 0a 20 20 20 20 63 61 74 63 68 20 28 65 29 20 7b  .    catch (e) {
4d40: 0a 20 20 20 20 20 20 20 20 68 65 6c 70 65 72 73  .        helpers
4d50: 2e 6c 6f 67 65 72 72 6f 72 28 65 29 3b 0a 20 20  .logerror(e);.  
4d60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
4d70: 73 65 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 2f 2f  se;.    }.}...//
4d80: 2f 2f 2f 2f 2f 2f 20 44 69 73 61 6d 62 69 67 75  ////// Disambigu
4d90: 61 74 6f 72 0a 0a 66 75 6e 63 74 69 6f 6e 20 73  ator..function s
4da0: 65 6c 65 63 74 20 28 64 44 41 2c 20 6e 50 6f 73  elect (dDA, nPos
4db0: 2c 20 73 57 6f 72 64 2c 20 73 50 61 74 74 65 72  , sWord, sPatter
4dc0: 6e 2c 20 6c 44 65 66 61 75 6c 74 3d 6e 75 6c 6c  n, lDefault=null
4dd0: 29 20 7b 0a 20 20 20 20 69 66 20 28 21 73 57 6f  ) {.    if (!sWo
4de0: 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  rd) {.        re
4df0: 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d  turn true;.    }
4e00: 0a 20 20 20 20 69 66 20 28 64 44 41 2e 68 61 73  .    if (dDA.has
4e10: 28 6e 50 6f 73 29 29 20 7b 0a 20 20 20 20 20 20  (nPos)) {.      
4e20: 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20    return true;. 
4e30: 20 20 20 7d 0a 20 20 20 20 6c 65 74 20 6c 4d 6f     }.    let lMo
4e40: 72 70 68 20 3d 20 5f 6f 53 70 65 6c 6c 43 68 65  rph = _oSpellChe
4e50: 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28 73 57  cker.getMorph(sW
4e60: 6f 72 64 29 3b 0a 20 20 20 20 69 66 20 28 6c 4d  ord);.    if (lM
4e70: 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20  orph.length === 
4e80: 30 20 20 7c 7c 20 20 6c 4d 6f 72 70 68 2e 6c 65  0  ||  lMorph.le
4e90: 6e 67 74 68 20 3d 3d 3d 20 31 29 20 7b 0a 20 20  ngth === 1) {.  
4ea0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
4eb0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 74  e;.    }.    let
4ec0: 20 6c 53 65 6c 65 63 74 20 3d 20 6c 4d 6f 72 70   lSelect = lMorp
4ed0: 68 2e 66 69 6c 74 65 72 28 20 73 4d 6f 72 70 68  h.filter( sMorph
4ee0: 20 3d 3e 20 73 4d 6f 72 70 68 2e 73 65 61 72 63   => sMorph.searc
4ef0: 68 28 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20  h(sPattern) !== 
4f00: 2d 31 20 29 3b 0a 20 20 20 20 69 66 20 28 6c 53  -1 );.    if (lS
4f10: 65 6c 65 63 74 2e 6c 65 6e 67 74 68 20 3e 20 30  elect.length > 0
4f20: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ) {.        if (
4f30: 6c 53 65 6c 65 63 74 2e 6c 65 6e 67 74 68 20 21  lSelect.length !
4f40: 3d 20 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 29  = lMorph.length)
4f50: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64   {.            d
4f60: 44 41 2e 73 65 74 28 6e 50 6f 73 2c 20 6c 53 65  DA.set(nPos, lSe
4f70: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  lect);.        }
4f80: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
4f90: 6c 44 65 66 61 75 6c 74 29 20 7b 0a 20 20 20 20  lDefault) {.    
4fa0: 20 20 20 20 64 44 41 2e 73 65 74 28 6e 50 6f 73      dDA.set(nPos
4fb0: 2c 20 6c 44 65 66 61 75 6c 29 3b 0a 20 20 20 20  , lDefaul);.    
4fc0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72 75  }.    return tru
4fd0: 65 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 65  e;.}..function e
4fe0: 78 63 6c 75 64 65 20 28 64 44 41 2c 20 6e 50 6f  xclude (dDA, nPo
4ff0: 73 2c 20 73 57 6f 72 64 2c 20 73 50 61 74 74 65  s, sWord, sPatte
5000: 72 6e 2c 20 6c 44 65 66 61 75 6c 74 3d 6e 75 6c  rn, lDefault=nul
5010: 6c 29 20 7b 0a 20 20 20 20 69 66 20 28 21 73 57  l) {.    if (!sW
5020: 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20 72  ord) {.        r
5030: 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20  eturn true;.    
5040: 7d 0a 20 20 20 20 69 66 20 28 64 44 41 2e 68 61  }.    if (dDA.ha
5050: 73 28 6e 50 6f 73 29 29 20 7b 0a 20 20 20 20 20  s(nPos)) {.     
5060: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a     return true;.
5070: 20 20 20 20 7d 0a 20 20 20 20 6c 65 74 20 6c 4d      }.    let lM
5080: 6f 72 70 68 20 3d 20 5f 6f 53 70 65 6c 6c 43 68  orph = _oSpellCh
5090: 65 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28 73  ecker.getMorph(s
50a0: 57 6f 72 64 29 3b 0a 20 20 20 20 69 66 20 28 6c  Word);.    if (l
50b0: 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 3d  Morph.length ===
50c0: 20 30 20 20 7c 7c 20 20 6c 4d 6f 72 70 68 2e 6c   0  ||  lMorph.l
50d0: 65 6e 67 74 68 20 3d 3d 3d 20 31 29 20 7b 0a 20  ength === 1) {. 
50e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
50f0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  ue;.    }.    le
5100: 74 20 6c 53 65 6c 65 63 74 20 3d 20 6c 4d 6f 72  t lSelect = lMor
5110: 70 68 2e 66 69 6c 74 65 72 28 20 73 4d 6f 72 70  ph.filter( sMorp
5120: 68 20 3d 3e 20 73 4d 6f 72 70 68 2e 73 65 61 72  h => sMorph.sear
5130: 63 68 28 73 50 61 74 74 65 72 6e 29 20 3d 3d 3d  ch(sPattern) ===
5140: 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 20 28 6c   -1 );.    if (l
5150: 53 65 6c 65 63 74 2e 6c 65 6e 67 74 68 20 3e 20  Select.length > 
5160: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  0) {.        if 
5170: 28 6c 53 65 6c 65 63 74 2e 6c 65 6e 67 74 68 20  (lSelect.length 
5180: 21 3d 20 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68  != lMorph.length
5190: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
51a0: 64 44 41 2e 73 65 74 28 6e 50 6f 73 2c 20 6c 53  dDA.set(nPos, lS
51b0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
51c0: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  }.    } else if 
51d0: 28 6c 44 65 66 61 75 6c 74 29 20 7b 0a 20 20 20  (lDefault) {.   
51e0: 20 20 20 20 20 64 44 41 2e 73 65 74 28 6e 50 6f       dDA.set(nPo
51f0: 73 2c 20 6c 44 65 66 61 75 6c 74 29 3b 0a 20 20  s, lDefault);.  
5200: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 74    }.    return t
5210: 72 75 65 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e  rue;.}..function
5220: 20 64 65 66 69 6e 65 20 28 64 44 41 2c 20 6e 50   define (dDA, nP
5230: 6f 73 2c 20 6c 4d 6f 72 70 68 29 20 7b 0a 20 20  os, lMorph) {.  
5240: 20 20 64 44 41 2e 73 65 74 28 6e 50 6f 73 2c 20    dDA.set(nPos, 
5250: 6c 4d 6f 72 70 68 29 3b 0a 20 20 20 20 72 65 74  lMorph);.    ret
5260: 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a 0a 2f 2f  urn true;.}...//
5270: 2f 2f 2f 2f 2f 2f 20 47 52 41 4d 4d 41 52 20 43  ////// GRAMMAR C
5280: 48 45 43 4b 45 52 20 50 4c 55 47 49 4e 53 0a 0a  HECKER PLUGINS..
5290: 24 7b 70 6c 75 67 69 6e 73 4a 53 7d 0a 0a 0a 24  ${pluginsJS}...$
52a0: 7b 63 61 6c 6c 61 62 6c 65 73 4a 53 7d 0a 0a 0a  {callablesJS}...
52b0: 0a 69 66 20 28 74 79 70 65 6f 66 28 65 78 70 6f  .if (typeof(expo
52c0: 72 74 73 29 20 21 3d 3d 20 27 75 6e 64 65 66 69  rts) !== 'undefi
52d0: 6e 65 64 27 29 20 7b 0a 20 20 20 20 65 78 70 6f  ned') {.    expo
52e0: 72 74 73 2e 6c 61 6e 67 20 3d 20 67 63 5f 65 6e  rts.lang = gc_en
52f0: 67 69 6e 65 2e 6c 61 6e 67 3b 0a 20 20 20 20 65  gine.lang;.    e
5300: 78 70 6f 72 74 73 2e 6c 6f 63 61 6c 65 73 20 3d  xports.locales =
5310: 20 67 63 5f 65 6e 67 69 6e 65 2e 6c 6f 63 61 6c   gc_engine.local
5320: 65 73 3b 0a 20 20 20 20 65 78 70 6f 72 74 73 2e  es;.    exports.
5330: 70 6b 67 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e  pkg = gc_engine.
5340: 70 6b 67 3b 0a 20 20 20 20 65 78 70 6f 72 74 73  pkg;.    exports
5350: 2e 6e 61 6d 65 20 3d 20 67 63 5f 65 6e 67 69 6e  .name = gc_engin
5360: 65 2e 6e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6f  e.name;.    expo
5370: 72 74 73 2e 76 65 72 73 69 6f 6e 20 3d 20 67 63  rts.version = gc
5380: 5f 65 6e 67 69 6e 65 2e 76 65 72 73 69 6f 6e 3b  _engine.version;
5390: 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 61 75 74  .    exports.aut
53a0: 68 6f 72 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e  hor = gc_engine.
53b0: 61 75 74 68 6f 72 3b 0a 20 20 20 20 65 78 70 6f  author;.    expo
53c0: 72 74 73 2e 70 61 72 73 65 20 3d 20 67 63 5f 65  rts.parse = gc_e
53d0: 6e 67 69 6e 65 2e 70 61 72 73 65 3b 0a 20 20 20  ngine.parse;.   
53e0: 20 65 78 70 6f 72 74 73 2e 5f 7a 45 6e 64 4f 66   exports._zEndOf
53f0: 53 65 6e 74 65 6e 63 65 20 3d 20 67 63 5f 65 6e  Sentence = gc_en
5400: 67 69 6e 65 2e 5f 7a 45 6e 64 4f 66 53 65 6e 74  gine._zEndOfSent
5410: 65 6e 63 65 3b 0a 20 20 20 20 65 78 70 6f 72 74  ence;.    export
5420: 73 2e 5f 7a 42 65 67 69 6e 4f 66 50 61 72 61 67  s._zBeginOfParag
5430: 72 61 70 68 20 3d 20 67 63 5f 65 6e 67 69 6e 65  raph = gc_engine
5440: 2e 5f 7a 42 65 67 69 6e 4f 66 50 61 72 61 67 72  ._zBeginOfParagr
5450: 61 70 68 3b 0a 20 20 20 20 65 78 70 6f 72 74 73  aph;.    exports
5460: 2e 5f 7a 45 6e 64 4f 66 50 61 72 61 67 72 61 70  ._zEndOfParagrap
5470: 68 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 5f 7a  h = gc_engine._z
5480: 45 6e 64 4f 66 50 61 72 61 67 72 61 70 68 3b 0a  EndOfParagraph;.
5490: 20 20 20 20 65 78 70 6f 72 74 73 2e 5f 67 65 74      exports._get
54a0: 53 65 6e 74 65 6e 63 65 42 6f 75 6e 64 61 72 69  SentenceBoundari
54b0: 65 73 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 5f  es = gc_engine._
54c0: 67 65 74 53 65 6e 74 65 6e 63 65 42 6f 75 6e 64  getSentenceBound
54d0: 61 72 69 65 73 3b 0a 20 20 20 20 65 78 70 6f 72  aries;.    expor
54e0: 74 73 2e 5f 70 72 6f 6f 66 72 65 61 64 20 3d 20  ts._proofread = 
54f0: 67 63 5f 65 6e 67 69 6e 65 2e 5f 70 72 6f 6f 66  gc_engine._proof
5500: 72 65 61 64 3b 0a 20 20 20 20 65 78 70 6f 72 74  read;.    export
5510: 73 2e 5f 63 72 65 61 74 65 45 72 72 6f 72 20 3d  s._createError =
5520: 20 67 63 5f 65 6e 67 69 6e 65 2e 5f 63 72 65 61   gc_engine._crea
5530: 74 65 45 72 72 6f 72 3b 0a 20 20 20 20 65 78 70  teError;.    exp
5540: 6f 72 74 73 2e 5f 72 65 77 72 69 74 65 20 3d 20  orts._rewrite = 
5550: 67 63 5f 65 6e 67 69 6e 65 2e 5f 72 65 77 72 69  gc_engine._rewri
5560: 74 65 3b 0a 20 20 20 20 65 78 70 6f 72 74 73 2e  te;.    exports.
5570: 69 67 6e 6f 72 65 52 75 6c 65 20 3d 20 67 63 5f  ignoreRule = gc_
5580: 65 6e 67 69 6e 65 2e 69 67 6e 6f 72 65 52 75 6c  engine.ignoreRul
5590: 65 3b 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 72  e;.    exports.r
55a0: 65 73 65 74 49 67 6e 6f 72 65 52 75 6c 65 73 20  esetIgnoreRules 
55b0: 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 72 65 73 65  = gc_engine.rese
55c0: 74 49 67 6e 6f 72 65 52 75 6c 65 73 3b 0a 20 20  tIgnoreRules;.  
55d0: 20 20 65 78 70 6f 72 74 73 2e 72 65 61 63 74 69    exports.reacti
55e0: 76 61 74 65 52 75 6c 65 20 3d 20 67 63 5f 65 6e  vateRule = gc_en
55f0: 67 69 6e 65 2e 72 65 61 63 74 69 76 61 74 65 52  gine.reactivateR
5600: 75 6c 65 3b 0a 20 20 20 20 65 78 70 6f 72 74 73  ule;.    exports
5610: 2e 6c 69 73 74 52 75 6c 65 73 20 3d 20 67 63 5f  .listRules = gc_
5620: 65 6e 67 69 6e 65 2e 6c 69 73 74 52 75 6c 65 73  engine.listRules
5630: 3b 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 5f 67  ;.    exports._g
5640: 65 74 52 75 6c 65 73 20 3d 20 67 63 5f 65 6e 67  etRules = gc_eng
5650: 69 6e 65 2e 5f 67 65 74 52 75 6c 65 73 3b 0a 20  ine._getRules;. 
5660: 20 20 20 65 78 70 6f 72 74 73 2e 6c 6f 61 64 20     exports.load 
5670: 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 6c 6f 61 64  = gc_engine.load
5680: 3b 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 67 65  ;.    exports.ge
5690: 74 53 70 65 6c 6c 43 68 65 63 6b 65 72 20 3d 20  tSpellChecker = 
56a0: 67 63 5f 65 6e 67 69 6e 65 2e 67 65 74 53 70 65  gc_engine.getSpe
56b0: 6c 6c 43 68 65 63 6b 65 72 3b 0a 20 20 20 20 65  llChecker;.    e
56c0: 78 70 6f 72 74 73 2e 73 65 74 4f 70 74 69 6f 6e  xports.setOption
56d0: 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e 73 65 74   = gc_engine.set
56e0: 4f 70 74 69 6f 6e 3b 0a 20 20 20 20 65 78 70 6f  Option;.    expo
56f0: 72 74 73 2e 73 65 74 4f 70 74 69 6f 6e 73 20 3d  rts.setOptions =
5700: 20 67 63 5f 65 6e 67 69 6e 65 2e 73 65 74 4f 70   gc_engine.setOp
5710: 74 69 6f 6e 73 3b 0a 20 20 20 20 65 78 70 6f 72  tions;.    expor
5720: 74 73 2e 67 65 74 4f 70 74 69 6f 6e 73 20 3d 20  ts.getOptions = 
5730: 67 63 5f 65 6e 67 69 6e 65 2e 67 65 74 4f 70 74  gc_engine.getOpt
5740: 69 6f 6e 73 3b 0a 20 20 20 20 65 78 70 6f 72 74  ions;.    export
5750: 73 2e 67 65 74 44 65 66 61 75 6c 74 4f 70 74 69  s.getDefaultOpti
5760: 6f 6e 73 20 3d 20 67 63 5f 65 6e 67 69 6e 65 2e  ons = gc_engine.
5770: 67 65 74 44 65 66 61 75 6c 74 4f 70 74 69 6f 6e  getDefaultOption
5780: 73 3b 0a 20 20 20 20 65 78 70 6f 72 74 73 2e 72  s;.    exports.r
5790: 65 73 65 74 4f 70 74 69 6f 6e 73 20 3d 20 67 63  esetOptions = gc
57a0: 5f 65 6e 67 69 6e 65 2e 72 65 73 65 74 4f 70 74  _engine.resetOpt
57b0: 69 6f 6e 73 3b 0a 7d 0a                          ions;.}.