Grammalecte  Hex Artifact Content

Artifact d66b04b5654bf1c1993b53b95aea1fd69a465c2738c9ca4aea820722fdc56985:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 70  #!/usr/bin/env p
0010: 79 74 68 6f 6e 33 0a 0a 69 6d 70 6f 72 74 20 73  ython3..import s
0020: 79 73 0a 69 6d 70 6f 72 74 20 6f 73 2e 70 61 74  ys.import os.pat
0030: 68 0a 69 6d 70 6f 72 74 20 61 72 67 70 61 72 73  h.import argpars
0040: 65 0a 69 6d 70 6f 72 74 20 6a 73 6f 6e 0a 0a 69  e.import json..i
0050: 6d 70 6f 72 74 20 67 72 61 6d 6d 61 6c 65 63 74  mport grammalect
0060: 65 2e 66 72 20 61 73 20 67 63 65 0a 69 6d 70 6f  e.fr as gce.impo
0070: 72 74 20 67 72 61 6d 6d 61 6c 65 63 74 65 2e 66  rt grammalecte.f
0080: 72 2e 6c 65 78 69 63 6f 67 72 61 70 68 65 20 61  r.lexicographe a
0090: 73 20 6c 78 67 0a 69 6d 70 6f 72 74 20 67 72 61  s lxg.import gra
00a0: 6d 6d 61 6c 65 63 74 65 2e 66 72 2e 74 65 78 74  mmalecte.fr.text
00b0: 66 6f 72 6d 61 74 74 65 72 20 61 73 20 74 66 0a  formatter as tf.
00c0: 69 6d 70 6f 72 74 20 67 72 61 6d 6d 61 6c 65 63  import grammalec
00d0: 74 65 2e 74 65 78 74 20 61 73 20 74 78 74 0a 69  te.text as txt.i
00e0: 6d 70 6f 72 74 20 67 72 61 6d 6d 61 6c 65 63 74  mport grammalect
00f0: 65 2e 67 72 61 70 68 73 70 65 6c 6c 2e 74 6f 6b  e.graphspell.tok
0100: 65 6e 69 7a 65 72 20 61 73 20 74 6b 7a 0a 66 72  enizer as tkz.fr
0110: 6f 6d 20 67 72 61 6d 6d 61 6c 65 63 74 65 2e 67  om grammalecte.g
0120: 72 61 70 68 73 70 65 6c 6c 2e 65 63 68 6f 20 69  raphspell.echo i
0130: 6d 70 6f 72 74 20 65 63 68 6f 0a 0a 0a 5f 45 58  mport echo..._EX
0140: 41 4d 50 4c 45 20 3d 20 22 51 75 6f 69 20 3f 20  AMPLE = "Quoi ? 
0150: 52 61 63 6f 6e 74 65 73 c2 a0 21 20 52 61 63 6f  Racontes..! Raco
0160: 6e 74 65 73 2d 6d 6f 69 c2 a0 21 20 42 6f 6e 20  ntes-moi..! Bon 
0170: 73 61 6e 67 67 2c 20 70 61 72 6c 65 73 c2 a0 21  sangg, parles..!
0180: 20 4f 75 69 2e 20 49 6c 20 79 20 61 20 64 65 73   Oui. Il y a des
0190: 20 6d 65 6e 74 65 75 72 20 70 61 72 74 6f 75 74   menteur partout
01a0: 2e 20 22 20 5c 0a 20 20 20 20 20 20 20 20 20 20  . " \.          
01b0: 20 22 4a 65 20 73 75 69 74 20 73 69 64 c3 a9 72   "Je suit sid..r
01c0: c3 a9 20 70 61 72 20 6c 61 20 62 72 75 74 61 6c  .. par la brutal
01d0: 65 73 20 61 72 72 6f 67 61 6e 63 65 20 64 65 20  es arrogance de 
01e0: 63 65 74 74 65 20 68 6f 6d 6d 65 2d 6c c3 a0 2e  cette homme-l...
01f0: 20 51 75 65 6c 6c 65 20 73 61 6c 6f 70 61 72 64   Quelle salopard
0200: c2 a0 21 20 55 6e 20 65 73 63 72 6f 63 73 20 64  ..! Un escrocs d
0210: 65 20 6c 61 20 70 69 72 65 20 65 73 70 65 63 65  e la pire espece
0220: 2e 20 22 20 5c 0a 20 20 20 20 20 20 20 20 20 20  . " \.          
0230: 20 22 51 75 61 6e 74 20 73 65 72 61 20 74 e2 80   "Quant sera t..
0240: 99 69 6c 20 63 68 c3 a2 74 69 c3 a9 73 20 70 6f  .il ch..ti..s po
0250: 75 72 20 73 65 73 20 6d 65 6e 73 6f 6e 67 65 c2  ur ses mensonge.
0260: a0 3f 20 20 20 20 20 20 20 20 20 20 20 20 20 4d  .?             M
0270: 65 72 64 65 20 21 20 4a e2 80 99 65 6e 20 61 69  erde ! J...en ai
0280: 65 20 6d 61 72 72 65 2e 22 0a 0a 5f 48 45 4c 50  e marre.".._HELP
0290: 20 3d 20 22 22 22 0a 20 20 20 20 2f 68 65 6c 70   = """.    /help
02a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02b0: 20 20 20 20 20 20 20 2f 68 20 20 20 20 20 20 73         /h      s
02c0: 68 6f 77 20 74 68 69 73 20 74 65 78 74 0a 20 20  how this text.  
02d0: 20 20 3f 77 6f 72 64 31 20 5b 77 6f 72 64 32 5d    ?word1 [word2]
02e0: 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20   ...            
02f0: 20 20 20 20 20 20 77 6f 72 64 73 20 61 6e 61 6c        words anal
0300: 79 73 69 73 0a 20 20 20 20 21 77 6f 72 64 20 20  ysis.    !word  
0310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0320: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 75 67               sug
0330: 67 65 73 74 69 6f 6e 0a 20 20 20 20 3e 77 6f 72  gestion.    >wor
0340: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
0350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0360: 64 72 61 77 20 70 61 74 68 20 6f 66 20 77 6f 72  draw path of wor
0370: 64 20 69 6e 20 74 68 65 20 77 6f 72 64 20 67 72  d in the word gr
0380: 61 70 68 0a 20 20 20 20 3d 66 69 6c 74 65 72 20  aph.    =filter 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77              show
03b0: 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 68 6f   all entries who
03c0: 73 65 20 6d 6f 72 70 68 6f 6c 6f 67 79 20 66 69  se morphology fi
03d0: 74 73 20 74 6f 20 66 69 6c 74 65 72 0a 20 20 20  ts to filter.   
03e0: 20 2f 6c 6f 70 74 20 20 20 20 20 20 20 20 20 20   /lopt          
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 6c 6f               /lo
0400: 20 20 20 20 20 6c 69 73 74 20 6f 70 74 69 6f 6e       list option
0410: 73 0a 20 20 20 20 2f 2b 20 6f 70 74 69 6f 6e 31  s.    /+ option1
0420: 20 5b 6f 70 74 69 6f 6e 32 5d 20 2e 2e 2e 20 20   [option2] ...  
0430: 20 20 20 20 20 20 20 20 20 20 61 63 74 69 76 61            activa
0440: 74 65 20 67 72 61 6d 6d 61 72 20 63 68 65 63 6b  te grammar check
0450: 69 6e 67 20 6f 70 74 69 6f 6e 73 0a 20 20 20 20  ing options.    
0460: 2f 2d 20 6f 70 74 69 6f 6e 31 20 5b 6f 70 74 69  /- option1 [opti
0470: 6f 6e 32 5d 20 2e 2e 2e 20 20 20 20 20 20 20 20  on2] ...        
0480: 20 20 20 20 64 65 61 63 74 69 76 61 74 65 20 67      deactivate g
0490: 72 61 6d 6d 61 72 20 63 68 65 63 6b 69 6e 67 20  rammar checking 
04a0: 6f 70 74 69 6f 6e 73 0a 20 20 20 20 2f 6c 72 75  options.    /lru
04b0: 6c 65 73 20 5b 70 61 74 74 65 72 6e 5d 20 20 20  les [pattern]   
04c0: 20 20 20 20 20 20 20 20 2f 6c 72 20 20 20 20 20          /lr     
04d0: 6c 69 73 74 20 72 75 6c 65 73 0a 20 20 20 20 2f  list rules.    /
04e0: 2d 2d 72 75 6c 65 31 20 5b 72 75 6c 65 32 5d 20  --rule1 [rule2] 
04f0: 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
0500: 20 20 20 64 65 61 63 74 69 76 61 74 65 20 67 72     deactivate gr
0510: 61 6d 6d 61 72 20 63 68 65 63 6b 69 6e 67 20 72  ammar checking r
0520: 75 6c 65 0a 20 20 20 20 2f 2b 2b 72 75 6c 65 31  ule.    /++rule1
0530: 20 5b 72 75 6c 65 32 5d 20 2e 2e 2e 20 20 20 20   [rule2] ...    
0540: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 63              reac
0550: 74 69 76 61 74 65 20 67 72 61 6d 6d 61 72 20 63  tivate grammar c
0560: 68 65 63 6b 69 6e 67 20 72 75 6c 65 0a 20 20 20  hecking rule.   
0570: 20 2f 71 75 69 74 20 20 20 20 20 20 20 20 20 20   /quit          
0580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 71 20               /q 
0590: 20 20 20 20 20 65 78 69 74 0a 22 22 22 0a 0a 0a       exit."""...
05a0: 64 65 66 20 5f 67 65 74 54 65 78 74 20 28 73 49  def _getText (sI
05b0: 6e 70 75 74 54 65 78 74 29 3a 0a 20 20 20 20 73  nputText):.    s
05c0: 54 65 78 74 20 3d 20 69 6e 70 75 74 28 73 49 6e  Text = input(sIn
05d0: 70 75 74 54 65 78 74 29 0a 20 20 20 20 69 66 20  putText).    if 
05e0: 73 54 65 78 74 20 3d 3d 20 22 2a 22 3a 0a 20 20  sText == "*":.  
05f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5f 45 58        return _EX
0600: 41 4d 50 4c 45 0a 20 20 20 20 69 66 20 73 79 73  AMPLE.    if sys
0610: 2e 70 6c 61 74 66 6f 72 6d 20 3d 3d 20 22 77 69  .platform == "wi
0620: 6e 33 32 22 3a 0a 20 20 20 20 20 20 20 20 23 20  n32":.        # 
0630: 41 70 70 61 72 65 6e 74 6c 79 2c 20 74 68 65 20  Apparently, the 
0640: 63 6f 6e 73 6f 6c 65 20 74 72 61 6e 73 66 6f 72  console transfor
0650: 6d 73 20 c2 ab e2 80 99 c2 bb 20 69 6e 20 c2 ab  ms ....... in ..
0660: 27 c2 bb 2e 0a 20 20 20 20 20 20 20 20 23 20 53  '....        # S
0670: 6f 20 77 65 20 72 65 76 65 72 73 65 20 69 74 20  o we reverse it 
0680: 74 6f 20 61 76 6f 69 64 20 6d 61 6e 79 20 75 73  to avoid many us
0690: 65 6c 65 73 73 20 77 61 72 6e 69 6e 67 73 2e 0a  eless warnings..
06a0: 20 20 20 20 20 20 20 20 73 54 65 78 74 20 3d 20          sText = 
06b0: 73 54 65 78 74 2e 72 65 70 6c 61 63 65 28 22 27  sText.replace("'
06c0: 22 2c 20 22 e2 80 99 22 29 0a 20 20 20 20 72 65  ", "...").    re
06d0: 74 75 72 6e 20 73 54 65 78 74 0a 0a 0a 64 65 66  turn sText...def
06e0: 20 5f 67 65 74 45 72 72 6f 72 73 20 28 73 54 65   _getErrors (sTe
06f0: 78 74 2c 20 6f 54 6f 6b 65 6e 69 7a 65 72 2c 20  xt, oTokenizer, 
0700: 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72 2c 20 62  oSpellChecker, b
0710: 43 6f 6e 74 65 78 74 3d 46 61 6c 73 65 2c 20 62  Context=False, b
0720: 53 70 65 6c 6c 53 75 67 67 3d 46 61 6c 73 65 2c  SpellSugg=False,
0730: 20 62 44 65 62 75 67 3d 46 61 6c 73 65 29 3a 0a   bDebug=False):.
0740: 20 20 20 20 22 72 65 74 75 72 6e 73 20 61 20 74      "returns a t
0750: 75 70 6c 65 3a 20 28 67 72 61 6d 6d 61 72 20 65  uple: (grammar e
0760: 72 72 6f 72 73 2c 20 73 70 65 6c 6c 69 6e 67 20  rrors, spelling 
0770: 65 72 72 6f 72 73 29 22 0a 20 20 20 20 61 47 72  errors)".    aGr
0780: 61 6d 6d 45 72 72 73 20 3d 20 67 63 65 2e 70 61  ammErrs = gce.pa
0790: 72 73 65 28 73 54 65 78 74 2c 20 22 46 52 22 2c  rse(sText, "FR",
07a0: 20 62 44 65 62 75 67 3d 62 44 65 62 75 67 2c 20   bDebug=bDebug, 
07b0: 62 43 6f 6e 74 65 78 74 3d 62 43 6f 6e 74 65 78  bContext=bContex
07c0: 74 29 0a 20 20 20 20 61 53 70 65 6c 6c 45 72 72  t).    aSpellErr
07d0: 73 20 3d 20 5b 5d 0a 20 20 20 20 66 6f 72 20 64  s = [].    for d
07e0: 54 6f 6b 65 6e 20 69 6e 20 6f 54 6f 6b 65 6e 69  Token in oTokeni
07f0: 7a 65 72 2e 67 65 6e 54 6f 6b 65 6e 73 28 73 54  zer.genTokens(sT
0800: 65 78 74 29 3a 0a 20 20 20 20 20 20 20 20 69 66  ext):.        if
0810: 20 64 54 6f 6b 65 6e 5b 27 73 54 79 70 65 27 5d   dToken['sType']
0820: 20 3d 3d 20 22 57 4f 52 44 22 20 61 6e 64 20 6e   == "WORD" and n
0830: 6f 74 20 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72  ot oSpellChecker
0840: 2e 69 73 56 61 6c 69 64 54 6f 6b 65 6e 28 64 54  .isValidToken(dT
0850: 6f 6b 65 6e 5b 27 73 56 61 6c 75 65 27 5d 29 3a  oken['sValue']):
0860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
0870: 62 53 70 65 6c 6c 53 75 67 67 3a 0a 20 20 20 20  bSpellSugg:.    
0880: 20 20 20 20 20 20 20 20 20 20 20 20 64 54 6f 6b              dTok
0890: 65 6e 5b 27 61 53 75 67 67 65 73 74 69 6f 6e 73  en['aSuggestions
08a0: 27 5d 20 3d 20 5b 5d 0a 20 20 20 20 20 20 20 20  '] = [].        
08b0: 20 20 20 20 20 20 20 20 66 6f 72 20 6c 53 75 67          for lSug
08c0: 67 20 69 6e 20 6f 53 70 65 6c 6c 43 68 65 63 6b  g in oSpellCheck
08d0: 65 72 2e 73 75 67 67 65 73 74 28 64 54 6f 6b 65  er.suggest(dToke
08e0: 6e 5b 27 73 56 61 6c 75 65 27 5d 29 3a 0a 20 20  n['sValue']):.  
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 64 54 6f 6b 65 6e 5b 27 61 53 75 67 67 65    dToken['aSugge
0910: 73 74 69 6f 6e 73 27 5d 2e 65 78 74 65 6e 64 28  stions'].extend(
0920: 6c 53 75 67 67 29 0a 20 20 20 20 20 20 20 20 20  lSugg).         
0930: 20 20 20 61 53 70 65 6c 6c 45 72 72 73 2e 61 70     aSpellErrs.ap
0940: 70 65 6e 64 28 64 54 6f 6b 65 6e 29 0a 20 20 20  pend(dToken).   
0950: 20 72 65 74 75 72 6e 20 61 47 72 61 6d 6d 45 72   return aGrammEr
0960: 72 73 2c 20 61 53 70 65 6c 6c 45 72 72 73 0a 0a  rs, aSpellErrs..
0970: 0a 64 65 66 20 67 65 6e 65 72 61 74 65 54 65 78  .def generateTex
0980: 74 20 28 73 54 65 78 74 2c 20 6f 54 6f 6b 65 6e  t (sText, oToken
0990: 69 7a 65 72 2c 20 6f 53 70 65 6c 6c 43 68 65 63  izer, oSpellChec
09a0: 6b 65 72 2c 20 62 44 65 62 75 67 3d 46 61 6c 73  ker, bDebug=Fals
09b0: 65 2c 20 62 45 6d 70 74 79 49 66 4e 6f 45 72 72  e, bEmptyIfNoErr
09c0: 6f 72 73 3d 46 61 6c 73 65 2c 20 62 53 70 65 6c  ors=False, bSpel
09d0: 6c 53 75 67 67 3d 46 61 6c 73 65 2c 20 6e 57 69  lSugg=False, nWi
09e0: 64 74 68 3d 31 30 30 29 3a 0a 20 20 20 20 61 47  dth=100):.    aG
09f0: 72 61 6d 6d 45 72 72 73 2c 20 61 53 70 65 6c 6c  rammErrs, aSpell
0a00: 45 72 72 73 20 3d 20 5f 67 65 74 45 72 72 6f 72  Errs = _getError
0a10: 73 28 73 54 65 78 74 2c 20 6f 54 6f 6b 65 6e 69  s(sText, oTokeni
0a20: 7a 65 72 2c 20 6f 53 70 65 6c 6c 43 68 65 63 6b  zer, oSpellCheck
0a30: 65 72 2c 20 46 61 6c 73 65 2c 20 62 53 70 65 6c  er, False, bSpel
0a40: 6c 53 75 67 67 2c 20 62 44 65 62 75 67 29 0a 20  lSugg, bDebug). 
0a50: 20 20 20 69 66 20 62 45 6d 70 74 79 49 66 4e 6f     if bEmptyIfNo
0a60: 45 72 72 6f 72 73 20 61 6e 64 20 6e 6f 74 20 61  Errors and not a
0a70: 47 72 61 6d 6d 45 72 72 73 20 61 6e 64 20 6e 6f  GrammErrs and no
0a80: 74 20 61 53 70 65 6c 6c 45 72 72 73 3a 0a 20 20  t aSpellErrs:.  
0a90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0a        return "".
0aa0: 20 20 20 20 72 65 74 75 72 6e 20 74 78 74 2e 67      return txt.g
0ab0: 65 6e 65 72 61 74 65 50 61 72 61 67 72 61 70 68  enerateParagraph
0ac0: 28 73 54 65 78 74 2c 20 61 47 72 61 6d 6d 45 72  (sText, aGrammEr
0ad0: 72 73 2c 20 61 53 70 65 6c 6c 45 72 72 73 2c 20  rs, aSpellErrs, 
0ae0: 6e 57 69 64 74 68 29 0a 0a 0a 64 65 66 20 67 65  nWidth)...def ge
0af0: 6e 65 72 61 74 65 4a 53 4f 4e 20 28 69 49 6e 64  nerateJSON (iInd
0b00: 65 78 2c 20 73 54 65 78 74 2c 20 6f 54 6f 6b 65  ex, sText, oToke
0b10: 6e 69 7a 65 72 2c 20 6f 53 70 65 6c 6c 43 68 65  nizer, oSpellChe
0b20: 63 6b 65 72 2c 20 62 43 6f 6e 74 65 78 74 3d 46  cker, bContext=F
0b30: 61 6c 73 65 2c 20 62 44 65 62 75 67 3d 46 61 6c  alse, bDebug=Fal
0b40: 73 65 2c 20 62 45 6d 70 74 79 49 66 4e 6f 45 72  se, bEmptyIfNoEr
0b50: 72 6f 72 73 3d 46 61 6c 73 65 2c 20 62 53 70 65  rors=False, bSpe
0b60: 6c 6c 53 75 67 67 3d 46 61 6c 73 65 2c 20 6c 4c  llSugg=False, lL
0b70: 69 6e 65 53 65 74 3d 4e 6f 6e 65 2c 20 62 52 65  ineSet=None, bRe
0b80: 74 75 72 6e 54 65 78 74 3d 46 61 6c 73 65 29 3a  turnText=False):
0b90: 0a 20 20 20 20 61 47 72 61 6d 6d 45 72 72 73 2c  .    aGrammErrs,
0ba0: 20 61 53 70 65 6c 6c 45 72 72 73 20 3d 20 5f 67   aSpellErrs = _g
0bb0: 65 74 45 72 72 6f 72 73 28 73 54 65 78 74 2c 20  etErrors(sText, 
0bc0: 6f 54 6f 6b 65 6e 69 7a 65 72 2c 20 6f 53 70 65  oTokenizer, oSpe
0bd0: 6c 6c 43 68 65 63 6b 65 72 2c 20 62 43 6f 6e 74  llChecker, bCont
0be0: 65 78 74 2c 20 62 53 70 65 6c 6c 53 75 67 67 2c  ext, bSpellSugg,
0bf0: 20 62 44 65 62 75 67 29 0a 20 20 20 20 61 47 72   bDebug).    aGr
0c00: 61 6d 6d 45 72 72 73 20 3d 20 6c 69 73 74 28 61  ammErrs = list(a
0c10: 47 72 61 6d 6d 45 72 72 73 29 0a 20 20 20 20 69  GrammErrs).    i
0c20: 66 20 62 45 6d 70 74 79 49 66 4e 6f 45 72 72 6f  f bEmptyIfNoErro
0c30: 72 73 20 61 6e 64 20 6e 6f 74 20 61 47 72 61 6d  rs and not aGram
0c40: 6d 45 72 72 73 20 61 6e 64 20 6e 6f 74 20 61 53  mErrs and not aS
0c50: 70 65 6c 6c 45 72 72 73 3a 0a 20 20 20 20 20 20  pellErrs:.      
0c60: 20 20 72 65 74 75 72 6e 20 22 22 0a 20 20 20 20    return "".    
0c70: 69 66 20 6c 4c 69 6e 65 53 65 74 3a 0a 20 20 20  if lLineSet:.   
0c80: 20 20 20 20 20 61 47 72 61 6d 6d 45 72 72 73 2c       aGrammErrs,
0c90: 20 61 53 70 65 6c 6c 45 72 72 73 20 3d 20 74 78   aSpellErrs = tx
0ca0: 74 2e 63 6f 6e 76 65 72 74 54 6f 58 59 28 61 47  t.convertToXY(aG
0cb0: 72 61 6d 6d 45 72 72 73 2c 20 61 53 70 65 6c 6c  rammErrs, aSpell
0cc0: 45 72 72 73 2c 20 6c 4c 69 6e 65 53 65 74 29 0a  Errs, lLineSet).
0cd0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6a          return j
0ce0: 73 6f 6e 2e 64 75 6d 70 73 28 7b 20 22 6c 47 72  son.dumps({ "lGr
0cf0: 61 6d 6d 61 72 45 72 72 6f 72 73 22 3a 20 61 47  ammarErrors": aG
0d00: 72 61 6d 6d 45 72 72 73 2c 20 22 6c 53 70 65 6c  rammErrs, "lSpel
0d10: 6c 69 6e 67 45 72 72 6f 72 73 22 3a 20 61 53 70  lingErrors": aSp
0d20: 65 6c 6c 45 72 72 73 20 7d 2c 20 65 6e 73 75 72  ellErrs }, ensur
0d30: 65 5f 61 73 63 69 69 3d 46 61 6c 73 65 29 0a 20  e_ascii=False). 
0d40: 20 20 20 69 66 20 62 52 65 74 75 72 6e 54 65 78     if bReturnTex
0d50: 74 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  t:.        retur
0d60: 6e 20 6a 73 6f 6e 2e 64 75 6d 70 73 28 7b 20 22  n json.dumps({ "
0d70: 69 50 61 72 61 67 72 61 70 68 22 3a 20 69 49 6e  iParagraph": iIn
0d80: 64 65 78 2c 20 22 73 54 65 78 74 22 3a 20 73 54  dex, "sText": sT
0d90: 65 78 74 2c 20 22 6c 47 72 61 6d 6d 61 72 45 72  ext, "lGrammarEr
0da0: 72 6f 72 73 22 3a 20 61 47 72 61 6d 6d 45 72 72  rors": aGrammErr
0db0: 73 2c 20 22 6c 53 70 65 6c 6c 69 6e 67 45 72 72  s, "lSpellingErr
0dc0: 6f 72 73 22 3a 20 61 53 70 65 6c 6c 45 72 72 73  ors": aSpellErrs
0dd0: 20 7d 2c 20 65 6e 73 75 72 65 5f 61 73 63 69 69   }, ensure_ascii
0de0: 3d 46 61 6c 73 65 29 0a 20 20 20 20 72 65 74 75  =False).    retu
0df0: 72 6e 20 6a 73 6f 6e 2e 64 75 6d 70 73 28 7b 20  rn json.dumps({ 
0e00: 22 69 50 61 72 61 67 72 61 70 68 22 3a 20 69 49  "iParagraph": iI
0e10: 6e 64 65 78 2c 20 22 6c 47 72 61 6d 6d 61 72 45  ndex, "lGrammarE
0e20: 72 72 6f 72 73 22 3a 20 61 47 72 61 6d 6d 45 72  rrors": aGrammEr
0e30: 72 73 2c 20 22 6c 53 70 65 6c 6c 69 6e 67 45 72  rs, "lSpellingEr
0e40: 72 6f 72 73 22 3a 20 61 53 70 65 6c 6c 45 72 72  rors": aSpellErr
0e50: 73 20 7d 2c 20 65 6e 73 75 72 65 5f 61 73 63 69  s }, ensure_asci
0e60: 69 3d 46 61 6c 73 65 29 0a 0a 0a 64 65 66 20 72  i=False)...def r
0e70: 65 61 64 66 69 6c 65 20 28 73 70 66 29 3a 0a 20  eadfile (spf):. 
0e80: 20 20 20 22 67 65 6e 65 72 61 74 6f 72 3a 20 72     "generator: r
0e90: 65 74 75 72 6e 73 20 66 69 6c 65 20 6c 69 6e 65  eturns file line
0ea0: 20 62 79 20 6c 69 6e 65 22 0a 20 20 20 20 69 66   by line".    if
0eb0: 20 6f 73 2e 70 61 74 68 2e 69 73 66 69 6c 65 28   os.path.isfile(
0ec0: 73 70 66 29 3a 0a 20 20 20 20 20 20 20 20 77 69  spf):.        wi
0ed0: 74 68 20 6f 70 65 6e 28 73 70 66 2c 20 22 72 22  th open(spf, "r"
0ee0: 2c 20 65 6e 63 6f 64 69 6e 67 3d 22 75 74 66 2d  , encoding="utf-
0ef0: 38 22 29 20 61 73 20 68 53 72 63 3a 0a 20 20 20  8") as hSrc:.   
0f00: 20 20 20 20 20 20 20 20 20 66 6f 72 20 73 4c 69           for sLi
0f10: 6e 65 20 69 6e 20 68 53 72 63 3a 0a 20 20 20 20  ne in hSrc:.    
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c              yiel
0f30: 64 20 73 4c 69 6e 65 0a 20 20 20 20 65 6c 73 65  d sLine.    else
0f40: 3a 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 28  :.        print(
0f50: 22 23 20 45 72 72 6f 72 3a 20 66 69 6c 65 20 6e  "# Error: file n
0f60: 6f 74 20 66 6f 75 6e 64 2e 22 29 0a 0a 0a 64 65  ot found.")...de
0f70: 66 20 72 65 61 64 66 69 6c 65 41 6e 64 43 6f 6e  f readfileAndCon
0f80: 63 61 74 4c 69 6e 65 73 20 28 73 70 66 29 3a 0a  catLines (spf):.
0f90: 20 20 20 20 22 67 65 6e 65 72 61 74 6f 72 3a 20      "generator: 
0fa0: 72 65 74 75 72 6e 73 20 74 65 78 74 20 62 79 20  returns text by 
0fb0: 6c 69 73 74 20 6f 66 20 6c 69 6e 65 73 20 6e 6f  list of lines no
0fc0: 74 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61  t separated by a
0fd0: 6e 20 65 6d 70 74 79 20 6c 69 6e 65 22 0a 20 20  n empty line".  
0fe0: 20 20 6c 4c 69 6e 65 20 3d 20 5b 5d 0a 20 20 20    lLine = [].   
0ff0: 20 66 6f 72 20 69 2c 20 73 4c 69 6e 65 20 69 6e   for i, sLine in
1000: 20 65 6e 75 6d 65 72 61 74 65 28 72 65 61 64 66   enumerate(readf
1010: 69 6c 65 28 73 70 66 29 2c 20 31 29 3a 0a 20 20  ile(spf), 1):.  
1020: 20 20 20 20 20 20 69 66 20 73 4c 69 6e 65 2e 73        if sLine.s
1030: 74 72 69 70 28 29 3a 0a 20 20 20 20 20 20 20 20  trip():.        
1040: 20 20 20 20 6c 4c 69 6e 65 2e 61 70 70 65 6e 64      lLine.append
1050: 28 28 69 2c 20 73 4c 69 6e 65 29 29 0a 20 20 20  ((i, sLine)).   
1060: 20 20 20 20 20 65 6c 69 66 20 6c 4c 69 6e 65 3a       elif lLine:
1070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65  .            yie
1080: 6c 64 20 6c 4c 69 6e 65 0a 20 20 20 20 20 20 20  ld lLine.       
1090: 20 20 20 20 20 6c 4c 69 6e 65 20 3d 20 5b 5d 0a       lLine = [].
10a0: 20 20 20 20 69 66 20 6c 4c 69 6e 65 3a 0a 20 20      if lLine:.  
10b0: 20 20 20 20 20 20 79 69 65 6c 64 20 6c 4c 69 6e        yield lLin
10c0: 65 0a 0a 0a 64 65 66 20 6f 75 74 70 75 74 20 28  e...def output (
10d0: 73 54 65 78 74 2c 20 68 44 73 74 3d 4e 6f 6e 65  sText, hDst=None
10e0: 29 3a 0a 20 20 20 20 69 66 20 6e 6f 74 20 68 44  ):.    if not hD
10f0: 73 74 3a 0a 20 20 20 20 20 20 20 20 65 63 68 6f  st:.        echo
1100: 28 73 54 65 78 74 2c 20 65 6e 64 3d 22 22 29 0a  (sText, end="").
1110: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
1120: 20 20 68 44 73 74 2e 77 72 69 74 65 28 73 54 65    hDst.write(sTe
1130: 78 74 29 0a 0a 0a 64 65 66 20 6d 61 69 6e 20 28  xt)...def main (
1140: 29 3a 0a 20 20 20 20 78 50 61 72 73 65 72 20 3d  ):.    xParser =
1150: 20 61 72 67 70 61 72 73 65 2e 41 72 67 75 6d 65   argparse.Argume
1160: 6e 74 50 61 72 73 65 72 28 29 0a 20 20 20 20 78  ntParser().    x
1170: 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d  Parser.add_argum
1180: 65 6e 74 28 22 2d 66 22 2c 20 22 2d 2d 66 69 6c  ent("-f", "--fil
1190: 65 22 2c 20 68 65 6c 70 3d 22 70 61 72 73 65 20  e", help="parse 
11a0: 66 69 6c 65 20 28 55 54 46 2d 38 20 72 65 71 75  file (UTF-8 requ
11b0: 69 72 65 64 21 29 20 5b 6f 6e 20 57 69 6e 64 6f  ired!) [on Windo
11c0: 77 73 2c 20 2d 66 20 69 73 20 73 69 6d 69 6c 61  ws, -f is simila
11d0: 72 20 74 6f 20 2d 66 66 5d 22 2c 20 74 79 70 65  r to -ff]", type
11e0: 3d 73 74 72 29 0a 20 20 20 20 78 50 61 72 73 65  =str).    xParse
11f0: 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22  r.add_argument("
1200: 2d 66 66 22 2c 20 22 2d 2d 66 69 6c 65 5f 74 6f  -ff", "--file_to
1210: 5f 66 69 6c 65 22 2c 20 68 65 6c 70 3d 22 70 61  _file", help="pa
1220: 72 73 65 20 66 69 6c 65 20 28 55 54 46 2d 38 20  rse file (UTF-8 
1230: 72 65 71 75 69 72 65 64 21 29 20 61 6e 64 20 63  required!) and c
1240: 72 65 61 74 65 20 61 20 72 65 73 75 6c 74 20 66  reate a result f
1250: 69 6c 65 20 28 2a 2e 72 65 73 2e 74 78 74 29 22  ile (*.res.txt)"
1260: 2c 20 74 79 70 65 3d 73 74 72 29 0a 20 20 20 20  , type=str).    
1270: 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75  xParser.add_argu
1280: 6d 65 6e 74 28 22 2d 6f 77 65 22 2c 20 22 2d 2d  ment("-owe", "--
1290: 6f 6e 6c 79 5f 77 68 65 6e 5f 65 72 72 6f 72 73  only_when_errors
12a0: 22 2c 20 68 65 6c 70 3d 22 64 69 73 70 6c 61 79  ", help="display
12b0: 20 72 65 73 75 6c 74 73 20 6f 6e 6c 79 20 77 68   results only wh
12c0: 65 6e 20 74 68 65 72 65 20 61 72 65 20 65 72 72  en there are err
12d0: 6f 72 73 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74  ors", action="st
12e0: 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78  ore_true").    x
12f0: 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d  Parser.add_argum
1300: 65 6e 74 28 22 2d 6a 22 2c 20 22 2d 2d 6a 73 6f  ent("-j", "--jso
1310: 6e 22 2c 20 68 65 6c 70 3d 22 67 65 6e 65 72 61  n", help="genera
1320: 74 65 20 6c 69 73 74 20 6f 66 20 65 72 72 6f 72  te list of error
1330: 73 20 69 6e 20 4a 53 4f 4e 20 28 6f 6e 6c 79 20  s in JSON (only 
1340: 77 69 74 68 20 6f 70 74 69 6f 6e 20 2d 2d 66 69  with option --fi
1350: 6c 65 20 6f 72 20 2d 2d 66 69 6c 65 5f 74 6f 5f  le or --file_to_
1360: 66 69 6c 65 29 22 2c 20 61 63 74 69 6f 6e 3d 22  file)", action="
1370: 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20  store_true").   
1380: 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67   xParser.add_arg
1390: 75 6d 65 6e 74 28 22 2d 63 6c 22 2c 20 22 2d 2d  ument("-cl", "--
13a0: 63 6f 6e 63 61 74 5f 6c 69 6e 65 73 22 2c 20 68  concat_lines", h
13b0: 65 6c 70 3d 22 63 6f 6e 63 61 74 65 6e 61 74 65  elp="concatenate
13c0: 20 6c 69 6e 65 73 20 6e 6f 74 20 73 65 70 61 72   lines not separ
13d0: 61 74 65 64 20 62 79 20 61 6e 20 65 6d 70 74 79  ated by an empty
13e0: 20 70 61 72 61 67 72 61 70 68 20 28 6f 6e 6c 79   paragraph (only
13f0: 20 77 69 74 68 20 6f 70 74 69 6f 6e 20 2d 2d 66   with option --f
1400: 69 6c 65 20 6f 72 20 2d 2d 66 69 6c 65 5f 74 6f  ile or --file_to
1410: 5f 66 69 6c 65 29 22 2c 20 61 63 74 69 6f 6e 3d  _file)", action=
1420: 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20 20  "store_true").  
1430: 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72    xParser.add_ar
1440: 67 75 6d 65 6e 74 28 22 2d 74 66 22 2c 20 22 2d  gument("-tf", "-
1450: 2d 74 65 78 74 66 6f 72 6d 61 74 74 65 72 22 2c  -textformatter",
1460: 20 68 65 6c 70 3d 22 61 75 74 6f 2d 66 6f 72 6d   help="auto-form
1470: 61 74 20 74 65 78 74 20 61 63 63 6f 72 64 69 6e  at text accordin
1480: 67 20 74 6f 20 74 79 70 6f 67 72 61 70 68 69 63  g to typographic
1490: 61 6c 20 72 75 6c 65 73 20 28 75 6e 61 76 61 69  al rules (unavai
14a0: 6c 61 62 6c 65 20 77 69 74 68 20 6f 70 74 69 6f  lable with optio
14b0: 6e 20 2d 2d 63 6f 6e 63 61 74 5f 6c 69 6e 65 73  n --concat_lines
14c0: 29 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72  )", action="stor
14d0: 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50 61  e_true").    xPa
14e0: 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e  rser.add_argumen
14f0: 74 28 22 2d 74 66 6f 22 2c 20 22 2d 2d 74 65 78  t("-tfo", "--tex
1500: 74 66 6f 72 6d 61 74 74 65 72 6f 6e 6c 79 22 2c  tformatteronly",
1510: 20 68 65 6c 70 3d 22 61 75 74 6f 2d 66 6f 72 6d   help="auto-form
1520: 61 74 20 74 65 78 74 20 61 6e 64 20 64 69 73 61  at text and disa
1530: 62 6c 65 20 67 72 61 6d 6d 61 72 20 63 68 65 63  ble grammar chec
1540: 6b 69 6e 67 20 28 6f 6e 6c 79 20 77 69 74 68 20  king (only with 
1550: 6f 70 74 69 6f 6e 20 2d 2d 66 69 6c 65 20 6f 72  option --file or
1560: 20 2d 2d 66 69 6c 65 5f 74 6f 5f 66 69 6c 65 29   --file_to_file)
1570: 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65  ", action="store
1580: 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50 61 72  _true").    xPar
1590: 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74  ser.add_argument
15a0: 28 22 2d 63 74 78 22 2c 20 22 2d 2d 63 6f 6e 74  ("-ctx", "--cont
15b0: 65 78 74 22 2c 20 68 65 6c 70 3d 22 72 65 74 75  ext", help="retu
15c0: 72 6e 20 65 72 72 6f 72 73 20 77 69 74 68 20 63  rn errors with c
15d0: 6f 6e 74 65 78 74 20 28 6f 6e 6c 79 20 77 69 74  ontext (only wit
15e0: 68 20 6f 70 74 69 6f 6e 20 2d 2d 6a 73 6f 6e 29  h option --json)
15f0: 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74 6f 72 65  ", action="store
1600: 5f 74 72 75 65 22 29 0a 20 20 20 20 78 50 61 72  _true").    xPar
1610: 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74  ser.add_argument
1620: 28 22 2d 77 73 73 22 2c 20 22 2d 2d 77 69 74 68  ("-wss", "--with
1630: 5f 73 70 65 6c 6c 5f 73 75 67 67 22 2c 20 68 65  _spell_sugg", he
1640: 6c 70 3d 22 61 64 64 20 73 75 67 67 65 73 74 69  lp="add suggesti
1650: 6f 6e 73 20 66 6f 72 20 73 70 65 6c 6c 69 6e 67  ons for spelling
1660: 20 65 72 72 6f 72 73 20 28 6f 6e 6c 79 20 77 69   errors (only wi
1670: 74 68 20 6f 70 74 69 6f 6e 20 2d 2d 66 69 6c 65  th option --file
1680: 20 6f 72 20 2d 2d 66 69 6c 65 5f 74 6f 5f 66 69   or --file_to_fi
1690: 6c 65 29 22 2c 20 61 63 74 69 6f 6e 3d 22 73 74  le)", action="st
16a0: 6f 72 65 5f 74 72 75 65 22 29 0a 20 20 20 20 78  ore_true").    x
16b0: 50 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d  Parser.add_argum
16c0: 65 6e 74 28 22 2d 77 22 2c 20 22 2d 2d 77 69 64  ent("-w", "--wid
16d0: 74 68 22 2c 20 68 65 6c 70 3d 22 77 69 64 74 68  th", help="width
16e0: 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 28   in characters (
16f0: 34 30 20 3c 20 77 69 64 74 68 20 3c 20 32 30 30  40 < width < 200
1700: 3b 20 64 65 66 61 75 6c 74 3a 20 31 30 30 29 22  ; default: 100)"
1710: 2c 20 74 79 70 65 3d 69 6e 74 2c 20 63 68 6f 69  , type=int, choi
1720: 63 65 73 3d 72 61 6e 67 65 28 34 30 2c 32 30 31  ces=range(40,201
1730: 2c 31 30 29 2c 20 64 65 66 61 75 6c 74 3d 31 30  ,10), default=10
1740: 30 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61  0).    xParser.a
1750: 64 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 6c 6f  dd_argument("-lo
1760: 22 2c 20 22 2d 2d 6c 69 73 74 5f 6f 70 74 69 6f  ", "--list_optio
1770: 6e 73 22 2c 20 68 65 6c 70 3d 22 6c 69 73 74 20  ns", help="list 
1780: 6f 70 74 69 6f 6e 73 22 2c 20 61 63 74 69 6f 6e  options", action
1790: 3d 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20  ="store_true"). 
17a0: 20 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61     xParser.add_a
17b0: 72 67 75 6d 65 6e 74 28 22 2d 6c 72 22 2c 20 22  rgument("-lr", "
17c0: 2d 2d 6c 69 73 74 5f 72 75 6c 65 73 22 2c 20 6e  --list_rules", n
17d0: 61 72 67 73 3d 22 3f 22 2c 20 68 65 6c 70 3d 22  args="?", help="
17e0: 6c 69 73 74 20 72 75 6c 65 73 20 5b 72 65 67 65  list rules [rege
17f0: 78 20 70 61 74 74 65 72 6e 20 61 73 20 66 69 6c  x pattern as fil
1800: 74 65 72 5d 22 2c 20 63 6f 6e 73 74 3d 22 2a 22  ter]", const="*"
1810: 29 0a 20 20 20 20 78 50 61 72 73 65 72 2e 61 64  ).    xParser.ad
1820: 64 5f 61 72 67 75 6d 65 6e 74 28 22 2d 73 75 67  d_argument("-sug
1830: 22 2c 20 22 2d 2d 73 75 67 67 65 73 74 22 2c 20  ", "--suggest", 
1840: 68 65 6c 70 3d 22 67 65 74 20 73 75 67 67 65 73  help="get sugges
1850: 74 69 6f 6e 73 20 6c 69 73 74 20 66 6f 72 20 67  tions list for g
1860: 69 76 65 6e 20 77 6f 72 64 22 2c 20 74 79 70 65  iven word", type
1870: 3d 73 74 72 29 0a 20 20 20 20 78 50 61 72 73 65  =str).    xParse
1880: 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22  r.add_argument("
1890: 2d 6f 6e 22 2c 20 22 2d 2d 6f 70 74 5f 6f 6e 22  -on", "--opt_on"
18a0: 2c 20 6e 61 72 67 73 3d 22 2b 22 2c 20 68 65 6c  , nargs="+", hel
18b0: 70 3d 22 61 63 74 69 76 61 74 65 20 6f 70 74 69  p="activate opti
18c0: 6f 6e 73 22 29 0a 20 20 20 20 78 50 61 72 73 65  ons").    xParse
18d0: 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 22  r.add_argument("
18e0: 2d 6f 66 66 22 2c 20 22 2d 2d 6f 70 74 5f 6f 66  -off", "--opt_of
18f0: 66 22 2c 20 6e 61 72 67 73 3d 22 2b 22 2c 20 68  f", nargs="+", h
1900: 65 6c 70 3d 22 64 65 61 63 74 69 76 61 74 65 20  elp="deactivate 
1910: 6f 70 74 69 6f 6e 73 22 29 0a 20 20 20 20 78 50  options").    xP
1920: 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65  arser.add_argume
1930: 6e 74 28 22 2d 72 6f 66 66 22 2c 20 22 2d 2d 72  nt("-roff", "--r
1940: 75 6c 65 5f 6f 66 66 22 2c 20 6e 61 72 67 73 3d  ule_off", nargs=
1950: 22 2b 22 2c 20 68 65 6c 70 3d 22 64 65 61 63 74  "+", help="deact
1960: 69 76 61 74 65 20 72 75 6c 65 73 22 29 0a 20 20  ivate rules").  
1970: 20 20 78 50 61 72 73 65 72 2e 61 64 64 5f 61 72    xParser.add_ar
1980: 67 75 6d 65 6e 74 28 22 2d 64 22 2c 20 22 2d 2d  gument("-d", "--
1990: 64 65 62 75 67 22 2c 20 68 65 6c 70 3d 22 64 65  debug", help="de
19a0: 62 75 67 67 69 6e 67 20 6d 6f 64 65 20 28 6f 6e  bugging mode (on
19b0: 6c 79 20 69 6e 20 69 6e 74 65 72 61 63 74 69 76  ly in interactiv
19c0: 65 20 6d 6f 64 65 29 22 2c 20 61 63 74 69 6f 6e  e mode)", action
19d0: 3d 22 73 74 6f 72 65 5f 74 72 75 65 22 29 0a 20  ="store_true"). 
19e0: 20 20 20 78 41 72 67 73 20 3d 20 78 50 61 72 73     xArgs = xPars
19f0: 65 72 2e 70 61 72 73 65 5f 61 72 67 73 28 29 0a  er.parse_args().
1a00: 0a 20 20 20 20 67 63 65 2e 6c 6f 61 64 28 29 0a  .    gce.load().
1a10: 20 20 20 20 69 66 20 6e 6f 74 20 78 41 72 67 73      if not xArgs
1a20: 2e 6a 73 6f 6e 3a 0a 20 20 20 20 20 20 20 20 65  .json:.        e
1a30: 63 68 6f 28 22 47 72 61 6d 6d 61 6c 65 63 74 65  cho("Grammalecte
1a40: 20 76 7b 7d 22 2e 66 6f 72 6d 61 74 28 67 63 65   v{}".format(gce
1a50: 2e 76 65 72 73 69 6f 6e 29 29 0a 20 20 20 20 6f  .version)).    o
1a60: 53 70 65 6c 6c 43 68 65 63 6b 65 72 20 3d 20 67  SpellChecker = g
1a70: 63 65 2e 67 65 74 53 70 65 6c 6c 43 68 65 63 6b  ce.getSpellCheck
1a80: 65 72 28 29 0a 20 20 20 20 6f 54 6f 6b 65 6e 69  er().    oTokeni
1a90: 7a 65 72 20 3d 20 74 6b 7a 2e 54 6f 6b 65 6e 69  zer = tkz.Tokeni
1aa0: 7a 65 72 28 22 66 72 22 29 0a 20 20 20 20 6f 4c  zer("fr").    oL
1ab0: 65 78 47 72 61 70 68 65 20 3d 20 6c 78 67 2e 4c  exGraphe = lxg.L
1ac0: 65 78 69 63 6f 67 72 61 70 68 65 28 6f 53 70 65  exicographe(oSpe
1ad0: 6c 6c 43 68 65 63 6b 65 72 29 0a 20 20 20 20 69  llChecker).    i
1ae0: 66 20 78 41 72 67 73 2e 74 65 78 74 66 6f 72 6d  f xArgs.textform
1af0: 61 74 74 65 72 20 6f 72 20 78 41 72 67 73 2e 74  atter or xArgs.t
1b00: 65 78 74 66 6f 72 6d 61 74 74 65 72 6f 6e 6c 79  extformatteronly
1b10: 3a 0a 20 20 20 20 20 20 20 20 6f 54 46 20 3d 20  :.        oTF = 
1b20: 74 66 2e 54 65 78 74 46 6f 72 6d 61 74 74 65 72  tf.TextFormatter
1b30: 28 29 0a 0a 20 20 20 20 69 66 20 78 41 72 67 73  ()..    if xArgs
1b40: 2e 6c 69 73 74 5f 6f 70 74 69 6f 6e 73 20 6f 72  .list_options or
1b50: 20 78 41 72 67 73 2e 6c 69 73 74 5f 72 75 6c 65   xArgs.list_rule
1b60: 73 3a 0a 20 20 20 20 20 20 20 20 69 66 20 78 41  s:.        if xA
1b70: 72 67 73 2e 6c 69 73 74 5f 6f 70 74 69 6f 6e 73  rgs.list_options
1b80: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 63  :.            gc
1b90: 65 2e 64 69 73 70 6c 61 79 4f 70 74 69 6f 6e 73  e.displayOptions
1ba0: 28 22 66 72 22 29 0a 20 20 20 20 20 20 20 20 69  ("fr").        i
1bb0: 66 20 78 41 72 67 73 2e 6c 69 73 74 5f 72 75 6c  f xArgs.list_rul
1bc0: 65 73 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  es:.            
1bd0: 67 63 65 2e 64 69 73 70 6c 61 79 52 75 6c 65 73  gce.displayRules
1be0: 28 4e 6f 6e 65 20 20 69 66 20 78 41 72 67 73 2e  (None  if xArgs.
1bf0: 6c 69 73 74 5f 72 75 6c 65 73 20 3d 3d 20 22 2a  list_rules == "*
1c00: 22 20 20 65 6c 73 65 20 78 41 72 67 73 2e 6c 69  "  else xArgs.li
1c10: 73 74 5f 72 75 6c 65 73 29 0a 20 20 20 20 20 20  st_rules).      
1c20: 20 20 65 78 69 74 28 29 0a 0a 20 20 20 20 69 66    exit()..    if
1c30: 20 78 41 72 67 73 2e 73 75 67 67 65 73 74 3a 0a   xArgs.suggest:.
1c40: 20 20 20 20 20 20 20 20 66 6f 72 20 6c 53 75 67          for lSug
1c50: 67 20 69 6e 20 6f 53 70 65 6c 6c 43 68 65 63 6b  g in oSpellCheck
1c60: 65 72 2e 73 75 67 67 65 73 74 28 78 41 72 67 73  er.suggest(xArgs
1c70: 2e 73 75 67 67 65 73 74 29 3a 0a 20 20 20 20 20  .suggest):.     
1c80: 20 20 20 20 20 20 20 69 66 20 78 41 72 67 73 2e         if xArgs.
1c90: 6a 73 6f 6e 3a 0a 20 20 20 20 20 20 20 20 20 20  json:.          
1ca0: 20 20 20 20 20 20 73 54 65 78 74 20 3d 20 6a 73        sText = js
1cb0: 6f 6e 2e 64 75 6d 70 73 28 7b 20 22 61 53 75 67  on.dumps({ "aSug
1cc0: 67 65 73 74 69 6f 6e 73 22 3a 20 6c 53 75 67 67  gestions": lSugg
1cd0: 20 7d 2c 20 65 6e 73 75 72 65 5f 61 73 63 69 69   }, ensure_ascii
1ce0: 3d 46 61 6c 73 65 29 0a 20 20 20 20 20 20 20 20  =False).        
1cf0: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
1d00: 20 20 20 20 20 20 20 20 20 20 73 54 65 78 74 20            sText 
1d10: 3d 20 22 53 75 67 67 65 73 74 69 6f 6e 73 20 3a  = "Suggestions :
1d20: 20 22 20 2b 20 22 20 7c 20 22 2e 6a 6f 69 6e 28   " + " | ".join(
1d30: 6c 53 75 67 67 29 0a 20 20 20 20 20 20 20 20 20  lSugg).         
1d40: 20 20 20 65 63 68 6f 28 73 54 65 78 74 29 0a 20     echo(sText). 
1d50: 20 20 20 20 20 20 20 65 78 69 74 28 29 0a 0a 20         exit().. 
1d60: 20 20 20 69 66 20 6e 6f 74 20 78 41 72 67 73 2e     if not xArgs.
1d70: 6a 73 6f 6e 3a 0a 20 20 20 20 20 20 20 20 78 41  json:.        xA
1d80: 72 67 73 2e 63 6f 6e 74 65 78 74 20 3d 20 46 61  rgs.context = Fa
1d90: 6c 73 65 0a 0a 20 20 20 20 67 63 65 2e 73 65 74  lse..    gce.set
1da0: 4f 70 74 69 6f 6e 73 28 7b 22 68 74 6d 6c 22 3a  Options({"html":
1db0: 20 54 72 75 65 2c 20 22 6c 61 74 65 78 22 3a 20   True, "latex": 
1dc0: 54 72 75 65 7d 29 0a 20 20 20 20 69 66 20 78 41  True}).    if xA
1dd0: 72 67 73 2e 6f 70 74 5f 6f 6e 3a 0a 20 20 20 20  rgs.opt_on:.    
1de0: 20 20 20 20 67 63 65 2e 73 65 74 4f 70 74 69 6f      gce.setOptio
1df0: 6e 73 28 7b 20 6f 70 74 3a 54 72 75 65 20 20 66  ns({ opt:True  f
1e00: 6f 72 20 6f 70 74 20 69 6e 20 78 41 72 67 73 2e  or opt in xArgs.
1e10: 6f 70 74 5f 6f 6e 20 20 69 66 20 6f 70 74 20 69  opt_on  if opt i
1e20: 6e 20 67 63 65 2e 67 65 74 4f 70 74 69 6f 6e 73  n gce.getOptions
1e30: 28 29 20 7d 29 0a 20 20 20 20 69 66 20 78 41 72  () }).    if xAr
1e40: 67 73 2e 6f 70 74 5f 6f 66 66 3a 0a 20 20 20 20  gs.opt_off:.    
1e50: 20 20 20 20 67 63 65 2e 73 65 74 4f 70 74 69 6f      gce.setOptio
1e60: 6e 73 28 7b 20 6f 70 74 3a 46 61 6c 73 65 20 20  ns({ opt:False  
1e70: 66 6f 72 20 6f 70 74 20 69 6e 20 78 41 72 67 73  for opt in xArgs
1e80: 2e 6f 70 74 5f 6f 66 66 20 20 69 66 20 6f 70 74  .opt_off  if opt
1e90: 20 69 6e 20 67 63 65 2e 67 65 74 4f 70 74 69 6f   in gce.getOptio
1ea0: 6e 73 28 29 20 7d 29 0a 0a 20 20 20 20 69 66 20  ns() })..    if 
1eb0: 78 41 72 67 73 2e 72 75 6c 65 5f 6f 66 66 3a 0a  xArgs.rule_off:.
1ec0: 20 20 20 20 20 20 20 20 66 6f 72 20 73 52 75 6c          for sRul
1ed0: 65 20 69 6e 20 78 41 72 67 73 2e 72 75 6c 65 5f  e in xArgs.rule_
1ee0: 6f 66 66 3a 0a 20 20 20 20 20 20 20 20 20 20 20  off:.           
1ef0: 20 67 63 65 2e 69 67 6e 6f 72 65 52 75 6c 65 28   gce.ignoreRule(
1f00: 73 52 75 6c 65 29 0a 0a 20 20 20 20 73 46 69 6c  sRule)..    sFil
1f10: 65 20 3d 20 78 41 72 67 73 2e 66 69 6c 65 20 6f  e = xArgs.file o
1f20: 72 20 78 41 72 67 73 2e 66 69 6c 65 5f 74 6f 5f  r xArgs.file_to_
1f30: 66 69 6c 65 0a 20 20 20 20 69 66 20 73 46 69 6c  file.    if sFil
1f40: 65 3a 0a 20 20 20 20 20 20 20 20 23 20 66 69 6c  e:.        # fil
1f50: 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
1f60: 20 20 20 20 20 68 44 73 74 20 3d 20 6f 70 65 6e       hDst = open
1f70: 28 73 46 69 6c 65 5b 3a 73 46 69 6c 65 2e 72 66  (sFile[:sFile.rf
1f80: 69 6e 64 28 22 2e 22 29 5d 2b 22 2e 72 65 73 2e  ind(".")]+".res.
1f90: 74 78 74 22 2c 20 22 77 22 2c 20 65 6e 63 6f 64  txt", "w", encod
1fa0: 69 6e 67 3d 22 75 74 66 2d 38 22 2c 20 6e 65 77  ing="utf-8", new
1fb0: 6c 69 6e 65 3d 22 5c 6e 22 29 20 20 69 66 20 78  line="\n")  if x
1fc0: 41 72 67 73 2e 66 69 6c 65 5f 74 6f 5f 66 69 6c  Args.file_to_fil
1fd0: 65 20 6f 72 20 73 79 73 2e 70 6c 61 74 66 6f 72  e or sys.platfor
1fe0: 6d 20 3d 3d 20 22 77 69 6e 33 32 22 20 20 65 6c  m == "win32"  el
1ff0: 73 65 20 4e 6f 6e 65 0a 20 20 20 20 20 20 20 20  se None.        
2000: 62 43 6f 6d 6d 61 20 3d 20 46 61 6c 73 65 0a 20  bComma = False. 
2010: 20 20 20 20 20 20 20 69 66 20 78 41 72 67 73 2e         if xArgs.
2020: 6a 73 6f 6e 3a 0a 20 20 20 20 20 20 20 20 20 20  json:.          
2030: 20 20 6f 75 74 70 75 74 28 27 7b 20 22 67 72 61    output('{ "gra
2040: 6d 6d 61 6c 65 63 74 65 22 3a 20 22 27 2b 67 63  mmalecte": "'+gc
2050: 65 2e 76 65 72 73 69 6f 6e 2b 27 22 2c 20 22 6c  e.version+'", "l
2060: 61 6e 67 22 3a 20 22 27 2b 67 63 65 2e 6c 61 6e  ang": "'+gce.lan
2070: 67 2b 27 22 2c 20 22 64 61 74 61 22 20 3a 20 5b  g+'", "data" : [
2080: 5c 6e 27 2c 20 68 44 73 74 29 0a 20 20 20 20 20  \n', hDst).     
2090: 20 20 20 69 66 20 6e 6f 74 20 78 41 72 67 73 2e     if not xArgs.
20a0: 63 6f 6e 63 61 74 5f 6c 69 6e 65 73 3a 0a 20 20  concat_lines:.  
20b0: 20 20 20 20 20 20 20 20 20 20 23 20 70 61 73 20            # pas 
20c0: 64 65 20 63 6f 6e 63 61 74 c3 a9 6e 61 74 69 6f  de concat..natio
20d0: 6e 20 64 65 73 20 6c 69 67 6e 65 73 0a 20 20 20  n des lignes.   
20e0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 2c 20           for i, 
20f0: 73 54 65 78 74 20 69 6e 20 65 6e 75 6d 65 72 61  sText in enumera
2100: 74 65 28 72 65 61 64 66 69 6c 65 28 73 46 69 6c  te(readfile(sFil
2110: 65 29 2c 20 31 29 3a 0a 20 20 20 20 20 20 20 20  e), 1):.        
2120: 20 20 20 20 20 20 20 20 69 66 20 78 41 72 67 73          if xArgs
2130: 2e 74 65 78 74 66 6f 72 6d 61 74 74 65 72 20 6f  .textformatter o
2140: 72 20 78 41 72 67 73 2e 74 65 78 74 66 6f 72 6d  r xArgs.textform
2150: 61 74 74 65 72 6f 6e 6c 79 3a 0a 20 20 20 20 20  atteronly:.     
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2170: 54 65 78 74 20 3d 20 6f 54 46 2e 66 6f 72 6d 61  Text = oTF.forma
2180: 74 54 65 78 74 28 73 54 65 78 74 29 0a 20 20 20  tText(sText).   
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
21a0: 78 41 72 67 73 2e 74 65 78 74 66 6f 72 6d 61 74  xArgs.textformat
21b0: 74 65 72 6f 6e 6c 79 3a 0a 20 20 20 20 20 20 20  teronly:.       
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74               out
21d0: 70 75 74 28 73 54 65 78 74 2c 20 68 44 73 74 29  put(sText, hDst)
21e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21f0: 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20   else:.         
2200: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 78 41             if xA
2210: 72 67 73 2e 6a 73 6f 6e 3a 0a 20 20 20 20 20 20  rgs.json:.      
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 73 54 65 78 74 20 3d 20 67 65 6e 65 72 61    sText = genera
2240: 74 65 4a 53 4f 4e 28 69 2c 20 73 54 65 78 74 2c  teJSON(i, sText,
2250: 20 6f 54 6f 6b 65 6e 69 7a 65 72 2c 20 6f 53 70   oTokenizer, oSp
2260: 65 6c 6c 43 68 65 63 6b 65 72 2c 20 62 43 6f 6e  ellChecker, bCon
2270: 74 65 78 74 3d 78 41 72 67 73 2e 63 6f 6e 74 65  text=xArgs.conte
2280: 78 74 2c 20 62 44 65 62 75 67 3d 46 61 6c 73 65  xt, bDebug=False
2290: 2c 20 62 45 6d 70 74 79 49 66 4e 6f 45 72 72 6f  , bEmptyIfNoErro
22a0: 72 73 3d 78 41 72 67 73 2e 6f 6e 6c 79 5f 77 68  rs=xArgs.only_wh
22b0: 65 6e 5f 65 72 72 6f 72 73 2c 20 62 53 70 65 6c  en_errors, bSpel
22c0: 6c 53 75 67 67 3d 78 41 72 67 73 2e 77 69 74 68  lSugg=xArgs.with
22d0: 5f 73 70 65 6c 6c 5f 73 75 67 67 2c 20 62 52 65  _spell_sugg, bRe
22e0: 74 75 72 6e 54 65 78 74 3d 78 41 72 67 73 2e 74  turnText=xArgs.t
22f0: 65 78 74 66 6f 72 6d 61 74 74 65 72 29 0a 20 20  extformatter).  
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20    else:.        
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2330: 73 54 65 78 74 20 3d 20 67 65 6e 65 72 61 74 65  sText = generate
2340: 54 65 78 74 28 73 54 65 78 74 2c 20 6f 54 6f 6b  Text(sText, oTok
2350: 65 6e 69 7a 65 72 2c 20 6f 53 70 65 6c 6c 43 68  enizer, oSpellCh
2360: 65 63 6b 65 72 2c 20 62 44 65 62 75 67 3d 46 61  ecker, bDebug=Fa
2370: 6c 73 65 2c 20 62 45 6d 70 74 79 49 66 4e 6f 45  lse, bEmptyIfNoE
2380: 72 72 6f 72 73 3d 78 41 72 67 73 2e 6f 6e 6c 79  rrors=xArgs.only
2390: 5f 77 68 65 6e 5f 65 72 72 6f 72 73 2c 20 62 53  _when_errors, bS
23a0: 70 65 6c 6c 53 75 67 67 3d 78 41 72 67 73 2e 77  pellSugg=xArgs.w
23b0: 69 74 68 5f 73 70 65 6c 6c 5f 73 75 67 67 2c 20  ith_spell_sugg, 
23c0: 6e 57 69 64 74 68 3d 78 41 72 67 73 2e 77 69 64  nWidth=xArgs.wid
23d0: 74 68 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  th).            
23e0: 20 20 20 20 20 20 20 20 69 66 20 73 54 65 78 74          if sText
23f0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
2400: 20 20 20 20 20 20 20 20 20 20 69 66 20 78 41 72            if xAr
2410: 67 73 2e 6a 73 6f 6e 20 61 6e 64 20 62 43 6f 6d  gs.json and bCom
2420: 6d 61 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ma:.            
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 6f 75 74 70 75 74 28 22 2c 5c 6e 22 2c 20 68 44  output(",\n", hD
2450: 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  st).            
2460: 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70              outp
2470: 75 74 28 73 54 65 78 74 2c 20 68 44 73 74 29 0a  ut(sText, hDst).
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 20 20 20 20 20 20 62 43 6f 6d 6d 61 20 3d          bComma =
24a0: 20 54 72 75 65 0a 20 20 20 20 20 20 20 20 20 20   True.          
24b0: 20 20 20 20 20 20 69 66 20 68 44 73 74 3a 0a 20        if hDst:. 
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 20 65 63 68 6f 28 22 c2 a7 20 25 64 5c 72     echo(".. %d\r
24e0: 22 20 25 20 69 2c 20 65 6e 64 3d 22 22 2c 20 66  " % i, end="", f
24f0: 6c 75 73 68 3d 54 72 75 65 29 0a 20 20 20 20 20  lush=True).     
2500: 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20     else:.       
2510: 20 20 20 20 20 23 20 63 6f 6e 63 61 74 c3 a9 6e       # concat..n
2520: 61 74 69 6f 6e 20 64 65 73 20 6c 69 67 6e 65 73  ation des lignes
2530: 20 6e 6f 6e 20 73 c3 a9 70 61 72 c3 a9 65 73 20   non s..par..es 
2540: 70 61 72 20 75 6e 65 20 6c 69 67 6e 65 20 76 69  par une ligne vi
2550: 64 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  de.            f
2560: 6f 72 20 69 2c 20 6c 4c 69 6e 65 20 69 6e 20 65  or i, lLine in e
2570: 6e 75 6d 65 72 61 74 65 28 72 65 61 64 66 69 6c  numerate(readfil
2580: 65 41 6e 64 43 6f 6e 63 61 74 4c 69 6e 65 73 28  eAndConcatLines(
2590: 73 46 69 6c 65 29 2c 20 31 29 3a 0a 20 20 20 20  sFile), 1):.    
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 54 65 78              sTex
25b0: 74 2c 20 6c 4c 69 6e 65 53 65 74 20 3d 20 74 78  t, lLineSet = tx
25c0: 74 2e 63 72 65 61 74 65 50 61 72 61 67 72 61 70  t.createParagrap
25d0: 68 57 69 74 68 4c 69 6e 65 73 28 6c 4c 69 6e 65  hWithLines(lLine
25e0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
25f0: 20 20 69 66 20 78 41 72 67 73 2e 6a 73 6f 6e 3a    if xArgs.json:
2600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2610: 20 20 20 20 20 73 54 65 78 74 20 3d 20 67 65 6e       sText = gen
2620: 65 72 61 74 65 4a 53 4f 4e 28 69 2c 20 73 54 65  erateJSON(i, sTe
2630: 78 74 2c 20 6f 54 6f 6b 65 6e 69 7a 65 72 2c 20  xt, oTokenizer, 
2640: 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72 2c 20 62  oSpellChecker, b
2650: 43 6f 6e 74 65 78 74 3d 78 41 72 67 73 2e 63 6f  Context=xArgs.co
2660: 6e 74 65 78 74 2c 20 62 44 65 62 75 67 3d 46 61  ntext, bDebug=Fa
2670: 6c 73 65 2c 20 62 45 6d 70 74 79 49 66 4e 6f 45  lse, bEmptyIfNoE
2680: 72 72 6f 72 73 3d 78 41 72 67 73 2e 6f 6e 6c 79  rrors=xArgs.only
2690: 5f 77 68 65 6e 5f 65 72 72 6f 72 73 2c 20 62 53  _when_errors, bS
26a0: 70 65 6c 6c 53 75 67 67 3d 78 41 72 67 73 2e 77  pellSugg=xArgs.w
26b0: 69 74 68 5f 73 70 65 6c 6c 5f 73 75 67 67 2c 20  ith_spell_sugg, 
26c0: 6c 4c 69 6e 65 53 65 74 3d 6c 4c 69 6e 65 53 65  lLineSet=lLineSe
26d0: 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t).             
26e0: 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20     else:.       
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 54 65               sTe
2700: 78 74 20 3d 20 67 65 6e 65 72 61 74 65 54 65 78  xt = generateTex
2710: 74 28 73 54 65 78 74 2c 20 6f 54 6f 6b 65 6e 69  t(sText, oTokeni
2720: 7a 65 72 2c 20 6f 53 70 65 6c 6c 43 68 65 63 6b  zer, oSpellCheck
2730: 65 72 2c 20 62 44 65 62 75 67 3d 46 61 6c 73 65  er, bDebug=False
2740: 2c 20 62 45 6d 70 74 79 49 66 4e 6f 45 72 72 6f  , bEmptyIfNoErro
2750: 72 73 3d 78 41 72 67 73 2e 6f 6e 6c 79 5f 77 68  rs=xArgs.only_wh
2760: 65 6e 5f 65 72 72 6f 72 73 2c 20 62 53 70 65 6c  en_errors, bSpel
2770: 6c 53 75 67 67 3d 78 41 72 67 73 2e 77 69 74 68  lSugg=xArgs.with
2780: 5f 73 70 65 6c 6c 5f 73 75 67 67 2c 20 6e 57 69  _spell_sugg, nWi
2790: 64 74 68 3d 78 41 72 67 73 2e 77 69 64 74 68 29  dth=xArgs.width)
27a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27b0: 20 69 66 20 73 54 65 78 74 3a 0a 20 20 20 20 20   if sText:.     
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
27d0: 66 20 78 41 72 67 73 2e 6a 73 6f 6e 20 61 6e 64  f xArgs.json and
27e0: 20 62 43 6f 6d 6d 61 3a 0a 20 20 20 20 20 20 20   bComma:.       
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2800: 20 6f 75 74 70 75 74 28 22 2c 5c 6e 22 2c 20 68   output(",\n", h
2810: 44 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 20  Dst).           
2820: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 28           output(
2830: 73 54 65 78 74 2c 20 68 44 73 74 29 0a 20 20 20  sText, hDst).   
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 62 43 6f 6d 6d 61 20 3d 20 54 72 75 65 0a 20   bComma = True. 
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2870: 66 20 68 44 73 74 3a 0a 20 20 20 20 20 20 20 20  f hDst:.        
2880: 20 20 20 20 20 20 20 20 20 20 20 20 65 63 68 6f              echo
2890: 28 22 c2 a7 20 25 64 5c 72 22 20 25 20 69 2c 20  (".. %d\r" % i, 
28a0: 65 6e 64 3d 22 22 2c 20 66 6c 75 73 68 3d 54 72  end="", flush=Tr
28b0: 75 65 29 0a 20 20 20 20 20 20 20 20 69 66 20 78  ue).        if x
28c0: 41 72 67 73 2e 6a 73 6f 6e 3a 0a 20 20 20 20 20  Args.json:.     
28d0: 20 20 20 20 20 20 20 6f 75 74 70 75 74 28 22 5c         output("\
28e0: 6e 5d 7d 5c 6e 22 2c 20 68 44 73 74 29 0a 20 20  n]}\n", hDst).  
28f0: 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20    else:.        
2900: 23 20 70 73 65 75 64 6f 2d 63 6f 6e 73 6f 6c 65  # pseudo-console
2910: 0a 20 20 20 20 20 20 20 20 73 49 6e 70 75 74 54  .        sInputT
2920: 65 78 74 20 3d 20 22 5c 6e 7e 3d 3d 3d 3d 3d 3d  ext = "\n~======
2930: 3d 3d 3d 3d 7e 20 45 6e 74 65 72 20 79 6f 75 72  ====~ Enter your
2940: 20 74 65 78 74 20 5b 2f 68 20 2f 71 5d 20 7e 3d   text [/h /q] ~=
2950: 3d 3d 3d 3d 3d 3d 3d 3d 3d 7e 5c 6e 22 0a 20 20  =========~\n".  
2960: 20 20 20 20 20 20 73 54 65 78 74 20 3d 20 5f 67        sText = _g
2970: 65 74 54 65 78 74 28 73 49 6e 70 75 74 54 65 78  etText(sInputTex
2980: 74 29 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  t).        while
2990: 20 54 72 75 65 3a 0a 20 20 20 20 20 20 20 20 20   True:.         
29a0: 20 20 20 69 66 20 73 54 65 78 74 2e 73 74 61 72     if sText.star
29b0: 74 73 77 69 74 68 28 22 3f 22 29 3a 0a 20 20 20  tswith("?"):.   
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
29d0: 20 73 57 6f 72 64 20 69 6e 20 73 54 65 78 74 5b   sWord in sText[
29e0: 31 3a 5d 2e 73 74 72 69 70 28 29 2e 73 70 6c 69  1:].strip().spli
29f0: 74 28 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  t():.           
2a00: 20 20 20 20 20 20 20 20 20 69 66 20 73 57 6f 72           if sWor
2a10: 64 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d:.             
2a20: 20 20 20 20 20 20 20 20 20 20 20 65 63 68 6f 28             echo(
2a30: 22 2a 20 22 20 2b 20 73 57 6f 72 64 29 0a 20 20  "* " + sWord).  
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 20 20 20 20 66 6f 72 20 73 4d 6f 72 70 68        for sMorph
2a60: 20 69 6e 20 6f 53 70 65 6c 6c 43 68 65 63 6b 65   in oSpellChecke
2a70: 72 2e 67 65 74 4d 6f 72 70 68 28 73 57 6f 72 64  r.getMorph(sWord
2a80: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ):.             
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
2aa0: 63 68 6f 28 22 20 20 7b 3a 3c 33 32 7d 20 7b 7d  cho("  {:<32} {}
2ab0: 22 2e 66 6f 72 6d 61 74 28 73 4d 6f 72 70 68 2c  ".format(sMorph,
2ac0: 20 6f 4c 65 78 47 72 61 70 68 65 2e 66 6f 72 6d   oLexGraphe.form
2ad0: 61 74 54 61 67 73 28 73 4d 6f 72 70 68 29 29 29  atTags(sMorph)))
2ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 69  .            eli
2af0: 66 20 73 54 65 78 74 2e 73 74 61 72 74 73 77 69  f sText.startswi
2b00: 74 68 28 22 21 22 29 3a 0a 20 20 20 20 20 20 20  th("!"):.       
2b10: 20 20 20 20 20 20 20 20 20 66 6f 72 20 73 57 6f           for sWo
2b20: 72 64 20 69 6e 20 73 54 65 78 74 5b 31 3a 5d 2e  rd in sText[1:].
2b30: 73 74 72 69 70 28 29 2e 73 70 6c 69 74 28 29 3a  strip().split():
2b40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b50: 20 20 20 20 20 69 66 20 73 57 6f 72 64 3a 0a 20       if sWord:. 
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 20 20 20 20 20 20 66 6f 72 20 6c 53 75 67 67         for lSugg
2b80: 20 69 6e 20 6f 53 70 65 6c 6c 43 68 65 63 6b 65   in oSpellChecke
2b90: 72 2e 73 75 67 67 65 73 74 28 73 57 6f 72 64 29  r.suggest(sWord)
2ba0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 63                ec
2bc0: 68 6f 28 22 20 7c 20 22 2e 6a 6f 69 6e 28 6c 53  ho(" | ".join(lS
2bd0: 75 67 67 29 29 0a 20 20 20 20 20 20 20 20 20 20  ugg)).          
2be0: 20 20 65 6c 69 66 20 73 54 65 78 74 2e 73 74 61    elif sText.sta
2bf0: 72 74 73 77 69 74 68 28 22 3e 22 29 3a 0a 20 20  rtswith(">"):.  
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 53                oS
2c10: 70 65 6c 6c 43 68 65 63 6b 65 72 2e 64 72 61 77  pellChecker.draw
2c20: 50 61 74 68 28 73 54 65 78 74 5b 31 3a 5d 2e 73  Path(sText[1:].s
2c30: 74 72 69 70 28 29 29 0a 20 20 20 20 20 20 20 20  trip()).        
2c40: 20 20 20 20 65 6c 69 66 20 73 54 65 78 74 2e 73      elif sText.s
2c50: 74 61 72 74 73 77 69 74 68 28 22 3d 22 29 3a 0a  tartswith("="):.
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c70: 66 6f 72 20 73 52 65 73 20 69 6e 20 6f 53 70 65  for sRes in oSpe
2c80: 6c 6c 43 68 65 63 6b 65 72 2e 73 65 6c 65 63 74  llChecker.select
2c90: 28 73 54 65 78 74 5b 31 3a 5d 2e 73 74 72 69 70  (sText[1:].strip
2ca0: 28 29 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ()):.           
2cb0: 20 20 20 20 20 20 20 20 20 65 63 68 6f 28 73 52           echo(sR
2cc0: 65 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  es).            
2cd0: 65 6c 69 66 20 73 54 65 78 74 2e 73 74 61 72 74  elif sText.start
2ce0: 73 77 69 74 68 28 22 2f 2b 20 22 29 3a 0a 20 20  swith("/+ "):.  
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 63                gc
2d00: 65 2e 73 65 74 4f 70 74 69 6f 6e 73 28 7b 20 6f  e.setOptions({ o
2d10: 70 74 3a 54 72 75 65 20 20 66 6f 72 20 6f 70 74  pt:True  for opt
2d20: 20 69 6e 20 73 54 65 78 74 5b 33 3a 5d 2e 73 74   in sText[3:].st
2d30: 72 69 70 28 29 2e 73 70 6c 69 74 28 29 20 20 69  rip().split()  i
2d40: 66 20 6f 70 74 20 69 6e 20 67 63 65 2e 67 65 74  f opt in gce.get
2d50: 4f 70 74 69 6f 6e 73 28 29 20 7d 29 0a 20 20 20  Options() }).   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 63 68               ech
2d70: 6f 28 22 64 6f 6e 65 22 29 0a 20 20 20 20 20 20  o("done").      
2d80: 20 20 20 20 20 20 65 6c 69 66 20 73 54 65 78 74        elif sText
2d90: 2e 73 74 61 72 74 73 77 69 74 68 28 22 2f 2d 20  .startswith("/- 
2da0: 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  "):.            
2db0: 20 20 20 20 67 63 65 2e 73 65 74 4f 70 74 69 6f      gce.setOptio
2dc0: 6e 73 28 7b 20 6f 70 74 3a 46 61 6c 73 65 20 20  ns({ opt:False  
2dd0: 66 6f 72 20 6f 70 74 20 69 6e 20 73 54 65 78 74  for opt in sText
2de0: 5b 33 3a 5d 2e 73 74 72 69 70 28 29 2e 73 70 6c  [3:].strip().spl
2df0: 69 74 28 29 20 20 69 66 20 6f 70 74 20 69 6e 20  it()  if opt in 
2e00: 67 63 65 2e 67 65 74 4f 70 74 69 6f 6e 73 28 29  gce.getOptions()
2e10: 20 7d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   }).            
2e20: 20 20 20 20 65 63 68 6f 28 22 64 6f 6e 65 22 29      echo("done")
2e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 69  .            eli
2e40: 66 20 73 54 65 78 74 2e 73 74 61 72 74 73 77 69  f sText.startswi
2e50: 74 68 28 22 2f 2d 2d 20 22 29 3a 0a 20 20 20 20  th("/-- "):.    
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
2e70: 73 52 75 6c 65 20 69 6e 20 73 54 65 78 74 5b 33  sRule in sText[3
2e80: 3a 5d 2e 73 74 72 69 70 28 29 2e 73 70 6c 69 74  :].strip().split
2e90: 28 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ():.            
2ea0: 20 20 20 20 20 20 20 20 67 63 65 2e 69 67 6e 6f          gce.igno
2eb0: 72 65 52 75 6c 65 28 73 52 75 6c 65 29 0a 20 20  reRule(sRule).  
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 63                ec
2ed0: 68 6f 28 22 64 6f 6e 65 22 29 0a 20 20 20 20 20  ho("done").     
2ee0: 20 20 20 20 20 20 20 65 6c 69 66 20 73 54 65 78         elif sTex
2ef0: 74 2e 73 74 61 72 74 73 77 69 74 68 28 22 2f 2b  t.startswith("/+
2f00: 2b 20 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  + "):.          
2f10: 20 20 20 20 20 20 66 6f 72 20 73 52 75 6c 65 20        for sRule 
2f20: 69 6e 20 73 54 65 78 74 5b 33 3a 5d 2e 73 74 72  in sText[3:].str
2f30: 69 70 28 29 2e 73 70 6c 69 74 28 29 3a 0a 20 20  ip().split():.  
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f50: 20 20 67 63 65 2e 72 65 61 63 74 69 76 61 74 65    gce.reactivate
2f60: 52 75 6c 65 28 73 52 75 6c 65 29 0a 20 20 20 20  Rule(sRule).    
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 65 63 68 6f              echo
2f80: 28 22 64 6f 6e 65 22 29 0a 20 20 20 20 20 20 20  ("done").       
2f90: 20 20 20 20 20 65 6c 69 66 20 73 54 65 78 74 20       elif sText 
2fa0: 3d 3d 20 22 2f 64 65 62 75 67 22 20 6f 72 20 73  == "/debug" or s
2fb0: 54 65 78 74 20 3d 3d 20 22 2f 64 22 3a 0a 20 20  Text == "/d":.  
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 41                xA
2fd0: 72 67 73 2e 64 65 62 75 67 20 3d 20 6e 6f 74 28  rgs.debug = not(
2fe0: 78 41 72 67 73 2e 64 65 62 75 67 29 0a 20 20 20  xArgs.debug).   
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 63 68               ech
3000: 6f 28 22 64 65 62 75 67 20 6d 6f 64 65 20 6f 6e  o("debug mode on
3010: 22 20 20 69 66 20 78 41 72 67 73 2e 64 65 62 75  "  if xArgs.debu
3020: 67 20 20 65 6c 73 65 20 22 64 65 62 75 67 20 6d  g  else "debug m
3030: 6f 64 65 20 6f 66 66 22 29 0a 20 20 20 20 20 20  ode off").      
3040: 20 20 20 20 20 20 65 6c 69 66 20 73 54 65 78 74        elif sText
3050: 20 3d 3d 20 22 2f 74 65 78 74 66 6f 72 6d 61 74   == "/textformat
3060: 74 65 72 22 20 6f 72 20 73 54 65 78 74 20 3d 3d  ter" or sText ==
3070: 20 22 2f 74 66 22 3a 0a 20 20 20 20 20 20 20 20   "/tf":.        
3080: 20 20 20 20 20 20 20 20 78 41 72 67 73 2e 74 65          xArgs.te
3090: 78 74 66 6f 72 6d 61 74 74 65 72 20 3d 20 6e 6f  xtformatter = no
30a0: 74 28 78 41 72 67 73 2e 74 65 78 74 66 6f 72 6d  t(xArgs.textform
30b0: 61 74 74 65 72 29 0a 20 20 20 20 20 20 20 20 20  atter).         
30c0: 20 20 20 20 20 20 20 65 63 68 6f 28 22 74 65 78         echo("tex
30d0: 74 66 6f 72 6d 61 74 74 65 72 20 6f 6e 22 20 20  tformatter on"  
30e0: 69 66 20 78 41 72 67 73 2e 64 65 62 75 67 20 20  if xArgs.debug  
30f0: 65 6c 73 65 20 22 74 65 78 74 66 6f 72 6d 61 74  else "textformat
3100: 74 65 72 20 6f 66 66 22 29 0a 20 20 20 20 20 20  ter off").      
3110: 20 20 20 20 20 20 65 6c 69 66 20 73 54 65 78 74        elif sText
3120: 20 3d 3d 20 22 2f 68 65 6c 70 22 20 6f 72 20 73   == "/help" or s
3130: 54 65 78 74 20 3d 3d 20 22 2f 68 22 3a 0a 20 20  Text == "/h":.  
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 63                ec
3150: 68 6f 28 5f 48 45 4c 50 29 0a 20 20 20 20 20 20  ho(_HELP).      
3160: 20 20 20 20 20 20 65 6c 69 66 20 73 54 65 78 74        elif sText
3170: 20 3d 3d 20 22 2f 6c 6f 70 74 22 20 6f 72 20 73   == "/lopt" or s
3180: 54 65 78 74 20 3d 3d 20 22 2f 6c 6f 22 3a 0a 20  Text == "/lo":. 
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
31a0: 63 65 2e 64 69 73 70 6c 61 79 4f 70 74 69 6f 6e  ce.displayOption
31b0: 73 28 22 66 72 22 29 0a 20 20 20 20 20 20 20 20  s("fr").        
31c0: 20 20 20 20 65 6c 69 66 20 73 54 65 78 74 2e 73      elif sText.s
31d0: 74 61 72 74 73 77 69 74 68 28 22 2f 6c 72 22 29  tartswith("/lr")
31e0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
31f0: 20 20 73 54 65 78 74 20 3d 20 73 54 65 78 74 2e    sText = sText.
3200: 73 74 72 69 70 28 29 0a 20 20 20 20 20 20 20 20  strip().        
3210: 20 20 20 20 20 20 20 20 73 46 69 6c 74 65 72 20          sFilter 
3220: 3d 20 73 54 65 78 74 5b 73 54 65 78 74 2e 66 69  = sText[sText.fi
3230: 6e 64 28 22 20 22 29 3a 5d 2e 73 74 72 69 70 28  nd(" "):].strip(
3240: 29 20 20 69 66 20 73 54 65 78 74 20 21 3d 20 22  )  if sText != "
3250: 2f 6c 72 22 20 61 6e 64 20 73 54 65 78 74 20 21  /lr" and sText !
3260: 3d 20 22 2f 72 75 6c 65 73 22 20 20 65 6c 73 65  = "/rules"  else
3270: 20 4e 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20   None.          
3280: 20 20 20 20 20 20 67 63 65 2e 64 69 73 70 6c 61        gce.displa
3290: 79 52 75 6c 65 73 28 73 46 69 6c 74 65 72 29 0a  yRules(sFilter).
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 69 66              elif
32b0: 20 73 54 65 78 74 20 3d 3d 20 22 2f 71 75 69 74   sText == "/quit
32c0: 22 20 6f 72 20 73 54 65 78 74 20 3d 3d 20 22 2f  " or sText == "/
32d0: 71 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  q":.            
32e0: 20 20 20 20 62 72 65 61 6b 0a 20 20 20 20 20 20      break.      
32f0: 20 20 20 20 20 20 65 6c 69 66 20 73 54 65 78 74        elif sText
3300: 2e 73 74 61 72 74 73 77 69 74 68 28 22 2f 72 6c  .startswith("/rl
3310: 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  "):.            
3320: 20 20 20 20 23 20 72 65 6c 6f 61 64 20 28 74 6f      # reload (to
3330: 64 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  do).            
3340: 20 20 20 20 70 61 73 73 0a 20 20 20 20 20 20 20      pass.       
3350: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
3360: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 73             for s
3370: 50 61 72 61 67 72 61 70 68 20 69 6e 20 74 78 74  Paragraph in txt
3380: 2e 67 65 74 50 61 72 61 67 72 61 70 68 28 73 54  .getParagraph(sT
3390: 65 78 74 29 3a 0a 20 20 20 20 20 20 20 20 20 20  ext):.          
33a0: 20 20 20 20 20 20 20 20 20 20 69 66 20 78 41 72            if xAr
33b0: 67 73 2e 74 65 78 74 66 6f 72 6d 61 74 74 65 72  gs.textformatter
33c0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
33d0: 20 20 20 20 20 20 20 20 20 20 73 54 65 78 74 20            sText 
33e0: 3d 20 6f 54 46 2e 66 6f 72 6d 61 74 54 65 78 74  = oTF.formatText
33f0: 28 73 54 65 78 74 29 0a 20 20 20 20 20 20 20 20  (sText).        
3400: 20 20 20 20 20 20 20 20 20 20 20 20 73 52 65 73              sRes
3410: 20 3d 20 67 65 6e 65 72 61 74 65 54 65 78 74 28   = generateText(
3420: 73 54 65 78 74 2c 20 6f 54 6f 6b 65 6e 69 7a 65  sText, oTokenize
3430: 72 2c 20 6f 53 70 65 6c 6c 43 68 65 63 6b 65 72  r, oSpellChecker
3440: 2c 20 62 44 65 62 75 67 3d 78 41 72 67 73 2e 64  , bDebug=xArgs.d
3450: 65 62 75 67 2c 20 62 45 6d 70 74 79 49 66 4e 6f  ebug, bEmptyIfNo
3460: 45 72 72 6f 72 73 3d 78 41 72 67 73 2e 6f 6e 6c  Errors=xArgs.onl
3470: 79 5f 77 68 65 6e 5f 65 72 72 6f 72 73 2c 20 6e  y_when_errors, n
3480: 57 69 64 74 68 3d 78 41 72 67 73 2e 77 69 64 74  Width=xArgs.widt
3490: 68 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h).             
34a0: 20 20 20 20 20 20 20 69 66 20 73 52 65 73 3a 0a         if sRes:.
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c0: 20 20 20 20 20 20 20 20 65 63 68 6f 28 22 5c 6e          echo("\n
34d0: 22 20 2b 20 73 52 65 73 29 0a 20 20 20 20 20 20  " + sRes).      
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
34f0: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
3500: 20 20 20 20 20 20 20 20 20 20 20 20 65 63 68 6f              echo
3510: 28 22 5c 6e 4e 6f 20 65 72 72 6f 72 20 66 6f 75  ("\nNo error fou
3520: 6e 64 2e 22 29 0a 20 20 20 20 20 20 20 20 20 20  nd.").          
3530: 20 20 73 54 65 78 74 20 3d 20 5f 67 65 74 54 65    sText = _getTe
3540: 78 74 28 73 49 6e 70 75 74 54 65 78 74 29 0a 0a  xt(sInputText)..
3550: 0a 69 66 20 5f 5f 6e 61 6d 65 5f 5f 20 3d 3d 20  .if __name__ == 
3560: 27 5f 5f 6d 61 69 6e 5f 5f 27 3a 0a 20 20 20 20  '__main__':.    
3570: 6d 61 69 6e 28 29 0a                             main().