Grammalecte  Hex Artifact Content

Artifact b9945ec9c3cd0b13144d21a34d88626bdfd18b1b992408efe76cca0bee362536:

  • File gc_lang/fr/oxt/Graphspell.py — part of check-in [51a40c07e3] at 2019-04-04 07:23:07 on branch trunk — [graphspell][core][build][lo] remove extended dictionary (user: olr size: 7105)

0000: 23 20 47 72 61 70 68 73 70 65 6c 6c 0a 23 0a 23  # Graphspell.#.#
0010: 20 53 70 65 6c 6c 63 68 65 63 6b 65 72 20 62 61   Spellchecker ba
0020: 73 65 64 20 6f 6e 20 61 20 44 41 57 47 20 28 44  sed on a DAWG (D
0030: 69 72 65 63 74 20 41 63 79 63 6c 69 63 20 57 6f  irect Acyclic Wo
0040: 72 64 20 47 72 61 70 68 29 0a 0a 0a 69 6d 70 6f  rd Graph)...impo
0050: 72 74 20 75 6e 6f 0a 69 6d 70 6f 72 74 20 75 6e  rt uno.import un
0060: 6f 68 65 6c 70 65 72 0a 69 6d 70 6f 72 74 20 74  ohelper.import t
0070: 72 61 63 65 62 61 63 6b 0a 69 6d 70 6f 72 74 20  raceback.import 
0080: 72 65 0a 69 6d 70 6f 72 74 20 6a 73 6f 6e 0a 0a  re.import json..
0090: 69 6d 70 6f 72 74 20 68 65 6c 70 65 72 73 0a 66  import helpers.f
00a0: 72 6f 6d 20 67 72 61 6d 6d 61 6c 65 63 74 65 2e  rom grammalecte.
00b0: 67 72 61 70 68 73 70 65 6c 6c 20 69 6d 70 6f 72  graphspell impor
00c0: 74 20 53 70 65 6c 6c 43 68 65 63 6b 65 72 0a 0a  t SpellChecker..
00d0: 66 72 6f 6d 20 63 6f 6d 2e 73 75 6e 2e 73 74 61  from com.sun.sta
00e0: 72 2e 6c 69 6e 67 75 69 73 74 69 63 32 20 69 6d  r.linguistic2 im
00f0: 70 6f 72 74 20 58 53 75 70 70 6f 72 74 65 64 4c  port XSupportedL
0100: 6f 63 61 6c 65 73 2c 20 58 53 70 65 6c 6c 43 68  ocales, XSpellCh
0110: 65 63 6b 65 72 2c 20 58 53 70 65 6c 6c 41 6c 74  ecker, XSpellAlt
0120: 65 72 6e 61 74 69 76 65 73 0a 66 72 6f 6d 20 63  ernatives.from c
0130: 6f 6d 2e 73 75 6e 2e 73 74 61 72 2e 6c 61 6e 67  om.sun.star.lang
0140: 20 69 6d 70 6f 72 74 20 58 53 65 72 76 69 63 65   import XService
0150: 49 6e 66 6f 2c 20 58 53 65 72 76 69 63 65 4e 61  Info, XServiceNa
0160: 6d 65 2c 20 58 53 65 72 76 69 63 65 44 69 73 70  me, XServiceDisp
0170: 6c 61 79 4e 61 6d 65 0a 66 72 6f 6d 20 63 6f 6d  layName.from com
0180: 2e 73 75 6e 2e 73 74 61 72 2e 6c 61 6e 67 20 69  .sun.star.lang i
0190: 6d 70 6f 72 74 20 4c 6f 63 61 6c 65 0a 0a 0a 6c  mport Locale...l
01a0: 4c 6f 63 61 6c 65 20 3d 20 7b 0a 20 20 20 20 23  Locale = {.    #
01b0: 20 4c 69 73 74 20 6f 66 20 6c 6f 63 61 6c 65 73   List of locales
01c0: 20 69 6e 20 4c 69 62 72 65 4f 66 66 69 63 65 0a   in LibreOffice.
01d0: 20 20 20 20 23 20 68 74 74 70 73 3a 2f 2f 63 67      # https://cg
01e0: 69 74 2e 66 72 65 65 64 65 73 6b 74 6f 70 2e 6f  it.freedesktop.o
01f0: 72 67 2f 6c 69 62 72 65 6f 66 66 69 63 65 2f 63  rg/libreoffice/c
0200: 6f 72 65 2f 74 72 65 65 2f 69 31 38 6e 6c 61 6e  ore/tree/i18nlan
0210: 67 74 61 67 2f 73 6f 75 72 63 65 2f 69 73 6f 6c  gtag/source/isol
0220: 61 6e 67 2f 69 73 6f 6c 61 6e 67 2e 63 78 78 0a  ang/isolang.cxx.
0230: 20 20 20 20 23 28 27 6c 61 27 2c 20 27 56 41 27      #('la', 'VA'
0240: 2c 20 27 27 29 2c 20 20 23 20 4c 61 74 69 6e 20  , ''),  # Latin 
0250: 28 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72  (for testing pur
0260: 70 6f 73 65 29 0a 20 20 20 20 28 27 66 72 27 2c  pose).    ('fr',
0270: 20 27 46 52 27 2c 20 27 27 29 2c 20 20 23 20 46   'FR', ''),  # F
0280: 72 61 6e 63 65 0a 20 20 20 20 28 27 66 72 27 2c  rance.    ('fr',
0290: 20 27 42 45 27 2c 20 27 27 29 2c 20 20 23 20 42   'BE', ''),  # B
02a0: 65 6c 67 69 71 75 65 0a 20 20 20 20 28 27 66 72  elgique.    ('fr
02b0: 27 2c 20 27 43 41 27 2c 20 27 27 29 2c 20 20 23  ', 'CA', ''),  #
02c0: 20 43 61 6e 61 64 61 0a 20 20 20 20 28 27 66 72   Canada.    ('fr
02d0: 27 2c 20 27 43 48 27 2c 20 27 27 29 2c 20 20 23  ', 'CH', ''),  #
02e0: 20 53 75 69 73 73 65 0a 20 20 20 20 28 27 66 72   Suisse.    ('fr
02f0: 27 2c 20 27 4c 55 27 2c 20 27 27 29 2c 20 20 23  ', 'LU', ''),  #
0300: 20 4c 75 78 65 6d 62 6f 75 72 67 0a 20 20 20 20   Luxembourg.    
0310: 23 28 27 66 72 27 2c 20 27 4d 43 27 2c 20 27 27  #('fr', 'MC', ''
0320: 29 2c 20 20 23 20 4d 6f 6e 61 63 6f 0a 20 20 20  ),  # Monaco.   
0330: 20 28 27 66 72 27 2c 20 27 42 46 27 2c 20 27 27   ('fr', 'BF', ''
0340: 29 2c 20 20 23 20 42 75 72 6b 69 6e 61 20 46 61  ),  # Burkina Fa
0350: 73 6f 0a 20 20 20 20 28 27 66 72 27 2c 20 27 42  so.    ('fr', 'B
0360: 4a 27 2c 20 27 27 29 2c 20 20 23 20 42 65 6e 69  J', ''),  # Beni
0370: 6e 0a 20 20 20 20 28 27 66 72 27 2c 20 27 43 44  n.    ('fr', 'CD
0380: 27 2c 20 27 27 29 2c 20 20 23 20 43 6f 6e 67 6f  ', ''),  # Congo
0390: 0a 20 20 20 20 28 27 66 72 27 2c 20 27 43 49 27  .    ('fr', 'CI'
03a0: 2c 20 27 27 29 2c 20 20 23 20 43 c3 b4 74 65 20  , ''),  # C..te 
03b0: 64 e2 80 99 49 76 6f 69 72 65 0a 20 20 20 20 28  d...Ivoire.    (
03c0: 27 66 72 27 2c 20 27 43 4d 27 2c 20 27 27 29 2c  'fr', 'CM', ''),
03d0: 20 20 23 20 43 61 6d 65 72 6f 75 6e 0a 20 20 20    # Cameroun.   
03e0: 20 28 27 66 72 27 2c 20 27 4d 41 27 2c 20 27 27   ('fr', 'MA', ''
03f0: 29 2c 20 20 23 20 4d 61 72 6f 63 0a 20 20 20 20  ),  # Maroc.    
0400: 28 27 66 72 27 2c 20 27 4d 4c 27 2c 20 27 27 29  ('fr', 'ML', '')
0410: 2c 20 20 23 20 4d 61 6c 69 0a 20 20 20 20 28 27  ,  # Mali.    ('
0420: 66 72 27 2c 20 27 4d 55 27 2c 20 27 27 29 2c 20  fr', 'MU', ''), 
0430: 20 23 20 c3 8e 6c 65 20 4d 61 75 72 69 63 65 0a   # ..le Maurice.
0440: 20 20 20 20 28 27 66 72 27 2c 20 27 4e 45 27 2c      ('fr', 'NE',
0450: 20 27 27 29 2c 20 20 23 20 4e 69 67 65 72 0a 20   ''),  # Niger. 
0460: 20 20 20 28 27 66 72 27 2c 20 27 52 45 27 2c 20     ('fr', 'RE', 
0470: 27 27 29 2c 20 20 23 20 52 c3 a9 75 6e 69 6f 6e  ''),  # R..union
0480: 0a 20 20 20 20 28 27 66 72 27 2c 20 27 53 4e 27  .    ('fr', 'SN'
0490: 2c 20 27 27 29 2c 20 20 23 20 53 c3 a9 6e c3 a9  , ''),  # S..n..
04a0: 67 61 6c 0a 20 20 20 20 28 27 66 72 27 2c 20 27  gal.    ('fr', '
04b0: 54 47 27 2c 20 27 27 29 20 20 20 23 20 54 6f 67  TG', '')   # Tog
04c0: 6f 0a 7d 0a 0a 7a 45 6c 69 64 65 64 57 6f 72 64  o.}..zElidedWord
04d0: 73 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 22  s = re.compile("
04e0: 28 3f 69 29 5e 28 3f 3a 5b 6c 64 6e 6d 74 73 6a  (?i)^(?:[ldnmtsj
04f0: 63 c3 a7 79 5d 7c 71 75 7c 6c 6f 72 73 71 75 7c  c..y]|qu|lorsqu|
0500: 71 75 6f 69 71 75 7c 70 75 69 73 71 75 7c 6a 75  quoiqu|puisqu|ju
0510: 73 71 75 29 5b 27 e2 80 99 60 e2 80 98 5d 22 29  squ)['...`...]")
0520: 0a 0a 0a 63 6c 61 73 73 20 47 72 61 70 68 73 70  ...class Graphsp
0530: 65 6c 6c 20 28 75 6e 6f 68 65 6c 70 65 72 2e 42  ell (unohelper.B
0540: 61 73 65 2c 20 58 53 70 65 6c 6c 43 68 65 63 6b  ase, XSpellCheck
0550: 65 72 2c 20 58 53 65 72 76 69 63 65 49 6e 66 6f  er, XServiceInfo
0560: 2c 20 58 53 65 72 76 69 63 65 4e 61 6d 65 2c 20  , XServiceName, 
0570: 58 53 65 72 76 69 63 65 44 69 73 70 6c 61 79 4e  XServiceDisplayN
0580: 61 6d 65 2c 20 58 53 75 70 70 6f 72 74 65 64 4c  ame, XSupportedL
0590: 6f 63 61 6c 65 73 29 3a 0a 0a 20 20 20 20 64 65  ocales):..    de
05a0: 66 20 5f 5f 69 6e 69 74 5f 5f 20 28 73 65 6c 66  f __init__ (self
05b0: 2c 20 63 74 78 2c 20 2a 61 72 67 73 29 3a 0a 20  , ctx, *args):. 
05c0: 20 20 20 20 20 20 20 74 72 79 3a 0a 20 20 20 20         try:.    
05d0: 20 20 20 20 20 20 20 20 73 65 6c 66 2e 63 74 78          self.ctx
05e0: 20 3d 20 63 74 78 0a 20 20 20 20 20 20 20 20 20   = ctx.         
05f0: 20 20 20 73 65 6c 66 2e 73 53 65 72 76 69 63 65     self.sService
0600: 4e 61 6d 65 20 3d 20 22 63 6f 6d 2e 73 75 6e 2e  Name = "com.sun.
0610: 73 74 61 72 2e 6c 69 6e 67 75 69 73 74 69 63 32  star.linguistic2
0620: 2e 53 70 65 6c 6c 43 68 65 63 6b 65 72 22 0a 20  .SpellChecker". 
0630: 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e             self.
0640: 73 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 4e  sImplementationN
0650: 61 6d 65 20 3d 20 22 6e 65 74 2e 67 72 61 6d 6d  ame = "net.gramm
0660: 61 6c 65 63 74 65 2e 67 72 61 70 68 73 70 65 6c  alecte.graphspel
0670: 6c 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  l".            s
0680: 65 6c 66 2e 74 53 75 70 70 6f 72 74 65 64 53 65  elf.tSupportedSe
0690: 72 76 69 63 65 4e 61 6d 65 73 20 3d 20 28 73 65  rviceNames = (se
06a0: 6c 66 2e 73 53 65 72 76 69 63 65 4e 61 6d 65 2c  lf.sServiceName,
06b0: 20 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   ).            s
06c0: 65 6c 66 2e 78 53 76 4d 67 72 20 3d 20 63 74 78  elf.xSvMgr = ctx
06d0: 2e 53 65 72 76 69 63 65 4d 61 6e 61 67 65 72 0a  .ServiceManager.
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66              self
06f0: 2e 6c 6f 63 61 6c 65 73 20 3d 20 74 75 70 6c 65  .locales = tuple
0700: 28 5b 20 4c 6f 63 61 6c 65 28 74 5b 30 5d 2c 20  ([ Locale(t[0], 
0710: 74 5b 31 5d 2c 20 74 5b 32 5d 29 20 20 66 6f 72  t[1], t[2])  for
0720: 20 74 20 69 6e 20 6c 4c 6f 63 61 6c 65 20 5d 29   t in lLocale ])
0730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c  .            sel
0740: 66 2e 78 53 65 74 74 69 6e 67 4e 6f 64 65 20 3d  f.xSettingNode =
0750: 20 68 65 6c 70 65 72 73 2e 67 65 74 43 6f 6e 66   helpers.getConf
0760: 69 67 53 65 74 74 69 6e 67 28 22 2f 6f 72 67 2e  igSetting("/org.
0770: 6f 70 65 6e 6f 66 66 69 63 65 2e 4c 69 67 68 74  openoffice.Light
0780: 70 72 6f 6f 66 5f 67 72 61 6d 6d 61 6c 65 63 74  proof_grammalect
0790: 65 2f 4f 74 68 65 72 2f 22 2c 20 46 61 6c 73 65  e/Other/", False
07a0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ).            se
07b0: 6c 66 2e 78 4f 70 74 69 6f 6e 4e 6f 64 65 20 3d  lf.xOptionNode =
07c0: 20 73 65 6c 66 2e 78 53 65 74 74 69 6e 67 4e 6f   self.xSettingNo
07d0: 64 65 2e 67 65 74 42 79 4e 61 6d 65 28 22 6f 5f  de.getByName("o_
07e0: 66 72 22 29 0a 20 20 20 20 20 20 20 20 20 20 20  fr").           
07f0: 20 73 4d 61 69 6e 44 69 63 4e 61 6d 65 20 3d 20   sMainDicName = 
0800: 73 65 6c 66 2e 78 4f 70 74 69 6f 6e 4e 6f 64 65  self.xOptionNode
0810: 2e 67 65 74 50 72 6f 70 65 72 74 79 56 61 6c 75  .getPropertyValu
0820: 65 28 22 6d 61 69 6e 5f 64 69 63 5f 6e 61 6d 65  e("main_dic_name
0830: 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ").            p
0840: 65 72 73 6f 6e 61 6c 5f 64 69 63 20 3d 20 22 22  ersonal_dic = ""
0850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
0860: 28 73 65 6c 66 2e 78 4f 70 74 69 6f 6e 4e 6f 64  (self.xOptionNod
0870: 65 2e 67 65 74 50 72 6f 70 65 72 74 79 56 61 6c  e.getPropertyVal
0880: 75 65 28 22 75 73 65 5f 70 65 72 73 6f 6e 61 6c  ue("use_personal
0890: 5f 64 69 63 22 29 29 3a 0a 20 20 20 20 20 20 20  _dic")):.       
08a0: 20 20 20 20 20 20 20 20 20 73 50 65 72 73 6f 6e           sPerson
08b0: 61 6c 44 69 63 4a 53 4f 4e 20 3d 20 73 65 6c 66  alDicJSON = self
08c0: 2e 78 4f 70 74 69 6f 6e 4e 6f 64 65 2e 67 65 74  .xOptionNode.get
08d0: 50 72 6f 70 65 72 74 79 56 61 6c 75 65 28 22 70  PropertyValue("p
08e0: 65 72 73 6f 6e 61 6c 5f 64 69 63 22 29 0a 20 20  ersonal_dic").  
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
0900: 20 73 50 65 72 73 6f 6e 61 6c 44 69 63 4a 53 4f   sPersonalDicJSO
0910: 4e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N:.             
0920: 20 20 20 20 20 20 20 74 72 79 3a 0a 20 20 20 20         try:.    
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 20 20 70 65 72 73 6f 6e 61 6c 5f 64 69 63      personal_dic
0950: 20 3d 20 6a 73 6f 6e 2e 6c 6f 61 64 73 28 73 50   = json.loads(sP
0960: 65 72 73 6f 6e 61 6c 44 69 63 4a 53 4f 4e 29 0a  ersonalDicJSON).
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 20 20 65 78 63 65 70 74 3a 0a 20 20 20 20      except:.    
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 20 20 20 20 70 72 69 6e 74 28 22 47 72 61 70 68      print("Graph
09b0: 73 70 65 6c 6c 3a 20 77 72 6f 6e 67 20 70 65 72  spell: wrong per
09c0: 73 6f 6e 61 6c 5f 64 69 63 22 29 0a 20 20 20 20  sonal_dic").    
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 74 72 61 63 65 62 61 63 6b 2e 70 72      traceback.pr
09f0: 69 6e 74 5f 65 78 63 28 29 0a 20 20 20 20 20 20  int_exc().      
0a00: 20 20 20 20 20 20 73 65 6c 66 2e 6f 47 72 61 70        self.oGrap
0a10: 68 73 70 65 6c 6c 20 3d 20 53 70 65 6c 6c 43 68  hspell = SpellCh
0a20: 65 63 6b 65 72 28 22 66 72 22 2c 20 22 66 72 2d  ecker("fr", "fr-
0a30: 22 2b 73 4d 61 69 6e 44 69 63 4e 61 6d 65 2b 22  "+sMainDicName+"
0a40: 2e 62 64 69 63 22 2c 20 22 22 2c 20 70 65 72 73  .bdic", "", pers
0a50: 6f 6e 61 6c 5f 64 69 63 29 0a 20 20 20 20 20 20  onal_dic).      
0a60: 20 20 20 20 20 20 73 65 6c 66 2e 6c 6f 61 64 48        self.loadH
0a70: 75 6e 73 70 65 6c 6c 28 29 0a 20 20 20 20 20 20  unspell().      
0a80: 20 20 20 20 20 20 23 20 70 72 69 6e 74 28 22 47        # print("G
0a90: 72 61 70 68 73 70 65 6c 6c 3a 20 69 6e 69 74 20  raphspell: init 
0aa0: 64 6f 6e 65 22 29 0a 20 20 20 20 20 20 20 20 65  done").        e
0ab0: 78 63 65 70 74 3a 0a 20 20 20 20 20 20 20 20 20  xcept:.         
0ac0: 20 20 20 70 72 69 6e 74 28 22 47 72 61 70 68 73     print("Graphs
0ad0: 70 65 6c 6c 3a 20 69 6e 69 74 20 66 61 69 6c 65  pell: init faile
0ae0: 64 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  d").            
0af0: 74 72 61 63 65 62 61 63 6b 2e 70 72 69 6e 74 5f  traceback.print_
0b00: 65 78 63 28 29 0a 0a 20 20 20 20 64 65 66 20 6c  exc()..    def l
0b10: 6f 61 64 48 75 6e 73 70 65 6c 6c 20 28 73 65 6c  oadHunspell (sel
0b20: 66 29 3a 0a 20 20 20 20 20 20 20 20 23 20 48 75  f):.        # Hu
0b30: 6e 73 70 65 6c 6c 20 69 73 20 61 20 66 61 6c 6c  nspell is a fall
0b40: 62 61 63 6b 20 73 70 65 6c 6c 63 68 65 63 6b 65  back spellchecke
0b50: 72 0a 20 20 20 20 20 20 20 20 74 72 79 3a 0a 20  r.        try:. 
0b60: 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e             self.
0b70: 78 48 75 6e 73 70 65 6c 6c 20 3d 20 73 65 6c 66  xHunspell = self
0b80: 2e 78 53 76 4d 67 72 2e 63 72 65 61 74 65 49 6e  .xSvMgr.createIn
0b90: 73 74 61 6e 63 65 28 22 6f 72 67 2e 6f 70 65 6e  stance("org.open
0ba0: 6f 66 66 69 63 65 2e 6c 69 6e 67 75 2e 4d 79 53  office.lingu.MyS
0bb0: 70 65 6c 6c 53 70 65 6c 6c 43 68 65 63 6b 65 72  pellSpellChecker
0bc0: 22 29 0a 20 20 20 20 20 20 20 20 65 78 63 65 70  ").        excep
0bd0: 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  t:.            p
0be0: 72 69 6e 74 28 22 48 75 6e 73 70 65 6c 6c 3a 20  rint("Hunspell: 
0bf0: 69 6e 69 74 20 66 61 69 6c 65 64 22 29 0a 20 20  init failed").  
0c00: 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65 62            traceb
0c10: 61 63 6b 2e 70 72 69 6e 74 5f 65 78 63 28 29 0a  ack.print_exc().
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66              self
0c30: 2e 78 48 75 6e 73 70 65 6c 6c 20 3d 20 46 61 6c  .xHunspell = Fal
0c40: 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  se.            s
0c50: 65 6c 66 2e 62 48 75 6e 73 70 65 6c 6c 20 3d 20  elf.bHunspell = 
0c60: 46 61 6c 73 65 0a 20 20 20 20 20 20 20 20 65 6c  False.        el
0c70: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
0c80: 73 65 6c 66 2e 78 48 75 6e 73 70 65 6c 6c 4c 6f  self.xHunspellLo
0c90: 63 61 6c 65 20 3d 20 4c 6f 63 61 6c 65 28 27 66  cale = Locale('f
0ca0: 72 27 2c 20 27 4d 43 27 2c 20 27 27 29 0a 20 20  r', 'MC', '').  
0cb0: 20 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e 62            self.b
0cc0: 48 75 6e 73 70 65 6c 6c 20 3d 20 6e 6f 74 20 62  Hunspell = not b
0cd0: 6f 6f 6c 28 73 65 6c 66 2e 78 4f 70 74 69 6f 6e  ool(self.xOption
0ce0: 4e 6f 64 65 2e 67 65 74 50 72 6f 70 65 72 74 79  Node.getProperty
0cf0: 56 61 6c 75 65 28 22 75 73 65 5f 67 72 61 70 68  Value("use_graph
0d00: 73 70 65 6c 6c 5f 73 75 67 67 22 29 29 0a 0a 20  spell_sugg")).. 
0d10: 20 20 20 23 20 58 53 65 72 76 69 63 65 4e 61 6d     # XServiceNam
0d20: 65 0a 20 20 20 20 64 65 66 20 67 65 74 53 65 72  e.    def getSer
0d30: 76 69 63 65 4e 61 6d 65 20 28 73 65 6c 66 29 3a  viceName (self):
0d40: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0d50: 73 65 6c 66 2e 73 49 6d 70 6c 65 6d 65 6e 74 61  self.sImplementa
0d60: 74 69 6f 6e 4e 61 6d 65 20 20 20 20 20 23 73 65  tionName     #se
0d70: 6c 66 2e 73 53 65 72 76 69 63 65 4e 61 6d 65 0a  lf.sServiceName.
0d80: 0a 20 20 20 20 23 20 58 53 65 72 76 69 63 65 49  .    # XServiceI
0d90: 6e 66 6f 0a 20 20 20 20 64 65 66 20 67 65 74 49  nfo.    def getI
0da0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 4e 61 6d  mplementationNam
0db0: 65 20 28 73 65 6c 66 29 3a 0a 20 20 20 20 20 20  e (self):.      
0dc0: 20 20 72 65 74 75 72 6e 20 73 65 6c 66 2e 73 49    return self.sI
0dd0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 4e 61 6d  mplementationNam
0de0: 65 0a 0a 20 20 20 20 64 65 66 20 73 75 70 70 6f  e..    def suppo
0df0: 72 74 73 53 65 72 76 69 63 65 20 28 73 65 6c 66  rtsService (self
0e00: 2c 20 73 53 65 72 76 69 63 65 4e 61 6d 65 29 3a  , sServiceName):
0e10: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0e20: 28 73 53 65 72 76 69 63 65 4e 61 6d 65 20 69 6e  (sServiceName in
0e30: 20 73 65 6c 66 2e 74 53 75 70 70 6f 72 74 65 64   self.tSupported
0e40: 53 65 72 76 69 63 65 4e 61 6d 65 73 29 0a 0a 20  ServiceNames).. 
0e50: 20 20 20 64 65 66 20 67 65 74 53 75 70 70 6f 72     def getSuppor
0e60: 74 65 64 53 65 72 76 69 63 65 4e 61 6d 65 73 20  tedServiceNames 
0e70: 28 73 65 6c 66 29 3a 0a 20 20 20 20 20 20 20 20  (self):.        
0e80: 72 65 74 75 72 6e 20 73 65 6c 66 2e 74 53 75 70  return self.tSup
0e90: 70 6f 72 74 65 64 53 65 72 76 69 63 65 4e 61 6d  portedServiceNam
0ea0: 65 73 0a 0a 20 20 20 20 23 20 58 53 75 70 70 6f  es..    # XSuppo
0eb0: 72 74 65 64 4c 6f 63 61 6c 65 73 0a 20 20 20 20  rtedLocales.    
0ec0: 64 65 66 20 68 61 73 4c 6f 63 61 6c 65 20 28 73  def hasLocale (s
0ed0: 65 6c 66 2c 20 61 4c 6f 63 61 6c 65 29 3a 0a 20  elf, aLocale):. 
0ee0: 20 20 20 20 20 20 20 69 66 20 61 4c 6f 63 61 6c         if aLocal
0ef0: 65 20 69 6e 20 73 65 6c 66 2e 6c 6f 63 61 6c 65  e in self.locale
0f00: 73 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  s:.            r
0f10: 65 74 75 72 6e 20 54 72 75 65 0a 20 20 20 20 20  eturn True.     
0f20: 20 20 20 66 6f 72 20 65 20 69 6e 20 73 65 6c 66     for e in self
0f30: 2e 6c 6f 63 61 6c 65 73 3a 0a 20 20 20 20 20 20  .locales:.      
0f40: 20 20 20 20 20 20 69 66 20 61 4c 6f 63 61 6c 65        if aLocale
0f50: 2e 4c 61 6e 67 75 61 67 65 20 3d 3d 20 65 2e 4c  .Language == e.L
0f60: 61 6e 67 75 61 67 65 20 61 6e 64 20 28 65 2e 43  anguage and (e.C
0f70: 6f 75 6e 74 72 79 20 3d 3d 20 61 4c 6f 63 61 6c  ountry == aLocal
0f80: 65 2e 43 6f 75 6e 74 72 79 20 6f 72 20 65 2e 43  e.Country or e.C
0f90: 6f 75 6e 74 72 79 20 3d 3d 20 22 22 29 3a 0a 20  ountry == ""):. 
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
0fb0: 65 74 75 72 6e 20 54 72 75 65 0a 20 20 20 20 20  eturn True.     
0fc0: 20 20 20 72 65 74 75 72 6e 20 46 61 6c 73 65 0a     return False.
0fd0: 0a 20 20 20 20 64 65 66 20 67 65 74 4c 6f 63 61  .    def getLoca
0fe0: 6c 65 73 20 28 73 65 6c 66 29 3a 0a 20 20 20 20  les (self):.    
0ff0: 20 20 20 20 72 65 74 75 72 6e 20 73 65 6c 66 2e      return self.
1000: 6c 6f 63 61 6c 65 73 0a 0a 20 20 20 20 23 20 58  locales..    # X
1010: 53 70 65 6c 6c 43 68 65 63 6b 65 72 0a 20 20 20  SpellChecker.   
1020: 20 23 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70   # http://www.op
1030: 65 6e 6f 66 66 69 63 65 2e 6f 72 67 2f 61 70 69  enoffice.org/api
1040: 2f 64 6f 63 73 2f 63 6f 6d 6d 6f 6e 2f 72 65 66  /docs/common/ref
1050: 2f 63 6f 6d 2f 73 75 6e 2f 73 74 61 72 2f 6c 69  /com/sun/star/li
1060: 6e 67 75 69 73 74 69 63 32 2f 58 53 70 65 6c 6c  nguistic2/XSpell
1070: 43 68 65 63 6b 65 72 2e 68 74 6d 6c 0a 20 20 20  Checker.html.   
1080: 20 64 65 66 20 69 73 56 61 6c 69 64 20 28 73 65   def isValid (se
1090: 6c 66 2c 20 61 57 6f 72 64 2c 20 72 4c 6f 63 61  lf, aWord, rLoca
10a0: 6c 65 2c 20 61 50 72 6f 70 65 72 74 69 65 73 29  le, aProperties)
10b0: 3a 0a 20 20 20 20 20 20 20 20 74 72 79 3a 0a 20  :.        try:. 
10c0: 20 20 20 20 20 20 20 20 20 20 20 61 57 6f 72 64             aWord
10d0: 20 3d 20 7a 45 6c 69 64 65 64 57 6f 72 64 73 2e   = zElidedWords.
10e0: 73 75 62 28 22 22 2c 20 61 57 6f 72 64 2e 72 73  sub("", aWord.rs
10f0: 74 72 69 70 28 22 2e 22 29 2c 20 63 6f 75 6e 74  trip("."), count
1100: 3d 31 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =1).            
1110: 72 65 74 75 72 6e 20 73 65 6c 66 2e 6f 47 72 61  return self.oGra
1120: 70 68 73 70 65 6c 6c 2e 69 73 56 61 6c 69 64 54  phspell.isValidT
1130: 6f 6b 65 6e 28 61 57 6f 72 64 29 0a 20 20 20 20  oken(aWord).    
1140: 20 20 20 20 20 20 20 20 23 20 72 65 74 75 72 6e          # return
1150: 20 73 65 6c 66 2e 78 48 75 6e 73 70 65 6c 6c 2e   self.xHunspell.
1160: 69 73 56 61 6c 69 64 28 61 57 6f 72 64 2c 20 73  isValid(aWord, s
1170: 65 6c 66 2e 78 48 75 6e 73 70 65 6c 6c 4c 6f 63  elf.xHunspellLoc
1180: 61 6c 65 2c 20 61 50 72 6f 70 65 72 74 69 65 73  ale, aProperties
1190: 29 0a 20 20 20 20 20 20 20 20 65 78 63 65 70 74  ).        except
11a0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  :.            tr
11b0: 61 63 65 62 61 63 6b 2e 70 72 69 6e 74 5f 65 78  aceback.print_ex
11c0: 63 28 29 0a 20 20 20 20 20 20 20 20 72 65 74 75  c().        retu
11d0: 72 6e 20 46 61 6c 73 65 0a 0a 20 20 20 20 64 65  rn False..    de
11e0: 66 20 73 70 65 6c 6c 20 28 73 65 6c 66 2c 20 61  f spell (self, a
11f0: 57 6f 72 64 2c 20 61 4c 6f 63 61 6c 65 2c 20 61  Word, aLocale, a
1200: 50 72 6f 70 65 72 74 69 65 73 29 3a 0a 20 20 20  Properties):.   
1210: 20 20 20 20 20 22 72 65 74 75 72 6e 73 20 61 6e       "returns an
1220: 20 6f 62 6a 65 63 74 20 53 70 65 6c 6c 41 6c 74   object SpellAlt
1230: 65 72 6e 61 74 69 76 65 73 22 0a 20 20 20 20 20  ernatives".     
1240: 20 20 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20     try:.        
1250: 20 20 20 20 69 66 20 6e 6f 74 20 73 65 6c 66 2e      if not self.
1260: 62 48 75 6e 73 70 65 6c 6c 3a 0a 20 20 20 20 20  bHunspell:.     
1270: 20 20 20 20 20 20 20 20 20 20 20 6c 53 75 67 67             lSugg
1280: 20 3d 20 5b 5d 0a 20 20 20 20 20 20 20 20 20 20   = [].          
1290: 20 20 20 20 20 20 66 6f 72 20 6c 20 69 6e 20 73        for l in s
12a0: 65 6c 66 2e 6f 47 72 61 70 68 73 70 65 6c 6c 2e  elf.oGraphspell.
12b0: 73 75 67 67 65 73 74 28 61 57 6f 72 64 29 3a 0a  suggest(aWord):.
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 6c 53 75 67 67 2e 65 78 74 65 6e 64      lSugg.extend
12e0: 28 6c 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  (l).            
12f0: 20 20 20 20 72 65 74 75 72 6e 20 53 70 65 6c 6c      return Spell
1300: 41 6c 74 65 72 6e 61 74 69 76 65 73 28 61 57 6f  Alternatives(aWo
1310: 72 64 2c 20 74 75 70 6c 65 28 6c 53 75 67 67 29  rd, tuple(lSugg)
1320: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ).            el
1330: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
1340: 20 20 20 20 23 20 66 61 6c 6c 62 61 63 6b 20 64      # fallback d
1350: 69 63 74 69 6f 6e 61 72 79 20 73 75 67 67 65 73  ictionary sugges
1360: 74 69 6f 6e 73 20 28 48 75 6e 73 70 65 6c 6c 29  tions (Hunspell)
1370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1380: 20 72 65 74 75 72 6e 20 73 65 6c 66 2e 78 48 75   return self.xHu
1390: 6e 73 70 65 6c 6c 2e 73 70 65 6c 6c 28 61 57 6f  nspell.spell(aWo
13a0: 72 64 2c 20 73 65 6c 66 2e 78 48 75 6e 73 70 65  rd, self.xHunspe
13b0: 6c 6c 4c 6f 63 61 6c 65 2c 20 61 50 72 6f 70 65  llLocale, aPrope
13c0: 72 74 69 65 73 29 0a 20 20 20 20 20 20 20 20 65  rties).        e
13d0: 78 63 65 70 74 3a 0a 20 20 20 20 20 20 20 20 20  xcept:.         
13e0: 20 20 20 74 72 61 63 65 62 61 63 6b 2e 70 72 69     traceback.pri
13f0: 6e 74 5f 65 78 63 28 29 0a 20 20 20 20 20 20 20  nt_exc().       
1400: 20 72 65 74 75 72 6e 20 4e 6f 6e 65 0a 0a 20 20   return None..  
1410: 20 20 23 20 58 53 65 72 76 69 63 65 44 69 73 70    # XServiceDisp
1420: 6c 61 79 4e 61 6d 65 0a 20 20 20 20 64 65 66 20  layName.    def 
1430: 67 65 74 53 65 72 76 69 63 65 44 69 73 70 6c 61  getServiceDispla
1440: 79 4e 61 6d 65 28 73 65 6c 66 2c 20 61 4c 6f 63  yName(self, aLoc
1450: 61 6c 65 29 3a 0a 20 20 20 20 20 20 20 20 72 65  ale):.        re
1460: 74 75 72 6e 20 22 47 72 61 70 68 73 70 65 6c 6c  turn "Graphspell
1470: 20 28 66 72 29 22 0a 0a 20 20 20 20 23 20 4f 74   (fr)"..    # Ot
1480: 68 65 72 0a 20 20 20 20 64 65 66 20 6c 69 73 74  her.    def list
1490: 53 70 65 6c 6c 43 68 65 63 6b 65 72 20 28 73 65  SpellChecker (se
14a0: 6c 66 29 3a 0a 20 20 20 20 20 20 20 20 78 4c 69  lf):.        xLi
14b0: 6e 67 75 53 65 72 76 69 63 65 4d 61 6e 61 67 65  nguServiceManage
14c0: 72 20 3d 20 73 65 6c 66 2e 78 53 76 4d 67 72 2e  r = self.xSvMgr.
14d0: 63 72 65 61 74 65 49 6e 73 74 61 6e 63 65 28 22  createInstance("
14e0: 63 6f 6d 2e 73 75 6e 2e 73 74 61 72 2e 6c 69 6e  com.sun.star.lin
14f0: 67 75 69 73 74 69 63 32 2e 4c 69 6e 67 75 53 65  guistic2.LinguSe
1500: 72 76 69 63 65 4d 61 6e 61 67 65 72 22 29 0a 20  rviceManager"). 
1510: 20 20 20 20 20 20 20 6c 53 65 72 76 69 63 65 20         lService 
1520: 3d 20 78 4c 69 6e 67 75 53 65 72 76 69 63 65 4d  = xLinguServiceM
1530: 61 6e 61 67 65 72 2e 67 65 74 41 76 61 69 6c 61  anager.getAvaila
1540: 62 6c 65 53 65 72 76 69 63 65 73 28 27 63 6f 6d  bleServices('com
1550: 2e 73 75 6e 2e 73 74 61 72 2e 6c 69 6e 67 75 69  .sun.star.lingui
1560: 73 74 69 63 32 2e 53 70 65 6c 6c 43 68 65 63 6b  stic2.SpellCheck
1570: 65 72 27 2c 20 4c 6f 63 61 6c 65 28 22 66 72 22  er', Locale("fr"
1580: 2c 20 22 4d 43 22 2c 20 22 22 29 29 0a 20 20 20  , "MC", "")).   
1590: 20 20 20 20 20 66 6f 72 20 73 53 70 65 6c 6c 63       for sSpellc
15a0: 68 65 63 6b 65 72 20 69 6e 20 6c 53 65 72 76 69  hecker in lServi
15b0: 63 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ce:.            
15c0: 70 72 69 6e 74 28 72 65 70 72 28 73 53 70 65 6c  print(repr(sSpel
15d0: 6c 63 68 65 63 6b 65 72 29 29 0a 20 20 20 20 20  lchecker)).     
15e0: 20 20 20 20 20 20 20 23 69 66 20 73 53 70 65 6c         #if sSpel
15f0: 6c 63 68 65 63 6b 65 72 20 3d 3d 20 73 65 6c 66  lchecker == self
1600: 2e 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 4e  .ImplementationN
1610: 61 6d 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ame:.           
1620: 20 23 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 20   #    continue. 
1630: 20 20 20 20 20 20 20 20 20 20 20 23 73 65 6c 66             #self
1640: 2e 78 46 61 6c 6c 62 61 63 6b 53 70 65 6c 6c 43  .xFallbackSpellC
1650: 68 65 63 6b 65 72 20 3d 20 73 65 6c 66 2e 78 53  hecker = self.xS
1660: 76 4d 67 72 2e 63 72 65 61 74 65 49 6e 73 74 61  vMgr.createInsta
1670: 6e 63 65 28 73 53 70 65 6c 6c 63 68 65 63 6b 65  nce(sSpellchecke
1680: 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  r).            #
1690: 69 66 20 73 65 6c 66 2e 78 46 61 6c 6c 62 61 63  if self.xFallbac
16a0: 6b 53 70 65 6c 6c 43 68 65 63 6b 65 72 3a 0a 20  kSpellChecker:. 
16b0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
16c0: 70 72 69 6e 74 28 22 53 70 65 6c 6c 20 63 68 65  print("Spell che
16d0: 63 6b 65 72 3a 20 25 73 22 20 25 20 78 53 70 65  cker: %s" % xSpe
16e0: 6c 6c 43 68 65 63 6b 65 72 29 0a 20 20 20 20 20  llChecker).     
16f0: 20 20 20 20 20 20 20 23 20 20 20 20 62 72 65 61         #    brea
1700: 6b 0a 0a 0a 63 6c 61 73 73 20 53 70 65 6c 6c 41  k...class SpellA
1710: 6c 74 65 72 6e 61 74 69 76 65 73 20 28 75 6e 6f  lternatives (uno
1720: 68 65 6c 70 65 72 2e 42 61 73 65 2c 20 58 53 70  helper.Base, XSp
1730: 65 6c 6c 41 6c 74 65 72 6e 61 74 69 76 65 73 29  ellAlternatives)
1740: 3a 0a 0a 20 20 20 20 64 65 66 20 5f 5f 69 6e 69  :..    def __ini
1750: 74 5f 5f 20 28 73 65 6c 66 2c 20 73 57 6f 72 64  t__ (self, sWord
1760: 2c 20 6c 53 75 67 67 29 3a 0a 20 20 20 20 20 20  , lSugg):.      
1770: 20 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20 20    try:.         
1780: 20 20 20 73 65 6c 66 2e 73 57 6f 72 64 20 3d 20     self.sWord = 
1790: 73 57 6f 72 64 0a 20 20 20 20 20 20 20 20 20 20  sWord.          
17a0: 20 20 73 65 6c 66 2e 6c 53 75 67 67 20 3d 20 6c    self.lSugg = l
17b0: 53 75 67 67 0a 20 20 20 20 20 20 20 20 20 20 20  Sugg.           
17c0: 20 73 65 6c 66 2e 78 4c 6f 63 61 6c 65 20 3d 20   self.xLocale = 
17d0: 4c 6f 63 61 6c 65 28 27 66 72 27 2c 20 27 46 52  Locale('fr', 'FR
17e0: 27 2c 20 27 27 29 0a 20 20 20 20 20 20 20 20 65  ', '').        e
17f0: 78 63 65 70 74 3a 0a 20 20 20 20 20 20 20 20 20  xcept:.         
1800: 20 20 20 74 72 61 63 65 62 61 63 6b 2e 70 72 69     traceback.pri
1810: 6e 74 5f 65 78 63 28 29 0a 0a 20 20 20 20 23 20  nt_exc()..    # 
1820: 58 53 70 65 6c 6c 41 6c 74 65 72 6e 61 74 69 76  XSpellAlternativ
1830: 65 73 0a 20 20 20 20 23 20 68 74 74 70 3a 2f 2f  es.    # http://
1840: 77 77 77 2e 6f 70 65 6e 6f 66 66 69 63 65 2e 6f  www.openoffice.o
1850: 72 67 2f 61 70 69 2f 64 6f 63 73 2f 63 6f 6d 6d  rg/api/docs/comm
1860: 6f 6e 2f 72 65 66 2f 63 6f 6d 2f 73 75 6e 2f 73  on/ref/com/sun/s
1870: 74 61 72 2f 6c 69 6e 67 75 69 73 74 69 63 32 2f  tar/linguistic2/
1880: 58 53 70 65 6c 6c 41 6c 74 65 72 6e 61 74 69 76  XSpellAlternativ
1890: 65 73 2e 68 74 6d 6c 0a 20 20 20 20 64 65 66 20  es.html.    def 
18a0: 67 65 74 57 6f 72 64 20 28 73 65 6c 66 29 3a 0a  getWord (self):.
18b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
18c0: 65 6c 66 2e 73 57 6f 72 64 0a 0a 20 20 20 20 64  elf.sWord..    d
18d0: 65 66 20 67 65 74 4c 6f 63 61 6c 65 20 28 73 65  ef getLocale (se
18e0: 6c 66 29 3a 0a 20 20 20 20 20 20 20 20 72 65 74  lf):.        ret
18f0: 75 72 6e 20 73 65 6c 66 2e 78 4c 6f 63 61 6c 65  urn self.xLocale
1900: 0a 0a 20 20 20 20 64 65 66 20 67 65 74 46 61 69  ..    def getFai
1910: 6c 75 72 65 54 79 70 65 20 28 73 65 6c 66 29 3a  lureType (self):
1920: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1930: 34 0a 20 20 20 20 20 20 20 20 23 20 49 53 5f 4e  4.        # IS_N
1940: 45 47 41 54 49 56 45 5f 57 4f 52 44 20 3d 20 32  EGATIVE_WORD = 2
1950: 0a 20 20 20 20 20 20 20 20 23 20 20 20 54 68 65  .        #   The
1960: 20 77 6f 72 64 20 69 73 20 61 20 6e 65 67 61 74   word is a negat
1970: 69 76 65 20 6f 6e 65 2c 20 74 68 61 74 20 69 73  ive one, that is
1980: 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  , it should not 
1990: 62 65 20 75 73 65 64 2e 0a 20 20 20 20 20 20 20  be used..       
19a0: 20 23 20 43 41 50 54 49 4f 4e 5f 45 52 52 4f 52   # CAPTION_ERROR
19b0: 20 3d 20 33 0a 20 20 20 20 20 20 20 20 23 20 20   = 3.        #  
19c0: 20 54 68 65 20 63 61 70 69 74 61 6c 69 7a 61 74   The capitalizat
19d0: 69 6f 6e 20 6f 66 20 74 68 65 20 77 6f 72 64 20  ion of the word 
19e0: 69 73 20 77 72 6f 6e 67 2e 0a 20 20 20 20 20 20  is wrong..      
19f0: 20 20 23 20 53 50 45 4c 4c 49 4e 47 5f 45 52 52    # SPELLING_ERR
1a00: 4f 52 20 3d 20 34 0a 20 20 20 20 20 20 20 20 23  OR = 4.        #
1a10: 20 20 20 54 68 65 20 73 70 65 6c 6c 69 6e 67 20     The spelling 
1a20: 6f 66 20 74 68 65 20 77 6f 72 64 20 69 73 20 77  of the word is w
1a30: 72 6f 6e 67 20 28 6f 72 20 61 74 20 6c 65 61 73  rong (or at leas
1a40: 74 20 6e 6f 74 20 6b 6e 6f 77 6e 20 74 6f 20 62  t not known to b
1a50: 65 20 63 6f 72 72 65 63 74 29 2e 0a 20 20 20 20  e correct)..    
1a60: 20 20 20 20 23 20 4e 6f 20 64 69 66 66 65 72 65      # No differe
1a70: 6e 63 65 20 2d 3e 20 72 65 64 20 75 6e 64 65 72  nce -> red under
1a80: 6c 69 6e 65 0a 0a 20 20 20 20 64 65 66 20 67 65  line..    def ge
1a90: 74 41 6c 74 65 72 6e 61 74 69 76 65 73 43 6f 75  tAlternativesCou
1aa0: 6e 74 20 28 73 65 6c 66 29 3a 0a 20 20 20 20 20  nt (self):.     
1ab0: 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 28 73 65     return len(se
1ac0: 6c 66 2e 6c 53 75 67 67 29 0a 0a 20 20 20 20 64  lf.lSugg)..    d
1ad0: 65 66 20 67 65 74 41 6c 74 65 72 6e 61 74 69 76  ef getAlternativ
1ae0: 65 73 20 28 73 65 6c 66 29 3a 0a 20 20 20 20 20  es (self):.     
1af0: 20 20 20 72 65 74 75 72 6e 20 73 65 6c 66 2e 6c     return self.l
1b00: 53 75 67 67 0a 0a 0a 67 5f 49 6d 70 6c 65 6d 65  Sugg...g_Impleme
1b10: 6e 74 61 74 69 6f 6e 48 65 6c 70 65 72 20 3d 20  ntationHelper = 
1b20: 75 6e 6f 68 65 6c 70 65 72 2e 49 6d 70 6c 65 6d  unohelper.Implem
1b30: 65 6e 74 61 74 69 6f 6e 48 65 6c 70 65 72 28 29  entationHelper()
1b40: 0a 67 5f 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  .g_Implementatio
1b50: 6e 48 65 6c 70 65 72 2e 61 64 64 49 6d 70 6c 65  nHelper.addImple
1b60: 6d 65 6e 74 61 74 69 6f 6e 28 47 72 61 70 68 73  mentation(Graphs
1b70: 70 65 6c 6c 2c 20 22 6e 65 74 2e 67 72 61 6d 6d  pell, "net.gramm
1b80: 61 6c 65 63 74 65 2e 67 72 61 70 68 73 70 65 6c  alecte.graphspel
1b90: 6c 22 2c 20 28 22 63 6f 6d 2e 73 75 6e 2e 73 74  l", ("com.sun.st
1ba0: 61 72 2e 6c 69 6e 67 75 69 73 74 69 63 32 2e 53  ar.linguistic2.S
1bb0: 70 65 6c 6c 43 68 65 63 6b 65 72 22 2c 29 2c 29  pellChecker",),)
1bc0: 0a                                               .