Grammalecte  Hex Artifact Content

Artifact 09241345b5415f6af329c5be7abf6e5c2da3685cbb773e6a7e27805f114ea0aa:


0000: 2f 2f 20 47 52 41 4d 4d 41 52 20 43 48 45 43 4b  // GRAMMAR CHECK
0010: 49 4e 47 20 45 4e 47 49 4e 45 20 50 4c 55 47 49  ING ENGINE PLUGI
0020: 4e 3a 20 50 61 72 73 69 6e 67 20 66 75 6e 63 74  N: Parsing funct
0030: 69 6f 6e 73 20 66 6f 72 20 46 72 65 6e 63 68 20  ions for French 
0040: 6c 61 6e 67 75 61 67 65 0a 0a 2f 2a 20 6a 73 68  language../* jsh
0050: 69 6e 74 20 65 73 76 65 72 73 69 6f 6e 3a 36 20  int esversion:6 
0060: 2a 2f 0a 2f 2a 20 6a 73 6c 69 6e 74 20 65 73 76  */./* jslint esv
0070: 65 72 73 69 6f 6e 3a 36 20 2a 2f 0a 0a 66 75 6e  ersion:6 */..fun
0080: 63 74 69 6f 6e 20 67 5f 6d 6f 72 70 68 56 43 20  ction g_morphVC 
0090: 28 64 54 6f 6b 65 6e 2c 20 73 50 61 74 74 65 72  (dToken, sPatter
00a0: 6e 2c 20 73 4e 65 67 50 61 74 74 65 72 6e 3d 22  n, sNegPattern="
00b0: 22 29 20 7b 0a 20 20 20 20 6c 65 74 20 6e 45 6e  ") {.    let nEn
00c0: 64 20 3d 20 64 54 6f 6b 65 6e 5b 22 73 56 61 6c  d = dToken["sVal
00d0: 75 65 22 5d 2e 6c 61 73 74 49 6e 64 65 78 4f 66  ue"].lastIndexOf
00e0: 28 22 2d 22 29 3b 0a 20 20 20 20 69 66 20 28 64  ("-");.    if (d
00f0: 54 6f 6b 65 6e 5b 22 73 56 61 6c 75 65 22 5d 2e  Token["sValue"].
0100: 69 6e 63 6c 75 64 65 73 28 22 2d 74 2d 22 29 29  includes("-t-"))
0110: 20 7b 0a 20 20 20 20 20 20 20 20 6e 45 6e 64 20   {.        nEnd 
0120: 3d 20 6e 45 6e 64 20 2d 20 32 3b 0a 20 20 20 20  = nEnd - 2;.    
0130: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 67 5f 6d  }.    return g_m
0140: 6f 72 70 68 28 64 54 6f 6b 65 6e 2c 20 73 50 61  orph(dToken, sPa
0150: 74 74 65 72 6e 2c 20 73 4e 65 67 50 61 74 74 65  ttern, sNegPatte
0160: 72 6e 2c 20 30 2c 20 6e 45 6e 64 2c 20 66 61 6c  rn, 0, nEnd, fal
0170: 73 65 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e  se);.}..function
0180: 20 72 65 77 72 69 74 65 53 75 62 6a 65 63 74 20   rewriteSubject 
0190: 28 73 31 2c 20 73 32 29 20 7b 0a 20 20 20 20 2f  (s1, s2) {.    /
01a0: 2f 20 73 31 20 69 73 20 73 75 70 70 6f 73 65 64  / s1 is supposed
01b0: 20 74 6f 20 62 65 20 70 72 6e 2f 70 61 74 72 2f   to be prn/patr/
01c0: 6e 70 72 20 28 4d 5b 31 32 50 5d 29 0a 20 20 20  npr (M[12P]).   
01d0: 20 69 66 20 28 73 32 20 3d 3d 20 22 6c 75 69 22   if (s2 == "lui"
01e0: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
01f0: 72 6e 20 22 69 6c 73 22 3b 0a 20 20 20 20 7d 0a  rn "ils";.    }.
0200: 20 20 20 20 69 66 20 28 73 32 20 3d 3d 20 22 6d      if (s2 == "m
0210: 6f 69 22 29 20 7b 0a 20 20 20 20 20 20 20 20 72  oi") {.        r
0220: 65 74 75 72 6e 20 22 6e 6f 75 73 22 3b 0a 20 20  eturn "nous";.  
0230: 20 20 7d 0a 20 20 20 20 69 66 20 28 73 32 20 3d    }.    if (s2 =
0240: 3d 20 22 74 6f 69 22 29 20 7b 0a 20 20 20 20 20  = "toi") {.     
0250: 20 20 20 72 65 74 75 72 6e 20 22 76 6f 75 73 22     return "vous"
0260: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
0270: 73 32 20 3d 3d 20 22 6e 6f 75 73 22 29 20 7b 0a  s2 == "nous") {.
0280: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
0290: 6e 6f 75 73 22 3b 0a 20 20 20 20 7d 0a 20 20 20  nous";.    }.   
02a0: 20 69 66 20 28 73 32 20 3d 3d 20 22 76 6f 75 73   if (s2 == "vous
02b0: 22 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ") {.        ret
02c0: 75 72 6e 20 22 76 6f 75 73 22 3b 0a 20 20 20 20  urn "vous";.    
02d0: 7d 0a 20 20 20 20 69 66 20 28 73 32 20 3d 3d 20  }.    if (s2 == 
02e0: 22 65 75 78 22 29 20 7b 0a 20 20 20 20 20 20 20  "eux") {.       
02f0: 20 72 65 74 75 72 6e 20 22 69 6c 73 22 3b 0a 20   return "ils";. 
0300: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 32 20     }.    if (s2 
0310: 3d 3d 20 22 65 6c 6c 65 22 20 7c 7c 20 73 32 20  == "elle" || s2 
0320: 3d 3d 20 22 65 6c 6c 65 73 22 29 20 7b 0a 20 20  == "elles") {.  
0330: 20 20 20 20 20 20 69 66 20 28 63 72 65 67 65 78        if (cregex
0340: 2e 6d 62 4e 70 72 4d 61 73 4e 6f 74 46 65 6d 28  .mbNprMasNotFem(
0350: 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67  _oSpellChecker.g
0360: 65 74 4d 6f 72 70 68 28 73 31 29 29 29 20 7b 0a  etMorph(s1))) {.
0370: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
0380: 72 6e 20 22 69 6c 73 22 3b 0a 20 20 20 20 20 20  rn "ils";.      
0390: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f 20 73    }.        // s
03a0: 69 20 c3 a9 70 69 63 c3 a8 6e 65 2c 20 69 6e 64  i ..pic..ne, ind
03b0: c3 a9 74 65 72 6d 69 6e 61 62 6c 65 2c 20 6d 61  ..terminable, ma
03c0: 69 73 20 4f 53 45 46 2c 20 6c 65 20 66 c3 a9 6d  is OSEF, le f..m
03d0: 69 6e 69 6e 20 6c e2 80 99 65 6d 70 6f 72 74 65  inin l...emporte
03e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
03f0: 22 65 6c 6c 65 73 22 3b 0a 20 20 20 20 7d 0a 20  "elles";.    }. 
0400: 20 20 20 72 65 74 75 72 6e 20 73 31 20 2b 20 22     return s1 + "
0410: 20 65 74 20 22 20 2b 20 73 32 3b 0a 7d 0a 0a 66   et " + s2;.}..f
0420: 75 6e 63 74 69 6f 6e 20 61 70 70 6f 73 69 74 69  unction appositi
0430: 6f 6e 20 28 73 57 6f 72 64 31 2c 20 73 57 6f 72  on (sWord1, sWor
0440: 64 32 29 20 7b 0a 20 20 20 20 2f 2f 20 72 65 74  d2) {.    // ret
0450: 75 72 6e 73 20 74 72 75 65 20 69 66 20 6e 6f 6d  urns true if nom
0460: 20 2b 20 6e 6f 6d 20 28 6e 6f 20 61 67 72 65 65   + nom (no agree
0470: 6d 65 6e 74 20 72 65 71 75 69 72 65 64 29 0a 20  ment required). 
0480: 20 20 20 72 65 74 75 72 6e 20 73 57 6f 72 64 32     return sWord2
0490: 2e 6c 65 6e 67 74 68 20 3c 20 32 20 7c 7c 20 28  .length < 2 || (
04a0: 63 72 65 67 65 78 2e 6d 62 4e 6f 6d 4e 6f 74 41  cregex.mbNomNotA
04b0: 64 6a 28 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65  dj(_oSpellChecke
04c0: 72 2e 67 65 74 4d 6f 72 70 68 28 73 57 6f 72 64  r.getMorph(sWord
04d0: 32 29 29 20 26 26 20 63 72 65 67 65 78 2e 6d 62  2)) && cregex.mb
04e0: 50 70 61 73 4e 6f 6d 4e 6f 74 41 64 6a 28 5f 6f  PpasNomNotAdj(_o
04f0: 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e 67 65 74  SpellChecker.get
0500: 4d 6f 72 70 68 28 73 57 6f 72 64 31 29 29 29 3b  Morph(sWord1)));
0510: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 69 73 41  .}..function isA
0520: 6d 62 69 67 75 6f 75 73 4e 41 56 20 28 73 57 6f  mbiguousNAV (sWo
0530: 72 64 29 20 7b 0a 20 20 20 20 2f 2f 20 77 6f 72  rd) {.    // wor
0540: 64 73 20 77 68 69 63 68 20 61 72 65 20 6e 6f 6d  ds which are nom
0550: 7c 61 64 6a 20 61 6e 64 20 76 65 72 62 20 61 72  |adj and verb ar
0560: 65 20 61 6d 62 69 67 75 6f 75 73 20 28 65 78 63  e ambiguous (exc
0570: 65 70 74 20 c3 aa 74 72 65 20 61 6e 64 20 61 76  ept ..tre and av
0580: 6f 69 72 29 0a 20 20 20 20 6c 65 74 20 6c 4d 6f  oir).    let lMo
0590: 72 70 68 20 3d 20 5f 6f 53 70 65 6c 6c 43 68 65  rph = _oSpellChe
05a0: 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28 73 57  cker.getMorph(sW
05b0: 6f 72 64 29 3b 0a 20 20 20 20 69 66 20 28 6c 4d  ord);.    if (lM
05c0: 6f 72 70 68 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20  orph.length === 
05d0: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0) {.        ret
05e0: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d  urn false;.    }
05f0: 0a 20 20 20 20 69 66 20 28 21 63 72 65 67 65 78  .    if (!cregex
0600: 2e 6d 62 4e 6f 6d 41 64 6a 28 6c 4d 6f 72 70 68  .mbNomAdj(lMorph
0610: 29 20 7c 7c 20 73 57 6f 72 64 20 3d 3d 20 22 65  ) || sWord == "e
0620: 73 74 22 29 20 7b 0a 20 20 20 20 20 20 20 20 72  st") {.        r
0630: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20  eturn false;.   
0640: 20 7d 0a 20 20 20 20 69 66 20 28 63 72 65 67 65   }.    if (crege
0650: 78 2e 6d 62 56 63 6f 6e 6a 28 6c 4d 6f 72 70 68  x.mbVconj(lMorph
0660: 29 20 26 26 20 21 63 72 65 67 65 78 2e 6d 62 4d  ) && !cregex.mbM
0670: 47 28 6c 4d 6f 72 70 68 29 29 20 7b 0a 20 20 20  G(lMorph)) {.   
0680: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
0690: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
06a0: 72 6e 20 66 61 6c 73 65 3b 0a 7d 0a 0a 66 75 6e  rn false;.}..fun
06b0: 63 74 69 6f 6e 20 69 73 41 6d 62 69 67 75 6f 75  ction isAmbiguou
06c0: 73 41 6e 64 57 72 6f 6e 67 20 28 73 57 6f 72 64  sAndWrong (sWord
06d0: 31 2c 20 73 57 6f 72 64 32 2c 20 73 52 65 71 4d  1, sWord2, sReqM
06e0: 6f 72 70 68 4e 41 2c 20 73 52 65 71 4d 6f 72 70  orphNA, sReqMorp
06f0: 68 43 6f 6e 6a 29 20 7b 0a 20 20 20 20 2f 2f 2f  hConj) {.    ///
0700: 2f 20 75 73 65 20 69 74 20 69 66 20 73 57 6f 72  / use it if sWor
0710: 64 31 20 77 6f 6e e2 80 99 74 20 62 65 20 61 20  d1 won...t be a 
0720: 76 65 72 62 3b 20 77 6f 72 64 32 20 69 73 20 61  verb; word2 is a
0730: 73 73 75 6d 65 64 20 74 6f 20 62 65 20 74 72 75  ssumed to be tru
0740: 65 20 76 69 61 20 69 73 41 6d 62 69 67 75 6f 75  e via isAmbiguou
0750: 73 4e 41 56 0a 20 20 20 20 6c 65 74 20 61 32 20  sNAV.    let a2 
0760: 3d 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72  = _oSpellChecker
0770: 2e 67 65 74 4d 6f 72 70 68 28 73 57 6f 72 64 32  .getMorph(sWord2
0780: 29 3b 0a 20 20 20 20 69 66 20 28 61 32 2e 6c 65  );.    if (a2.le
0790: 6e 67 74 68 20 3d 3d 3d 20 30 29 20 7b 0a 20 20  ngth === 0) {.  
07a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
07b0: 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  se;.    }.    if
07c0: 20 28 63 72 65 67 65 78 2e 63 68 65 63 6b 43 6f   (cregex.checkCo
07d0: 6e 6a 56 65 72 62 28 61 32 2c 20 73 52 65 71 4d  njVerb(a2, sReqM
07e0: 6f 72 70 68 43 6f 6e 6a 29 29 20 7b 0a 20 20 20  orphConj)) {.   
07f0: 20 20 20 20 20 2f 2f 20 76 65 72 62 20 77 6f 72       // verb wor
0800: 64 32 20 69 73 20 6f 6b 0a 20 20 20 20 20 20 20  d2 is ok.       
0810: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 20   return false;. 
0820: 20 20 20 7d 0a 20 20 20 20 6c 65 74 20 61 31 20     }.    let a1 
0830: 3d 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72  = _oSpellChecker
0840: 2e 67 65 74 4d 6f 72 70 68 28 73 57 6f 72 64 31  .getMorph(sWord1
0850: 29 3b 0a 20 20 20 20 69 66 20 28 61 31 2e 6c 65  );.    if (a1.le
0860: 6e 67 74 68 20 3d 3d 3d 20 30 29 20 7b 0a 20 20  ngth === 0) {.  
0870: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
0880: 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  se;.    }.    if
0890: 20 28 63 72 65 67 65 78 2e 63 68 65 63 6b 41 67   (cregex.checkAg
08a0: 72 65 65 6d 65 6e 74 28 61 31 2c 20 61 32 29 20  reement(a1, a2) 
08b0: 26 26 20 28 63 72 65 67 65 78 2e 6d 62 41 64 6a  && (cregex.mbAdj
08c0: 28 61 32 29 20 7c 7c 20 63 72 65 67 65 78 2e 6d  (a2) || cregex.m
08d0: 62 41 64 6a 28 61 31 29 29 29 20 7b 0a 20 20 20  bAdj(a1))) {.   
08e0: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
08f0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
0900: 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a 66 75 6e  urn true;.}..fun
0910: 63 74 69 6f 6e 20 69 73 56 65 72 79 41 6d 62 69  ction isVeryAmbi
0920: 67 75 6f 75 73 41 6e 64 57 72 6f 6e 67 20 28 73  guousAndWrong (s
0930: 57 6f 72 64 31 2c 20 73 57 6f 72 64 32 2c 20 73  Word1, sWord2, s
0940: 52 65 71 4d 6f 72 70 68 4e 41 2c 20 73 52 65 71  ReqMorphNA, sReq
0950: 4d 6f 72 70 68 43 6f 6e 6a 2c 20 62 4c 61 73 74  MorphConj, bLast
0960: 48 6f 70 65 43 6f 6e 64 29 20 7b 0a 20 20 20 20  HopeCond) {.    
0970: 2f 2f 2f 2f 20 75 73 65 20 69 74 20 69 66 20 73  //// use it if s
0980: 57 6f 72 64 31 20 63 61 6e 20 62 65 20 61 6c 73  Word1 can be als
0990: 6f 20 61 20 76 65 72 62 3b 20 77 6f 72 64 32 20  o a verb; word2 
09a0: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  is assumed to be
09b0: 20 74 72 75 65 20 76 69 61 20 69 73 41 6d 62 69   true via isAmbi
09c0: 67 75 6f 75 73 4e 41 56 0a 20 20 20 20 6c 65 74  guousNAV.    let
09d0: 20 61 32 20 3d 20 5f 6f 53 70 65 6c 6c 43 68 65   a2 = _oSpellChe
09e0: 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28 73 57  cker.getMorph(sW
09f0: 6f 72 64 32 29 3b 0a 20 20 20 20 69 66 20 28 61  ord2);.    if (a
0a00: 32 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20 30 29 20  2.length === 0) 
0a10: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
0a20: 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20   false;.    }.  
0a30: 20 20 69 66 20 28 63 72 65 67 65 78 2e 63 68 65    if (cregex.che
0a40: 63 6b 43 6f 6e 6a 56 65 72 62 28 61 32 2c 20 73  ckConjVerb(a2, s
0a50: 52 65 71 4d 6f 72 70 68 43 6f 6e 6a 29 29 20 7b  ReqMorphConj)) {
0a60: 0a 20 20 20 20 20 20 20 20 2f 2f 20 76 65 72 62  .        // verb
0a70: 20 77 6f 72 64 32 20 69 73 20 6f 6b 0a 20 20 20   word2 is ok.   
0a80: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
0a90: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 74  e;.    }.    let
0aa0: 20 61 31 20 3d 20 5f 6f 53 70 65 6c 6c 43 68 65   a1 = _oSpellChe
0ab0: 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28 73 57  cker.getMorph(sW
0ac0: 6f 72 64 31 29 3b 0a 20 20 20 20 69 66 20 28 61  ord1);.    if (a
0ad0: 31 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20 30 29 20  1.length === 0) 
0ae0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
0af0: 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20   false;.    }.  
0b00: 20 20 69 66 20 28 63 72 65 67 65 78 2e 63 68 65    if (cregex.che
0b10: 63 6b 41 67 72 65 65 6d 65 6e 74 28 61 31 2c 20  ckAgreement(a1, 
0b20: 61 32 29 20 26 26 20 28 63 72 65 67 65 78 2e 6d  a2) && (cregex.m
0b30: 62 41 64 6a 28 61 32 29 20 7c 7c 20 63 72 65 67  bAdj(a2) || creg
0b40: 65 78 2e 6d 62 41 64 6a 4e 62 28 61 31 29 29 29  ex.mbAdjNb(a1)))
0b50: 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   {.        retur
0b60: 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 0a 20  n false;.    }. 
0b70: 20 20 20 2f 2f 20 6e 6f 77 2c 20 77 65 20 6b 6e     // now, we kn
0b80: 6f 77 20 74 68 65 72 65 20 6e 6f 20 61 67 72 65  ow there no agre
0b90: 65 6d 65 6e 74 2c 20 61 6e 64 20 63 6f 6e 6a 75  ement, and conju
0ba0: 67 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 77  gation is also w
0bb0: 72 6f 6e 67 0a 20 20 20 20 69 66 20 28 63 72 65  rong.    if (cre
0bc0: 67 65 78 2e 69 73 4e 6f 6d 41 64 6a 28 61 31 29  gex.isNomAdj(a1)
0bd0: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
0be0: 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20  rn true;.    }. 
0bf0: 20 20 20 2f 2f 69 66 20 63 72 65 67 65 78 2e 69     //if cregex.i
0c00: 73 4e 6f 6d 41 64 6a 56 65 72 62 28 61 31 29 3a  sNomAdjVerb(a1):
0c10: 20 23 20 63 6f 6e 73 69 64 65 72 65 64 20 74 72   # considered tr
0c20: 75 65 0a 20 20 20 20 69 66 20 28 62 4c 61 73 74  ue.    if (bLast
0c30: 48 6f 70 65 43 6f 6e 64 29 20 7b 0a 20 20 20 20  HopeCond) {.    
0c40: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b      return true;
0c50: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
0c60: 6e 20 66 61 6c 73 65 3b 0a 7d 0a 0a 66 75 6e 63  n false;.}..func
0c70: 74 69 6f 6e 20 63 68 65 63 6b 41 67 72 65 65 6d  tion checkAgreem
0c80: 65 6e 74 20 28 73 57 6f 72 64 31 2c 20 73 57 6f  ent (sWord1, sWo
0c90: 72 64 32 29 20 7b 0a 20 20 20 20 6c 65 74 20 61  rd2) {.    let a
0ca0: 32 20 3d 20 5f 6f 53 70 65 6c 6c 43 68 65 63 6b  2 = _oSpellCheck
0cb0: 65 72 2e 67 65 74 4d 6f 72 70 68 28 73 57 6f 72  er.getMorph(sWor
0cc0: 64 32 29 3b 0a 20 20 20 20 69 66 20 28 61 32 2e  d2);.    if (a2.
0cd0: 6c 65 6e 67 74 68 20 3d 3d 3d 20 30 29 20 7b 0a  length === 0) {.
0ce0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
0cf0: 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  rue;.    }.    l
0d00: 65 74 20 61 31 20 3d 20 5f 6f 53 70 65 6c 6c 43  et a1 = _oSpellC
0d10: 68 65 63 6b 65 72 2e 67 65 74 4d 6f 72 70 68 28  hecker.getMorph(
0d20: 73 57 6f 72 64 31 29 3b 0a 20 20 20 20 69 66 20  sWord1);.    if 
0d30: 28 61 31 2e 6c 65 6e 67 74 68 20 3d 3d 3d 20 30  (a1.length === 0
0d40: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
0d50: 72 6e 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20  rn true;.    }. 
0d60: 20 20 20 72 65 74 75 72 6e 20 63 72 65 67 65 78     return cregex
0d70: 2e 63 68 65 63 6b 41 67 72 65 65 6d 65 6e 74 28  .checkAgreement(
0d80: 61 31 2c 20 61 32 29 3b 0a 7d 0a 0a 66 75 6e 63  a1, a2);.}..func
0d90: 74 69 6f 6e 20 6d 62 55 6e 69 74 20 28 73 29 20  tion mbUnit (s) 
0da0: 7b 0a 20 20 20 20 69 66 20 28 2f 5b c2 b5 5c 2f  {.    if (/[..\/
0db0: e2 81 b0 c2 b9 c2 b2 c2 b3 e2 81 b4 e2 81 b5 e2  ................
0dc0: 81 b6 e2 81 b7 e2 81 b8 e2 81 b9 e2 84 a6 e2 84  ................
0dd0: 93 c2 b7 5d 2f 2e 74 65 73 74 28 73 29 29 20 7b  ...]/.test(s)) {
0de0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0df0: 74 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  true;.    }.    
0e00: 69 66 20 28 73 2e 6c 65 6e 67 74 68 20 3e 20 31  if (s.length > 1
0e10: 20 26 26 20 73 2e 6c 65 6e 67 74 68 20 3c 20 31   && s.length < 1
0e20: 36 20 26 26 20 73 2e 73 6c 69 63 65 28 30 2c 20  6 && s.slice(0, 
0e30: 31 29 2e 67 6c 5f 69 73 4c 6f 77 65 72 43 61 73  1).gl_isLowerCas
0e40: 65 28 29 20 26 26 20 28 21 73 2e 73 6c 69 63 65  e() && (!s.slice
0e50: 28 31 29 2e 67 6c 5f 69 73 4c 6f 77 65 72 43 61  (1).gl_isLowerCa
0e60: 73 65 28 29 20 7c 7c 20 2f 5b 30 2d 39 5d 2f 2e  se() || /[0-9]/.
0e70: 74 65 73 74 28 73 29 29 29 20 7b 0a 20 20 20 20  test(s))) {.    
0e80: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b      return true;
0e90: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
0ea0: 6e 20 66 61 6c 73 65 3b 0a 7d 0a 0a 0a 2f 2f 20  n false;.}...// 
0eb0: 45 78 63 65 70 74 69 6f 6e 73 0a 0a 63 6f 6e 73  Exceptions..cons
0ec0: 74 20 61 52 45 47 55 4c 41 52 50 4c 55 52 41 4c  t aREGULARPLURAL
0ed0: 20 3d 20 6e 65 77 20 53 65 74 28 5b 22 61 62 72   = new Set(["abr
0ee0: 69 63 6f 74 22 2c 20 22 61 6d 61 72 61 6e 74 65  icot", "amarante
0ef0: 22 2c 20 22 61 75 62 65 72 67 69 6e 65 22 2c 20  ", "aubergine", 
0f00: 22 61 63 61 6a 6f 75 22 2c 20 22 61 6e 74 68 72  "acajou", "anthr
0f10: 61 63 69 74 65 22 2c 20 22 62 72 69 71 75 65 22  acite", "brique"
0f20: 2c 20 22 63 61 63 61 22 2c 20 22 63 61 66 c3 a9  , "caca", "caf..
0f30: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f50: 20 20 20 22 63 61 72 6f 74 74 65 22 2c 20 22 63     "carotte", "c
0f60: 65 72 69 73 65 22 2c 20 22 63 68 61 74 61 69 67  erise", "chataig
0f70: 6e 65 22 2c 20 22 63 6f 72 61 69 6c 22 2c 20 22  ne", "corail", "
0f80: 63 69 74 72 6f 6e 22 2c 20 22 63 72 c3 a8 6d 65  citron", "cr..me
0f90: 22 2c 20 22 67 72 61 76 65 22 2c 20 22 67 72 6f  ", "grave", "gro
0fa0: 73 65 69 6c 6c 65 22 2c 0a 20 20 20 20 20 20 20  seille",.       
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 20 20 20 20 20 20 22 6a 6f 6e 71 75 69           "jonqui
0fd0: 6c 6c 65 22 2c 20 22 6d 61 72 72 6f 6e 22 2c 20  lle", "marron", 
0fe0: 22 6f 6c 69 76 65 22 2c 20 22 70 65 72 76 65 6e  "olive", "perven
0ff0: 63 68 65 22 2c 20 22 70 72 75 6e 65 22 2c 20 22  che", "prune", "
1000: 73 61 62 6c 65 22 5d 29 3b 0a 63 6f 6e 73 74 20  sable"]);.const 
1010: 61 53 48 4f 55 4c 44 42 45 56 45 52 42 20 3d 20  aSHOULDBEVERB = 
1020: 6e 65 77 20 53 65 74 28 5b 22 61 6c 6c 65 72 22  new Set(["aller"
1030: 2c 20 22 6d 61 6e 67 65 72 22 5d 29 3b 0a        , "manger"]);.