Grammalecte  Hex Artifact Content

Artifact ee18ec83eeeda2ea43ffc07fc8d39817f272514bb82c9496a4258eb646e120d0:


0000: 2f 2f 20 47 72 61 6d 6d 61 72 20 63 68 65 63 6b  // Grammar check
0010: 65 72 20 65 6e 67 69 6e 65 0a 0a 24 7b 73 74 72  er engine..${str
0020: 69 6e 67 7d 0a 24 7b 72 65 67 65 78 7d 0a 24 7b  ing}.${regex}.${
0030: 6d 61 70 7d 0a 0a 0a 66 75 6e 63 74 69 6f 6e 20  map}...function 
0040: 63 61 70 69 74 61 6c 69 7a 65 41 72 72 61 79 20  capitalizeArray 
0050: 28 61 41 72 72 61 79 29 20 7b 0a 20 20 20 20 2f  (aArray) {.    /
0060: 2f 20 63 61 6e e2 80 99 74 20 6d 61 70 20 6f 6e  / can...t map on
0070: 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 66 75   user defined fu
0080: 6e 63 74 69 6f 6e 3f 3f 0a 20 20 20 20 6c 65 74  nction??.    let
0090: 20 61 4e 65 77 20 3d 20 5b 5d 3b 0a 20 20 20 20   aNew = [];.    
00a0: 66 6f 72 20 28 6c 65 74 20 69 20 3d 20 30 3b 20  for (let i = 0; 
00b0: 69 20 3c 20 61 41 72 72 61 79 2e 6c 65 6e 67 74  i < aArray.lengt
00c0: 68 3b 20 69 20 3d 20 69 20 2b 20 31 29 20 7b 0a  h; i = i + 1) {.
00d0: 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 5d 20          aNew[i] 
00e0: 3d 20 61 41 72 72 61 79 5b 69 5d 2e 5f 74 6f 43  = aArray[i]._toC
00f0: 61 70 69 74 61 6c 69 7a 65 28 29 3b 0a 20 20 20  apitalize();.   
0100: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 61 4e   }.    return aN
0110: 65 77 3b 0a 7d 0a 0a 63 6f 6e 73 74 20 69 62 64  ew;.}..const ibd
0120: 61 77 67 20 3d 20 72 65 71 75 69 72 65 28 22 72  awg = require("r
0130: 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d 61  esource://gramma
0140: 6c 65 63 74 65 2f 69 62 64 61 77 67 2e 6a 73 22  lecte/ibdawg.js"
0150: 29 3b 0a 63 6f 6e 73 74 20 68 65 6c 70 65 72 73  );.const helpers
0160: 20 3d 20 72 65 71 75 69 72 65 28 22 72 65 73 6f   = require("reso
0170: 75 72 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63  urce://grammalec
0180: 74 65 2f 68 65 6c 70 65 72 73 2e 6a 73 22 29 3b  te/helpers.js");
0190: 0a 63 6f 6e 73 74 20 67 63 5f 6f 70 74 69 6f 6e  .const gc_option
01a0: 73 20 3d 20 72 65 71 75 69 72 65 28 22 72 65 73  s = require("res
01b0: 6f 75 72 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65  ource://grammale
01c0: 63 74 65 2f 24 7b 6c 61 6e 67 7d 2f 67 63 5f 6f  cte/${lang}/gc_o
01d0: 70 74 69 6f 6e 73 2e 6a 73 22 29 3b 0a 63 6f 6e  ptions.js");.con
01e0: 73 74 20 63 72 20 3d 20 72 65 71 75 69 72 65 28  st cr = require(
01f0: 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72 61 6d  "resource://gram
0200: 6d 61 6c 65 63 74 65 2f 24 7b 6c 61 6e 67 7d 2f  malecte/${lang}/
0210: 63 72 65 67 65 78 2e 6a 73 22 29 3b 0a 63 6f 6e  cregex.js");.con
0220: 73 74 20 74 65 78 74 20 3d 20 72 65 71 75 69 72  st text = requir
0230: 65 28 22 72 65 73 6f 75 72 63 65 3a 2f 2f 67 72  e("resource://gr
0240: 61 6d 6d 61 6c 65 63 74 65 2f 74 65 78 74 2e 6a  ammalecte/text.j
0250: 73 22 29 3b 0a 63 6f 6e 73 74 20 65 63 68 6f 20  s");.const echo 
0260: 3d 20 72 65 71 75 69 72 65 28 22 72 65 73 6f 75  = require("resou
0270: 72 63 65 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74  rce://grammalect
0280: 65 2f 68 65 6c 70 65 72 73 2e 6a 73 22 29 2e 65  e/helpers.js").e
0290: 63 68 6f 3b 0a 0a 63 6f 6e 73 74 20 6c 61 6e 67  cho;..const lang
02a0: 20 3d 20 22 24 7b 6c 61 6e 67 7d 22 3b 0a 63 6f   = "${lang}";.co
02b0: 6e 73 74 20 6c 6f 63 61 6c 65 73 20 3d 20 24 7b  nst locales = ${
02c0: 6c 6f 63 7d 3b 0a 63 6f 6e 73 74 20 70 6b 67 20  loc};.const pkg 
02d0: 3d 20 22 24 7b 69 6d 70 6c 6e 61 6d 65 7d 22 3b  = "${implname}";
02e0: 0a 63 6f 6e 73 74 20 6e 61 6d 65 20 3d 20 22 24  .const name = "$
02f0: 7b 6e 61 6d 65 7d 22 3b 0a 63 6f 6e 73 74 20 76  {name}";.const v
0300: 65 72 73 69 6f 6e 20 3d 20 22 24 7b 76 65 72 73  ersion = "${vers
0310: 69 6f 6e 7d 22 3b 0a 63 6f 6e 73 74 20 61 75 74  ion}";.const aut
0320: 68 6f 72 20 3d 20 22 24 7b 61 75 74 68 6f 72 7d  hor = "${author}
0330: 22 3b 0a 0a 2f 2f 20 63 6f 6d 6d 6f 6e 73 20 72  ";..// commons r
0340: 65 67 65 78 65 73 0a 63 6f 6e 73 74 20 5f 7a 45  egexes.const _zE
0350: 6e 64 4f 66 53 65 6e 74 65 6e 63 65 20 3d 20 6e  ndOfSentence = n
0360: 65 77 20 52 65 67 45 78 70 20 28 27 28 5b 2e 3f  ew RegExp ('([.?
0370: 21 3a 3b e2 80 a6 5d 5b 20 2e 3f 21 e2 80 a6 20  !:;...][ .?!... 
0380: c2 bb e2 80 9d 22 29 5d 2a 7c 2e 24 29 27 2c 20  .....")]*|.$)', 
0390: 22 67 22 29 3b 0a 63 6f 6e 73 74 20 5f 7a 42 65  "g");.const _zBe
03a0: 67 69 6e 4f 66 50 61 72 61 67 72 61 70 68 20 3d  ginOfParagraph =
03b0: 20 6e 65 77 20 52 65 67 45 78 70 20 28 22 5e 5b   new RegExp ("^[
03c0: 2d 20 c2 a0 e2 80 93 e2 80 94 2e 2c 3b 3f 21 e2  - .........,;?!.
03d0: 80 a6 5d 2a 22 2c 20 22 69 67 22 29 3b 0a 63 6f  ..]*", "ig");.co
03e0: 6e 73 74 20 5f 7a 45 6e 64 4f 66 50 61 72 61 67  nst _zEndOfParag
03f0: 72 61 70 68 20 3d 20 6e 65 77 20 52 65 67 45 78  raph = new RegEx
0400: 70 20 28 22 5b 2d 20 c2 a0 2e 2c 3b 3f 21 e2 80  p ("[- ...,;?!..
0410: a6 e2 80 93 e2 80 94 5d 2a 24 22 2c 20 22 69 67  .......]*$", "ig
0420: 22 29 3b 0a 0a 2f 2f 20 67 72 61 6d 6d 61 72 20  ");..// grammar 
0430: 72 75 6c 65 73 20 61 6e 64 20 64 69 63 74 69 6f  rules and dictio
0440: 6e 61 72 79 0a 2f 2f 63 6f 6e 73 74 20 5f 72 75  nary.//const _ru
0450: 6c 65 73 20 3d 20 72 65 71 75 69 72 65 28 22 2e  les = require(".
0460: 2f 67 63 5f 72 75 6c 65 73 2e 6a 73 22 29 3b 0a  /gc_rules.js");.
0470: 6c 65 74 20 5f 73 43 6f 6e 74 65 78 74 20 3d 20  let _sContext = 
0480: 22 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  "";             
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04a0: 20 20 20 20 2f 2f 20 77 68 61 74 20 73 6f 66 74      // what soft
04b0: 77 61 72 65 20 69 73 20 72 75 6e 6e 69 6e 67 0a  ware is running.
04c0: 63 6f 6e 73 74 20 5f 72 75 6c 65 73 20 3d 20 72  const _rules = r
04d0: 65 71 75 69 72 65 28 22 72 65 73 6f 75 72 63 65  equire("resource
04e0: 3a 2f 2f 67 72 61 6d 6d 61 6c 65 63 74 65 2f 24  ://grammalecte/$
04f0: 7b 6c 61 6e 67 7d 2f 67 63 5f 72 75 6c 65 73 2e  {lang}/gc_rules.
0500: 6a 73 22 29 3b 0a 6c 65 74 20 5f 64 4f 70 74 69  js");.let _dOpti
0510: 6f 6e 73 20 3d 20 6e 75 6c 6c 3b 0a 6c 65 74 20  ons = null;.let 
0520: 5f 61 49 67 6e 6f 72 65 64 52 75 6c 65 73 20 3d  _aIgnoredRules =
0530: 20 6e 65 77 20 53 65 74 28 29 3b 0a 6c 65 74 20   new Set();.let 
0540: 5f 6f 44 69 63 74 20 3d 20 6e 75 6c 6c 3b 0a 6c  _oDict = null;.l
0550: 65 74 20 5f 64 41 6e 61 6c 79 73 65 73 20 3d 20  et _dAnalyses = 
0560: 6e 65 77 20 4d 61 70 28 29 3b 20 20 20 20 20 20  new Map();      
0570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0580: 20 20 20 2f 2f 20 63 61 63 68 65 20 66 6f 72 20     // cache for 
0590: 64 61 74 61 20 66 72 6f 6d 20 64 69 63 74 69 6f  data from dictio
05a0: 6e 61 72 79 0a 0a 0a 2f 2f 2f 2f 2f 20 50 61 72  nary...///// Par
05b0: 73 69 6e 67 0a 0a 66 75 6e 63 74 69 6f 6e 20 70  sing..function p
05c0: 61 72 73 65 20 28 73 54 65 78 74 2c 20 73 43 6f  arse (sText, sCo
05d0: 75 6e 74 72 79 3d 22 24 7b 63 6f 75 6e 74 72 79  untry="${country
05e0: 5f 64 65 66 61 75 6c 74 7d 22 2c 20 62 44 65 62  _default}", bDeb
05f0: 75 67 3d 66 61 6c 73 65 2c 20 62 43 6f 6e 74 65  ug=false, bConte
0600: 78 74 3d 66 61 6c 73 65 29 20 7b 0a 20 20 20 20  xt=false) {.    
0610: 2f 2f 20 61 6e 61 6c 79 73 65 73 20 74 68 65 20  // analyses the 
0620: 70 61 72 61 67 72 61 70 68 20 73 54 65 78 74 20  paragraph sText 
0630: 61 6e 64 20 72 65 74 75 72 6e 73 20 6c 69 73 74  and returns list
0640: 20 6f 66 20 65 72 72 6f 72 73 0a 20 20 20 20 6c   of errors.    l
0650: 65 74 20 64 45 72 72 6f 72 73 3b 0a 20 20 20 20  et dErrors;.    
0660: 6c 65 74 20 65 72 72 73 3b 0a 20 20 20 20 6c 65  let errs;.    le
0670: 74 20 73 41 6c 74 20 3d 20 73 54 65 78 74 3b 0a  t sAlt = sText;.
0680: 20 20 20 20 6c 65 74 20 64 44 41 20 3d 20 6e 65      let dDA = ne
0690: 77 20 4d 61 70 28 29 3b 20 20 20 20 20 20 20 20  w Map();        
06a0: 2f 2f 20 44 69 73 61 6d 6e 62 69 67 75 61 74 6f  // Disamnbiguato
06b0: 72 0a 20 20 20 20 6c 65 74 20 64 50 72 69 6f 72  r.    let dPrior
06c0: 69 74 79 20 3d 20 6e 65 77 20 4d 61 70 28 29 3b  ity = new Map();
06d0: 20 20 2f 2f 20 4b 65 79 20 3d 20 70 6f 73 69 74    // Key = posit
06e0: 69 6f 6e 3b 20 76 61 6c 75 65 20 3d 20 70 72 69  ion; value = pri
06f0: 6f 72 69 74 79 0a 20 20 20 20 6c 65 74 20 73 4e  ority.    let sN
0700: 65 77 20 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2f  ew = "";..    //
0710: 20 70 61 72 73 65 20 70 61 72 61 67 72 61 70 68   parse paragraph
0720: 0a 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20  .    try {.     
0730: 20 20 20 5b 73 4e 65 77 2c 20 64 45 72 72 6f 72     [sNew, dError
0740: 73 5d 20 3d 20 5f 70 72 6f 6f 66 72 65 61 64 28  s] = _proofread(
0750: 73 54 65 78 74 2c 20 73 41 6c 74 2c 20 30 2c 20  sText, sAlt, 0, 
0760: 74 72 75 65 2c 20 64 44 41 2c 20 64 50 72 69 6f  true, dDA, dPrio
0770: 72 69 74 79 2c 20 73 43 6f 75 6e 74 72 79 2c 20  rity, sCountry, 
0780: 62 44 65 62 75 67 2c 20 62 43 6f 6e 74 65 78 74  bDebug, bContext
0790: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 73  );.        if (s
07a0: 4e 65 77 29 20 7b 0a 20 20 20 20 20 20 20 20 20  New) {.         
07b0: 20 20 20 73 54 65 78 74 20 3d 20 73 4e 65 77 3b     sText = sNew;
07c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
07d0: 0a 20 20 20 20 63 61 74 63 68 20 28 65 29 20 7b  .    catch (e) {
07e0: 0a 20 20 20 20 20 20 20 20 68 65 6c 70 65 72 73  .        helpers
07f0: 2e 6c 6f 67 65 72 72 6f 72 28 65 29 3b 0a 20 20  .logerror(e);.  
0800: 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 63 6c 65 61    }..    // clea
0810: 6e 75 70 0a 20 20 20 20 69 66 20 28 73 54 65 78  nup.    if (sTex
0820: 74 2e 69 6e 63 6c 75 64 65 73 28 22 c2 a0 22 29  t.includes("..")
0830: 29 20 7b 0a 20 20 20 20 20 20 20 20 73 54 65 78  ) {.        sTex
0840: 74 20 3d 20 73 54 65 78 74 2e 72 65 70 6c 61 63  t = sText.replac
0850: 65 28 2f c2 a0 2f 67 2c 20 27 20 27 29 3b 20 2f  e(/../g, ' '); /
0860: 2f 20 6e 62 73 70 0a 20 20 20 20 7d 0a 20 20 20  / nbsp.    }.   
0870: 20 69 66 20 28 73 54 65 78 74 2e 69 6e 63 6c 75   if (sText.inclu
0880: 64 65 73 28 22 e2 80 af 22 29 29 20 7b 0a 20 20  des("...")) {.  
0890: 20 20 20 20 20 20 73 54 65 78 74 20 3d 20 73 54        sText = sT
08a0: 65 78 74 2e 72 65 70 6c 61 63 65 28 2f e2 80 af  ext.replace(/...
08b0: 2f 67 2c 20 27 20 27 29 3b 20 2f 2f 20 73 6e 62  /g, ' '); // snb
08c0: 73 70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  sp.    }.    if 
08d0: 28 73 54 65 78 74 2e 69 6e 63 6c 75 64 65 73 28  (sText.includes(
08e0: 22 27 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20  "'")) {.        
08f0: 73 54 65 78 74 20 3d 20 73 54 65 78 74 2e 72 65  sText = sText.re
0900: 70 6c 61 63 65 28 2f 27 2f 67 2c 20 22 e2 80 99  place(/'/g, "...
0910: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
0920: 20 28 73 54 65 78 74 2e 69 6e 63 6c 75 64 65 73   (sText.includes
0930: 28 22 e2 80 91 22 29 29 20 7b 0a 20 20 20 20 20  ("...")) {.     
0940: 20 20 20 73 54 65 78 74 20 3d 20 73 54 65 78 74     sText = sText
0950: 2e 72 65 70 6c 61 63 65 28 2f e2 80 91 2f 67 2c  .replace(/.../g,
0960: 20 22 2d 22 29 3b 20 2f 2f 20 6e 6f 62 72 65 61   "-"); // nobrea
0970: 6b 64 61 73 68 0a 20 20 20 20 7d 0a 0a 20 20 20  kdash.    }..   
0980: 20 2f 2f 20 70 61 72 73 65 20 73 65 6e 74 65 6e   // parse senten
0990: 63 65 0a 20 20 20 20 66 6f 72 20 28 6c 65 74 20  ce.    for (let 
09a0: 5b 69 53 74 61 72 74 2c 20 69 45 6e 64 5d 20 6f  [iStart, iEnd] o
09b0: 66 20 5f 67 65 74 53 65 6e 74 65 6e 63 65 42 6f  f _getSentenceBo
09c0: 75 6e 64 61 72 69 65 73 28 73 54 65 78 74 29 29  undaries(sText))
09d0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 34   {.        if (4
09e0: 20 3c 20 28 69 45 6e 64 20 2d 20 69 53 74 61 72   < (iEnd - iStar
09f0: 74 29 20 3c 20 32 30 30 30 29 20 7b 0a 20 20 20  t) < 2000) {.   
0a00: 20 20 20 20 20 20 20 20 20 64 44 41 2e 63 6c 65           dDA.cle
0a10: 61 72 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ar();.          
0a20: 20 20 2f 2f 65 63 68 6f 28 73 54 65 78 74 2e 73    //echo(sText.s
0a30: 6c 69 63 65 28 69 53 74 61 72 74 2c 20 69 45 6e  lice(iStart, iEn
0a40: 64 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  d));.           
0a50: 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20   try {.         
0a60: 20 20 20 20 20 20 20 5b 5f 2c 20 65 72 72 73 5d         [_, errs]
0a70: 20 3d 20 5f 70 72 6f 6f 66 72 65 61 64 28 73 54   = _proofread(sT
0a80: 65 78 74 2e 73 6c 69 63 65 28 69 53 74 61 72 74  ext.slice(iStart
0a90: 2c 20 69 45 6e 64 29 2c 20 73 41 6c 74 2e 73 6c  , iEnd), sAlt.sl
0aa0: 69 63 65 28 69 53 74 61 72 74 2c 20 69 45 6e 64  ice(iStart, iEnd
0ab0: 29 2c 20 69 53 74 61 72 74 2c 20 66 61 6c 73 65  ), iStart, false
0ac0: 2c 20 64 44 41 2c 20 64 50 72 69 6f 72 69 74 79  , dDA, dPriority
0ad0: 2c 20 73 43 6f 75 6e 74 72 79 2c 20 62 44 65 62  , sCountry, bDeb
0ae0: 75 67 2c 20 62 43 6f 6e 74 65 78 74 29 3b 0a 20  ug, bContext);. 
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0b00: 45 72 72 6f 72 73 2e 5f 75 70 64 61 74 65 28 65  Errors._update(e
0b10: 72 72 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rrs);.          
0b20: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
0b30: 63 61 74 63 68 20 28 65 29 20 7b 0a 20 20 20 20  catch (e) {.    
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 68 65 6c 70              help
0b50: 65 72 73 2e 6c 6f 67 65 72 72 6f 72 28 65 29 3b  ers.logerror(e);
0b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
0b70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20         }.    }. 
0b80: 20 20 20 72 65 74 75 72 6e 20 41 72 72 61 79 2e     return Array.
0b90: 66 72 6f 6d 28 64 45 72 72 6f 72 73 2e 76 61 6c  from(dErrors.val
0ba0: 75 65 73 28 29 29 3b 0a 7d 0a 0a 66 75 6e 63 74  ues());.}..funct
0bb0: 69 6f 6e 2a 20 5f 67 65 74 53 65 6e 74 65 6e 63  ion* _getSentenc
0bc0: 65 42 6f 75 6e 64 61 72 69 65 73 20 28 73 54 65  eBoundaries (sTe
0bd0: 78 74 29 20 7b 0a 20 20 20 20 6c 65 74 20 6d 42  xt) {.    let mB
0be0: 65 67 69 6e 4f 66 53 65 6e 74 65 6e 63 65 20 3d  eginOfSentence =
0bf0: 20 5f 7a 42 65 67 69 6e 4f 66 50 61 72 61 67 72   _zBeginOfParagr
0c00: 61 70 68 2e 65 78 65 63 28 73 54 65 78 74 29 0a  aph.exec(sText).
0c10: 20 20 20 20 6c 65 74 20 69 53 74 61 72 74 20 3d      let iStart =
0c20: 20 5f 7a 42 65 67 69 6e 4f 66 50 61 72 61 67 72   _zBeginOfParagr
0c30: 61 70 68 2e 6c 61 73 74 49 6e 64 65 78 3b 0a 20  aph.lastIndex;. 
0c40: 20 20 20 6c 65 74 20 6d 3b 0a 20 20 20 20 77 68     let m;.    wh
0c50: 69 6c 65 20 28 28 6d 20 3d 20 5f 7a 45 6e 64 4f  ile ((m = _zEndO
0c60: 66 53 65 6e 74 65 6e 63 65 2e 65 78 65 63 28 73  fSentence.exec(s
0c70: 54 65 78 74 29 29 20 21 3d 3d 20 6e 75 6c 6c 29  Text)) !== null)
0c80: 20 7b 0a 20 20 20 20 20 20 20 20 79 69 65 6c 64   {.        yield
0c90: 20 5b 69 53 74 61 72 74 2c 20 5f 7a 45 6e 64 4f   [iStart, _zEndO
0ca0: 66 53 65 6e 74 65 6e 63 65 2e 6c 61 73 74 49 6e  fSentence.lastIn
0cb0: 64 65 78 5d 3b 0a 20 20 20 20 20 20 20 20 69 53  dex];.        iS
0cc0: 74 61 72 74 20 3d 20 5f 7a 45 6e 64 4f 66 53 65  tart = _zEndOfSe
0cd0: 6e 74 65 6e 63 65 2e 6c 61 73 74 49 6e 64 65 78  ntence.lastIndex
0ce0: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 66 75 6e 63 74  ;.    }.}..funct
0cf0: 69 6f 6e 20 5f 70 72 6f 6f 66 72 65 61 64 20 28  ion _proofread (
0d00: 73 2c 20 73 78 2c 20 6e 4f 66 66 73 65 74 2c 20  s, sx, nOffset, 
0d10: 62 50 61 72 61 67 72 61 70 68 2c 20 64 44 41 2c  bParagraph, dDA,
0d20: 20 64 50 72 69 6f 72 69 74 79 2c 20 73 43 6f 75   dPriority, sCou
0d30: 6e 74 72 79 2c 20 62 44 65 62 75 67 2c 20 62 43  ntry, bDebug, bC
0d40: 6f 6e 74 65 78 74 29 20 7b 0a 20 20 20 20 6c 65  ontext) {.    le
0d50: 74 20 64 45 72 72 73 20 3d 20 6e 65 77 20 4d 61  t dErrs = new Ma
0d60: 70 28 29 3b 0a 20 20 20 20 6c 65 74 20 62 43 68  p();.    let bCh
0d70: 61 6e 67 65 20 3d 20 66 61 6c 73 65 3b 0a 20 20  ange = false;.  
0d80: 20 20 6c 65 74 20 62 49 64 52 75 6c 65 20 3d 20    let bIdRule = 
0d90: 6f 70 74 69 6f 6e 28 27 69 64 72 75 6c 65 27 29  option('idrule')
0da0: 3b 0a 20 20 20 20 6c 65 74 20 6d 3b 0a 20 20 20  ;.    let m;.   
0db0: 20 6c 65 74 20 62 43 6f 6e 64 4d 65 6d 6f 3b 0a   let bCondMemo;.
0dc0: 20 20 20 20 6c 65 74 20 6e 45 72 72 6f 72 53 74      let nErrorSt
0dd0: 61 72 74 3b 0a 0a 20 20 20 20 66 6f 72 20 28 6c  art;..    for (l
0de0: 65 74 20 5b 73 4f 70 74 69 6f 6e 2c 20 6c 52 75  et [sOption, lRu
0df0: 6c 65 47 72 6f 75 70 5d 20 6f 66 20 5f 67 65 74  leGroup] of _get
0e00: 52 75 6c 65 73 28 62 50 61 72 61 67 72 61 70 68  Rules(bParagraph
0e10: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  )) {.        if 
0e20: 28 21 73 4f 70 74 69 6f 6e 20 7c 7c 20 6f 70 74  (!sOption || opt
0e30: 69 6f 6e 28 73 4f 70 74 69 6f 6e 29 29 20 7b 0a  ion(sOption)) {.
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
0e50: 28 6c 65 74 20 5b 7a 52 65 67 65 78 2c 20 62 55  (let [zRegex, bU
0e60: 70 70 65 72 63 61 73 65 2c 20 73 4c 69 6e 65 49  ppercase, sLineI
0e70: 64 2c 20 73 52 75 6c 65 49 64 2c 20 6e 50 72 69  d, sRuleId, nPri
0e80: 6f 72 69 74 79 2c 20 6c 41 63 74 69 6f 6e 73 2c  ority, lActions,
0e90: 20 6c 47 72 6f 75 70 73 2c 20 6c 4e 65 67 4c 6f   lGroups, lNegLo
0ea0: 6f 6b 42 65 66 6f 72 65 5d 20 6f 66 20 6c 52 75  okBefore] of lRu
0eb0: 6c 65 47 72 6f 75 70 29 20 7b 0a 20 20 20 20 20  leGroup) {.     
0ec0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
0ed0: 5f 61 49 67 6e 6f 72 65 64 52 75 6c 65 73 2e 68  _aIgnoredRules.h
0ee0: 61 73 28 73 52 75 6c 65 49 64 29 29 20 7b 0a 20  as(sRuleId)) {. 
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f00: 20 20 20 77 68 69 6c 65 20 28 28 6d 20 3d 20 7a     while ((m = z
0f10: 52 65 67 65 78 2e 5f 65 78 65 63 32 28 73 2c 20  Regex._exec2(s, 
0f20: 6c 47 72 6f 75 70 73 2c 20 6c 4e 65 67 4c 6f 6f  lGroups, lNegLoo
0f30: 6b 42 65 66 6f 72 65 29 29 20 21 3d 3d 20 6e 75  kBefore)) !== nu
0f40: 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ll) {.          
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 43                bC
0f60: 6f 6e 64 4d 65 6d 6f 20 3d 20 6e 75 6c 6c 3b 0a  ondMemo = null;.
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f80: 20 20 20 20 20 20 20 20 2f 2a 69 66 20 28 62 44          /*if (bD
0f90: 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20  ebug) {.        
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 20 20 20 65 63 68 6f 28 22 3e 3e 3e 3e 20 52      echo(">>>> R
0fc0: 75 6c 65 20 23 20 22 20 2b 20 73 4c 69 6e 65 49  ule # " + sLineI
0fd0: 64 20 2b 20 22 20 2d 20 54 65 78 74 3a 20 22 20  d + " - Text: " 
0fe0: 2b 20 73 20 2b 20 22 20 6f 70 74 3a 20 22 2b 20  + s + " opt: "+ 
0ff0: 73 4f 70 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  sOption);.      
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1010: 20 20 7d 2a 2f 0a 20 20 20 20 20 20 20 20 20 20    }*/.          
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
1030: 72 20 28 6c 65 74 20 5b 73 46 75 6e 63 43 6f 6e  r (let [sFuncCon
1040: 64 2c 20 63 41 63 74 69 6f 6e 54 79 70 65 2c 20  d, cActionType, 
1050: 73 57 68 61 74 2c 20 2e 2e 2e 65 41 63 74 5d 20  sWhat, ...eAct] 
1060: 6f 66 20 6c 41 63 74 69 6f 6e 73 29 20 7b 0a 20  of lActions) {. 
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1080: 20 20 20 20 20 20 20 2f 2f 20 61 63 74 69 6f 6e         // action
1090: 20 69 6e 20 6c 41 63 74 69 6f 6e 73 3a 20 5b 20   in lActions: [ 
10a0: 63 6f 6e 64 69 74 69 6f 6e 2c 20 61 63 74 69 6f  condition, actio
10b0: 6e 20 74 79 70 65 2c 20 72 65 70 6c 61 63 65 6d  n type, replacem
10c0: 65 6e 74 2f 73 75 67 67 65 73 74 69 6f 6e 2f 61  ent/suggestion/a
10d0: 63 74 69 6f 6e 5b 2c 20 69 47 72 6f 75 70 5b 2c  ction[, iGroup[,
10e0: 20 6d 65 73 73 61 67 65 2c 20 55 52 4c 5d 5d 20   message, URL]] 
10f0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
1110: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1130: 20 20 20 20 2f 2f 65 63 68 6f 28 6f 45 76 61 6c      //echo(oEval
1140: 46 75 6e 63 5b 73 46 75 6e 63 43 6f 6e 64 5d 29  Func[sFuncCond])
1150: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1170: 20 20 62 43 6f 6e 64 4d 65 6d 6f 20 3d 20 28 21    bCondMemo = (!
1180: 73 46 75 6e 63 43 6f 6e 64 20 7c 7c 20 6f 45 76  sFuncCond || oEv
1190: 61 6c 46 75 6e 63 5b 73 46 75 6e 63 43 6f 6e 64  alFunc[sFuncCond
11a0: 5d 28 73 2c 20 73 78 2c 20 6d 2c 20 64 44 41 2c  ](s, sx, m, dDA,
11b0: 20 73 43 6f 75 6e 74 72 79 2c 20 62 43 6f 6e 64   sCountry, bCond
11c0: 4d 65 6d 6f 29 29 0a 20 20 20 20 20 20 20 20 20  Memo)).         
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e0: 20 20 20 20 20 20 20 69 66 20 28 62 43 6f 6e 64         if (bCond
11f0: 4d 65 6d 6f 29 20 7b 0a 20 20 20 20 20 20 20 20  Memo) {.        
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1210: 20 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74              swit
1220: 63 68 20 28 63 41 63 74 69 6f 6e 54 79 70 65 29  ch (cActionType)
1230: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
1260: 22 2d 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20  "-":.           
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 2f 2f 20 67 72 61 6d 6d 61 72 20 65 72 72 6f   // grammar erro
12a0: 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r.              
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
12d0: 65 63 68 6f 28 22 2d 3e 20 65 72 72 6f 72 20 64  echo("-> error d
12e0: 65 74 65 63 74 65 64 20 69 6e 20 22 20 2b 20 73  etected in " + s
12f0: 4c 69 6e 65 49 64 20 2b 20 22 5c 6e 7a 52 65 67  LineId + "\nzReg
1300: 65 78 3a 20 22 20 2b 20 7a 52 65 67 65 78 2e 73  ex: " + zRegex.s
1310: 6f 75 72 63 65 29 3b 0a 20 20 20 20 20 20 20 20  ource);.        
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 20 20 20 20 20 20 20                  
1340: 20 20 20 20 6e 45 72 72 6f 72 53 74 61 72 74 20      nErrorStart 
1350: 3d 20 6e 4f 66 66 73 65 74 20 2b 20 6d 2e 73 74  = nOffset + m.st
1360: 61 72 74 5b 65 41 63 74 5b 30 5d 5d 3b 0a 20 20  art[eAct[0]];.  
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 64            if (!d
13a0: 45 72 72 73 2e 68 61 73 28 6e 45 72 72 6f 72 53  Errs.has(nErrorS
13b0: 74 61 72 74 29 20 7c 7c 20 6e 50 72 69 6f 72 69  tart) || nPriori
13c0: 74 79 20 3e 20 64 50 72 69 6f 72 69 74 79 2e 67  ty > dPriority.g
13d0: 65 74 28 6e 45 72 72 6f 72 53 74 61 72 74 29 29  et(nErrorStart))
13e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 20 64 45 72 72 73 2e 73 65 74 28 6e 45 72     dErrs.set(nEr
1420: 72 6f 72 53 74 61 72 74 2c 20 5f 63 72 65 61 74  rorStart, _creat
1430: 65 45 72 72 6f 72 28 73 2c 20 73 78 2c 20 73 57  eError(s, sx, sW
1440: 68 61 74 2c 20 6e 4f 66 66 73 65 74 2c 20 6d 2c  hat, nOffset, m,
1450: 20 65 41 63 74 5b 30 5d 2c 20 73 4c 69 6e 65 49   eAct[0], sLineI
1460: 64 2c 20 73 52 75 6c 65 49 64 2c 20 62 55 70 70  d, sRuleId, bUpp
1470: 65 72 63 61 73 65 2c 20 65 41 63 74 5b 31 5d 2c  ercase, eAct[1],
1480: 20 65 41 63 74 5b 32 5d 2c 20 62 49 64 52 75 6c   eAct[2], bIdRul
1490: 65 2c 20 73 4f 70 74 69 6f 6e 2c 20 62 43 6f 6e  e, sOption, bCon
14a0: 74 65 78 74 29 29 3b 0a 20 20 20 20 20 20 20 20  text));.        
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d0: 20 20 20 20 20 20 20 20 64 50 72 69 6f 72 69 74          dPriorit
14e0: 79 2e 73 65 74 28 6e 45 72 72 6f 72 53 74 61 72  y.set(nErrorStar
14f0: 74 2c 20 6e 50 72 69 6f 72 69 74 79 29 3b 0a 20  t, nPriority);. 
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 7d 0a 20 20 20             }.   
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
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 20 20 63 61 73 65 20 22 7e 22          case "~"
1590: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
15c0: 20 74 65 78 74 20 70 72 6f 63 65 73 73 6f 72 0a   text processor.
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 2f 2f 65 63              //ec
1600: 68 6f 28 22 2d 3e 20 74 65 78 74 20 70 72 6f 63  ho("-> text proc
1610: 65 73 73 6f 72 20 62 79 20 22 20 2b 20 73 4c 69  essor by " + sLi
1620: 6e 65 49 64 20 2b 20 22 5c 6e 7a 52 65 67 65 78  neId + "\nzRegex
1630: 3a 20 22 20 2b 20 7a 52 65 67 65 78 2e 73 6f 75  : " + zRegex.sou
1640: 72 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rce);.          
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 20 20 73 20 3d 20 5f 72 65 77 72 69 74 65 28 73    s = _rewrite(s
1680: 2c 20 73 57 68 61 74 2c 20 65 41 63 74 5b 30 5d  , sWhat, eAct[0]
1690: 2c 20 6d 2c 20 62 55 70 70 65 72 63 61 73 65 29  , m, bUppercase)
16a0: 3b 0a 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 62 43                bC
16d0: 68 61 6e 67 65 20 3d 20 74 72 75 65 3b 0a 20 20  hange = true;.  
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1700: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 62 44            if (bD
1710: 65 62 75 67 29 20 7b 0a 20 20 20 20 20 20 20 20  ebug) {.        
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 20 20 20 20 20 20 20 20 65 63 68 6f 28 22 7e 20          echo("~ 
1750: 22 20 2b 20 73 20 2b 20 22 20 20 2d 2d 20 22 20  " + s + "  -- " 
1760: 2b 20 6d 5b 65 41 63 74 5b 30 5d 5d 20 2b 20 22  + m[eAct[0]] + "
1770: 20 20 23 20 22 20 2b 20 73 4c 69 6e 65 49 64 29    # " + sLineId)
1780: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
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 20 20 20 20 20 20 20 20 20                  
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
17e0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
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 20 20 63 61 73 65 20             case 
1810: 22 3d 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20  "=":.           
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 20 2f 2f 20 64 69 73 61 6d 62 69 67 75 61 74 69   // disambiguati
1850: 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  on.             
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 2f                 /
1880: 2f 65 63 68 6f 28 22 2d 3e 20 64 69 73 61 6d 62  /echo("-> disamb
1890: 69 67 75 61 74 69 6f 6e 20 62 79 20 22 20 2b 20  iguation by " + 
18a0: 73 4c 69 6e 65 49 64 20 2b 20 22 5c 6e 7a 52 65  sLineId + "\nzRe
18b0: 67 65 78 3a 20 22 20 2b 20 7a 52 65 67 65 78 2e  gex: " + zRegex.
18c0: 73 6f 75 72 63 65 29 3b 0a 20 20 20 20 20 20 20  source);.       
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: 20 20 20 20 20 6f 45 76 61 6c 46 75 6e 63 5b 73       oEvalFunc[s
1900: 57 68 61 74 5d 28 73 2c 20 6d 2c 20 64 44 41 29  What](s, m, dDA)
1910: 3b 0a 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: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1940: 20 28 62 44 65 62 75 67 29 20 7b 0a 20 20 20 20   (bDebug) {.    
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 20 20 20 20 20 20 20 20 65 63 68 6f              echo
1980: 28 22 3d 20 22 20 2b 20 6d 5b 30 5d 20 2b 20 22  ("= " + m[0] + "
1990: 20 20 23 20 22 20 2b 20 73 4c 69 6e 65 49 64 20    # " + sLineId 
19a0: 2b 20 22 5c 6e 44 41 3a 20 22 20 2b 20 64 44 41  + "\nDA: " + dDA
19b0: 2e 5f 74 6f 53 74 72 69 6e 67 28 29 29 3b 0a 20  ._toString());. 
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 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 20 20 20 62 72 65 61 6b 3b 0a           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 63 61 73 65 20 22 3e 22          case ">"
1a50: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1a80: 20 77 65 20 64 6f 20 6e 6f 74 68 69 6e 67 2c 20   we do nothing, 
1a90: 74 68 69 73 20 74 65 73 74 20 69 73 20 6a 75 73  this test is jus
1aa0: 74 20 61 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f  t a condition to
1ab0: 20 61 70 70 6c 79 20 61 6c 6c 20 66 6f 6c 6c 6f   apply all follo
1ac0: 77 69 6e 67 20 61 63 74 69 6f 6e 73 0a 20 20 20  wing actions.   
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
1b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 63 68               ech
1b60: 6f 28 22 23 20 65 72 72 6f 72 3a 20 75 6e 6b 6e  o("# error: unkn
1b70: 6f 77 6e 20 61 63 74 69 6f 6e 20 61 74 20 22 20  own action at " 
1b80: 2b 20 73 4c 69 6e 65 49 64 29 3b 0a 20 20 20 20  + sLineId);.    
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 7d 0a 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 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1c00: 66 20 28 63 41 63 74 69 6f 6e 54 79 70 65 20 3d  f (cActionType =
1c10: 3d 20 22 3e 22 29 20 7b 0a 20 20 20 20 20 20 20  = ">") {.       
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 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 20 20 20 20 20 20 20 20 20 7d 0a                }.
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 7d 0a 20 20              }.  
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
1cd0: 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  (e) {.          
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 20 20 20 65 63 68 6f 28 73 29 3b 0a 20        echo(s);. 
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
1d20: 63 68 6f 28 22 23 20 6c 69 6e 65 20 69 64 3a 20  cho("# line id: 
1d30: 22 20 2b 20 73 4c 69 6e 65 49 64 20 2b 20 22 5c  " + sLineId + "\
1d40: 6e 23 20 72 75 6c 65 20 69 64 3a 20 22 20 2b 20  n# rule id: " + 
1d50: 73 52 75 6c 65 49 64 29 3b 0a 20 20 20 20 20 20  sRuleId);.      
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 20 20 20 20 20 20 20 20 68 65 6c 70 65 72            helper
1d80: 73 2e 6c 6f 67 65 72 72 6f 72 28 65 29 3b 0a 20  s.logerror(e);. 
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1dd0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1df0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1e00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1e10: 20 69 66 20 28 62 43 68 61 6e 67 65 29 20 7b 0a   if (bChange) {.
1e20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
1e30: 73 2c 20 64 45 72 72 73 5d 3b 0a 20 20 20 20 7d  s, dErrs];.    }
1e40: 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 66 61 6c  .    return [fal
1e50: 73 65 2c 20 64 45 72 72 73 5d 3b 0a 7d 0a 0a 66  se, dErrs];.}..f
1e60: 75 6e 63 74 69 6f 6e 20 5f 63 72 65 61 74 65 45  unction _createE
1e70: 72 72 6f 72 20 28 73 2c 20 73 78 2c 20 73 52 65  rror (s, sx, sRe
1e80: 70 6c 2c 20 6e 4f 66 66 73 65 74 2c 20 6d 2c 20  pl, nOffset, m, 
1e90: 69 47 72 6f 75 70 2c 20 73 4c 69 6e 65 49 64 2c  iGroup, sLineId,
1ea0: 20 73 52 75 6c 65 49 64 2c 20 62 55 70 70 65 72   sRuleId, bUpper
1eb0: 63 61 73 65 2c 20 73 4d 73 67 2c 20 73 55 52 4c  case, sMsg, sURL
1ec0: 2c 20 62 49 64 52 75 6c 65 2c 20 73 4f 70 74 69  , bIdRule, sOpti
1ed0: 6f 6e 2c 20 62 43 6f 6e 74 65 78 74 29 20 7b 0a  on, bContext) {.
1ee0: 20 20 20 20 6c 65 74 20 6f 45 72 72 20 3d 20 7b      let oErr = {
1ef0: 7d 3b 0a 20 20 20 20 6f 45 72 72 5b 22 6e 53 74  };.    oErr["nSt
1f00: 61 72 74 22 5d 20 3d 20 6e 4f 66 66 73 65 74 20  art"] = nOffset 
1f10: 2b 20 6d 2e 73 74 61 72 74 5b 69 47 72 6f 75 70  + m.start[iGroup
1f20: 5d 3b 0a 20 20 20 20 6f 45 72 72 5b 22 6e 45 6e  ];.    oErr["nEn
1f30: 64 22 5d 20 3d 20 6e 4f 66 66 73 65 74 20 2b 20  d"] = nOffset + 
1f40: 6d 2e 65 6e 64 5b 69 47 72 6f 75 70 5d 3b 0a 20  m.end[iGroup];. 
1f50: 20 20 20 6f 45 72 72 5b 22 73 4c 69 6e 65 49 64     oErr["sLineId
1f60: 22 5d 20 3d 20 73 4c 69 6e 65 49 64 3b 0a 20 20  "] = sLineId;.  
1f70: 20 20 6f 45 72 72 5b 22 73 52 75 6c 65 49 64 22    oErr["sRuleId"
1f80: 5d 20 3d 20 73 52 75 6c 65 49 64 3b 0a 20 20 20  ] = sRuleId;.   
1f90: 20 6f 45 72 72 5b 22 73 54 79 70 65 22 5d 20 3d   oErr["sType"] =
1fa0: 20 28 73 4f 70 74 69 6f 6e 29 20 3f 20 73 4f 70   (sOption) ? sOp
1fb0: 74 69 6f 6e 20 3a 20 22 6e 6f 74 79 70 65 22 3b  tion : "notype";
1fc0: 0a 20 20 20 20 2f 2f 20 73 75 67 67 65 73 74 69  .    // suggesti
1fd0: 6f 6e 73 0a 20 20 20 20 69 66 20 28 73 52 65 70  ons.    if (sRep
1fe0: 6c 5b 30 5d 20 3d 3d 3d 20 22 3d 22 29 20 7b 0a  l[0] === "=") {.
1ff0: 20 20 20 20 20 20 20 20 6c 65 74 20 73 75 67 67          let sugg
2000: 20 3d 20 6f 45 76 61 6c 46 75 6e 63 5b 73 52 65   = oEvalFunc[sRe
2010: 70 6c 2e 73 6c 69 63 65 28 31 29 5d 28 73 2c 20  pl.slice(1)](s, 
2020: 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  m);.        if (
2030: 73 75 67 67 29 20 7b 0a 20 20 20 20 20 20 20 20  sugg) {.        
2040: 20 20 20 20 69 66 20 28 62 55 70 70 65 72 63 61      if (bUpperca
2050: 73 65 20 26 26 20 6d 5b 69 47 72 6f 75 70 5d 2e  se && m[iGroup].
2060: 73 6c 69 63 65 28 30 2c 31 29 2e 5f 69 73 55 70  slice(0,1)._isUp
2070: 70 65 72 43 61 73 65 28 29 29 20 7b 0a 20 20 20  perCase()) {.   
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 45 72               oEr
2090: 72 5b 22 61 53 75 67 67 65 73 74 69 6f 6e 73 22  r["aSuggestions"
20a0: 5d 20 3d 20 63 61 70 69 74 61 6c 69 7a 65 41 72  ] = capitalizeAr
20b0: 72 61 79 28 73 75 67 67 2e 73 70 6c 69 74 28 22  ray(sugg.split("
20c0: 7c 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  |"));.          
20d0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
20e0: 20 20 20 20 20 20 20 20 20 20 20 6f 45 72 72 5b             oErr[
20f0: 22 61 53 75 67 67 65 73 74 69 6f 6e 73 22 5d 20  "aSuggestions"] 
2100: 3d 20 73 75 67 67 2e 73 70 6c 69 74 28 22 7c 22  = sugg.split("|"
2110: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2120: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
2130: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 45  {.            oE
2140: 72 72 5b 22 61 53 75 67 67 65 73 74 69 6f 6e 73  rr["aSuggestions
2150: 22 5d 20 3d 20 5b 5d 3b 0a 20 20 20 20 20 20 20  "] = [];.       
2160: 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66   }.    } else if
2170: 20 28 73 52 65 70 6c 20 3d 3d 20 22 5f 22 29 20   (sRepl == "_") 
2180: 7b 0a 20 20 20 20 20 20 20 20 6f 45 72 72 5b 22  {.        oErr["
2190: 61 53 75 67 67 65 73 74 69 6f 6e 73 22 5d 20 3d  aSuggestions"] =
21a0: 20 5b 5d 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20   [];.    } else 
21b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 62 55  {.        if (bU
21c0: 70 70 65 72 63 61 73 65 20 26 26 20 6d 5b 69 47  ppercase && m[iG
21d0: 72 6f 75 70 5d 2e 73 6c 69 63 65 28 30 2c 31 29  roup].slice(0,1)
21e0: 2e 5f 69 73 55 70 70 65 72 43 61 73 65 28 29 29  ._isUpperCase())
21f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f   {.            o
2200: 45 72 72 5b 22 61 53 75 67 67 65 73 74 69 6f 6e  Err["aSuggestion
2210: 73 22 5d 20 3d 20 63 61 70 69 74 61 6c 69 7a 65  s"] = capitalize
2220: 41 72 72 61 79 28 73 52 65 70 6c 2e 5f 65 78 70  Array(sRepl._exp
2230: 61 6e 64 28 6d 29 2e 73 70 6c 69 74 28 22 7c 22  and(m).split("|"
2240: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  ));.        } el
2250: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
2260: 20 6f 45 72 72 5b 22 61 53 75 67 67 65 73 74 69   oErr["aSuggesti
2270: 6f 6e 73 22 5d 20 3d 20 73 52 65 70 6c 2e 5f 65  ons"] = sRepl._e
2280: 78 70 61 6e 64 28 6d 29 2e 73 70 6c 69 74 28 22  xpand(m).split("
2290: 7c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  |");.        }. 
22a0: 20 20 20 7d 0a 20 20 20 20 2f 2f 20 4d 65 73 73     }.    // Mess
22b0: 61 67 65 0a 20 20 20 20 69 66 20 28 73 4d 73 67  age.    if (sMsg
22c0: 5b 30 5d 20 3d 3d 3d 20 22 3d 22 29 20 7b 0a 20  [0] === "=") {. 
22d0: 20 20 20 20 20 20 20 73 4d 65 73 73 61 67 65 20         sMessage 
22e0: 3d 20 6f 45 76 61 6c 46 75 6e 63 5b 73 4d 73 67  = oEvalFunc[sMsg
22f0: 2e 73 6c 69 63 65 28 31 29 5d 28 73 2c 20 6d 29  .slice(1)](s, m)
2300: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
2310: 20 20 20 20 20 20 73 4d 65 73 73 61 67 65 20 3d        sMessage =
2320: 20 73 4d 73 67 2e 5f 65 78 70 61 6e 64 28 6d 29   sMsg._expand(m)
2330: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
2340: 62 49 64 52 75 6c 65 29 20 7b 0a 20 20 20 20 20  bIdRule) {.     
2350: 20 20 20 73 4d 65 73 73 61 67 65 20 2b 3d 20 22     sMessage += "
2360: 20 23 23 22 20 2b 20 73 4c 69 6e 65 49 64 20 2b   ##" + sLineId +
2370: 20 22 20 23 22 20 2b 20 73 52 75 6c 65 49 64 3b   " #" + sRuleId;
2380: 0a 20 20 20 20 7d 0a 20 20 20 20 6f 45 72 72 5b  .    }.    oErr[
2390: 22 73 4d 65 73 73 61 67 65 22 5d 20 3d 20 73 4d  "sMessage"] = sM
23a0: 65 73 73 61 67 65 3b 0a 20 20 20 20 2f 2f 20 55  essage;.    // U
23b0: 52 4c 0a 20 20 20 20 6f 45 72 72 5b 22 55 52 4c  RL.    oErr["URL
23c0: 22 5d 20 3d 20 73 55 52 4c 20 7c 7c 20 22 22 3b  "] = sURL || "";
23d0: 0a 20 20 20 20 2f 2f 20 43 6f 6e 74 65 78 74 0a  .    // Context.
23e0: 20 20 20 20 69 66 20 28 62 43 6f 6e 74 65 78 74      if (bContext
23f0: 29 20 7b 0a 20 20 20 20 20 20 20 20 6f 45 72 72  ) {.        oErr
2400: 5b 22 73 55 6e 64 65 72 6c 69 6e 65 64 22 5d 20  ["sUnderlined"] 
2410: 3d 20 73 78 2e 73 6c 69 63 65 28 6d 2e 73 74 61  = sx.slice(m.sta
2420: 72 74 5b 69 47 72 6f 75 70 5d 2c 20 6d 2e 65 6e  rt[iGroup], m.en
2430: 64 5b 69 47 72 6f 75 70 5d 29 3b 0a 20 20 20 20  d[iGroup]);.    
2440: 20 20 20 20 6f 45 72 72 5b 22 73 42 65 66 6f 72      oErr["sBefor
2450: 65 22 5d 20 3d 20 73 78 2e 73 6c 69 63 65 28 4d  e"] = sx.slice(M
2460: 61 74 68 2e 6d 61 78 28 30 2c 20 6d 2e 73 74 61  ath.max(0, m.sta
2470: 72 74 5b 69 47 72 6f 75 70 5d 2d 38 30 29 2c 20  rt[iGroup]-80), 
2480: 6d 2e 73 74 61 72 74 5b 69 47 72 6f 75 70 5d 29  m.start[iGroup])
2490: 3b 0a 20 20 20 20 20 20 20 20 6f 45 72 72 5b 22  ;.        oErr["
24a0: 73 41 66 74 65 72 22 5d 20 3d 20 73 78 2e 73 6c  sAfter"] = sx.sl
24b0: 69 63 65 28 6d 2e 65 6e 64 5b 69 47 72 6f 75 70  ice(m.end[iGroup
24c0: 5d 2c 20 6d 2e 65 6e 64 5b 69 47 72 6f 75 70 5d  ], m.end[iGroup]
24d0: 2b 38 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  +80);.    }.    
24e0: 72 65 74 75 72 6e 20 6f 45 72 72 3b 0a 7d 0a 0a  return oErr;.}..
24f0: 66 75 6e 63 74 69 6f 6e 20 5f 72 65 77 72 69 74  function _rewrit
2500: 65 20 28 73 2c 20 73 52 65 70 6c 2c 20 69 47 72  e (s, sRepl, iGr
2510: 6f 75 70 2c 20 6d 2c 20 62 55 70 70 65 72 63 61  oup, m, bUpperca
2520: 73 65 29 20 7b 0a 20 20 20 20 2f 2f 20 74 65 78  se) {.    // tex
2530: 74 20 70 72 6f 63 65 73 73 6f 72 3a 20 77 72 69  t processor: wri
2540: 74 65 20 73 52 65 70 6c 20 69 6e 20 73 20 61 74  te sRepl in s at
2550: 20 69 47 72 6f 75 70 20 70 6f 73 69 74 69 6f 6e   iGroup position
2560: 22 0a 20 20 20 20 6c 65 74 20 6c 6e 20 3d 20 6d  ".    let ln = m
2570: 2e 65 6e 64 5b 69 47 72 6f 75 70 5d 20 2d 20 6d  .end[iGroup] - m
2580: 2e 73 74 61 72 74 5b 69 47 72 6f 75 70 5d 3b 0a  .start[iGroup];.
2590: 20 20 20 20 6c 65 74 20 73 4e 65 77 20 3d 20 22      let sNew = "
25a0: 22 3b 0a 20 20 20 20 69 66 20 28 73 52 65 70 6c  ";.    if (sRepl
25b0: 20 3d 3d 3d 20 22 2a 22 29 20 7b 0a 20 20 20 20   === "*") {.    
25c0: 20 20 20 20 73 4e 65 77 20 3d 20 22 20 22 2e 72      sNew = " ".r
25d0: 65 70 65 61 74 28 6c 6e 29 3b 0a 20 20 20 20 7d  epeat(ln);.    }
25e0: 20 65 6c 73 65 20 69 66 20 28 73 52 65 70 6c 20   else if (sRepl 
25f0: 3d 3d 3d 20 22 3e 22 20 7c 7c 20 73 52 65 70 6c  === ">" || sRepl
2600: 20 3d 3d 3d 20 22 5f 22 20 7c 7c 20 73 52 65 70   === "_" || sRep
2610: 6c 20 3d 3d 3d 20 22 7e 22 29 20 7b 0a 20 20 20  l === "~") {.   
2620: 20 20 20 20 20 73 4e 65 77 20 3d 20 73 52 65 70       sNew = sRep
2630: 6c 20 2b 20 22 20 22 2e 72 65 70 65 61 74 28 6c  l + " ".repeat(l
2640: 6e 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  n-1);.    } else
2650: 20 69 66 20 28 73 52 65 70 6c 20 3d 3d 3d 20 22   if (sRepl === "
2660: 40 22 29 20 7b 0a 20 20 20 20 20 20 20 20 73 4e  @") {.        sN
2670: 65 77 20 3d 20 22 40 22 2e 72 65 70 65 61 74 28  ew = "@".repeat(
2680: 6c 6e 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ln);.    } else 
2690: 69 66 20 28 73 52 65 70 6c 2e 73 6c 69 63 65 28  if (sRepl.slice(
26a0: 30 2c 31 29 20 3d 3d 3d 20 22 3d 22 29 20 7b 0a  0,1) === "=") {.
26b0: 20 20 20 20 20 20 20 20 73 4e 65 77 20 3d 20 6f          sNew = o
26c0: 45 76 61 6c 46 75 6e 63 5b 73 52 65 70 6c 2e 73  EvalFunc[sRepl.s
26d0: 6c 69 63 65 28 31 29 5d 28 73 2c 20 6d 29 3b 0a  lice(1)](s, m);.
26e0: 20 20 20 20 20 20 20 20 73 4e 65 77 20 3d 20 73          sNew = s
26f0: 4e 65 77 20 2b 20 22 20 22 2e 72 65 70 65 61 74  New + " ".repeat
2700: 28 6c 6e 2d 73 4e 65 77 2e 6c 65 6e 67 74 68 29  (ln-sNew.length)
2710: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 62 55  ;.        if (bU
2720: 70 70 65 72 63 61 73 65 20 26 26 20 6d 5b 69 47  ppercase && m[iG
2730: 72 6f 75 70 5d 2e 73 6c 69 63 65 28 30 2c 31 29  roup].slice(0,1)
2740: 2e 5f 69 73 55 70 70 65 72 43 61 73 65 28 29 29  ._isUpperCase())
2750: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
2760: 4e 65 77 20 3d 20 73 4e 65 77 2e 5f 74 6f 43 61  New = sNew._toCa
2770: 70 69 74 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  pitalize();.    
2780: 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
2790: 20 7b 0a 20 20 20 20 20 20 20 20 73 4e 65 77 20   {.        sNew 
27a0: 3d 20 73 52 65 70 6c 2e 5f 65 78 70 61 6e 64 28  = sRepl._expand(
27b0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 4e 65 77  m);.        sNew
27c0: 20 3d 20 73 4e 65 77 20 2b 20 22 20 22 2e 72 65   = sNew + " ".re
27d0: 70 65 61 74 28 6c 6e 2d 73 4e 65 77 2e 6c 65 6e  peat(ln-sNew.len
27e0: 67 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  gth);.    }.    
27f0: 2f 2f 65 63 68 6f 28 22 5c 6e 22 2b 73 2b 22 5c  //echo("\n"+s+"\
2800: 6e 73 74 61 72 74 3a 20 22 2b 6d 2e 73 74 61 72  nstart: "+m.star
2810: 74 5b 69 47 72 6f 75 70 5d 2b 22 20 65 6e 64 3a  t[iGroup]+" end:
2820: 22 2b 6d 2e 65 6e 64 5b 69 47 72 6f 75 70 5d 29  "+m.end[iGroup])
2830: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 2e 73 6c  .    return s.sl
2840: 69 63 65 28 30 2c 20 6d 2e 73 74 61 72 74 5b 69  ice(0, m.start[i
2850: 47 72 6f 75 70 5d 29 20 2b 20 73 4e 65 77 20 2b  Group]) + sNew +
2860: 20 73 2e 73 6c 69 63 65 28 6d 2e 65 6e 64 5b 69   s.slice(m.end[i
2870: 47 72 6f 75 70 5d 29 3b 0a 7d 0a 0a 66 75 6e 63  Group]);.}..func
2880: 74 69 6f 6e 20 69 67 6e 6f 72 65 52 75 6c 65 20  tion ignoreRule 
2890: 28 73 52 75 6c 65 49 64 29 20 7b 0a 20 20 20 20  (sRuleId) {.    
28a0: 5f 61 49 67 6e 6f 72 65 64 52 75 6c 65 73 2e 61  _aIgnoredRules.a
28b0: 64 64 28 73 52 75 6c 65 49 64 29 3b 0a 7d 0a 0a  dd(sRuleId);.}..
28c0: 66 75 6e 63 74 69 6f 6e 20 72 65 73 65 74 49 67  function resetIg
28d0: 6e 6f 72 65 52 75 6c 65 73 20 28 29 20 7b 0a 20  noreRules () {. 
28e0: 20 20 20 5f 61 49 67 6e 6f 72 65 64 52 75 6c 65     _aIgnoredRule
28f0: 73 2e 63 6c 65 61 72 28 29 3b 0a 7d 0a 0a 66 75  s.clear();.}..fu
2900: 6e 63 74 69 6f 6e 20 72 65 61 63 74 69 76 61 74  nction reactivat
2910: 65 52 75 6c 65 20 28 73 52 75 6c 65 49 64 29 20  eRule (sRuleId) 
2920: 7b 0a 20 20 20 20 5f 61 49 67 6e 6f 72 65 64 52  {.    _aIgnoredR
2930: 75 6c 65 73 2e 64 65 6c 65 74 65 28 73 52 75 6c  ules.delete(sRul
2940: 65 49 64 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f  eId);.}..functio
2950: 6e 20 6c 69 73 74 52 75 6c 65 73 20 28 73 46 69  n listRules (sFi
2960: 6c 74 65 72 3d 6e 75 6c 6c 29 20 7b 0a 20 20 20  lter=null) {.   
2970: 20 2f 2f 20 67 65 6e 65 72 61 74 6f 72 3a 20 72   // generator: r
2980: 65 74 75 72 6e 73 20 74 75 70 6c 65 20 28 73 4f  eturns tuple (sO
2990: 70 74 69 6f 6e 2c 20 73 4c 69 6e 65 49 64 2c 20  ption, sLineId, 
29a0: 73 52 75 6c 65 49 64 29 0a 20 20 20 20 74 72 79  sRuleId).    try
29b0: 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28   {.        for (
29c0: 5b 73 4f 70 74 69 6f 6e 2c 20 6c 52 75 6c 65 47  [sOption, lRuleG
29d0: 72 6f 75 70 5d 20 6f 66 20 5f 67 65 74 52 75 6c  roup] of _getRul
29e0: 65 73 28 74 72 75 65 29 29 20 7b 0a 20 20 20 20  es(true)) {.    
29f0: 20 20 20 20 20 20 20 20 66 6f 72 20 28 5b 5f 2c          for ([_,
2a00: 20 5f 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75   _, sLineId, sRu
2a10: 6c 65 49 64 2c 20 5f 2c 20 5f 5d 20 6f 66 20 6c  leId, _, _] of l
2a20: 52 75 6c 65 47 72 6f 75 70 29 20 7b 0a 20 20 20  RuleGroup) {.   
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
2a40: 28 21 73 46 69 6c 74 65 72 20 7c 7c 20 73 52 75  (!sFilter || sRu
2a50: 6c 65 49 64 2e 74 65 73 74 28 73 46 69 6c 74 65  leId.test(sFilte
2a60: 72 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  r)) {.          
2a70: 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
2a80: 5b 73 4f 70 74 69 6f 6e 2c 20 73 4c 69 6e 65 49  [sOption, sLineI
2a90: 64 2c 20 73 52 75 6c 65 49 64 5d 3b 0a 20 20 20  d, sRuleId];.   
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2ab0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2ac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
2ad0: 6f 72 20 28 5b 73 4f 70 74 69 6f 6e 2c 20 6c 52  or ([sOption, lR
2ae0: 75 6c 65 47 72 6f 75 70 5d 20 6f 66 20 5f 67 65  uleGroup] of _ge
2af0: 74 52 75 6c 65 73 28 66 61 6c 73 65 29 29 20 7b  tRules(false)) {
2b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
2b10: 20 28 5b 5f 2c 20 5f 2c 20 73 4c 69 6e 65 49 64   ([_, _, sLineId
2b20: 2c 20 73 52 75 6c 65 49 64 2c 20 5f 2c 20 5f 5d  , sRuleId, _, _]
2b30: 20 6f 66 20 6c 52 75 6c 65 47 72 6f 75 70 29 20   of lRuleGroup) 
2b40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b50: 20 20 69 66 20 28 21 73 46 69 6c 74 65 72 20 7c    if (!sFilter |
2b60: 7c 20 73 52 75 6c 65 49 64 2e 74 65 73 74 28 73  | sRuleId.test(s
2b70: 46 69 6c 74 65 72 29 29 20 7b 0a 20 20 20 20 20  Filter)) {.     
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 79                 y
2b90: 69 65 6c 64 20 5b 73 4f 70 74 69 6f 6e 2c 20 73  ield [sOption, s
2ba0: 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65 49 64 5d  LineId, sRuleId]
2bb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2bc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2bd0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2be0: 7d 0a 20 20 20 20 63 61 74 63 68 20 28 65 29 20  }.    catch (e) 
2bf0: 7b 0a 20 20 20 20 20 20 20 20 68 65 6c 70 65 72  {.        helper
2c00: 73 2e 6c 6f 67 65 72 72 6f 72 28 65 29 3b 0a 20  s.logerror(e);. 
2c10: 20 20 20 7d 0a 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f     }.}...///////
2c20: 2f 20 69 6e 69 74 0a 0a 66 75 6e 63 74 69 6f 6e  / init..function
2c30: 20 6c 6f 61 64 20 28 73 43 6f 6e 74 65 78 74 3d   load (sContext=
2c40: 22 4a 61 76 61 53 63 72 69 70 74 22 29 20 7b 0a  "JavaScript") {.
2c50: 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20      try {.      
2c60: 20 20 5f 6f 44 69 63 74 20 3d 20 6e 65 77 20 69    _oDict = new i
2c70: 62 64 61 77 67 2e 49 42 44 41 57 47 28 22 24 7b  bdawg.IBDAWG("${
2c80: 64 69 63 5f 6e 61 6d 65 7d 2e 6a 73 6f 6e 22 29  dic_name}.json")
2c90: 3b 0a 20 20 20 20 20 20 20 20 5f 73 43 6f 6e 74  ;.        _sCont
2ca0: 65 78 74 20 3d 20 73 43 6f 6e 74 65 78 74 3b 0a  ext = sContext;.
2cb0: 20 20 20 20 20 20 20 20 5f 64 4f 70 74 69 6f 6e          _dOption
2cc0: 73 20 3d 20 67 63 5f 6f 70 74 69 6f 6e 73 2e 67  s = gc_options.g
2cd0: 65 74 4f 70 74 69 6f 6e 73 28 73 43 6f 6e 74 65  etOptions(sConte
2ce0: 78 74 29 2e 5f 73 68 61 6c 6c 6f 77 43 6f 70 79  xt)._shallowCopy
2cf0: 28 29 3b 20 20 20 20 20 2f 2f 20 64 75 70 6c 69  ();     // dupli
2d00: 63 61 74 69 6f 6e 20 6e 65 63 65 73 73 61 72 79  cation necessary
2d10: 2c 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  , to be able to 
2d20: 72 65 73 65 74 20 74 6f 20 64 65 66 61 75 6c 74  reset to default
2d30: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 74 63 68  .    }.    catch
2d40: 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20 68   (e) {.        h
2d50: 65 6c 70 65 72 73 2e 6c 6f 67 65 72 72 6f 72 28  elpers.logerror(
2d60: 65 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 66 75 6e  e);.    }.}..fun
2d70: 63 74 69 6f 6e 20 73 65 74 4f 70 74 69 6f 6e 20  ction setOption 
2d80: 28 73 4f 70 74 2c 20 62 56 61 6c 29 20 7b 0a 20  (sOpt, bVal) {. 
2d90: 20 20 20 69 66 20 28 5f 64 4f 70 74 69 6f 6e 73     if (_dOptions
2da0: 2e 68 61 73 28 73 4f 70 74 29 29 20 7b 0a 20 20  .has(sOpt)) {.  
2db0: 20 20 20 20 20 20 5f 64 4f 70 74 69 6f 6e 73 2e        _dOptions.
2dc0: 73 65 74 28 73 4f 70 74 2c 20 62 56 61 6c 29 3b  set(sOpt, bVal);
2dd0: 0a 20 20 20 20 7d 0a 7d 0a 0a 66 75 6e 63 74 69  .    }.}..functi
2de0: 6f 6e 20 73 65 74 4f 70 74 69 6f 6e 73 20 28 64  on setOptions (d
2df0: 4f 70 74 29 20 7b 0a 20 20 20 20 5f 64 4f 70 74  Opt) {.    _dOpt
2e00: 69 6f 6e 73 2e 5f 75 70 64 61 74 65 4f 6e 6c 79  ions._updateOnly
2e10: 45 78 69 73 74 69 6e 67 4b 65 79 73 28 64 4f 70  ExistingKeys(dOp
2e20: 74 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20  t);.}..function 
2e30: 67 65 74 4f 70 74 69 6f 6e 73 20 28 29 20 7b 0a  getOptions () {.
2e40: 20 20 20 20 72 65 74 75 72 6e 20 5f 64 4f 70 74      return _dOpt
2e50: 69 6f 6e 73 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f  ions;.}..functio
2e60: 6e 20 67 65 74 44 65 66 61 75 6c 74 4f 70 74 69  n getDefaultOpti
2e70: 6f 6e 73 20 28 29 20 7b 0a 20 20 20 20 72 65 74  ons () {.    ret
2e80: 75 72 6e 20 67 63 5f 6f 70 74 69 6f 6e 73 2e 67  urn gc_options.g
2e90: 65 74 4f 70 74 69 6f 6e 73 28 5f 73 43 6f 6e 74  etOptions(_sCont
2ea0: 65 78 74 29 2e 5f 73 68 61 6c 6c 6f 77 43 6f 70  ext)._shallowCop
2eb0: 79 28 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e  y();.}..function
2ec0: 20 72 65 73 65 74 4f 70 74 69 6f 6e 73 20 28 29   resetOptions ()
2ed0: 20 7b 0a 20 20 20 20 5f 64 4f 70 74 69 6f 6e 73   {.    _dOptions
2ee0: 20 3d 20 67 63 5f 6f 70 74 69 6f 6e 73 2e 67 65   = gc_options.ge
2ef0: 74 4f 70 74 69 6f 6e 73 28 5f 73 43 6f 6e 74 65  tOptions(_sConte
2f00: 78 74 29 2e 5f 73 68 61 6c 6c 6f 77 43 6f 70 79  xt)._shallowCopy
2f10: 28 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20  ();.}..function 
2f20: 67 65 74 44 69 63 74 69 6f 6e 61 72 79 20 28 29  getDictionary ()
2f30: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 5f 6f   {.    return _o
2f40: 44 69 63 74 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f  Dict;.}..functio
2f50: 6e 20 5f 67 65 74 52 75 6c 65 73 20 28 62 50 61  n _getRules (bPa
2f60: 72 61 67 72 61 70 68 29 20 7b 0a 20 20 20 20 69  ragraph) {.    i
2f70: 66 20 28 21 62 50 61 72 61 67 72 61 70 68 29 20  f (!bParagraph) 
2f80: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2f90: 20 5f 72 75 6c 65 73 2e 6c 53 65 6e 74 65 6e 63   _rules.lSentenc
2fa0: 65 52 75 6c 65 73 3b 0a 20 20 20 20 7d 0a 20 20  eRules;.    }.  
2fb0: 20 20 72 65 74 75 72 6e 20 5f 72 75 6c 65 73 2e    return _rules.
2fc0: 6c 50 61 72 61 67 72 61 70 68 52 75 6c 65 73 3b  lParagraphRules;
2fd0: 0a 7d 0a 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 20 63  .}....//////// c
2fe0: 6f 6d 6d 6f 6e 20 66 75 6e 63 74 69 6f 6e 73 0a  ommon functions.
2ff0: 0a 66 75 6e 63 74 69 6f 6e 20 6f 70 74 69 6f 6e  .function option
3000: 20 28 73 4f 70 74 29 20 7b 0a 20 20 20 20 2f 2f   (sOpt) {.    //
3010: 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   return true if 
3020: 6f 70 74 69 6f 6e 20 73 4f 70 74 20 69 73 20 61  option sOpt is a
3030: 63 74 69 76 65 0a 20 20 20 20 72 65 74 75 72 6e  ctive.    return
3040: 20 5f 64 4f 70 74 69 6f 6e 73 2e 67 65 74 28 73   _dOptions.get(s
3050: 4f 70 74 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f  Opt);.}..functio
3060: 6e 20 64 69 73 70 6c 61 79 49 6e 66 6f 20 28 64  n displayInfo (d
3070: 44 41 2c 20 61 57 6f 72 64 29 20 7b 0a 20 20 20  DA, aWord) {.   
3080: 20 2f 2f 20 66 6f 72 20 64 65 62 75 67 67 69 6e   // for debuggin
3090: 67 3a 20 69 6e 66 6f 20 6f 66 20 77 6f 72 64 0a  g: info of word.
30a0: 20 20 20 20 69 66 20 28 21 61 57 6f 72 64 29 20      if (!aWord) 
30b0: 7b 0a 20 20 20 20 20 20 20 20 65 63 68 6f 28 22  {.        echo("
30c0: 3e 20 6e 6f 74 68 69 6e 67 20 74 6f 20 66 69 6e  > nothing to fin
30d0: 64 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d");.        ret
30e0: 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a  urn true;.    }.
30f0: 20 20 20 20 69 66 20 28 21 5f 64 41 6e 61 6c 79      if (!_dAnaly
3100: 73 65 73 2e 68 61 73 28 61 57 6f 72 64 5b 31 5d  ses.has(aWord[1]
3110: 29 20 26 26 20 21 5f 73 74 6f 72 65 4d 6f 72 70  ) && !_storeMorp
3120: 68 46 72 6f 6d 46 53 41 28 61 57 6f 72 64 5b 31  hFromFSA(aWord[1
3130: 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 20 65 63  ])) {.        ec
3140: 68 6f 28 22 3e 20 6e 6f 74 20 69 6e 20 46 53 41  ho("> not in FSA
3150: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
3160: 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20  rn true;.    }. 
3170: 20 20 20 69 66 20 28 64 44 41 2e 68 61 73 28 61     if (dDA.has(a
3180: 57 6f 72 64 5b 30 5d 29 29 20 7b 0a 20 20 20 20  Word[0])) {.    
3190: 20 20 20 20 65 63 68 6f 28 22 44 41 3a 20 22 20      echo("DA: " 
31a0: 2b 20 64 44 41 2e 67 65 74 28 61 57 6f 72 64 5b  + dDA.get(aWord[
31b0: 30 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  0]));.    }.    
31c0: 65 63 68 6f 28 22 46 53 41 3a 20 22 20 2b 20 5f  echo("FSA: " + _
31d0: 64 41 6e 61 6c 79 73 65 73 2e 67 65 74 28 61 57  dAnalyses.get(aW
31e0: 6f 72 64 5b 31 5d 29 29 3b 0a 20 20 20 20 72 65  ord[1]));.    re
31f0: 74 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a 66 75  turn true;.}..fu
3200: 6e 63 74 69 6f 6e 20 5f 73 74 6f 72 65 4d 6f 72  nction _storeMor
3210: 70 68 46 72 6f 6d 46 53 41 20 28 73 57 6f 72 64  phFromFSA (sWord
3220: 29 20 7b 0a 20 20 20 20 2f 2f 20 72 65 74 72 69  ) {.    // retri
3230: 65 76 65 73 20 6d 6f 72 70 68 6f 6c 6f 67 69 65  eves morphologie
3240: 73 20 6c 69 73 74 20 66 72 6f 6d 20 5f 6f 44 69  s list from _oDi
3250: 63 74 20 2d 3e 20 5f 64 41 6e 61 6c 79 73 65 73  ct -> _dAnalyses
3260: 0a 20 20 20 20 2f 2f 65 63 68 6f 28 22 72 65 67  .    //echo("reg
3270: 69 73 74 65 72 3a 20 22 2b 73 57 6f 72 64 20 2b  ister: "+sWord +
3280: 20 22 20 22 20 2b 20 5f 6f 44 69 63 74 2e 67 65   " " + _oDict.ge
3290: 74 4d 6f 72 70 68 28 73 57 6f 72 64 29 2e 74 6f  tMorph(sWord).to
32a0: 53 74 72 69 6e 67 28 29 29 0a 20 20 20 20 5f 64  String()).    _d
32b0: 41 6e 61 6c 79 73 65 73 2e 73 65 74 28 73 57 6f  Analyses.set(sWo
32c0: 72 64 2c 20 5f 6f 44 69 63 74 2e 67 65 74 4d 6f  rd, _oDict.getMo
32d0: 72 70 68 28 73 57 6f 72 64 29 29 3b 0a 20 20 20  rph(sWord));.   
32e0: 20 72 65 74 75 72 6e 20 21 21 5f 64 41 6e 61 6c   return !!_dAnal
32f0: 79 73 65 73 2e 67 65 74 28 73 57 6f 72 64 29 3b  yses.get(sWord);
3300: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 6d 6f 72  .}..function mor
3310: 70 68 20 28 64 44 41 2c 20 61 57 6f 72 64 2c 20  ph (dDA, aWord, 
3320: 73 50 61 74 74 65 72 6e 2c 20 62 53 74 72 69 63  sPattern, bStric
3330: 74 3d 74 72 75 65 2c 20 62 4e 6f 57 6f 72 64 3d  t=true, bNoWord=
3340: 66 61 6c 73 65 29 20 7b 0a 20 20 20 20 2f 2f 20  false) {.    // 
3350: 61 6e 61 6c 79 73 65 20 61 20 74 75 70 6c 65 20  analyse a tuple 
3360: 28 70 6f 73 69 74 69 6f 6e 2c 20 77 6f 72 64 29  (position, word)
3370: 2c 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66  , return true if
3380: 20 73 50 61 74 74 65 72 6e 20 69 6e 20 6d 6f 72   sPattern in mor
3390: 70 68 6f 6c 6f 67 69 65 73 20 28 64 69 73 61 6d  phologies (disam
33a0: 62 69 67 75 61 74 69 6f 6e 20 6f 6e 29 0a 20 20  biguation on).  
33b0: 20 20 69 66 20 28 21 61 57 6f 72 64 29 20 7b 0a    if (!aWord) {.
33c0: 20 20 20 20 20 20 20 20 2f 2f 65 63 68 6f 28 22          //echo("
33d0: 6d 6f 72 70 68 3a 20 6e 6f 77 6f 72 64 2c 20 72  morph: noword, r
33e0: 65 74 75 72 6e 73 20 22 20 2b 20 62 4e 6f 57 6f  eturns " + bNoWo
33f0: 72 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  rd);.        ret
3400: 75 72 6e 20 62 4e 6f 57 6f 72 64 3b 0a 20 20 20  urn bNoWord;.   
3410: 20 7d 0a 20 20 20 20 2f 2f 65 63 68 6f 28 22 61   }.    //echo("a
3420: 57 6f 72 64 3a 20 22 2b 61 57 6f 72 64 2e 74 6f  Word: "+aWord.to
3430: 53 74 72 69 6e 67 28 29 29 3b 0a 20 20 20 20 69  String());.    i
3440: 66 20 28 21 5f 64 41 6e 61 6c 79 73 65 73 2e 68  f (!_dAnalyses.h
3450: 61 73 28 61 57 6f 72 64 5b 31 5d 29 20 26 26 20  as(aWord[1]) && 
3460: 21 5f 73 74 6f 72 65 4d 6f 72 70 68 46 72 6f 6d  !_storeMorphFrom
3470: 46 53 41 28 61 57 6f 72 64 5b 31 5d 29 29 20 7b  FSA(aWord[1])) {
3480: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3490: 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20  false;.    }.   
34a0: 20 6c 65 74 20 6c 4d 6f 72 70 68 20 3d 20 64 44   let lMorph = dD
34b0: 41 2e 68 61 73 28 61 57 6f 72 64 5b 30 5d 29 20  A.has(aWord[0]) 
34c0: 3f 20 64 44 41 2e 67 65 74 28 61 57 6f 72 64 5b  ? dDA.get(aWord[
34d0: 30 5d 29 20 3a 20 5f 64 41 6e 61 6c 79 73 65 73  0]) : _dAnalyses
34e0: 2e 67 65 74 28 61 57 6f 72 64 5b 31 5d 29 3b 0a  .get(aWord[1]);.
34f0: 20 20 20 20 2f 2f 65 63 68 6f 28 22 6c 4d 6f 72      //echo("lMor
3500: 70 68 3a 20 22 2b 6c 4d 6f 72 70 68 2e 74 6f 53  ph: "+lMorph.toS
3510: 74 72 69 6e 67 28 29 29 3b 0a 20 20 20 20 69 66  tring());.    if
3520: 20 28 6c 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20   (lMorph.length 
3530: 3d 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20  === 0) {.       
3540: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20   return false;. 
3550: 20 20 20 7d 0a 20 20 20 20 2f 2f 65 63 68 6f 28     }.    //echo(
3560: 22 2a 2a 2a 22 29 3b 0a 20 20 20 20 69 66 20 28  "***");.    if (
3570: 62 53 74 72 69 63 74 29 20 7b 0a 20 20 20 20 20  bStrict) {.     
3580: 20 20 20 72 65 74 75 72 6e 20 6c 4d 6f 72 70 68     return lMorph
3590: 2e 65 76 65 72 79 28 73 20 20 3d 3e 20 20 28 73  .every(s  =>  (s
35a0: 2e 73 65 61 72 63 68 28 73 50 61 74 74 65 72 6e  .search(sPattern
35b0: 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 20 20 20 20  ) !== -1));.    
35c0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 4d 6f  }.    return lMo
35d0: 72 70 68 2e 73 6f 6d 65 28 73 20 20 3d 3e 20 20  rph.some(s  =>  
35e0: 28 73 2e 73 65 61 72 63 68 28 73 50 61 74 74 65  (s.search(sPatte
35f0: 72 6e 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 7d 0a  rn) !== -1));.}.
3600: 0a 66 75 6e 63 74 69 6f 6e 20 6d 6f 72 70 68 65  .function morphe
3610: 78 20 28 64 44 41 2c 20 61 57 6f 72 64 2c 20 73  x (dDA, aWord, s
3620: 50 61 74 74 65 72 6e 2c 20 73 4e 65 67 50 61 74  Pattern, sNegPat
3630: 74 65 72 6e 2c 20 62 4e 6f 57 6f 72 64 3d 66 61  tern, bNoWord=fa
3640: 6c 73 65 29 20 7b 0a 20 20 20 20 2f 2f 20 61 6e  lse) {.    // an
3650: 61 6c 79 73 65 20 61 20 74 75 70 6c 65 20 28 70  alyse a tuple (p
3660: 6f 73 69 74 69 6f 6e 2c 20 77 6f 72 64 29 2c 20  osition, word), 
3670: 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
3680: 6e 6f 74 20 73 4e 65 67 50 61 74 74 65 72 6e 20  not sNegPattern 
3690: 69 6e 20 77 6f 72 64 20 6d 6f 72 70 68 6f 6c 6f  in word morpholo
36a0: 67 69 65 73 20 61 6e 64 20 73 50 61 74 74 65 72  gies and sPatter
36b0: 6e 20 69 6e 20 77 6f 72 64 20 6d 6f 72 70 68 6f  n in word morpho
36c0: 6c 6f 67 69 65 73 20 28 64 69 73 61 6d 62 69 67  logies (disambig
36d0: 75 61 74 69 6f 6e 20 6f 6e 29 0a 20 20 20 20 69  uation on).    i
36e0: 66 20 28 21 61 57 6f 72 64 29 20 7b 0a 20 20 20  f (!aWord) {.   
36f0: 20 20 20 20 20 2f 2f 65 63 68 6f 28 22 6d 6f 72       //echo("mor
3700: 70 68 3a 20 6e 6f 77 6f 72 64 2c 20 72 65 74 75  ph: noword, retu
3710: 72 6e 73 20 22 20 2b 20 62 4e 6f 57 6f 72 64 29  rns " + bNoWord)
3720: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3730: 20 62 4e 6f 57 6f 72 64 3b 0a 20 20 20 20 7d 0a   bNoWord;.    }.
3740: 20 20 20 20 2f 2f 65 63 68 6f 28 22 61 57 6f 72      //echo("aWor
3750: 64 3a 20 22 2b 61 57 6f 72 64 2e 74 6f 53 74 72  d: "+aWord.toStr
3760: 69 6e 67 28 29 29 3b 0a 20 20 20 20 69 66 20 28  ing());.    if (
3770: 21 5f 64 41 6e 61 6c 79 73 65 73 2e 68 61 73 28  !_dAnalyses.has(
3780: 61 57 6f 72 64 5b 31 5d 29 20 26 26 20 21 5f 73  aWord[1]) && !_s
3790: 74 6f 72 65 4d 6f 72 70 68 46 72 6f 6d 46 53 41  toreMorphFromFSA
37a0: 28 61 57 6f 72 64 5b 31 5d 29 29 20 7b 0a 20 20  (aWord[1])) {.  
37b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
37c0: 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  se;.    }.    le
37d0: 74 20 6c 4d 6f 72 70 68 20 3d 20 64 44 41 2e 68  t lMorph = dDA.h
37e0: 61 73 28 61 57 6f 72 64 5b 30 5d 29 20 3f 20 64  as(aWord[0]) ? d
37f0: 44 41 2e 67 65 74 28 61 57 6f 72 64 5b 30 5d 29  DA.get(aWord[0])
3800: 20 3a 20 5f 64 41 6e 61 6c 79 73 65 73 2e 67 65   : _dAnalyses.ge
3810: 74 28 61 57 6f 72 64 5b 31 5d 29 3b 0a 20 20 20  t(aWord[1]);.   
3820: 20 2f 2f 65 63 68 6f 28 22 6c 4d 6f 72 70 68 3a   //echo("lMorph:
3830: 20 22 2b 6c 4d 6f 72 70 68 2e 74 6f 53 74 72 69   "+lMorph.toStri
3840: 6e 67 28 29 29 3b 0a 20 20 20 20 69 66 20 28 6c  ng());.    if (l
3850: 4d 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 3d  Morph.length ===
3860: 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65   0) {.        re
3870: 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20  turn false;.    
3880: 7d 0a 20 20 20 20 2f 2f 65 63 68 6f 28 22 2a 2a  }.    //echo("**
3890: 2a 22 29 3b 0a 20 20 20 20 2f 2f 20 63 68 65 63  *");.    // chec
38a0: 6b 20 6e 65 67 61 74 69 76 65 20 63 6f 6e 64 69  k negative condi
38b0: 74 69 6f 6e 0a 20 20 20 20 69 66 20 28 6c 4d 6f  tion.    if (lMo
38c0: 72 70 68 2e 73 6f 6d 65 28 73 20 20 3d 3e 20 20  rph.some(s  =>  
38d0: 28 73 2e 73 65 61 72 63 68 28 73 4e 65 67 50 61  (s.search(sNegPa
38e0: 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29 29  ttern) !== -1)))
38f0: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
3900: 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20  n false;.    }. 
3910: 20 20 20 2f 2f 20 73 65 61 72 63 68 20 73 50 61     // search sPa
3920: 74 74 65 72 6e 0a 20 20 20 20 72 65 74 75 72 6e  ttern.    return
3930: 20 6c 4d 6f 72 70 68 2e 73 6f 6d 65 28 73 20 20   lMorph.some(s  
3940: 3d 3e 20 20 28 73 2e 73 65 61 72 63 68 28 73 50  =>  (s.search(sP
3950: 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31 29 29  attern) !== -1))
3960: 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 61 6e  ;.}..function an
3970: 61 6c 79 73 65 20 28 73 57 6f 72 64 2c 20 73 50  alyse (sWord, sP
3980: 61 74 74 65 72 6e 2c 20 62 53 74 72 69 63 74 3d  attern, bStrict=
3990: 74 72 75 65 29 20 7b 0a 20 20 20 20 2f 2f 20 61  true) {.    // a
39a0: 6e 61 6c 79 73 65 20 61 20 77 6f 72 64 2c 20 72  nalyse a word, r
39b0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 73 50  eturn true if sP
39c0: 61 74 74 65 72 6e 20 69 6e 20 6d 6f 72 70 68 6f  attern in morpho
39d0: 6c 6f 67 69 65 73 20 28 64 69 73 61 6d 62 69 67  logies (disambig
39e0: 75 61 74 69 6f 6e 20 6f 66 66 29 0a 20 20 20 20  uation off).    
39f0: 69 66 20 28 21 5f 64 41 6e 61 6c 79 73 65 73 2e  if (!_dAnalyses.
3a00: 68 61 73 28 73 57 6f 72 64 29 20 26 26 20 21 5f  has(sWord) && !_
3a10: 73 74 6f 72 65 4d 6f 72 70 68 46 72 6f 6d 46 53  storeMorphFromFS
3a20: 41 28 73 57 6f 72 64 29 29 20 7b 0a 20 20 20 20  A(sWord)) {.    
3a30: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
3a40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
3a50: 62 53 74 72 69 63 74 29 20 7b 0a 20 20 20 20 20  bStrict) {.     
3a60: 20 20 20 72 65 74 75 72 6e 20 5f 64 41 6e 61 6c     return _dAnal
3a70: 79 73 65 73 2e 67 65 74 28 73 57 6f 72 64 29 2e  yses.get(sWord).
3a80: 65 76 65 72 79 28 73 20 20 3d 3e 20 20 28 73 2e  every(s  =>  (s.
3a90: 73 65 61 72 63 68 28 73 50 61 74 74 65 72 6e 29  search(sPattern)
3aa0: 20 21 3d 3d 20 2d 31 29 29 3b 0a 20 20 20 20 7d   !== -1));.    }
3ab0: 0a 20 20 20 20 72 65 74 75 72 6e 20 5f 64 41 6e  .    return _dAn
3ac0: 61 6c 79 73 65 73 2e 67 65 74 28 73 57 6f 72 64  alyses.get(sWord
3ad0: 29 2e 73 6f 6d 65 28 73 20 20 3d 3e 20 20 28 73  ).some(s  =>  (s
3ae0: 2e 73 65 61 72 63 68 28 73 50 61 74 74 65 72 6e  .search(sPattern
3af0: 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 7d 0a 0a 66  ) !== -1));.}..f
3b00: 75 6e 63 74 69 6f 6e 20 61 6e 61 6c 79 73 65 78  unction analysex
3b10: 20 28 73 57 6f 72 64 2c 20 73 50 61 74 74 65 72   (sWord, sPatter
3b20: 6e 2c 20 73 4e 65 67 50 61 74 74 65 72 6e 29 20  n, sNegPattern) 
3b30: 7b 0a 20 20 20 20 2f 2f 20 61 6e 61 6c 79 73 65  {.    // analyse
3b40: 20 61 20 77 6f 72 64 2c 20 72 65 74 75 72 6e 73   a word, returns
3b50: 20 54 72 75 65 20 69 66 20 6e 6f 74 20 73 4e 65   True if not sNe
3b60: 67 50 61 74 74 65 72 6e 20 69 6e 20 77 6f 72 64  gPattern in word
3b70: 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20 61 6e   morphologies an
3b80: 64 20 73 50 61 74 74 65 72 6e 20 69 6e 20 77 6f  d sPattern in wo
3b90: 72 64 20 6d 6f 72 70 68 6f 6c 6f 67 69 65 73 20  rd morphologies 
3ba0: 28 64 69 73 61 6d 62 69 67 75 61 74 69 6f 6e 20  (disambiguation 
3bb0: 6f 66 66 29 0a 20 20 20 20 69 66 20 28 21 5f 64  off).    if (!_d
3bc0: 41 6e 61 6c 79 73 65 73 2e 68 61 73 28 73 57 6f  Analyses.has(sWo
3bd0: 72 64 29 20 26 26 20 21 5f 73 74 6f 72 65 4d 6f  rd) && !_storeMo
3be0: 72 70 68 46 72 6f 6d 46 53 41 28 73 57 6f 72 64  rphFromFSA(sWord
3bf0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  )) {.        ret
3c00: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d  urn false;.    }
3c10: 0a 20 20 20 20 2f 2f 20 63 68 65 63 6b 20 6e 65  .    // check ne
3c20: 67 61 74 69 76 65 20 63 6f 6e 64 69 74 69 6f 6e  gative condition
3c30: 0a 20 20 20 20 69 66 20 28 5f 64 41 6e 61 6c 79  .    if (_dAnaly
3c40: 73 65 73 2e 67 65 74 28 73 57 6f 72 64 29 2e 73  ses.get(sWord).s
3c50: 6f 6d 65 28 73 20 20 3d 3e 20 20 28 73 2e 73 65  ome(s  =>  (s.se
3c60: 61 72 63 68 28 73 4e 65 67 50 61 74 74 65 72 6e  arch(sNegPattern
3c70: 29 20 21 3d 3d 20 2d 31 29 29 29 20 7b 0a 20 20  ) !== -1))) {.  
3c80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
3c90: 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2f  se;.    }.    //
3ca0: 20 73 65 61 72 63 68 20 73 50 61 74 74 65 72 6e   search sPattern
3cb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 5f 64 41 6e  .    return _dAn
3cc0: 61 6c 79 73 65 73 2e 67 65 74 28 73 57 6f 72 64  alyses.get(sWord
3cd0: 29 2e 73 6f 6d 65 28 73 20 20 3d 3e 20 20 28 73  ).some(s  =>  (s
3ce0: 2e 73 65 61 72 63 68 28 73 50 61 74 74 65 72 6e  .search(sPattern
3cf0: 29 20 21 3d 3d 20 2d 31 29 29 3b 0a 7d 0a 0a 66  ) !== -1));.}..f
3d00: 75 6e 63 74 69 6f 6e 20 73 74 65 6d 20 28 73 57  unction stem (sW
3d10: 6f 72 64 29 20 7b 0a 20 20 20 20 2f 2f 20 72 65  ord) {.    // re
3d20: 74 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20  turns a list of 
3d30: 73 57 6f 72 64 27 73 20 73 74 65 6d 73 0a 20 20  sWord's stems.  
3d40: 20 20 69 66 20 28 21 73 57 6f 72 64 29 20 7b 0a    if (!sWord) {.
3d50: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
3d60: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  ];.    }.    if 
3d70: 28 21 5f 64 41 6e 61 6c 79 73 65 73 2e 68 61 73  (!_dAnalyses.has
3d80: 28 73 57 6f 72 64 29 20 26 26 20 21 5f 73 74 6f  (sWord) && !_sto
3d90: 72 65 4d 6f 72 70 68 46 72 6f 6d 46 53 41 28 73  reMorphFromFSA(s
3da0: 57 6f 72 64 29 29 20 7b 0a 20 20 20 20 20 20 20  Word)) {.       
3db0: 20 72 65 74 75 72 6e 20 5b 5d 3b 0a 20 20 20 20   return [];.    
3dc0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 20 66  }.    return [ f
3dd0: 6f 72 20 28 73 20 6f 66 20 5f 64 41 6e 61 6c 79  or (s of _dAnaly
3de0: 73 65 73 2e 67 65 74 28 73 57 6f 72 64 29 29 20  ses.get(sWord)) 
3df0: 20 73 2e 73 6c 69 63 65 28 31 2c 20 73 2e 69 6e   s.slice(1, s.in
3e00: 64 65 78 4f 66 28 22 20 22 29 29 20 5d 3b 0a 7d  dexOf(" ")) ];.}
3e10: 0a 0a 0a 2f 2f 2f 2f 20 66 75 6e 63 74 69 6f 6e  ...//// function
3e20: 73 20 74 6f 20 67 65 74 20 74 65 78 74 20 6f 75  s to get text ou
3e30: 74 73 69 64 65 20 70 61 74 74 65 72 6e 20 73 63  tside pattern sc
3e40: 6f 70 65 0a 0a 2f 2f 20 77 61 72 6e 69 6e 67 3a  ope..// warning:
3e50: 20 63 68 65 63 6b 20 63 6f 6d 70 69 6c 65 5f 72   check compile_r
3e60: 75 6c 65 73 2e 70 79 20 74 6f 20 75 6e 64 65 72  ules.py to under
3e70: 73 74 61 6e 64 20 68 6f 77 20 69 74 20 77 6f 72  stand how it wor
3e80: 6b 73 0a 0a 66 75 6e 63 74 69 6f 6e 20 6e 65 78  ks..function nex
3e90: 74 77 6f 72 64 20 28 73 2c 20 69 53 74 61 72 74  tword (s, iStart
3ea0: 2c 20 6e 29 20 7b 0a 20 20 20 20 2f 2f 20 67 65  , n) {.    // ge
3eb0: 74 20 74 68 65 20 6e 74 68 20 77 6f 72 64 20 6f  t the nth word o
3ec0: 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  f the input stri
3ed0: 6e 67 20 6f 72 20 65 6d 70 74 79 20 73 74 72 69  ng or empty stri
3ee0: 6e 67 0a 20 20 20 20 6c 65 74 20 7a 20 3d 20 6e  ng.    let z = n
3ef0: 65 77 20 52 65 67 45 78 70 28 22 5e 28 20 2b 5b  ew RegExp("^( +[
3f00: 61 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf  a-z..-..A-Z..-..
3f10: c3 80 2d c3 96 30 2d 39 c3 98 2d c3 9f c4 80 2d  ..-..0-9..-....-
3f20: ca af ef ac 81 2d ef ac 86 25 5f 2d 5d 2b 29 7b  .....-...%_-]+){
3f30: 22 20 2b 20 28 6e 2d 31 29 2e 74 6f 53 74 72 69  " + (n-1).toStri
3f40: 6e 67 28 29 20 2b 20 22 7d 20 2b 28 5b 61 2d 7a  ng() + "} +([a-z
3f50: c3 a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d  ..-..A-Z..-....-
3f60: c3 96 30 2d 39 c3 98 2d c3 9f c4 80 2d ca af ef  ..0-9..-....-...
3f70: ac 81 2d ef ac 86 25 5f 2d 5d 2b 29 22 2c 20 22  ..-...%_-]+)", "
3f80: 69 22 29 3b 0a 20 20 20 20 6c 65 74 20 6d 20 3d  i");.    let m =
3f90: 20 7a 2e 65 78 65 63 28 73 2e 73 6c 69 63 65 28   z.exec(s.slice(
3fa0: 69 53 74 61 72 74 29 29 3b 0a 20 20 20 20 69 66  iStart));.    if
3fb0: 20 28 21 6d 29 20 7b 0a 20 20 20 20 20 20 20 20   (!m) {.        
3fc0: 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20  return null;.   
3fd0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 69   }.    return [i
3fe0: 53 74 61 72 74 20 2b 20 52 65 67 45 78 70 2e 6c  Start + RegExp.l
3ff0: 61 73 74 49 6e 64 65 78 20 2d 20 6d 5b 32 5d 2e  astIndex - m[2].
4000: 6c 65 6e 67 74 68 2c 20 6d 5b 32 5d 5d 3b 0a 7d  length, m[2]];.}
4010: 0a 0a 66 75 6e 63 74 69 6f 6e 20 70 72 65 76 77  ..function prevw
4020: 6f 72 64 20 28 73 2c 20 69 45 6e 64 2c 20 6e 29  ord (s, iEnd, n)
4030: 20 7b 0a 20 20 20 20 2f 2f 20 67 65 74 20 74 68   {.    // get th
4040: 65 20 28 2d 29 6e 74 68 20 77 6f 72 64 20 6f 66  e (-)nth word of
4050: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
4060: 67 20 6f 72 20 65 6d 70 74 79 20 73 74 72 69 6e  g or empty strin
4070: 67 0a 20 20 20 20 6c 65 74 20 7a 20 3d 20 6e 65  g.    let z = ne
4080: 77 20 52 65 67 45 78 70 28 22 28 5b 61 2d 7a c3  w RegExp("([a-z.
4090: a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3  .-..A-Z..-....-.
40a0: 96 30 2d 39 c3 98 2d c3 9f c4 80 2d ca af ef ac  .0-9..-....-....
40b0: 81 2d ef ac 86 25 5f 2d 5d 2b 29 20 2b 28 5b 61  .-...%_-]+) +([a
40c0: 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf c3  -z..-..A-Z..-...
40d0: 80 2d c3 96 30 2d 39 c3 98 2d c3 9f c4 80 2d ca  .-..0-9..-....-.
40e0: af ef ac 81 2d ef ac 86 25 5f 2d 5d 2b 20 2b 29  ....-...%_-]+ +)
40f0: 7b 22 20 2b 20 28 6e 2d 31 29 2e 74 6f 53 74 72  {" + (n-1).toStr
4100: 69 6e 67 28 29 20 2b 20 22 7d 24 22 2c 20 22 69  ing() + "}$", "i
4110: 22 29 3b 0a 20 20 20 20 6c 65 74 20 6d 20 3d 20  ");.    let m = 
4120: 7a 2e 65 78 65 63 28 73 2e 73 6c 69 63 65 28 30  z.exec(s.slice(0
4130: 2c 20 69 45 6e 64 29 29 3b 0a 20 20 20 20 69 66  , iEnd));.    if
4140: 20 28 21 6d 29 20 7b 0a 20 20 20 20 20 20 20 20   (!m) {.        
4150: 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20  return null;.   
4160: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 6d   }.    return [m
4170: 2e 69 6e 64 65 78 2c 20 6d 5b 31 5d 5d 3b 0a 7d  .index, m[1]];.}
4180: 0a 0a 63 6f 6e 73 74 20 5f 7a 4e 65 78 74 57 6f  ..const _zNextWo
4190: 72 64 20 3d 20 6e 65 77 20 52 65 67 45 78 70 20  rd = new RegExp 
41a0: 28 22 5e 20 2b 28 5b 61 2d 7a c3 a0 2d c3 b6 41  ("^ +([a-z..-..A
41b0: 2d 5a c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39 c3  -Z..-....-..0-9.
41c0: 98 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac 86  .-....-.....-...
41d0: 5f 5d 5b 61 2d 7a c3 a0 2d c3 b6 41 2d 5a c3 b8  _][a-z..-..A-Z..
41e0: 2d c3 bf c3 80 2d c3 96 30 2d 39 c3 98 2d c3 9f  -....-..0-9..-..
41f0: c4 80 2d ca af ef ac 81 2d ef ac 86 5f 2d 5d 2a  ..-.....-..._-]*
4200: 29 22 2c 20 22 69 22 29 3b 0a 63 6f 6e 73 74 20  )", "i");.const 
4210: 5f 7a 50 72 65 76 57 6f 72 64 20 3d 20 6e 65 77  _zPrevWord = new
4220: 20 52 65 67 45 78 70 20 28 22 28 5b 61 2d 7a c3   RegExp ("([a-z.
4230: a0 2d c3 b6 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3  .-..A-Z..-....-.
4240: 96 30 2d 39 c3 98 2d c3 9f c4 80 2d ca af ef ac  .0-9..-....-....
4250: 81 2d ef ac 86 5f 5d 5b 61 2d 7a c3 a0 2d c3 b6  .-..._][a-z..-..
4260: 41 2d 5a c3 b8 2d c3 bf c3 80 2d c3 96 30 2d 39  A-Z..-....-..0-9
4270: c3 98 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac  ..-....-.....-..
4280: 86 5f 2d 5d 2a 29 20 2b 24 22 2c 20 22 69 22 29  ._-]*) +$", "i")
4290: 3b 0a 0a 66 75 6e 63 74 69 6f 6e 20 6e 65 78 74  ;..function next
42a0: 77 6f 72 64 31 20 28 73 2c 20 69 53 74 61 72 74  word1 (s, iStart
42b0: 29 20 7b 0a 20 20 20 20 2f 2f 20 67 65 74 20 6e  ) {.    // get n
42c0: 65 78 74 20 77 6f 72 64 20 28 6f 70 74 69 6d 69  ext word (optimi
42d0: 7a 61 74 69 6f 6e 29 0a 20 20 20 20 6c 65 74 20  zation).    let 
42e0: 6d 20 3d 20 5f 7a 4e 65 78 74 57 6f 72 64 2e 65  m = _zNextWord.e
42f0: 78 65 63 28 73 2e 73 6c 69 63 65 28 69 53 74 61  xec(s.slice(iSta
4300: 72 74 29 29 3b 0a 20 20 20 20 69 66 20 28 21 6d  rt));.    if (!m
4310: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
4320: 72 6e 20 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20  rn null;.    }. 
4330: 20 20 20 72 65 74 75 72 6e 20 5b 69 53 74 61 72     return [iStar
4340: 74 20 2b 20 52 65 67 45 78 70 2e 6c 61 73 74 49  t + RegExp.lastI
4350: 6e 64 65 78 20 2d 20 6d 5b 31 5d 2e 6c 65 6e 67  ndex - m[1].leng
4360: 74 68 2c 20 6d 5b 31 5d 5d 3b 0a 7d 0a 0a 66 75  th, m[1]];.}..fu
4370: 6e 63 74 69 6f 6e 20 70 72 65 76 77 6f 72 64 31  nction prevword1
4380: 20 28 73 2c 20 69 45 6e 64 29 20 7b 0a 20 20 20   (s, iEnd) {.   
4390: 20 2f 2f 20 67 65 74 20 70 72 65 76 69 6f 75 73   // get previous
43a0: 20 77 6f 72 64 20 28 6f 70 74 69 6d 69 7a 61 74   word (optimizat
43b0: 69 6f 6e 29 0a 20 20 20 20 2f 2f 65 63 68 6f 28  ion).    //echo(
43c0: 22 70 72 65 76 31 2c 20 73 3a 22 2b 73 29 3b 0a  "prev1, s:"+s);.
43d0: 20 20 20 20 2f 2f 65 63 68 6f 28 22 70 72 65 76      //echo("prev
43e0: 31 2c 20 73 2e 73 6c 69 63 65 28 30 2c 20 69 45  1, s.slice(0, iE
43f0: 6e 64 29 3a 22 2b 73 2e 73 6c 69 63 65 28 30 2c  nd):"+s.slice(0,
4400: 20 69 45 6e 64 29 29 3b 0a 20 20 20 20 6c 65 74   iEnd));.    let
4410: 20 6d 20 3d 20 5f 7a 50 72 65 76 57 6f 72 64 2e   m = _zPrevWord.
4420: 65 78 65 63 28 73 2e 73 6c 69 63 65 28 30 2c 20  exec(s.slice(0, 
4430: 69 45 6e 64 29 29 3b 0a 20 20 20 20 2f 2f 65 63  iEnd));.    //ec
4440: 68 6f 28 22 70 72 65 76 31 2c 20 6d 3a 22 2b 6d  ho("prev1, m:"+m
4450: 29 3b 0a 20 20 20 20 69 66 20 28 21 6d 29 20 7b  );.    if (!m) {
4460: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4470: 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  null;.    }.    
4480: 2f 2f 65 63 68 6f 28 22 70 72 65 76 31 3a 20 22  //echo("prev1: "
4490: 20 2b 20 6d 2e 69 6e 64 65 78 20 2b 20 22 20 22   + m.index + " "
44a0: 20 2b 20 6d 5b 31 5d 29 3b 0a 20 20 20 20 72 65   + m[1]);.    re
44b0: 74 75 72 6e 20 5b 6d 2e 69 6e 64 65 78 2c 20 6d  turn [m.index, m
44c0: 5b 31 5d 5d 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f  [1]];.}..functio
44d0: 6e 20 6c 6f 6f 6b 20 28 73 2c 20 7a 50 61 74 74  n look (s, zPatt
44e0: 65 72 6e 2c 20 7a 4e 65 67 50 61 74 74 65 72 6e  ern, zNegPattern
44f0: 3d 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 2f 2f 20  =null) {.    // 
4500: 73 65 65 6b 20 7a 50 61 74 74 65 72 6e 20 69 6e  seek zPattern in
4510: 20 73 20 28 62 65 66 6f 72 65 2f 61 66 74 65 72   s (before/after
4520: 2f 66 75 6c 6c 74 65 78 74 29 2c 20 69 66 20 61  /fulltext), if a
4530: 6e 74 69 70 61 74 74 65 72 6e 20 7a 4e 65 67 50  ntipattern zNegP
4540: 61 74 74 65 72 6e 20 6e 6f 74 20 69 6e 20 73 0a  attern not in s.
4550: 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20      try {.      
4560: 20 20 69 66 20 28 7a 4e 65 67 50 61 74 74 65 72    if (zNegPatter
4570: 6e 20 26 26 20 7a 4e 65 67 50 61 74 74 65 72 6e  n && zNegPattern
4580: 2e 74 65 73 74 28 73 29 29 20 7b 0a 20 20 20 20  .test(s)) {.    
4590: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
45a0: 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  alse;.        }.
45b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 7a          return z
45c0: 50 61 74 74 65 72 6e 2e 74 65 73 74 28 73 29 3b  Pattern.test(s);
45d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 74 63 68  .    }.    catch
45e0: 20 28 65 29 20 7b 0a 20 20 20 20 20 20 20 20 68   (e) {.        h
45f0: 65 6c 70 65 72 73 2e 6c 6f 67 65 72 72 6f 72 28  elpers.logerror(
4600: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  e);.    }.    re
4610: 74 75 72 6e 20 66 61 6c 73 65 3b 0a 7d 0a 0a 66  turn false;.}..f
4620: 75 6e 63 74 69 6f 6e 20 6c 6f 6f 6b 5f 63 68 6b  unction look_chk
4630: 31 20 28 64 44 41 2c 20 73 2c 20 6e 4f 66 66 73  1 (dDA, s, nOffs
4640: 65 74 2c 20 7a 50 61 74 74 65 72 6e 2c 20 73 50  et, zPattern, sP
4650: 61 74 74 65 72 6e 47 72 6f 75 70 31 2c 20 73 4e  atternGroup1, sN
4660: 65 67 50 61 74 74 65 72 6e 47 72 6f 75 70 31 3d  egPatternGroup1=
4670: 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 2f 2f 20 72  null) {.    // r
4680: 65 74 75 72 6e 73 20 54 72 75 65 20 69 66 20 73  eturns True if s
4690: 20 68 61 73 20 70 61 74 74 65 72 6e 20 7a 50 61   has pattern zPa
46a0: 74 74 65 72 6e 20 61 6e 64 20 6d 2e 67 72 6f 75  ttern and m.grou
46b0: 70 28 31 29 20 68 61 73 20 70 61 74 74 65 72 6e  p(1) has pattern
46c0: 20 73 50 61 74 74 65 72 6e 47 72 6f 75 70 31 0a   sPatternGroup1.
46d0: 20 20 20 20 6c 65 74 20 6d 20 3d 20 7a 50 61 74      let m = zPat
46e0: 74 65 72 6e 2e 5f 65 78 65 63 32 28 73 2c 20 6e  tern._exec2(s, n
46f0: 75 6c 6c 29 3b 0a 20 20 20 20 69 66 20 28 21 6d  ull);.    if (!m
4700: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
4710: 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a  rn false;.    }.
4720: 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20      try {.      
4730: 20 20 6c 65 74 20 73 57 6f 72 64 20 3d 20 6d 5b    let sWord = m[
4740: 31 5d 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  1];.        let 
4750: 6e 50 6f 73 20 3d 20 6d 2e 73 74 61 72 74 5b 31  nPos = m.start[1
4760: 5d 20 2b 20 6e 4f 66 66 73 65 74 3b 0a 20 20 20  ] + nOffset;.   
4770: 20 20 20 20 20 69 66 20 28 73 4e 65 67 50 61 74       if (sNegPat
4780: 74 65 72 6e 47 72 6f 75 70 31 29 20 7b 0a 20 20  ternGroup1) {.  
4790: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
47a0: 20 6d 6f 72 70 68 65 78 28 64 44 41 2c 20 5b 6e   morphex(dDA, [n
47b0: 50 6f 73 2c 20 73 57 6f 72 64 5d 2c 20 73 50 61  Pos, sWord], sPa
47c0: 74 74 65 72 6e 47 72 6f 75 70 31 2c 20 73 4e 65  tternGroup1, sNe
47d0: 67 50 61 74 74 65 72 6e 47 72 6f 75 70 31 29 3b  gPatternGroup1);
47e0: 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
47f0: 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 72 70 68      return morph
4800: 28 64 44 41 2c 20 5b 6e 50 6f 73 2c 20 73 57 6f  (dDA, [nPos, sWo
4810: 72 64 5d 2c 20 73 50 61 74 74 65 72 6e 47 72 6f  rd], sPatternGro
4820: 75 70 31 2c 20 66 61 6c 73 65 29 3b 0a 20 20 20  up1, false);.   
4830: 20 7d 0a 20 20 20 20 63 61 74 63 68 20 28 65 29   }.    catch (e)
4840: 20 7b 0a 20 20 20 20 20 20 20 20 68 65 6c 70 65   {.        helpe
4850: 72 73 2e 6c 6f 67 65 72 72 6f 72 28 65 29 3b 0a  rs.logerror(e);.
4860: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
4870: 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 0a  alse;.    }.}...
4880: 2f 2f 2f 2f 2f 2f 2f 2f 20 44 69 73 61 6d 62 69  //////// Disambi
4890: 67 75 61 74 6f 72 0a 0a 66 75 6e 63 74 69 6f 6e  guator..function
48a0: 20 73 65 6c 65 63 74 20 28 64 44 41 2c 20 6e 50   select (dDA, nP
48b0: 6f 73 2c 20 73 57 6f 72 64 2c 20 73 50 61 74 74  os, sWord, sPatt
48c0: 65 72 6e 2c 20 6c 44 65 66 61 75 6c 74 3d 6e 75  ern, lDefault=nu
48d0: 6c 6c 29 20 7b 0a 20 20 20 20 69 66 20 28 21 73  ll) {.    if (!s
48e0: 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20 20  Word) {.        
48f0: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20  return true;.   
4900: 20 7d 0a 20 20 20 20 69 66 20 28 64 44 41 2e 68   }.    if (dDA.h
4910: 61 73 28 6e 50 6f 73 29 29 20 7b 0a 20 20 20 20  as(nPos)) {.    
4920: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b      return true;
4930: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
4940: 5f 64 41 6e 61 6c 79 73 65 73 2e 68 61 73 28 73  _dAnalyses.has(s
4950: 57 6f 72 64 29 20 26 26 20 21 5f 73 74 6f 72 65  Word) && !_store
4960: 4d 6f 72 70 68 46 72 6f 6d 46 53 41 28 73 57 6f  MorphFromFSA(sWo
4970: 72 64 29 29 20 7b 0a 20 20 20 20 20 20 20 20 72  rd)) {.        r
4980: 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20  eturn true;.    
4990: 7d 0a 20 20 20 20 2f 2f 65 63 68 6f 28 22 6d 6f  }.    //echo("mo
49a0: 72 70 68 3a 20 22 2b 5f 64 41 6e 61 6c 79 73 65  rph: "+_dAnalyse
49b0: 73 2e 67 65 74 28 73 57 6f 72 64 29 2e 74 6f 53  s.get(sWord).toS
49c0: 74 72 69 6e 67 28 29 29 3b 0a 20 20 20 20 69 66  tring());.    if
49d0: 20 28 5f 64 41 6e 61 6c 79 73 65 73 2e 67 65 74   (_dAnalyses.get
49e0: 28 73 57 6f 72 64 29 2e 6c 65 6e 67 74 68 20 3d  (sWord).length =
49f0: 3d 3d 20 31 29 20 7b 0a 20 20 20 20 20 20 20 20  == 1) {.        
4a00: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20  return true;.   
4a10: 20 7d 0a 20 20 20 20 6c 65 74 20 6c 53 65 6c 65   }.    let lSele
4a20: 63 74 20 3d 20 5b 20 66 6f 72 20 28 73 4d 6f 72  ct = [ for (sMor
4a30: 70 68 20 6f 66 20 5f 64 41 6e 61 6c 79 73 65 73  ph of _dAnalyses
4a40: 2e 67 65 74 28 73 57 6f 72 64 29 29 20 20 69 66  .get(sWord))  if
4a50: 20 28 73 4d 6f 72 70 68 2e 73 65 61 72 63 68 28   (sMorph.search(
4a60: 73 50 61 74 74 65 72 6e 29 20 21 3d 3d 20 2d 31  sPattern) !== -1
4a70: 29 20 20 73 4d 6f 72 70 68 20 5d 3b 0a 20 20 20  )  sMorph ];.   
4a80: 20 2f 2f 65 63 68 6f 28 22 6c 53 65 6c 65 63 74   //echo("lSelect
4a90: 3a 20 22 2b 6c 53 65 6c 65 63 74 2e 74 6f 53 74  : "+lSelect.toSt
4aa0: 72 69 6e 67 28 29 29 3b 0a 20 20 20 20 69 66 20  ring());.    if 
4ab0: 28 6c 53 65 6c 65 63 74 2e 6c 65 6e 67 74 68 20  (lSelect.length 
4ac0: 3e 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 69  > 0) {.        i
4ad0: 66 20 28 6c 53 65 6c 65 63 74 2e 6c 65 6e 67 74  f (lSelect.lengt
4ae0: 68 20 21 3d 20 5f 64 41 6e 61 6c 79 73 65 73 2e  h != _dAnalyses.
4af0: 67 65 74 28 73 57 6f 72 64 29 2e 6c 65 6e 67 74  get(sWord).lengt
4b00: 68 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  h) {.           
4b10: 20 64 44 41 2e 73 65 74 28 6e 50 6f 73 2c 20 6c   dDA.set(nPos, l
4b20: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
4b30: 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66   }.    } else if
4b40: 20 28 6c 44 65 66 61 75 6c 74 29 20 7b 0a 20 20   (lDefault) {.  
4b50: 20 20 20 20 20 20 64 44 41 2e 73 65 74 28 6e 50        dDA.set(nP
4b60: 6f 73 2c 20 6c 44 65 66 61 75 6c 29 3b 0a 20 20  os, lDefaul);.  
4b70: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 74    }.    return t
4b80: 72 75 65 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e  rue;.}..function
4b90: 20 65 78 63 6c 75 64 65 20 28 64 44 41 2c 20 6e   exclude (dDA, n
4ba0: 50 6f 73 2c 20 73 57 6f 72 64 2c 20 73 50 61 74  Pos, sWord, sPat
4bb0: 74 65 72 6e 2c 20 6c 44 65 66 61 75 6c 74 3d 6e  tern, lDefault=n
4bc0: 75 6c 6c 29 20 7b 0a 20 20 20 20 69 66 20 28 21  ull) {.    if (!
4bd0: 73 57 6f 72 64 29 20 7b 0a 20 20 20 20 20 20 20  sWord) {.       
4be0: 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20   return true;.  
4bf0: 20 20 7d 0a 20 20 20 20 69 66 20 28 64 44 41 2e    }.    if (dDA.
4c00: 68 61 73 28 6e 50 6f 73 29 29 20 7b 0a 20 20 20  has(nPos)) {.   
4c10: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
4c20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
4c30: 21 5f 64 41 6e 61 6c 79 73 65 73 2e 68 61 73 28  !_dAnalyses.has(
4c40: 73 57 6f 72 64 29 20 26 26 20 21 5f 73 74 6f 72  sWord) && !_stor
4c50: 65 4d 6f 72 70 68 46 72 6f 6d 46 53 41 28 73 57  eMorphFromFSA(sW
4c60: 6f 72 64 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ord)) {.        
4c70: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20  return true;.   
4c80: 20 7d 0a 20 20 20 20 69 66 20 28 5f 64 41 6e 61   }.    if (_dAna
4c90: 6c 79 73 65 73 2e 67 65 74 28 73 57 6f 72 64 29  lyses.get(sWord)
4ca0: 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20 31 29 20 7b  .length === 1) {
4cb0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4cc0: 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  true;.    }.    
4cd0: 6c 65 74 20 6c 53 65 6c 65 63 74 20 3d 20 5b 20  let lSelect = [ 
4ce0: 66 6f 72 20 28 73 4d 6f 72 70 68 20 6f 66 20 5f  for (sMorph of _
4cf0: 64 41 6e 61 6c 79 73 65 73 2e 67 65 74 28 73 57  dAnalyses.get(sW
4d00: 6f 72 64 29 29 20 20 69 66 20 28 73 4d 6f 72 70  ord))  if (sMorp
4d10: 68 2e 73 65 61 72 63 68 28 73 50 61 74 74 65 72  h.search(sPatter
4d20: 6e 29 20 3d 3d 3d 20 2d 31 29 20 20 73 4d 6f 72  n) === -1)  sMor
4d30: 70 68 20 5d 3b 0a 20 20 20 20 2f 2f 65 63 68 6f  ph ];.    //echo
4d40: 28 22 6c 53 65 6c 65 63 74 3a 20 22 2b 6c 53 65  ("lSelect: "+lSe
4d50: 6c 65 63 74 2e 74 6f 53 74 72 69 6e 67 28 29 29  lect.toString())
4d60: 3b 0a 20 20 20 20 69 66 20 28 6c 53 65 6c 65 63  ;.    if (lSelec
4d70: 74 2e 6c 65 6e 67 74 68 20 3e 20 30 29 20 7b 0a  t.length > 0) {.
4d80: 20 20 20 20 20 20 20 20 69 66 20 28 6c 53 65 6c          if (lSel
4d90: 65 63 74 2e 6c 65 6e 67 74 68 20 21 3d 20 5f 64  ect.length != _d
4da0: 41 6e 61 6c 79 73 65 73 2e 67 65 74 28 73 57 6f  Analyses.get(sWo
4db0: 72 64 29 2e 6c 65 6e 67 74 68 29 20 7b 0a 20 20  rd).length) {.  
4dc0: 20 20 20 20 20 20 20 20 20 20 64 44 41 2e 73 65            dDA.se
4dd0: 74 28 6e 50 6f 73 2c 20 6c 53 65 6c 65 63 74 29  t(nPos, lSelect)
4de0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4df0: 7d 20 65 6c 73 65 20 69 66 20 28 6c 44 65 66 61  } else if (lDefa
4e00: 75 6c 74 29 20 7b 0a 20 20 20 20 20 20 20 20 64  ult) {.        d
4e10: 44 41 2e 73 65 74 28 6e 50 6f 73 2c 20 6c 44 65  DA.set(nPos, lDe
4e20: 66 61 75 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20  fault);.    }.  
4e30: 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 7d    return true;.}
4e40: 0a 0a 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  ..function defin
4e50: 65 20 28 64 44 41 2c 20 6e 50 6f 73 2c 20 6c 4d  e (dDA, nPos, lM
4e60: 6f 72 70 68 29 20 7b 0a 20 20 20 20 64 44 41 2e  orph) {.    dDA.
4e70: 73 65 74 28 6e 50 6f 73 2c 20 6c 4d 6f 72 70 68  set(nPos, lMorph
4e80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72  );.    return tr
4e90: 75 65 3b 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 20  ue;.}..//////// 
4ea0: 47 52 41 4d 4d 41 52 20 43 48 45 43 4b 45 52 20  GRAMMAR CHECKER 
4eb0: 50 4c 55 47 49 4e 53 0a 0a 24 7b 70 6c 75 67 69  PLUGINS..${plugi
4ec0: 6e 73 4a 53 7d 0a 0a 0a 24 7b 63 61 6c 6c 61 62  nsJS}...${callab
4ed0: 6c 65 73 4a 53 7d 0a 0a 0a 0a 0a 65 78 70 6f 72  lesJS}.....expor
4ee0: 74 73 2e 6c 6f 61 64 20 3d 20 6c 6f 61 64 3b 0a  ts.load = load;.
4ef0: 65 78 70 6f 72 74 73 2e 70 61 72 73 65 20 3d 20  exports.parse = 
4f00: 70 61 72 73 65 3b 0a 65 78 70 6f 72 74 73 2e 6c  parse;.exports.l
4f10: 61 6e 67 20 3d 20 6c 61 6e 67 3b 0a 65 78 70 6f  ang = lang;.expo
4f20: 72 74 73 2e 76 65 72 73 69 6f 6e 20 3d 20 76 65  rts.version = ve
4f30: 72 73 69 6f 6e 3b 0a 65 78 70 6f 72 74 73 2e 67  rsion;.exports.g
4f40: 65 74 44 69 63 74 69 6f 6e 61 72 79 20 3d 20 67  etDictionary = g
4f50: 65 74 44 69 63 74 69 6f 6e 61 72 79 3b 0a 65 78  etDictionary;.ex
4f60: 70 6f 72 74 73 2e 73 65 74 4f 70 74 69 6f 6e 20  ports.setOption 
4f70: 3d 20 73 65 74 4f 70 74 69 6f 6e 3b 0a 65 78 70  = setOption;.exp
4f80: 6f 72 74 73 2e 73 65 74 4f 70 74 69 6f 6e 73 20  orts.setOptions 
4f90: 3d 20 73 65 74 4f 70 74 69 6f 6e 73 3b 0a 65 78  = setOptions;.ex
4fa0: 70 6f 72 74 73 2e 67 65 74 4f 70 74 69 6f 6e 73  ports.getOptions
4fb0: 20 3d 20 67 65 74 4f 70 74 69 6f 6e 73 3b 0a 65   = getOptions;.e
4fc0: 78 70 6f 72 74 73 2e 67 65 74 44 65 66 61 75 6c  xports.getDefaul
4fd0: 74 4f 70 74 69 6f 6e 73 20 3d 20 67 65 74 44 65  tOptions = getDe
4fe0: 66 61 75 6c 74 4f 70 74 69 6f 6e 73 3b 0a 65 78  faultOptions;.ex
4ff0: 70 6f 72 74 73 2e 72 65 73 65 74 4f 70 74 69 6f  ports.resetOptio
5000: 6e 73 20 3d 20 72 65 73 65 74 4f 70 74 69 6f 6e  ns = resetOption
5010: 73 3b 0a 65 78 70 6f 72 74 73 2e 69 67 6e 6f 72  s;.exports.ignor
5020: 65 52 75 6c 65 20 3d 20 69 67 6e 6f 72 65 52 75  eRule = ignoreRu
5030: 6c 65 3b 0a 65 78 70 6f 72 74 73 2e 72 65 61 63  le;.exports.reac
5040: 74 69 76 61 74 65 52 75 6c 65 20 3d 20 72 65 61  tivateRule = rea
5050: 63 74 69 76 61 74 65 52 75 6c 65 3b 0a 65 78 70  ctivateRule;.exp
5060: 6f 72 74 73 2e 72 65 73 65 74 49 67 6e 6f 72 65  orts.resetIgnore
5070: 52 75 6c 65 73 20 3d 20 72 65 73 65 74 49 67 6e  Rules = resetIgn
5080: 6f 72 65 52 75 6c 65 73 3b 0a 65 78 70 6f 72 74  oreRules;.export
5090: 73 2e 6c 69 73 74 52 75 6c 65 73 20 3d 20 6c 69  s.listRules = li
50a0: 73 74 52 75 6c 65 73 3b 0a                       stRules;.