Grammalecte  Hex Artifact Content

Artifact 6b2cfc5228983e90d0e9daf0f80b174d6a1cc75f2af5e4de2dca9c1abbbb93c1:


0000: 23 20 47 72 61 6d 6d 61 6c 65 63 74 65 20 66 6f  # Grammalecte fo
0010: 72 20 57 72 69 74 65 72 0a 23 20 4c 69 63 65 6e  r Writer.# Licen
0020: 73 65 3a 20 4d 50 4c 20 32 0a 23 20 41 20 64 65  se: MPL 2.# A de
0030: 72 69 76 61 74 69 76 65 20 77 6f 72 6b 20 6f 66  rivative work of
0040: 20 4c 69 67 68 74 70 72 6f 6f 66 20 66 72 6f 6d   Lightproof from
0050: 20 4c c3 a1 73 7a 6c c3 b3 20 4e c3 a9 6d 65 74   L..szl.. N..met
0060: 68 20 28 68 74 74 70 3a 2f 2f 63 67 69 74 2e 66  h (http://cgit.f
0070: 72 65 65 64 65 73 6b 74 6f 70 2e 6f 72 67 2f 6c  reedesktop.org/l
0080: 69 62 72 65 6f 66 66 69 63 65 2f 6c 69 67 68 74  ibreoffice/light
0090: 70 72 6f 6f 66 2f 29 0a 0a 69 6d 70 6f 72 74 20  proof/)..import 
00a0: 75 6e 6f 0a 69 6d 70 6f 72 74 20 75 6e 6f 68 65  uno.import unohe
00b0: 6c 70 65 72 0a 69 6d 70 6f 72 74 20 6a 73 6f 6e  lper.import json
00c0: 0a 69 6d 70 6f 72 74 20 73 79 73 0a 69 6d 70 6f  .import sys.impo
00d0: 72 74 20 74 72 61 63 65 62 61 63 6b 0a 66 72 6f  rt traceback.fro
00e0: 6d 20 63 6f 6c 6c 65 63 74 69 6f 6e 73 20 69 6d  m collections im
00f0: 70 6f 72 74 20 64 65 71 75 65 0a 0a 66 72 6f 6d  port deque..from
0100: 20 63 6f 6d 2e 73 75 6e 2e 73 74 61 72 2e 6c 69   com.sun.star.li
0110: 6e 67 75 69 73 74 69 63 32 20 69 6d 70 6f 72 74  nguistic2 import
0120: 20 58 50 72 6f 6f 66 72 65 61 64 65 72 2c 20 58   XProofreader, X
0130: 53 75 70 70 6f 72 74 65 64 4c 6f 63 61 6c 65 73  SupportedLocales
0140: 0a 66 72 6f 6d 20 63 6f 6d 2e 73 75 6e 2e 73 74  .from com.sun.st
0150: 61 72 2e 6c 69 6e 67 75 69 73 74 69 63 32 20 69  ar.linguistic2 i
0160: 6d 70 6f 72 74 20 50 72 6f 6f 66 72 65 61 64 69  mport Proofreadi
0170: 6e 67 52 65 73 75 6c 74 0a 66 72 6f 6d 20 63 6f  ngResult.from co
0180: 6d 2e 73 75 6e 2e 73 74 61 72 2e 6c 61 6e 67 20  m.sun.star.lang 
0190: 69 6d 70 6f 72 74 20 58 53 65 72 76 69 63 65 49  import XServiceI
01a0: 6e 66 6f 2c 20 58 53 65 72 76 69 63 65 4e 61 6d  nfo, XServiceNam
01b0: 65 2c 20 58 53 65 72 76 69 63 65 44 69 73 70 6c  e, XServiceDispl
01c0: 61 79 4e 61 6d 65 0a 66 72 6f 6d 20 63 6f 6d 2e  ayName.from com.
01d0: 73 75 6e 2e 73 74 61 72 2e 6c 61 6e 67 20 69 6d  sun.star.lang im
01e0: 70 6f 72 74 20 4c 6f 63 61 6c 65 0a 0a 69 6d 70  port Locale..imp
01f0: 6f 72 74 20 68 65 6c 70 65 72 73 0a 69 6d 70 6f  ort helpers.impo
0200: 72 74 20 67 72 61 6d 6d 61 6c 65 63 74 65 2e 24  rt grammalecte.$
0210: 7b 6c 61 6e 67 7d 20 61 73 20 67 63 65 0a 23 69  {lang} as gce.#i
0220: 6d 70 6f 72 74 20 6c 69 67 68 74 70 72 6f 6f 66  mport lightproof
0230: 5f 68 61 6e 64 6c 65 72 5f 24 7b 69 6d 70 6c 6e  _handler_${impln
0240: 61 6d 65 7d 20 61 73 20 6f 70 74 5f 68 61 6e 64  ame} as opt_hand
0250: 6c 65 72 0a 69 6d 70 6f 72 74 20 4f 70 74 69 6f  ler.import Optio
0260: 6e 73 0a 0a 0a 63 6c 61 73 73 20 47 72 61 6d 6d  ns...class Gramm
0270: 61 6c 65 63 74 65 20 28 75 6e 6f 68 65 6c 70 65  alecte (unohelpe
0280: 72 2e 42 61 73 65 2c 20 58 50 72 6f 6f 66 72 65  r.Base, XProofre
0290: 61 64 65 72 2c 20 58 53 65 72 76 69 63 65 49 6e  ader, XServiceIn
02a0: 66 6f 2c 20 58 53 65 72 76 69 63 65 4e 61 6d 65  fo, XServiceName
02b0: 2c 20 58 53 65 72 76 69 63 65 44 69 73 70 6c 61  , XServiceDispla
02c0: 79 4e 61 6d 65 2c 20 58 53 75 70 70 6f 72 74 65  yName, XSupporte
02d0: 64 4c 6f 63 61 6c 65 73 29 3a 0a 0a 20 20 20 20  dLocales):..    
02e0: 64 65 66 20 5f 5f 69 6e 69 74 5f 5f 20 28 73 65  def __init__ (se
02f0: 6c 66 2c 20 63 74 78 2c 20 2a 61 72 67 73 29 3a  lf, ctx, *args):
0300: 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 63 74  .        self.ct
0310: 78 20 3d 20 63 74 78 0a 20 20 20 20 20 20 20 20  x = ctx.        
0320: 73 65 6c 66 2e 53 65 72 76 69 63 65 4e 61 6d 65  self.ServiceName
0330: 20 3d 20 22 63 6f 6d 2e 73 75 6e 2e 73 74 61 72   = "com.sun.star
0340: 2e 6c 69 6e 67 75 69 73 74 69 63 32 2e 50 72 6f  .linguistic2.Pro
0350: 6f 66 72 65 61 64 65 72 22 0a 20 20 20 20 20 20  ofreader".      
0360: 20 20 73 65 6c 66 2e 49 6d 70 6c 65 6d 65 6e 74    self.Implement
0370: 61 74 69 6f 6e 4e 61 6d 65 20 3d 20 22 6f 72 67  ationName = "org
0380: 2e 6f 70 65 6e 6f 66 66 69 63 65 2e 63 6f 6d 70  .openoffice.comp
0390: 2e 70 79 75 6e 6f 2e 4c 69 67 68 74 70 72 6f 6f  .pyuno.Lightproo
03a0: 66 2e 22 20 2b 20 67 63 65 2e 70 6b 67 0a 20 20  f." + gce.pkg.  
03b0: 20 20 20 20 20 20 73 65 6c 66 2e 53 75 70 70 6f        self.Suppo
03c0: 72 74 65 64 53 65 72 76 69 63 65 4e 61 6d 65 73  rtedServiceNames
03d0: 20 3d 20 28 73 65 6c 66 2e 53 65 72 76 69 63 65   = (self.Service
03e0: 4e 61 6d 65 2c 20 29 0a 20 20 20 20 20 20 20 20  Name, ).        
03f0: 73 65 6c 66 2e 6c 6f 63 61 6c 65 73 20 3d 20 5b  self.locales = [
0400: 5d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 69 20  ].        for i 
0410: 69 6e 20 67 63 65 2e 6c 6f 63 61 6c 65 73 3a 0a  in gce.locales:.
0420: 20 20 20 20 20 20 20 20 20 20 20 20 6c 20 3d 20              l = 
0430: 67 63 65 2e 6c 6f 63 61 6c 65 73 5b 69 5d 0a 20  gce.locales[i]. 
0440: 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e             self.
0450: 6c 6f 63 61 6c 65 73 2e 61 70 70 65 6e 64 28 4c  locales.append(L
0460: 6f 63 61 6c 65 28 6c 5b 30 5d 2c 20 6c 5b 31 5d  ocale(l[0], l[1]
0470: 2c 20 6c 5b 32 5d 29 29 0a 20 20 20 20 20 20 20  , l[2])).       
0480: 20 73 65 6c 66 2e 6c 6f 63 61 6c 65 73 20 3d 20   self.locales = 
0490: 74 75 70 6c 65 28 73 65 6c 66 2e 6c 6f 63 61 6c  tuple(self.local
04a0: 65 73 29 0a 20 20 20 20 20 20 20 20 78 43 75 72  es).        xCur
04b0: 43 74 78 20 3d 20 75 6e 6f 2e 67 65 74 43 6f 6d  Ctx = uno.getCom
04c0: 70 6f 6e 65 6e 74 43 6f 6e 74 65 78 74 28 29 0a  ponentContext().
04d0: 20 20 20 20 20 20 20 20 23 20 69 6e 69 74 0a 20          # init. 
04e0: 20 20 20 20 20 20 20 67 63 65 2e 6c 6f 61 64 28         gce.load(
04f0: 22 57 72 69 74 65 72 22 29 0a 20 20 20 20 20 20  "Writer").      
0500: 20 20 23 20 47 43 20 6f 70 74 69 6f 6e 73 0a 20    # GC options. 
0510: 20 20 20 20 20 20 20 23 20 6f 70 74 5f 68 61 6e         # opt_han
0520: 64 6c 65 72 2e 6c 6f 61 64 28 78 43 75 72 43 74  dler.load(xCurCt
0530: 78 29 0a 20 20 20 20 20 20 20 20 64 4f 70 74 20  x).        dOpt 
0540: 3d 20 4f 70 74 69 6f 6e 73 2e 6c 6f 61 64 28 78  = Options.load(x
0550: 43 75 72 43 74 78 29 0a 20 20 20 20 20 20 20 20  CurCtx).        
0560: 67 63 65 2e 73 65 74 4f 70 74 69 6f 6e 73 28 64  gce.setOptions(d
0570: 4f 70 74 29 0a 20 20 20 20 20 20 20 20 23 20 64  Opt).        # d
0580: 69 63 74 69 6f 6e 61 72 69 65 73 20 6f 70 74 69  ictionaries opti
0590: 6f 6e 73 0a 20 20 20 20 20 20 20 20 73 65 6c 66  ons.        self
05a0: 2e 6c 6f 61 64 55 73 65 72 44 69 63 74 69 6f 6e  .loadUserDiction
05b0: 61 72 69 65 73 28 29 0a 20 20 20 20 20 20 20 20  aries().        
05c0: 23 20 73 74 6f 72 65 20 66 6f 72 20 72 65 73 75  # store for resu
05d0: 6c 74 73 20 6f 66 20 62 69 67 20 70 61 72 61 67  lts of big parag
05e0: 72 61 70 68 73 0a 20 20 20 20 20 20 20 20 73 65  raphs.        se
05f0: 6c 66 2e 64 52 65 73 75 6c 74 20 3d 20 7b 7d 0a  lf.dResult = {}.
0600: 20 20 20 20 20 20 20 20 73 65 6c 66 2e 6e 4d 61          self.nMa
0610: 78 52 65 73 20 3d 20 31 35 30 30 0a 20 20 20 20  xRes = 1500.    
0620: 20 20 20 20 73 65 6c 66 2e 6c 4c 61 73 74 52 65      self.lLastRe
0630: 73 20 3d 20 64 65 71 75 65 28 6d 61 78 6c 65 6e  s = deque(maxlen
0640: 3d 73 65 6c 66 2e 6e 4d 61 78 52 65 73 29 0a 20  =self.nMaxRes). 
0650: 20 20 20 20 20 20 20 73 65 6c 66 2e 6e 52 65 73         self.nRes
0660: 20 3d 20 30 0a 0a 0a 20 20 20 20 23 20 58 53 65   = 0...    # XSe
0670: 72 76 69 63 65 4e 61 6d 65 20 6d 65 74 68 6f 64  rviceName method
0680: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
0690: 0a 20 20 20 20 64 65 66 20 67 65 74 53 65 72 76  .    def getServ
06a0: 69 63 65 4e 61 6d 65 20 28 73 65 6c 66 29 3a 0a  iceName (self):.
06b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
06c0: 65 6c 66 2e 49 6d 70 6c 65 6d 65 6e 74 61 74 69  elf.Implementati
06d0: 6f 6e 4e 61 6d 65 0a 0a 20 20 20 20 23 20 58 53  onName..    # XS
06e0: 65 72 76 69 63 65 49 6e 66 6f 20 6d 65 74 68 6f  erviceInfo metho
06f0: 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  d implementation
0700: 73 0a 20 20 20 20 64 65 66 20 67 65 74 49 6d 70  s.    def getImp
0710: 6c 65 6d 65 6e 74 61 74 69 6f 6e 4e 61 6d 65 20  lementationName 
0720: 28 73 65 6c 66 29 3a 0a 20 20 20 20 20 20 20 20  (self):.        
0730: 72 65 74 75 72 6e 20 73 65 6c 66 2e 49 6d 70 6c  return self.Impl
0740: 65 6d 65 6e 74 61 74 69 6f 6e 4e 61 6d 65 0a 0a  ementationName..
0750: 20 20 20 20 64 65 66 20 73 75 70 70 6f 72 74 73      def supports
0760: 53 65 72 76 69 63 65 20 28 73 65 6c 66 2c 20 53  Service (self, S
0770: 65 72 76 69 63 65 4e 61 6d 65 29 3a 0a 20 20 20  erviceName):.   
0780: 20 20 20 20 20 72 65 74 75 72 6e 20 28 53 65 72       return (Ser
0790: 76 69 63 65 4e 61 6d 65 20 69 6e 20 73 65 6c 66  viceName in self
07a0: 2e 53 75 70 70 6f 72 74 65 64 53 65 72 76 69 63  .SupportedServic
07b0: 65 4e 61 6d 65 73 29 0a 0a 20 20 20 20 64 65 66  eNames)..    def
07c0: 20 67 65 74 53 75 70 70 6f 72 74 65 64 53 65 72   getSupportedSer
07d0: 76 69 63 65 4e 61 6d 65 73 20 28 73 65 6c 66 29  viceNames (self)
07e0: 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  :.        return
07f0: 20 73 65 6c 66 2e 53 75 70 70 6f 72 74 65 64 53   self.SupportedS
0800: 65 72 76 69 63 65 4e 61 6d 65 73 0a 0a 20 20 20  erviceNames..   
0810: 20 23 20 58 53 75 70 70 6f 72 74 65 64 4c 6f 63   # XSupportedLoc
0820: 61 6c 65 73 0a 20 20 20 20 64 65 66 20 68 61 73  ales.    def has
0830: 4c 6f 63 61 6c 65 20 28 73 65 6c 66 2c 20 61 4c  Locale (self, aL
0840: 6f 63 61 6c 65 29 3a 0a 20 20 20 20 20 20 20 20  ocale):.        
0850: 69 66 20 61 4c 6f 63 61 6c 65 20 69 6e 20 73 65  if aLocale in se
0860: 6c 66 2e 6c 6f 63 61 6c 65 73 3a 0a 20 20 20 20  lf.locales:.    
0870: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
0880: 72 75 65 0a 20 20 20 20 20 20 20 20 66 6f 72 20  rue.        for 
0890: 69 20 69 6e 20 73 65 6c 66 2e 6c 6f 63 61 6c 65  i in self.locale
08a0: 73 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  s:.            i
08b0: 66 20 28 69 2e 43 6f 75 6e 74 72 79 20 3d 3d 20  f (i.Country == 
08c0: 61 4c 6f 63 61 6c 65 2e 43 6f 75 6e 74 72 79 20  aLocale.Country 
08d0: 6f 72 20 69 2e 43 6f 75 6e 74 72 79 20 3d 3d 20  or i.Country == 
08e0: 22 22 29 20 61 6e 64 20 61 4c 6f 63 61 6c 65 2e  "") and aLocale.
08f0: 4c 61 6e 67 75 61 67 65 20 3d 3d 20 69 2e 4c 61  Language == i.La
0900: 6e 67 75 61 67 65 3a 0a 20 20 20 20 20 20 20 20  nguage:.        
0910: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
0920: 72 75 65 0a 20 20 20 20 20 20 20 20 72 65 74 75  rue.        retu
0930: 72 6e 20 46 61 6c 73 65 0a 0a 20 20 20 20 64 65  rn False..    de
0940: 66 20 67 65 74 4c 6f 63 61 6c 65 73 20 28 73 65  f getLocales (se
0950: 6c 66 29 3a 0a 20 20 20 20 20 20 20 20 72 65 74  lf):.        ret
0960: 75 72 6e 20 73 65 6c 66 2e 6c 6f 63 61 6c 65 73  urn self.locales
0970: 0a 0a 20 20 20 20 23 20 58 50 72 6f 6f 66 72 65  ..    # XProofre
0980: 61 64 65 72 0a 20 20 20 20 64 65 66 20 69 73 53  ader.    def isS
0990: 70 65 6c 6c 43 68 65 63 6b 65 72 20 28 73 65 6c  pellChecker (sel
09a0: 66 29 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  f):.        retu
09b0: 72 6e 20 46 61 6c 73 65 0a 0a 20 20 20 20 64 65  rn False..    de
09c0: 66 20 64 6f 50 72 6f 6f 66 72 65 61 64 69 6e 67  f doProofreading
09d0: 20 28 73 65 6c 66 2c 20 6e 44 6f 63 49 64 2c 20   (self, nDocId, 
09e0: 72 54 65 78 74 2c 20 72 4c 6f 63 61 6c 65 2c 20  rText, rLocale, 
09f0: 6e 53 74 61 72 74 4f 66 53 65 6e 74 65 6e 63 65  nStartOfSentence
0a00: 50 6f 73 2c 20 6e 53 75 67 67 65 73 74 65 64 53  Pos, nSuggestedS
0a10: 65 6e 74 65 6e 63 65 45 6e 64 50 6f 73 2c 20 72  entenceEndPos, r
0a20: 50 72 6f 70 65 72 74 69 65 73 29 3a 0a 20 20 20  Properties):.   
0a30: 20 20 20 20 20 78 52 65 73 20 3d 20 50 72 6f 6f       xRes = Proo
0a40: 66 72 65 61 64 69 6e 67 52 65 73 75 6c 74 28 29  freadingResult()
0a50: 0a 20 20 20 20 20 20 20 20 23 78 52 65 73 20 3d  .        #xRes =
0a60: 20 75 6e 6f 2e 63 72 65 61 74 65 55 6e 6f 53 74   uno.createUnoSt
0a70: 72 75 63 74 28 22 63 6f 6d 2e 73 75 6e 2e 73 74  ruct("com.sun.st
0a80: 61 72 2e 6c 69 6e 67 75 69 73 74 69 63 32 2e 50  ar.linguistic2.P
0a90: 72 6f 6f 66 72 65 61 64 69 6e 67 52 65 73 75 6c  roofreadingResul
0aa0: 74 22 29 0a 20 20 20 20 20 20 20 20 78 52 65 73  t").        xRes
0ab0: 2e 61 44 6f 63 75 6d 65 6e 74 49 64 65 6e 74 69  .aDocumentIdenti
0ac0: 66 69 65 72 20 3d 20 6e 44 6f 63 49 64 0a 20 20  fier = nDocId.  
0ad0: 20 20 20 20 20 20 78 52 65 73 2e 61 54 65 78 74        xRes.aText
0ae0: 20 3d 20 72 54 65 78 74 0a 20 20 20 20 20 20 20   = rText.       
0af0: 20 78 52 65 73 2e 61 4c 6f 63 61 6c 65 20 3d 20   xRes.aLocale = 
0b00: 72 4c 6f 63 61 6c 65 0a 20 20 20 20 20 20 20 20  rLocale.        
0b10: 78 52 65 73 2e 6e 53 74 61 72 74 4f 66 53 65 6e  xRes.nStartOfSen
0b20: 74 65 6e 63 65 50 6f 73 69 74 69 6f 6e 20 3d 20  tencePosition = 
0b30: 6e 53 74 61 72 74 4f 66 53 65 6e 74 65 6e 63 65  nStartOfSentence
0b40: 50 6f 73 0a 20 20 20 20 20 20 20 20 78 52 65 73  Pos.        xRes
0b50: 2e 6e 53 74 61 72 74 4f 66 4e 65 78 74 53 65 6e  .nStartOfNextSen
0b60: 74 65 6e 63 65 50 6f 73 69 74 69 6f 6e 20 3d 20  tencePosition = 
0b70: 6e 53 75 67 67 65 73 74 65 64 53 65 6e 74 65 6e  nSuggestedSenten
0b80: 63 65 45 6e 64 50 6f 73 0a 20 20 20 20 20 20 20  ceEndPos.       
0b90: 20 78 52 65 73 2e 61 50 72 6f 70 65 72 74 69 65   xRes.aPropertie
0ba0: 73 20 3d 20 28 29 0a 20 20 20 20 20 20 20 20 78  s = ().        x
0bb0: 52 65 73 2e 78 50 72 6f 6f 66 72 65 61 64 65 72  Res.xProofreader
0bc0: 20 3d 20 73 65 6c 66 0a 20 20 20 20 20 20 20 20   = self.        
0bd0: 78 52 65 73 2e 61 45 72 72 6f 72 73 20 3d 20 28  xRes.aErrors = (
0be0: 29 0a 0a 20 20 20 20 20 20 20 20 23 20 50 41 54  )..        # PAT
0bf0: 43 48 20 46 4f 52 20 4c 4f 20 34 0a 20 20 20 20  CH FOR LO 4.    
0c00: 20 20 20 20 23 20 46 69 78 20 66 6f 72 20 68 74      # Fix for ht
0c10: 74 70 3a 2f 2f 6e 61 62 62 6c 65 2e 64 6f 63 75  tp://nabble.docu
0c20: 6d 65 6e 74 66 6f 75 6e 64 61 74 69 6f 6e 2e 6f  mentfoundation.o
0c30: 72 67 2f 47 72 61 6d 6d 61 72 2d 63 68 65 63 6b  rg/Grammar-check
0c40: 65 72 2d 55 6e 64 6f 63 75 6d 65 6e 74 65 64 2d  er-Undocumented-
0c50: 63 68 61 6e 67 65 2d 69 6e 2d 74 68 65 2d 41 50  change-in-the-AP
0c60: 49 2d 66 6f 72 2d 4c 4f 2d 34 2d 74 64 34 30 33  I-for-LO-4-td403
0c70: 30 36 33 39 2e 68 74 6d 6c 0a 20 20 20 20 20 20  0639.html.      
0c80: 20 20 69 66 20 6e 53 74 61 72 74 4f 66 53 65 6e    if nStartOfSen
0c90: 74 65 6e 63 65 50 6f 73 20 21 3d 20 30 3a 0a 20  tencePos != 0:. 
0ca0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
0cb0: 6e 20 78 52 65 73 0a 20 20 20 20 20 20 20 20 78  n xRes.        x
0cc0: 52 65 73 2e 6e 53 74 61 72 74 4f 66 4e 65 78 74  Res.nStartOfNext
0cd0: 53 65 6e 74 65 6e 63 65 50 6f 73 69 74 69 6f 6e  SentencePosition
0ce0: 20 3d 20 6c 65 6e 28 72 54 65 78 74 29 0a 20 20   = len(rText).  
0cf0: 20 20 20 20 20 20 23 20 45 4e 44 20 4f 46 20 50        # END OF P
0d00: 41 54 43 48 0a 0a 20 20 20 20 20 20 20 20 23 20  ATCH..        # 
0d10: 57 4f 52 4b 41 52 4f 55 4e 44 20 46 4f 52 20 41  WORKAROUND FOR A
0d20: 56 4f 49 44 49 4e 47 20 52 45 50 45 41 54 45 44  VOIDING REPEATED
0d30: 20 41 43 54 49 4f 4e 53 20 4f 4e c2 a0 48 45 41   ACTIONS ON..HEA
0d40: 56 59 20 50 41 52 41 47 52 41 50 48 53 0a 20 20  VY PARAGRAPHS.  
0d50: 20 20 20 20 20 20 69 66 20 78 52 65 73 2e 6e 53        if xRes.nS
0d60: 74 61 72 74 4f 66 4e 65 78 74 53 65 6e 74 65 6e  tartOfNextSenten
0d70: 63 65 50 6f 73 69 74 69 6f 6e 20 3e 20 33 30 30  cePosition > 300
0d80: 30 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  0:.            n
0d90: 48 61 73 68 65 64 56 61 6c 20 3d 20 68 61 73 68  HashedVal = hash
0da0: 28 72 54 65 78 74 29 0a 20 20 20 20 20 20 20 20  (rText).        
0db0: 20 20 20 20 69 66 20 6e 48 61 73 68 65 64 56 61      if nHashedVa
0dc0: 6c 20 69 6e 20 73 65 6c 66 2e 64 52 65 73 75 6c  l in self.dResul
0dd0: 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t:.             
0de0: 20 20 20 72 65 74 75 72 6e 20 73 65 6c 66 2e 64     return self.d
0df0: 52 65 73 75 6c 74 5b 6e 48 61 73 68 65 64 56 61  Result[nHashedVa
0e00: 6c 5d 0a 20 20 20 20 20 20 20 20 23 20 57 4f 52  l].        # WOR
0e10: 4b 41 52 4f 55 4e 44 20 2d 3e 3e 3e 0a 0a 20 20  KAROUND ->>>..  
0e20: 20 20 20 20 20 20 78 52 65 73 2e 6e 42 65 68 69        xRes.nBehi
0e30: 6e 64 45 6e 64 4f 66 53 65 6e 74 65 6e 63 65 50  ndEndOfSentenceP
0e40: 6f 73 69 74 69 6f 6e 20 3d 20 78 52 65 73 2e 6e  osition = xRes.n
0e50: 53 74 61 72 74 4f 66 4e 65 78 74 53 65 6e 74 65  StartOfNextSente
0e60: 6e 63 65 50 6f 73 69 74 69 6f 6e 0a 0a 20 20 20  ncePosition..   
0e70: 20 20 20 20 20 74 72 79 3a 0a 20 20 20 20 20 20       try:.      
0e80: 20 20 20 20 20 20 78 52 65 73 2e 61 45 72 72 6f        xRes.aErro
0e90: 72 73 20 3d 20 74 75 70 6c 65 28 67 63 65 2e 70  rs = tuple(gce.p
0ea0: 61 72 73 65 28 72 54 65 78 74 2c 20 72 4c 6f 63  arse(rText, rLoc
0eb0: 61 6c 65 2e 43 6f 75 6e 74 72 79 29 29 0a 0a 20  ale.Country)).. 
0ec0: 20 20 20 20 20 20 20 20 20 20 20 23 20 2d 3e 3e             # ->>
0ed0: 3e 20 57 4f 52 4b 41 52 4f 55 4e 44 0a 20 20 20  > WORKAROUND.   
0ee0: 20 20 20 20 20 20 20 20 20 69 66 20 78 52 65 73           if xRes
0ef0: 2e 6e 53 74 61 72 74 4f 66 4e 65 78 74 53 65 6e  .nStartOfNextSen
0f00: 74 65 6e 63 65 50 6f 73 69 74 69 6f 6e 20 3e 20  tencePosition > 
0f10: 33 30 30 30 3a 0a 20 20 20 20 20 20 20 20 20 20  3000:.          
0f20: 20 20 20 20 20 20 73 65 6c 66 2e 64 52 65 73 75        self.dResu
0f30: 6c 74 5b 6e 48 61 73 68 65 64 56 61 6c 5d 20 3d  lt[nHashedVal] =
0f40: 20 78 52 65 73 0a 20 20 20 20 20 20 20 20 20 20   xRes.          
0f50: 20 20 20 20 20 20 73 65 6c 66 2e 6e 52 65 73 20        self.nRes 
0f60: 2b 3d 20 31 0a 20 20 20 20 20 20 20 20 20 20 20  += 1.           
0f70: 20 20 20 20 20 69 66 20 73 65 6c 66 2e 6e 52 65       if self.nRe
0f80: 73 20 3e 20 73 65 6c 66 2e 6e 4d 61 78 52 65 73  s > self.nMaxRes
0f90: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
0fa0: 20 20 20 20 20 20 64 65 6c 20 73 65 6c 66 2e 64        del self.d
0fb0: 52 65 73 75 6c 74 5b 73 65 6c 66 2e 6c 4c 61 73  Result[self.lLas
0fc0: 74 52 65 73 2e 70 6f 70 6c 65 66 74 28 29 5d 0a  tRes.popleft()].
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fe0: 20 20 20 20 73 65 6c 66 2e 6e 52 65 73 20 3d 20      self.nRes = 
0ff0: 73 65 6c 66 2e 6e 4d 61 78 52 65 73 0a 20 20 20  self.nMaxRes.   
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c               sel
1010: 66 2e 6c 4c 61 73 74 52 65 73 2e 61 70 70 65 6e  f.lLastRes.appen
1020: 64 28 6e 48 61 73 68 65 64 56 61 6c 29 0a 20 20  d(nHashedVal).  
1030: 20 20 20 20 20 20 20 20 20 20 23 20 45 4e 44 20            # END 
1040: 4f 46 20 57 4f 52 4b 41 52 4f 55 4e 44 0a 20 20  OF WORKAROUND.  
1050: 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
1060: 20 20 20 65 78 63 65 70 74 20 45 78 63 65 70 74     except Except
1070: 69 6f 6e 20 61 73 20 65 3a 0a 20 20 20 20 20 20  ion as e:.      
1080: 20 20 20 20 20 20 69 66 20 73 79 73 2e 76 65 72        if sys.ver
1090: 73 69 6f 6e 5f 69 6e 66 6f 2e 6d 61 6a 6f 72 20  sion_info.major 
10a0: 3d 3d 20 33 3a 0a 20 20 20 20 20 20 20 20 20 20  == 3:.          
10b0: 20 20 20 20 20 20 74 72 61 63 65 62 61 63 6b 2e        traceback.
10c0: 70 72 69 6e 74 5f 65 78 63 28 29 0a 0a 20 20 20  print_exc()..   
10d0: 20 20 20 20 20 72 65 74 75 72 6e 20 78 52 65 73       return xRes
10e0: 0a 0a 20 20 20 20 64 65 66 20 69 67 6e 6f 72 65  ..    def ignore
10f0: 52 75 6c 65 20 28 73 65 6c 66 2c 20 72 69 64 2c  Rule (self, rid,
1100: 20 61 4c 6f 63 61 6c 65 29 3a 0a 20 20 20 20 20   aLocale):.     
1110: 20 20 20 67 63 65 2e 69 67 6e 6f 72 65 52 75 6c     gce.ignoreRul
1120: 65 28 72 69 64 29 0a 0a 20 20 20 20 64 65 66 20  e(rid)..    def 
1130: 72 65 73 65 74 49 67 6e 6f 72 65 52 75 6c 65 73  resetIgnoreRules
1140: 20 28 73 65 6c 66 29 3a 0a 20 20 20 20 20 20 20   (self):.       
1150: 20 67 63 65 2e 72 65 73 65 74 49 67 6e 6f 72 65   gce.resetIgnore
1160: 52 75 6c 65 73 28 29 0a 0a 20 20 20 20 23 20 58  Rules()..    # X
1170: 53 65 72 76 69 63 65 44 69 73 70 6c 61 79 4e 61  ServiceDisplayNa
1180: 6d 65 0a 20 20 20 20 64 65 66 20 67 65 74 53 65  me.    def getSe
1190: 72 76 69 63 65 44 69 73 70 6c 61 79 4e 61 6d 65  rviceDisplayName
11a0: 20 28 73 65 6c 66 2c 20 61 4c 6f 63 61 6c 65 29   (self, aLocale)
11b0: 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  :.        return
11c0: 20 67 63 65 2e 6e 61 6d 65 0a 0a 20 20 20 20 23   gce.name..    #
11d0: 20 47 72 61 6d 6d 61 6c 65 63 74 65 0a 20 20 20   Grammalecte.   
11e0: 20 64 65 66 20 67 65 74 53 70 65 6c 6c 43 68 65   def getSpellChe
11f0: 63 6b 65 72 20 28 73 65 6c 66 29 3a 0a 20 20 20  cker (self):.   
1200: 20 20 20 20 20 72 65 74 75 72 6e 20 67 63 65 2e       return gce.
1210: 67 65 74 53 70 65 6c 6c 43 68 65 63 6b 65 72 28  getSpellChecker(
1220: 29 0a 0a 20 20 20 20 64 65 66 20 6c 6f 61 64 55  )..    def loadU
1230: 73 65 72 44 69 63 74 69 6f 6e 61 72 69 65 73 20  serDictionaries 
1240: 28 73 65 6c 66 29 3a 0a 20 20 20 20 20 20 20 20  (self):.        
1250: 74 72 79 3a 0a 20 20 20 20 20 20 20 20 20 20 20  try:.           
1260: 20 78 53 65 74 74 69 6e 67 4e 6f 64 65 20 3d 20   xSettingNode = 
1270: 68 65 6c 70 65 72 73 2e 67 65 74 43 6f 6e 66 69  helpers.getConfi
1280: 67 53 65 74 74 69 6e 67 28 22 2f 6f 72 67 2e 6f  gSetting("/org.o
1290: 70 65 6e 6f 66 66 69 63 65 2e 4c 69 67 68 74 70  penoffice.Lightp
12a0: 72 6f 6f 66 5f 67 72 61 6d 6d 61 6c 65 63 74 65  roof_grammalecte
12b0: 2f 4f 74 68 65 72 2f 22 2c 20 46 61 6c 73 65 29  /Other/", False)
12c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 43 68  .            xCh
12d0: 69 6c 64 20 3d 20 78 53 65 74 74 69 6e 67 4e 6f  ild = xSettingNo
12e0: 64 65 2e 67 65 74 42 79 4e 61 6d 65 28 22 6f 5f  de.getByName("o_
12f0: 24 7b 6c 61 6e 67 7d 22 29 0a 20 20 20 20 20 20  ${lang}").      
1300: 20 20 20 20 20 20 69 66 20 78 43 68 69 6c 64 2e        if xChild.
1310: 67 65 74 50 72 6f 70 65 72 74 79 56 61 6c 75 65  getPropertyValue
1320: 28 22 75 73 65 5f 70 65 72 73 6f 6e 61 6c 5f 64  ("use_personal_d
1330: 69 63 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  ic"):.          
1340: 20 20 20 20 20 20 73 4a 53 4f 4e 20 3d 20 78 43        sJSON = xC
1350: 68 69 6c 64 2e 67 65 74 50 72 6f 70 65 72 74 79  hild.getProperty
1360: 56 61 6c 75 65 28 22 70 65 72 73 6f 6e 61 6c 5f  Value("personal_
1370: 64 69 63 22 29 0a 20 20 20 20 20 20 20 20 20 20  dic").          
1380: 20 20 20 20 20 20 69 66 20 73 4a 53 4f 4e 3a 0a        if sJSON:.
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 20 20 20 20 6f 53 70 65 6c 6c 43 68 65 63 6b 65      oSpellChecke
13b0: 72 20 3d 20 67 63 65 2e 67 65 74 53 70 65 6c 6c  r = gce.getSpell
13c0: 43 68 65 63 6b 65 72 28 29 3b 0a 20 20 20 20 20  Checker();.     
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
13e0: 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e 73 65 74  SpellChecker.set
13f0: 50 65 72 73 6f 6e 61 6c 44 69 63 74 69 6f 6e 61  PersonalDictiona
1400: 72 79 28 6a 73 6f 6e 2e 6c 6f 61 64 73 28 73 4a  ry(json.loads(sJ
1410: 53 4f 4e 29 29 0a 20 20 20 20 20 20 20 20 65 78  SON)).        ex
1420: 63 65 70 74 3a 0a 20 20 20 20 20 20 20 20 20 20  cept:.          
1430: 20 20 74 72 61 63 65 62 61 63 6b 2e 70 72 69 6e    traceback.prin
1440: 74 5f 65 78 63 28 29 0a 0a 0a 67 5f 49 6d 70 6c  t_exc()...g_Impl
1450: 65 6d 65 6e 74 61 74 69 6f 6e 48 65 6c 70 65 72  ementationHelper
1460: 20 3d 20 75 6e 6f 68 65 6c 70 65 72 2e 49 6d 70   = unohelper.Imp
1470: 6c 65 6d 65 6e 74 61 74 69 6f 6e 48 65 6c 70 65  lementationHelpe
1480: 72 28 29 0a 67 5f 49 6d 70 6c 65 6d 65 6e 74 61  r().g_Implementa
1490: 74 69 6f 6e 48 65 6c 70 65 72 2e 61 64 64 49 6d  tionHelper.addIm
14a0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 28 47 72 61  plementation(Gra
14b0: 6d 6d 61 6c 65 63 74 65 2c 20 22 6f 72 67 2e 6f  mmalecte, "org.o
14c0: 70 65 6e 6f 66 66 69 63 65 2e 63 6f 6d 70 2e 70  penoffice.comp.p
14d0: 79 75 6e 6f 2e 4c 69 67 68 74 70 72 6f 6f 66 2e  yuno.Lightproof.
14e0: 22 2b 67 63 65 2e 70 6b 67 2c 20 28 22 63 6f 6d  "+gce.pkg, ("com
14f0: 2e 73 75 6e 2e 73 74 61 72 2e 6c 69 6e 67 75 69  .sun.star.lingui
1500: 73 74 69 63 32 2e 50 72 6f 6f 66 72 65 61 64 65  stic2.Proofreade
1510: 72 22 2c 29 2c 29 0a 0a 23 20 67 5f 49 6d 70 6c  r",),)..# g_Impl
1520: 65 6d 65 6e 74 61 74 69 6f 6e 48 65 6c 70 65 72  ementationHelper
1530: 2e 61 64 64 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .addImplementati
1540: 6f 6e 28 20 6f 70 74 5f 68 61 6e 64 6c 65 72 2e  on( opt_handler.
1550: 4c 69 67 68 74 70 72 6f 6f 66 4f 70 74 69 6f 6e  LightproofOption
1560: 73 45 76 65 6e 74 48 61 6e 64 6c 65 72 2c 20 5c  sEventHandler, \
1570: 0a 23 20 20 20 20 20 22 6f 72 67 2e 6f 70 65 6e  .#     "org.open
1580: 6f 66 66 69 63 65 2e 63 6f 6d 70 2e 70 79 75 6e  office.comp.pyun
1590: 6f 2e 4c 69 67 68 74 70 72 6f 6f 66 4f 70 74 69  o.LightproofOpti
15a0: 6f 6e 73 45 76 65 6e 74 48 61 6e 64 6c 65 72 2e  onsEventHandler.
15b0: 22 20 2b 20 67 63 65 2e 70 6b 67 2c 20 28 22 63  " + gce.pkg, ("c
15c0: 6f 6d 2e 73 75 6e 2e 73 74 61 72 2e 61 77 74 2e  om.sun.star.awt.
15d0: 58 43 6f 6e 74 61 69 6e 65 72 57 69 6e 64 6f 77  XContainerWindow
15e0: 45 76 65 6e 74 48 61 6e 64 6c 65 72 22 2c 29 2c  EventHandler",),
15f0: 29 0a                                            ).