Grammalecte  Hex Artifact Content

Artifact 73cbb643ffbe68e297aa6d3812da9498d7b8b8ea140b74252303bbf2873288b8:


0000: 22 22 22 0a 47 72 61 6d 6d 61 6c 65 63 74 65 2c  """.Grammalecte,
0010: 20 67 72 61 6d 6d 61 72 20 63 68 65 63 6b 65 72   grammar checker
0020: 0a 22 22 22 0a 0a 69 6d 70 6f 72 74 20 69 6d 70  ."""..import imp
0030: 6f 72 74 6c 69 62 0a 69 6d 70 6f 72 74 20 6a 73  ortlib.import js
0040: 6f 6e 0a 0a 66 72 6f 6d 20 2e 20 69 6d 70 6f 72  on..from . impor
0050: 74 20 74 65 78 74 0a 0a 0a 63 6c 61 73 73 20 47  t text...class G
0060: 72 61 6d 6d 61 72 43 68 65 63 6b 65 72 3a 0a 20  rammarChecker:. 
0070: 20 20 20 22 47 72 61 6d 6d 61 72 43 68 65 63 6b     "GrammarCheck
0080: 65 72 3a 20 57 72 61 70 70 65 72 20 66 6f 72 20  er: Wrapper for 
0090: 74 68 65 20 67 72 61 6d 6d 61 72 20 63 68 65 63  the grammar chec
00a0: 6b 65 72 20 65 6e 67 69 6e 65 22 0a 0a 20 20 20  ker engine"..   
00b0: 20 64 65 66 20 5f 5f 69 6e 69 74 5f 5f 20 28 73   def __init__ (s
00c0: 65 6c 66 2c 20 73 4c 61 6e 67 43 6f 64 65 2c 20  elf, sLangCode, 
00d0: 73 43 6f 6e 74 65 78 74 3d 22 50 79 74 68 6f 6e  sContext="Python
00e0: 22 29 3a 0a 20 20 20 20 20 20 20 20 73 65 6c 66  "):.        self
00f0: 2e 73 4c 61 6e 67 43 6f 64 65 20 3d 20 73 4c 61  .sLangCode = sLa
0100: 6e 67 43 6f 64 65 0a 20 20 20 20 20 20 20 20 23  ngCode.        #
0110: 20 47 72 61 6d 6d 61 72 20 63 68 65 63 6b 65 72   Grammar checker
0120: 20 65 6e 67 69 6e 65 0a 20 20 20 20 20 20 20 20   engine.        
0130: 73 65 6c 66 2e 67 63 65 20 3d 20 69 6d 70 6f 72  self.gce = impor
0140: 74 6c 69 62 2e 69 6d 70 6f 72 74 5f 6d 6f 64 75  tlib.import_modu
0150: 6c 65 28 22 2e 22 2b 73 4c 61 6e 67 43 6f 64 65  le("."+sLangCode
0160: 2c 20 22 67 72 61 6d 6d 61 6c 65 63 74 65 22 29  , "grammalecte")
0170: 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 67 63  .        self.gc
0180: 65 2e 6c 6f 61 64 28 73 43 6f 6e 74 65 78 74 29  e.load(sContext)
0190: 0a 20 20 20 20 20 20 20 20 23 20 53 70 65 6c 6c  .        # Spell
01a0: 20 63 68 65 63 6b 65 72 0a 20 20 20 20 20 20 20   checker.       
01b0: 20 73 65 6c 66 2e 6f 53 70 65 6c 6c 43 68 65 63   self.oSpellChec
01c0: 6b 65 72 20 3d 20 73 65 6c 66 2e 67 63 65 2e 67  ker = self.gce.g
01d0: 65 74 53 70 65 6c 6c 43 68 65 63 6b 65 72 28 29  etSpellChecker()
01e0: 0a 20 20 20 20 20 20 20 20 23 20 4c 65 78 69 63  .        # Lexic
01f0: 6f 67 72 61 70 68 65 72 0a 20 20 20 20 20 20 20  ographer.       
0200: 20 73 65 6c 66 2e 6f 4c 65 78 69 63 6f 67 72 61   self.oLexicogra
0210: 70 68 65 72 20 3d 20 4e 6f 6e 65 0a 20 20 20 20  pher = None.    
0220: 20 20 20 20 23 20 54 65 78 74 20 66 6f 72 6d 61      # Text forma
0230: 74 74 65 72 0a 20 20 20 20 20 20 20 20 73 65 6c  tter.        sel
0240: 66 2e 6f 54 65 78 74 46 6f 72 6d 61 74 74 65 72  f.oTextFormatter
0250: 20 3d 20 4e 6f 6e 65 0a 0a 20 20 20 20 64 65 66   = None..    def
0260: 20 67 65 74 47 43 45 6e 67 69 6e 65 20 28 73 65   getGCEngine (se
0270: 6c 66 29 3a 0a 20 20 20 20 20 20 20 20 22 72 65  lf):.        "re
0280: 74 75 72 6e 20 74 68 65 20 67 72 61 6d 6d 61 72  turn the grammar
0290: 20 63 68 65 63 6b 65 72 20 6f 62 6a 65 63 74 22   checker object"
02a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
02b0: 73 65 6c 66 2e 67 63 65 0a 0a 20 20 20 20 64 65  self.gce..    de
02c0: 66 20 67 65 74 53 70 65 6c 6c 43 68 65 63 6b 65  f getSpellChecke
02d0: 72 20 28 73 65 6c 66 29 3a 0a 20 20 20 20 20 20  r (self):.      
02e0: 20 20 22 72 65 74 75 72 6e 20 74 68 65 20 73 70    "return the sp
02f0: 65 6c 6c 20 63 68 65 63 6b 65 72 20 6f 62 6a 65  ell checker obje
0300: 63 74 22 0a 20 20 20 20 20 20 20 20 72 65 74 75  ct".        retu
0310: 72 6e 20 73 65 6c 66 2e 6f 53 70 65 6c 6c 43 68  rn self.oSpellCh
0320: 65 63 6b 65 72 0a 0a 20 20 20 20 64 65 66 20 67  ecker..    def g
0330: 65 74 54 65 78 74 46 6f 72 6d 61 74 74 65 72 20  etTextFormatter 
0340: 28 73 65 6c 66 29 3a 0a 20 20 20 20 20 20 20 20  (self):.        
0350: 22 6c 6f 61 64 20 61 6e 64 20 72 65 74 75 72 6e  "load and return
0360: 20 74 68 65 20 74 65 78 74 20 66 6f 72 6d 61 74   the text format
0370: 74 65 72 22 0a 20 20 20 20 20 20 20 20 69 66 20  ter".        if 
0380: 73 65 6c 66 2e 6f 54 65 78 74 46 6f 72 6d 61 74  self.oTextFormat
0390: 74 65 72 20 69 73 20 4e 6f 6e 65 3a 0a 20 20 20  ter is None:.   
03a0: 20 20 20 20 20 20 20 20 20 74 66 20 3d 20 69 6d           tf = im
03b0: 70 6f 72 74 6c 69 62 2e 69 6d 70 6f 72 74 5f 6d  portlib.import_m
03c0: 6f 64 75 6c 65 28 22 2e 22 2b 73 65 6c 66 2e 73  odule("."+self.s
03d0: 4c 61 6e 67 43 6f 64 65 2b 22 2e 74 65 78 74 66  LangCode+".textf
03e0: 6f 72 6d 61 74 74 65 72 22 2c 20 22 67 72 61 6d  ormatter", "gram
03f0: 6d 61 6c 65 63 74 65 22 29 0a 20 20 20 20 20 20  malecte").      
0400: 20 20 20 20 20 20 73 65 6c 66 2e 6f 54 65 78 74        self.oText
0410: 46 6f 72 6d 61 74 74 65 72 20 3d 20 74 66 2e 54  Formatter = tf.T
0420: 65 78 74 46 6f 72 6d 61 74 74 65 72 28 29 0a 20  extFormatter(). 
0430: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65         return se
0440: 6c 66 2e 6f 54 65 78 74 46 6f 72 6d 61 74 74 65  lf.oTextFormatte
0450: 72 0a 0a 20 20 20 20 64 65 66 20 67 65 74 4c 65  r..    def getLe
0460: 78 69 63 6f 67 72 61 70 68 65 72 20 28 73 65 6c  xicographer (sel
0470: 66 29 3a 0a 20 20 20 20 20 20 20 20 22 6c 6f 61  f):.        "loa
0480: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  d and return the
0490: 20 6c 65 78 69 63 6f 67 72 61 70 68 65 72 22 0a   lexicographer".
04a0: 20 20 20 20 20 20 20 20 69 66 20 73 65 6c 66 2e          if self.
04b0: 6f 4c 65 78 69 63 6f 67 72 61 70 68 65 72 20 69  oLexicographer i
04c0: 73 20 4e 6f 6e 65 3a 0a 20 20 20 20 20 20 20 20  s None:.        
04d0: 20 20 20 20 6c 78 67 20 3d 20 69 6d 70 6f 72 74      lxg = import
04e0: 6c 69 62 2e 69 6d 70 6f 72 74 5f 6d 6f 64 75 6c  lib.import_modul
04f0: 65 28 22 2e 22 2b 73 65 6c 66 2e 73 4c 61 6e 67  e("."+self.sLang
0500: 43 6f 64 65 2b 22 2e 6c 65 78 69 63 6f 67 72 61  Code+".lexicogra
0510: 70 68 65 22 2c 20 22 67 72 61 6d 6d 61 6c 65 63  phe", "grammalec
0520: 74 65 22 29 0a 20 20 20 20 20 20 20 20 20 20 20  te").           
0530: 20 73 65 6c 66 2e 6f 4c 65 78 69 63 6f 67 72 61   self.oLexicogra
0540: 70 68 65 72 20 3d 20 6c 78 67 2e 4c 65 78 69 63  pher = lxg.Lexic
0550: 6f 67 72 61 70 68 65 28 73 65 6c 66 2e 6f 53 70  ographe(self.oSp
0560: 65 6c 6c 43 68 65 63 6b 65 72 29 0a 20 20 20 20  ellChecker).    
0570: 20 20 20 20 72 65 74 75 72 6e 20 73 65 6c 66 2e      return self.
0580: 6f 4c 65 78 69 63 6f 67 72 61 70 68 65 72 0a 0a  oLexicographer..
0590: 20 20 20 20 64 65 66 20 64 69 73 70 6c 61 79 47      def displayG
05a0: 43 4f 70 74 69 6f 6e 73 20 28 73 65 6c 66 29 3a  COptions (self):
05b0: 0a 20 20 20 20 20 20 20 20 22 64 69 73 70 6c 61  .        "displa
05c0: 79 20 74 68 65 20 67 72 61 6d 6d 61 72 20 63 68  y the grammar ch
05d0: 65 63 6b 65 72 20 6f 70 74 69 6f 6e 73 22 0a 20  ecker options". 
05e0: 20 20 20 20 20 20 20 73 65 6c 66 2e 67 63 65 2e         self.gce.
05f0: 64 69 73 70 6c 61 79 4f 70 74 69 6f 6e 73 28 29  displayOptions()
0600: 0a 0a 20 20 20 20 64 65 66 20 67 65 74 50 61 72  ..    def getPar
0610: 61 67 72 61 70 68 45 72 72 6f 72 73 20 28 73 65  agraphErrors (se
0620: 6c 66 2c 20 73 54 65 78 74 2c 20 64 4f 70 74 69  lf, sText, dOpti
0630: 6f 6e 73 3d 4e 6f 6e 65 2c 20 62 43 6f 6e 74 65  ons=None, bConte
0640: 78 74 3d 46 61 6c 73 65 2c 20 62 53 70 65 6c 6c  xt=False, bSpell
0650: 53 75 67 67 3d 46 61 6c 73 65 2c 20 62 44 65 62  Sugg=False, bDeb
0660: 75 67 3d 46 61 6c 73 65 29 3a 0a 20 20 20 20 20  ug=False):.     
0670: 20 20 20 22 72 65 74 75 72 6e 73 20 61 20 74 75     "returns a tu
0680: 70 6c 65 3a 20 28 67 72 61 6d 6d 61 72 20 65 72  ple: (grammar er
0690: 72 6f 72 73 2c 20 73 70 65 6c 6c 69 6e 67 20 65  rors, spelling e
06a0: 72 72 6f 72 73 29 22 0a 20 20 20 20 20 20 20 20  rrors)".        
06b0: 61 47 72 61 6d 6d 45 72 72 73 20 3d 20 73 65 6c  aGrammErrs = sel
06c0: 66 2e 67 63 65 2e 70 61 72 73 65 28 73 54 65 78  f.gce.parse(sTex
06d0: 74 2c 20 22 46 52 22 2c 20 62 44 65 62 75 67 3d  t, "FR", bDebug=
06e0: 62 44 65 62 75 67 2c 20 64 4f 70 74 69 6f 6e 73  bDebug, dOptions
06f0: 3d 64 4f 70 74 69 6f 6e 73 2c 20 62 43 6f 6e 74  =dOptions, bCont
0700: 65 78 74 3d 62 43 6f 6e 74 65 78 74 29 0a 20 20  ext=bContext).  
0710: 20 20 20 20 20 20 61 53 70 65 6c 6c 45 72 72 73        aSpellErrs
0720: 20 3d 20 73 65 6c 66 2e 6f 53 70 65 6c 6c 43 68   = self.oSpellCh
0730: 65 63 6b 65 72 2e 70 61 72 73 65 50 61 72 61 67  ecker.parseParag
0740: 72 61 70 68 28 73 54 65 78 74 2c 20 62 53 70 65  raph(sText, bSpe
0750: 6c 6c 53 75 67 67 29 0a 20 20 20 20 20 20 20 20  llSugg).        
0760: 72 65 74 75 72 6e 20 61 47 72 61 6d 6d 45 72 72  return aGrammErr
0770: 73 2c 20 61 53 70 65 6c 6c 45 72 72 73 0a 0a 20  s, aSpellErrs.. 
0780: 20 20 20 64 65 66 20 67 65 74 50 61 72 61 67 72     def getParagr
0790: 61 70 68 57 69 74 68 45 72 72 6f 72 73 20 28 73  aphWithErrors (s
07a0: 65 6c 66 2c 20 73 54 65 78 74 2c 20 64 4f 70 74  elf, sText, dOpt
07b0: 69 6f 6e 73 3d 4e 6f 6e 65 2c 20 62 45 6d 70 74  ions=None, bEmpt
07c0: 79 49 66 4e 6f 45 72 72 6f 72 73 3d 46 61 6c 73  yIfNoErrors=Fals
07d0: 65 2c 20 62 53 70 65 6c 6c 53 75 67 67 3d 46 61  e, bSpellSugg=Fa
07e0: 6c 73 65 2c 20 6e 57 69 64 74 68 3d 31 30 30 2c  lse, nWidth=100,
07f0: 20 62 44 65 62 75 67 3d 46 61 6c 73 65 29 3a 0a   bDebug=False):.
0800: 20 20 20 20 20 20 20 20 22 70 61 72 73 65 20 74          "parse t
0810: 65 78 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ext and return a
0820: 20 72 65 61 64 61 62 6c 65 20 74 65 78 74 20 77   readable text w
0830: 69 74 68 20 75 6e 64 65 72 6c 69 6e 65 20 65 72  ith underline er
0840: 72 6f 72 73 22 0a 20 20 20 20 20 20 20 20 61 47  rors".        aG
0850: 72 61 6d 6d 45 72 72 73 2c 20 61 53 70 65 6c 6c  rammErrs, aSpell
0860: 45 72 72 73 20 3d 20 73 65 6c 66 2e 67 65 74 50  Errs = self.getP
0870: 61 72 61 67 72 61 70 68 45 72 72 6f 72 73 28 73  aragraphErrors(s
0880: 54 65 78 74 2c 20 64 4f 70 74 69 6f 6e 73 2c 20  Text, dOptions, 
0890: 46 61 6c 73 65 2c 20 62 53 70 65 6c 6c 53 75 67  False, bSpellSug
08a0: 67 2c 20 62 44 65 62 75 67 29 0a 20 20 20 20 20  g, bDebug).     
08b0: 20 20 20 69 66 20 62 45 6d 70 74 79 49 66 4e 6f     if bEmptyIfNo
08c0: 45 72 72 6f 72 73 20 61 6e 64 20 6e 6f 74 20 61  Errors and not a
08d0: 47 72 61 6d 6d 45 72 72 73 20 61 6e 64 20 6e 6f  GrammErrs and no
08e0: 74 20 61 53 70 65 6c 6c 45 72 72 73 3a 0a 20 20  t aSpellErrs:.  
08f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0900: 20 28 22 22 2c 20 5b 5d 29 0a 20 20 20 20 20 20   ("", []).      
0910: 20 20 72 65 74 75 72 6e 20 74 65 78 74 2e 67 65    return text.ge
0920: 6e 65 72 61 74 65 50 61 72 61 67 72 61 70 68 28  nerateParagraph(
0930: 73 54 65 78 74 2c 20 61 47 72 61 6d 6d 45 72 72  sText, aGrammErr
0940: 73 2c 20 61 53 70 65 6c 6c 45 72 72 73 2c 20 6e  s, aSpellErrs, n
0950: 57 69 64 74 68 29 0a 0a 20 20 20 20 64 65 66 20  Width)..    def 
0960: 67 65 74 54 65 78 74 57 69 74 68 45 72 72 6f 72  getTextWithError
0970: 73 20 28 73 65 6c 66 2c 20 73 54 65 78 74 2c 20  s (self, sText, 
0980: 62 45 6d 70 74 79 49 66 4e 6f 45 72 72 6f 72 73  bEmptyIfNoErrors
0990: 3d 46 61 6c 73 65 2c 20 62 53 70 65 6c 6c 53 75  =False, bSpellSu
09a0: 67 67 3d 46 61 6c 73 65 2c 20 6e 57 69 64 74 68  gg=False, nWidth
09b0: 3d 31 30 30 2c 20 62 44 65 62 75 67 3d 46 61 6c  =100, bDebug=Fal
09c0: 73 65 29 3a 0a 20 20 20 20 20 20 20 20 22 5b 74  se):.        "[t
09d0: 6f 64 6f 5d 22 0a 0a 20 20 20 20 64 65 66 20 67  odo]"..    def g
09e0: 65 74 50 61 72 61 67 72 61 70 68 45 72 72 6f 72  etParagraphError
09f0: 73 41 73 4a 53 4f 4e 20 28 73 65 6c 66 2c 20 69  sAsJSON (self, i
0a00: 49 6e 64 65 78 2c 20 73 54 65 78 74 2c 20 64 4f  Index, sText, dO
0a10: 70 74 69 6f 6e 73 3d 4e 6f 6e 65 2c 20 62 43 6f  ptions=None, bCo
0a20: 6e 74 65 78 74 3d 46 61 6c 73 65 2c 20 62 45 6d  ntext=False, bEm
0a30: 70 74 79 49 66 4e 6f 45 72 72 6f 72 73 3d 46 61  ptyIfNoErrors=Fa
0a40: 6c 73 65 2c 20 62 53 70 65 6c 6c 53 75 67 67 3d  lse, bSpellSugg=
0a50: 46 61 6c 73 65 2c 20 62 52 65 74 75 72 6e 54 65  False, bReturnTe
0a60: 78 74 3d 46 61 6c 73 65 2c 20 6c 4c 69 6e 65 53  xt=False, lLineS
0a70: 65 74 3d 4e 6f 6e 65 2c 20 62 44 65 62 75 67 3d  et=None, bDebug=
0a80: 46 61 6c 73 65 29 3a 0a 20 20 20 20 20 20 20 20  False):.        
0a90: 22 70 61 72 73 65 20 74 65 78 74 20 61 6e 64 20  "parse text and 
0aa0: 72 65 74 75 72 6e 20 65 72 72 6f 72 73 20 61 73  return errors as
0ab0: 20 61 20 4a 53 4f 4e 20 73 74 72 69 6e 67 22 0a   a JSON string".
0ac0: 20 20 20 20 20 20 20 20 61 47 72 61 6d 6d 45 72          aGrammEr
0ad0: 72 73 2c 20 61 53 70 65 6c 6c 45 72 72 73 20 3d  rs, aSpellErrs =
0ae0: 20 73 65 6c 66 2e 67 65 74 50 61 72 61 67 72 61   self.getParagra
0af0: 70 68 45 72 72 6f 72 73 28 73 54 65 78 74 2c 20  phErrors(sText, 
0b00: 64 4f 70 74 69 6f 6e 73 2c 20 62 43 6f 6e 74 65  dOptions, bConte
0b10: 78 74 2c 20 62 53 70 65 6c 6c 53 75 67 67 2c 20  xt, bSpellSugg, 
0b20: 62 44 65 62 75 67 29 0a 20 20 20 20 20 20 20 20  bDebug).        
0b30: 61 47 72 61 6d 6d 45 72 72 73 20 3d 20 6c 69 73  aGrammErrs = lis
0b40: 74 28 61 47 72 61 6d 6d 45 72 72 73 29 0a 20 20  t(aGrammErrs).  
0b50: 20 20 20 20 20 20 69 66 20 62 45 6d 70 74 79 49        if bEmptyI
0b60: 66 4e 6f 45 72 72 6f 72 73 20 61 6e 64 20 6e 6f  fNoErrors and no
0b70: 74 20 61 47 72 61 6d 6d 45 72 72 73 20 61 6e 64  t aGrammErrs and
0b80: 20 6e 6f 74 20 61 53 70 65 6c 6c 45 72 72 73 3a   not aSpellErrs:
0b90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
0ba0: 75 72 6e 20 22 22 0a 20 20 20 20 20 20 20 20 69  urn "".        i
0bb0: 66 20 6c 4c 69 6e 65 53 65 74 3a 0a 20 20 20 20  f lLineSet:.    
0bc0: 20 20 20 20 20 20 20 20 61 47 72 61 6d 6d 45 72          aGrammEr
0bd0: 72 73 2c 20 61 53 70 65 6c 6c 45 72 72 73 20 3d  rs, aSpellErrs =
0be0: 20 74 65 78 74 2e 63 6f 6e 76 65 72 74 54 6f 58   text.convertToX
0bf0: 59 28 61 47 72 61 6d 6d 45 72 72 73 2c 20 61 53  Y(aGrammErrs, aS
0c00: 70 65 6c 6c 45 72 72 73 2c 20 6c 4c 69 6e 65 53  pellErrs, lLineS
0c10: 65 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  et).            
0c20: 72 65 74 75 72 6e 20 6a 73 6f 6e 2e 64 75 6d 70  return json.dump
0c30: 73 28 7b 20 22 6c 47 72 61 6d 6d 61 72 45 72 72  s({ "lGrammarErr
0c40: 6f 72 73 22 3a 20 61 47 72 61 6d 6d 45 72 72 73  ors": aGrammErrs
0c50: 2c 20 22 6c 53 70 65 6c 6c 69 6e 67 45 72 72 6f  , "lSpellingErro
0c60: 72 73 22 3a 20 61 53 70 65 6c 6c 45 72 72 73 20  rs": aSpellErrs 
0c70: 7d 2c 20 65 6e 73 75 72 65 5f 61 73 63 69 69 3d  }, ensure_ascii=
0c80: 46 61 6c 73 65 29 0a 20 20 20 20 20 20 20 20 69  False).        i
0c90: 66 20 62 52 65 74 75 72 6e 54 65 78 74 3a 0a 20  f bReturnText:. 
0ca0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
0cb0: 6e 20 6a 73 6f 6e 2e 64 75 6d 70 73 28 7b 20 22  n json.dumps({ "
0cc0: 69 50 61 72 61 67 72 61 70 68 22 3a 20 69 49 6e  iParagraph": iIn
0cd0: 64 65 78 2c 20 22 73 54 65 78 74 22 3a 20 73 54  dex, "sText": sT
0ce0: 65 78 74 2c 20 22 6c 47 72 61 6d 6d 61 72 45 72  ext, "lGrammarEr
0cf0: 72 6f 72 73 22 3a 20 61 47 72 61 6d 6d 45 72 72  rors": aGrammErr
0d00: 73 2c 20 22 6c 53 70 65 6c 6c 69 6e 67 45 72 72  s, "lSpellingErr
0d10: 6f 72 73 22 3a 20 61 53 70 65 6c 6c 45 72 72 73  ors": aSpellErrs
0d20: 20 7d 2c 20 65 6e 73 75 72 65 5f 61 73 63 69 69   }, ensure_ascii
0d30: 3d 46 61 6c 73 65 29 0a 20 20 20 20 20 20 20 20  =False).        
0d40: 72 65 74 75 72 6e 20 6a 73 6f 6e 2e 64 75 6d 70  return json.dump
0d50: 73 28 7b 20 22 69 50 61 72 61 67 72 61 70 68 22  s({ "iParagraph"
0d60: 3a 20 69 49 6e 64 65 78 2c 20 22 6c 47 72 61 6d  : iIndex, "lGram
0d70: 6d 61 72 45 72 72 6f 72 73 22 3a 20 61 47 72 61  marErrors": aGra
0d80: 6d 6d 45 72 72 73 2c 20 22 6c 53 70 65 6c 6c 69  mmErrs, "lSpelli
0d90: 6e 67 45 72 72 6f 72 73 22 3a 20 61 53 70 65 6c  ngErrors": aSpel
0da0: 6c 45 72 72 73 20 7d 2c 20 65 6e 73 75 72 65 5f  lErrs }, ensure_
0db0: 61 73 63 69 69 3d 46 61 6c 73 65 29 0a 0a 20 20  ascii=False)..  
0dc0: 20 20 64 65 66 20 67 65 74 54 65 78 74 45 72 72    def getTextErr
0dd0: 6f 72 73 41 73 4a 53 4f 4e 20 28 73 65 6c 66 2c  orsAsJSON (self,
0de0: 20 73 54 65 78 74 2c 20 62 43 6f 6e 74 65 78 74   sText, bContext
0df0: 3d 46 61 6c 73 65 2c 20 62 45 6d 70 74 79 49 66  =False, bEmptyIf
0e00: 4e 6f 45 72 72 6f 72 73 3d 46 61 6c 73 65 2c 20  NoErrors=False, 
0e10: 62 53 70 65 6c 6c 53 75 67 67 3d 46 61 6c 73 65  bSpellSugg=False
0e20: 2c 20 62 52 65 74 75 72 6e 54 65 78 74 3d 46 61  , bReturnText=Fa
0e30: 6c 73 65 2c 20 62 44 65 62 75 67 3d 46 61 6c 73  lse, bDebug=Fals
0e40: 65 29 3a 0a 20 20 20 20 20 20 20 20 22 5b 74 6f  e):.        "[to
0e50: 64 6f 5d 22 0a                                   do]".