Grammalecte  Hex Artifact Content

Artifact caf6d0c215f92dd7761053312823afdde3605415ce86a68cad9d2b620967ac3c:


0000: 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 75 74  # -*- coding: ut
0010: 66 2d 38 20 2d 2a 2d 0a 23 20 28 63 29 20 32 30  f-8 -*-.# (c) 20
0020: 30 39 20 46 69 6e 6e 20 47 72 75 77 69 65 72 20  09 Finn Gruwier 
0030: 4c 61 72 73 65 6e 0a 0a 69 6d 70 6f 72 74 20 75  Larsen..import u
0040: 6e 6f 0a 69 6d 70 6f 72 74 20 75 6e 6f 68 65 6c  no.import unohel
0050: 70 65 72 0a 69 6d 70 6f 72 74 20 73 79 73 0a 69  per.import sys.i
0060: 6d 70 6f 72 74 20 74 72 61 63 65 62 61 63 6b 0a  mport traceback.
0070: 0a 66 72 6f 6d 20 63 6f 6d 2e 73 75 6e 2e 73 74  .from com.sun.st
0080: 61 72 2e 74 61 73 6b 20 69 6d 70 6f 72 74 20 58  ar.task import X
0090: 4a 6f 62 45 78 65 63 75 74 6f 72 0a 66 72 6f 6d  JobExecutor.from
00a0: 20 63 6f 6d 2e 73 75 6e 2e 73 74 61 72 2e 61 77   com.sun.star.aw
00b0: 74 20 69 6d 70 6f 72 74 20 58 41 63 74 69 6f 6e  t import XAction
00c0: 4c 69 73 74 65 6e 65 72 0a 66 72 6f 6d 20 63 6f  Listener.from co
00d0: 6d 2e 73 75 6e 2e 73 74 61 72 2e 61 77 74 20 69  m.sun.star.awt i
00e0: 6d 70 6f 72 74 20 57 69 6e 64 6f 77 44 65 73 63  mport WindowDesc
00f0: 72 69 70 74 6f 72 0a 66 72 6f 6d 20 63 6f 6d 2e  riptor.from com.
0100: 73 75 6e 2e 73 74 61 72 2e 61 77 74 2e 57 69 6e  sun.star.awt.Win
0110: 64 6f 77 43 6c 61 73 73 20 69 6d 70 6f 72 74 20  dowClass import 
0120: 4d 4f 44 41 4c 54 4f 50 0a 66 72 6f 6d 20 63 6f  MODALTOP.from co
0130: 6d 2e 73 75 6e 2e 73 74 61 72 2e 61 77 74 2e 56  m.sun.star.awt.V
0140: 63 6c 57 69 6e 64 6f 77 50 65 65 72 41 74 74 72  clWindowPeerAttr
0150: 69 62 75 74 65 20 69 6d 70 6f 72 74 20 4f 4b 2c  ibute import OK,
0160: 20 4f 4b 5f 43 41 4e 43 45 4c 2c 20 59 45 53 5f   OK_CANCEL, YES_
0170: 4e 4f 2c 20 59 45 53 5f 4e 4f 5f 43 41 4e 43 45  NO, YES_NO_CANCE
0180: 4c 2c 20 52 45 54 52 59 5f 43 41 4e 43 45 4c 2c  L, RETRY_CANCEL,
0190: 20 44 45 46 5f 4f 4b 2c 20 44 45 46 5f 43 41 4e   DEF_OK, DEF_CAN
01a0: 43 45 4c 2c 20 44 45 46 5f 52 45 54 52 59 2c 20  CEL, DEF_RETRY, 
01b0: 44 45 46 5f 59 45 53 2c 20 44 45 46 5f 4e 4f 0a  DEF_YES, DEF_NO.
01c0: 66 72 6f 6d 20 63 6f 6d 2e 73 75 6e 2e 73 74 61  from com.sun.sta
01d0: 72 2e 62 65 61 6e 73 20 69 6d 70 6f 72 74 20 50  r.beans import P
01e0: 72 6f 70 65 72 74 79 56 61 6c 75 65 0a 0a 73 79  ropertyValue..sy
01f0: 73 2e 73 74 64 65 72 72 20 3d 20 73 79 73 2e 73  s.stderr = sys.s
0200: 74 64 6f 75 74 0a 0a 63 6c 61 73 73 20 4c 69 6e  tdout..class Lin
0210: 67 75 69 73 74 20 28 75 6e 6f 68 65 6c 70 65 72  guist (unohelper
0220: 2e 42 61 73 65 2c 20 58 4a 6f 62 45 78 65 63 75  .Base, XJobExecu
0230: 74 6f 72 29 3a 0a 20 20 20 20 64 65 66 20 5f 5f  tor):.    def __
0240: 69 6e 69 74 5f 5f 20 28 73 65 6c 66 2c 20 63 74  init__ (self, ct
0250: 78 29 3a 0a 20 20 20 20 20 20 20 20 73 65 6c 66  x):.        self
0260: 2e 63 74 78 20 3d 20 63 74 78 0a 0a 20 20 20 20  .ctx = ctx..    
0270: 64 65 66 20 74 72 69 67 67 65 72 20 28 73 65 6c  def trigger (sel
0280: 66 2c 20 63 6f 6d 6d 61 6e 64 29 3a 0a 20 20 20  f, command):.   
0290: 20 20 20 20 20 64 65 73 6b 74 6f 70 20 3d 20 73       desktop = s
02a0: 65 6c 66 2e 63 74 78 2e 53 65 72 76 69 63 65 4d  elf.ctx.ServiceM
02b0: 61 6e 61 67 65 72 2e 63 72 65 61 74 65 49 6e 73  anager.createIns
02c0: 74 61 6e 63 65 57 69 74 68 43 6f 6e 74 65 78 74  tanceWithContext
02d0: 28 22 63 6f 6d 2e 73 75 6e 2e 73 74 61 72 2e 66  ("com.sun.star.f
02e0: 72 61 6d 65 2e 44 65 73 6b 74 6f 70 22 2c 20 73  rame.Desktop", s
02f0: 65 6c 66 2e 63 74 78 29 0a 20 20 20 20 20 20 20  elf.ctx).       
0300: 20 64 6f 63 20 3d 20 64 65 73 6b 74 6f 70 2e 67   doc = desktop.g
0310: 65 74 43 75 72 72 65 6e 74 43 6f 6d 70 6f 6e 65  etCurrentCompone
0320: 6e 74 28 29 0a 20 20 20 20 20 20 20 20 69 66 20  nt().        if 
0330: 63 6f 6d 6d 61 6e 64 20 3d 3d 20 22 4c 69 73 74  command == "List
0340: 55 6e 72 65 63 6f 67 6e 69 7a 65 64 57 6f 72 64  UnrecognizedWord
0350: 73 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  s":.            
0360: 69 74 65 6d 73 20 3d 20 73 65 6c 66 2e 63 6f 6c  items = self.col
0370: 6c 65 63 74 57 6f 72 64 73 28 64 6f 63 2c 20 73  lectWords(doc, s
0380: 65 6c 66 2e 63 74 78 2c 20 54 72 75 65 29 0a 20  elf.ctx, True). 
0390: 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75             outpu
03a0: 74 54 65 78 74 20 3d 20 22 22 0a 20 20 20 20 20  tText = "".     
03b0: 20 20 20 20 20 20 20 66 6f 72 20 69 74 65 6d 20         for item 
03c0: 69 6e 20 69 74 65 6d 73 3a 0a 20 20 20 20 20 20  in items:.      
03d0: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
03e0: 54 65 78 74 20 3d 20 6f 75 74 70 75 74 54 65 78  Text = outputTex
03f0: 74 2b 69 74 65 6d 5b 30 5d 2b 22 20 22 2b 73 74  t+item[0]+" "+st
0400: 72 28 69 74 65 6d 5b 31 5d 29 2b 22 5c 6e 22 0a  r(item[1])+"\n".
0410: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66              self
0420: 2e 63 72 65 61 74 65 4f 75 74 70 75 74 44 6f 63  .createOutputDoc
0430: 75 6d 65 6e 74 28 6f 75 74 70 75 74 54 65 78 74  ument(outputText
0440: 2c 20 73 65 6c 66 2e 63 74 78 29 0a 20 20 20 20  , self.ctx).    
0450: 20 20 20 20 65 6c 69 66 20 63 6f 6d 6d 61 6e 64      elif command
0460: 20 3d 3d 20 22 4c 69 73 74 41 6c 6c 57 6f 72 64   == "ListAllWord
0470: 73 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  s":.            
0480: 69 74 65 6d 73 20 3d 20 73 65 6c 66 2e 63 6f 6c  items = self.col
0490: 6c 65 63 74 57 6f 72 64 73 28 64 6f 63 2c 20 73  lectWords(doc, s
04a0: 65 6c 66 2e 63 74 78 2c 20 46 61 6c 73 65 29 0a  elf.ctx, False).
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70              outp
04c0: 75 74 54 65 78 74 20 3d 20 22 22 0a 20 20 20 20  utText = "".    
04d0: 20 20 20 20 20 20 20 20 66 6f 72 20 69 74 65 6d          for item
04e0: 20 69 6e 20 69 74 65 6d 73 3a 0a 20 20 20 20 20   in items:.     
04f0: 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75             outpu
0500: 74 54 65 78 74 20 3d 20 6f 75 74 70 75 74 54 65  tText = outputTe
0510: 78 74 2b 69 74 65 6d 5b 30 5d 2b 22 20 22 2b 73  xt+item[0]+" "+s
0520: 74 72 28 69 74 65 6d 5b 31 5d 29 2b 22 5c 6e 22  tr(item[1])+"\n"
0530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d  .            num
0540: 44 69 66 66 57 6f 72 64 73 20 3d 20 6c 65 6e 28  DiffWords = len(
0550: 69 74 65 6d 73 29 0a 20 20 20 20 20 20 20 20 20  items).         
0560: 20 20 20 6f 75 74 70 75 74 54 65 78 74 20 3d 20     outputText = 
0570: 6f 75 74 70 75 74 54 65 78 74 20 2b 20 22 5c 6e  outputText + "\n
0580: 4e 75 6d 62 65 72 20 6f 66 20 64 69 66 66 65 72  Number of differ
0590: 65 6e 74 20 77 6f 72 64 73 3a 20 22 20 2b 20 73  ent words: " + s
05a0: 74 72 28 6e 75 6d 44 69 66 66 57 6f 72 64 73 29  tr(numDiffWords)
05b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 44  .            # D
05c0: 6f 20 6c 69 78 20 70 72 6f 63 65 73 73 69 6e 67  o lix processing
05d0: 20 74 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 6f   to get number o
05e0: 66 20 77 6f 72 64 73 3a 0a 20 20 20 20 20 20 20  f words:.       
05f0: 20 20 20 20 20 72 65 73 75 6c 74 73 20 3d 20 73       results = s
0600: 65 6c 66 2e 6c 69 78 50 72 6f 63 65 73 73 57 6f  elf.lixProcessWo
0610: 72 64 73 28 64 6f 63 2c 20 73 65 6c 66 2e 63 74  rds(doc, self.ct
0620: 78 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  x).            n
0630: 75 6d 57 6f 72 64 73 20 3d 20 72 65 73 75 6c 74  umWords = result
0640: 73 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20  s[0].           
0650: 20 6f 75 74 70 75 74 54 65 78 74 20 3d 20 6f 75   outputText = ou
0660: 74 70 75 74 54 65 78 74 20 2b 20 22 5c 6e 54 6f  tputText + "\nTo
0670: 74 61 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 77  tal number for w
0680: 6f 72 64 73 3a 20 22 20 2b 20 73 74 72 28 6e 75  ords: " + str(nu
0690: 6d 57 6f 72 64 73 29 0a 20 20 20 20 20 20 20 20  mWords).        
06a0: 20 20 20 20 6f 75 74 70 75 74 54 65 78 74 20 3d      outputText =
06b0: 20 6f 75 74 70 75 74 54 65 78 74 20 2b 20 22 5c   outputText + "\
06c0: 6e 4c 65 78 69 63 61 6c 20 56 61 72 69 65 74 79  nLexical Variety
06d0: 3a 20 22 20 2b 20 5c 0a 20 20 20 20 20 20 20 20  : " + \.        
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06f0: 20 73 74 72 28 72 6f 75 6e 64 28 6e 75 6d 44 69   str(round(numDi
0700: 66 66 57 6f 72 64 73 20 2a 20 31 2e 30 20 2f 20  ffWords * 1.0 / 
0710: 6e 75 6d 57 6f 72 64 73 2c 20 32 29 29 0a 20 20  numWords, 2)).  
0720: 20 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e 63            self.c
0730: 72 65 61 74 65 4f 75 74 70 75 74 44 6f 63 75 6d  reateOutputDocum
0740: 65 6e 74 28 6f 75 74 70 75 74 54 65 78 74 2c 20  ent(outputText, 
0750: 73 65 6c 66 2e 63 74 78 29 0a 20 20 20 20 20 20  self.ctx).      
0760: 20 20 65 6c 69 66 20 63 6f 6d 6d 61 6e 64 20 3d    elif command =
0770: 3d 20 22 53 6f 72 74 57 6f 72 64 73 4f 6e 46 72  = "SortWordsOnFr
0780: 65 71 75 65 6e 63 79 22 3a 0a 20 20 20 20 20 20  equency":.      
0790: 20 20 20 20 20 20 69 74 65 6d 73 20 3d 20 73 65        items = se
07a0: 6c 66 2e 63 6f 6c 6c 65 63 74 57 6f 72 64 73 28  lf.collectWords(
07b0: 64 6f 63 2c 20 73 65 6c 66 2e 63 74 78 2c 20 46  doc, self.ctx, F
07c0: 61 6c 73 65 2c 20 54 72 75 65 29 0a 20 20 20 20  alse, True).    
07d0: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 54 65          outputTe
07e0: 78 74 20 3d 20 22 22 0a 20 20 20 20 20 20 20 20  xt = "".        
07f0: 20 20 20 20 66 6f 72 20 69 74 65 6d 20 69 6e 20      for item in 
0800: 69 74 65 6d 73 3a 0a 20 20 20 20 20 20 20 20 20  items:.         
0810: 20 20 20 20 20 20 20 69 66 20 69 74 65 6d 5b 31         if item[1
0820: 5d 20 3e 20 31 30 3a 0a 20 20 20 20 20 20 20 20  ] > 10:.        
0830: 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70              outp
0840: 75 74 54 65 78 74 20 3d 20 6f 75 74 70 75 74 54  utText = outputT
0850: 65 78 74 2b 69 74 65 6d 5b 30 5d 2b 22 20 22 2b  ext+item[0]+" "+
0860: 73 74 72 28 69 74 65 6d 5b 31 5d 29 2b 22 5c 6e  str(item[1])+"\n
0870: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ".            se
0880: 6c 66 2e 63 72 65 61 74 65 4f 75 74 70 75 74 44  lf.createOutputD
0890: 6f 63 75 6d 65 6e 74 28 6f 75 74 70 75 74 54 65  ocument(outputTe
08a0: 78 74 2c 20 73 65 6c 66 2e 63 74 78 29 0a 20 20  xt, self.ctx).  
08b0: 20 20 20 20 20 20 65 6c 69 66 20 63 6f 6d 6d 61        elif comma
08c0: 6e 64 20 3d 3d 20 22 43 61 6c 63 75 6c 61 74 65  nd == "Calculate
08d0: 4c 69 78 22 3a 0a 20 20 20 20 20 20 20 20 20 20  Lix":.          
08e0: 20 20 72 65 73 75 6c 74 73 20 3d 20 73 65 6c 66    results = self
08f0: 2e 6c 69 78 50 72 6f 63 65 73 73 57 6f 72 64 73  .lixProcessWords
0900: 28 64 6f 63 2c 20 73 65 6c 66 2e 63 74 78 29 0a  (doc, self.ctx).
0910: 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 57              numW
0920: 6f 72 64 73 20 3d 20 72 65 73 75 6c 74 73 5b 30  ords = results[0
0930: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 75  ].            nu
0940: 6d 46 75 6c 6c 53 74 6f 70 73 20 3d 20 72 65 73  mFullStops = res
0950: 75 6c 74 73 5b 31 5d 0a 20 20 20 20 20 20 20 20  ults[1].        
0960: 20 20 20 20 6e 75 6d 4c 6f 6e 67 57 6f 72 64 73      numLongWords
0970: 20 3d 20 72 65 73 75 6c 74 73 5b 32 5d 0a 20 20   = results[2].  
0980: 20 20 20 20 20 20 20 20 20 20 64 69 66 66 65 72            differ
0990: 65 6e 74 57 6f 72 64 73 20 3d 20 73 65 6c 66 2e  entWords = self.
09a0: 63 6f 6c 6c 65 63 74 57 6f 72 64 73 28 64 6f 63  collectWords(doc
09b0: 2c 20 73 65 6c 66 2e 63 74 78 2c 20 46 61 6c 73  , self.ctx, Fals
09c0: 65 2c 20 46 61 6c 73 65 29 0a 20 20 20 20 20 20  e, False).      
09d0: 20 20 20 20 20 20 6e 75 6d 44 69 66 66 65 72 65        numDiffere
09e0: 6e 74 57 6f 72 64 73 20 3d 20 66 6c 6f 61 74 28  ntWords = float(
09f0: 6c 65 6e 28 64 69 66 66 65 72 65 6e 74 57 6f 72  len(differentWor
0a00: 64 73 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  ds)).           
0a10: 20 69 66 20 6e 75 6d 46 75 6c 6c 53 74 6f 70 73   if numFullStops
0a20: 20 3d 3d 20 30 3a 0a 20 20 20 20 20 20 20 20 20   == 0:.         
0a30: 20 20 20 20 20 20 20 6f 75 74 70 75 74 54 65 78         outputTex
0a40: 74 20 3d 20 22 54 6f 20 6d 61 6b 65 20 61 20 6c  t = "To make a l
0a50: 69 78 20 63 61 6c 63 75 6c 61 74 69 6f 6e 20 74  ix calculation t
0a60: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
0a70: 74 20 6c 65 61 73 74 20 6f 6e 65 20 77 6f 72 64  t least one word
0a80: 20 74 68 61 74 20 69 73 20 66 6f 6c 6c 6f 77 65   that is followe
0a90: 64 20 20 62 79 20 61 20 66 75 6c 6c 20 73 74 6f  d  by a full sto
0aa0: 70 2e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  p.".            
0ab0: 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20  else:.          
0ac0: 20 20 20 20 20 20 6e 75 6d 57 6f 72 64 73 50 65        numWordsPe
0ad0: 72 46 75 6c 6c 53 74 6f 70 20 3d 20 6e 75 6d 57  rFullStop = numW
0ae0: 6f 72 64 73 20 2f 20 6e 75 6d 46 75 6c 6c 53 74  ords / numFullSt
0af0: 6f 70 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ops.            
0b00: 20 20 20 20 70 65 72 63 65 6e 74 61 67 65 4c 6f      percentageLo
0b10: 6e 67 57 6f 72 64 73 20 3d 20 28 6e 75 6d 4c 6f  ngWords = (numLo
0b20: 6e 67 57 6f 72 64 73 20 2a 20 31 30 30 29 20 2f  ngWords * 100) /
0b30: 20 6e 75 6d 57 6f 72 64 73 0a 20 20 20 20 20 20   numWords.      
0b40: 20 20 20 20 20 20 20 20 20 20 6c 69 78 20 3d 20            lix = 
0b50: 6e 75 6d 57 6f 72 64 73 50 65 72 46 75 6c 6c 53  numWordsPerFullS
0b60: 74 6f 70 20 2b 20 70 65 72 63 65 6e 74 61 67 65  top + percentage
0b70: 4c 6f 6e 67 57 6f 72 64 73 0a 20 20 20 20 20 20  LongWords.      
0b80: 20 20 20 20 20 20 20 20 20 20 6c 65 78 69 63 61            lexica
0b90: 6c 56 61 72 69 65 74 79 20 3d 20 6e 75 6d 44 69  lVariety = numDi
0ba0: 66 66 65 72 65 6e 74 57 6f 72 64 73 20 2f 20 6e  fferentWords / n
0bb0: 75 6d 57 6f 72 64 73 0a 20 20 20 20 20 20 20 20  umWords.        
0bc0: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 54 65          outputTe
0bd0: 78 74 20 3d 20 22 4e 75 6d 62 65 72 20 6f 66 20  xt = "Number of 
0be0: 77 6f 72 64 73 3a 20 22 20 2b 20 73 74 72 28 6e  words: " + str(n
0bf0: 75 6d 57 6f 72 64 73 29 20 2b 20 22 5c 72 22 20  umWords) + "\r" 
0c00: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
0c10: 20 20 2b 20 22 4e 75 6d 62 65 72 20 6f 66 20 66    + "Number of f
0c20: 75 6c 6c 20 73 74 6f 70 73 3a 20 22 20 2b 20 73  ull stops: " + s
0c30: 74 72 28 6e 75 6d 46 75 6c 6c 53 74 6f 70 73 29  tr(numFullStops)
0c40: 20 2b 20 22 5c 72 22 20 5c 0a 20 20 20 20 20 20   + "\r" \.      
0c50: 20 20 20 20 20 20 20 20 20 20 2b 20 22 4e 75 6d            + "Num
0c60: 62 65 72 20 6f 66 20 6c 6f 6e 67 20 77 6f 72 64  ber of long word
0c70: 73 20 28 37 20 6f 72 20 6d 6f 72 65 20 63 68 61  s (7 or more cha
0c80: 72 61 63 74 65 72 73 29 3a 20 22 20 2b 20 73 74  racters): " + st
0c90: 72 28 6e 75 6d 4c 6f 6e 67 57 6f 72 64 73 29 20  r(numLongWords) 
0ca0: 2b 20 22 5c 72 22 20 5c 0a 20 20 20 20 20 20 20  + "\r" \.       
0cb0: 20 20 20 20 20 20 20 20 20 2b 20 22 4e 75 6d 62           + "Numb
0cc0: 65 72 20 6f 66 20 77 6f 72 64 73 20 70 65 72 20  er of words per 
0cd0: 66 75 6c 6c 20 73 74 6f 70 3a 20 22 20 2b 20 73  full stop: " + s
0ce0: 74 72 28 6e 75 6d 57 6f 72 64 73 50 65 72 46 75  tr(numWordsPerFu
0cf0: 6c 6c 53 74 6f 70 29 20 2b 20 22 5c 72 22 20 5c  llStop) + "\r" \
0d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0d10: 20 2b 20 22 50 65 72 63 65 6e 74 61 67 65 20 6c   + "Percentage l
0d20: 6f 6e 67 20 77 6f 72 64 73 3a 20 22 20 2b 20 73  ong words: " + s
0d30: 74 72 28 70 65 72 63 65 6e 74 61 67 65 4c 6f 6e  tr(percentageLon
0d40: 67 57 6f 72 64 73 29 20 2b 20 22 5c 72 22 20 5c  gWords) + "\r" \
0d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0d60: 20 2b 20 22 4c 69 78 20 28 72 65 61 64 61 62 69   + "Lix (readabi
0d70: 6c 69 74 79 29 3a 20 22 20 2b 20 73 74 72 28 6c  lity): " + str(l
0d80: 69 78 29 20 2b 20 22 5c 72 22 20 5c 0a 20 20 20  ix) + "\r" \.   
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 22               + "
0da0: 4e 75 6d 62 65 72 20 6f 66 20 64 69 66 66 65 72  Number of differ
0db0: 65 6e 74 20 77 6f 72 64 73 3a 20 22 20 2b 20 73  ent words: " + s
0dc0: 74 72 28 6e 75 6d 44 69 66 66 65 72 65 6e 74 57  tr(numDifferentW
0dd0: 6f 72 64 73 29 20 2b 20 22 5c 72 22 20 5c 0a 20  ords) + "\r" \. 
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
0df0: 20 22 4c 65 78 69 63 61 6c 20 76 61 72 69 65 74   "Lexical variet
0e00: 79 3a 20 22 20 2b 20 73 74 72 28 72 6f 75 6e 64  y: " + str(round
0e10: 28 6c 65 78 69 63 61 6c 56 61 72 69 65 74 79 2c  (lexicalVariety,
0e20: 20 33 29 29 0a 20 20 20 20 20 20 20 20 20 20 20   3)).           
0e30: 20 73 65 6c 66 2e 63 72 65 61 74 65 4f 75 74 70   self.createOutp
0e40: 75 74 44 6f 63 75 6d 65 6e 74 28 6f 75 74 70 75  utDocument(outpu
0e50: 74 54 65 78 74 2c 20 73 65 6c 66 2e 63 74 78 29  tText, self.ctx)
0e60: 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20 63 6f  .        elif co
0e70: 6d 6d 61 6e 64 20 3d 3d 20 22 46 6f 72 6d 61 74  mmand == "Format
0e80: 41 6c 6c 22 3a 0a 20 20 20 20 20 20 20 20 20 20  All":.          
0e90: 20 20 70 61 73 73 0a 20 20 20 20 20 20 20 20 65    pass.        e
0ea0: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
0eb0: 20 70 72 69 6e 74 28 22 42 61 64 20 63 6f 6d 6d   print("Bad comm
0ec0: 61 6e 64 21 22 29 0a 20 20 20 20 0a 20 20 20 20  and!").    .    
0ed0: 64 65 66 20 63 6f 6c 6c 65 63 74 57 6f 72 64 73  def collectWords
0ee0: 20 28 73 65 6c 66 2c 20 64 6f 63 75 6d 65 6e 74   (self, document
0ef0: 2c 20 63 6f 6e 74 65 78 74 2c 20 75 6e 72 65 63  , context, unrec
0f00: 57 6f 72 64 73 4f 6e 6c 79 3d 46 61 6c 73 65 2c  WordsOnly=False,
0f10: 20 73 6f 72 74 4f 6e 46 72 65 71 75 65 6e 63 79   sortOnFrequency
0f20: 3d 46 61 6c 73 65 29 3a 20 0a 20 20 20 20 20 20  =False): .      
0f30: 20 20 22 22 22 43 6f 6c 6c 65 63 74 20 77 6f 72    """Collect wor
0f40: 64 73 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ds from the curr
0f50: 65 6e 74 20 74 65 78 74 20 64 6f 63 75 6d 65 6e  ent text documen
0f60: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
0f70: 6d 20 69 6e 20 61 20 74 75 70 6c 65 2e 22 22 22  m in a tuple."""
0f80: 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 20  .        cursor 
0f90: 3d 20 64 6f 63 75 6d 65 6e 74 2e 54 65 78 74 2e  = document.Text.
0fa0: 63 72 65 61 74 65 54 65 78 74 43 75 72 73 6f 72  createTextCursor
0fb0: 28 29 0a 20 20 20 20 20 20 20 20 73 6d 67 72 20  ().        smgr 
0fc0: 3d 20 63 6f 6e 74 65 78 74 2e 53 65 72 76 69 63  = context.Servic
0fd0: 65 4d 61 6e 61 67 65 72 0a 20 20 20 20 20 20 20  eManager.       
0fe0: 20 73 70 65 6c 6c 63 68 65 63 6b 65 72 20 3d 20   spellchecker = 
0ff0: 73 6d 67 72 2e 63 72 65 61 74 65 49 6e 73 74 61  smgr.createInsta
1000: 6e 63 65 57 69 74 68 43 6f 6e 74 65 78 74 28 22  nceWithContext("
1010: 63 6f 6d 2e 73 75 6e 2e 73 74 61 72 2e 6c 69 6e  com.sun.star.lin
1020: 67 75 69 73 74 69 63 32 2e 53 70 65 6c 6c 43 68  guistic2.SpellCh
1030: 65 63 6b 65 72 22 2c 20 63 6f 6e 74 65 78 74 29  ecker", context)
1040: 0a 20 20 20 20 20 20 20 20 6c 6f 63 61 6c 65 20  .        locale 
1050: 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 50 72  = document.getPr
1060: 6f 70 65 72 74 79 56 61 6c 75 65 28 22 43 68 61  opertyValue("Cha
1070: 72 4c 6f 63 61 6c 65 22 29 0a 20 20 20 20 20 20  rLocale").      
1080: 20 20 77 6f 72 64 73 20 3d 20 7b 7d 0a 20 20 20    words = {}.   
1090: 20 20 20 20 20 23 20 77 6f 72 64 73 5b 6c 6f 63       # words[loc
10a0: 61 6c 65 5d 20 3d 20 30 20 23 20 45 6e 61 62 6c  ale] = 0 # Enabl
10b0: 65 20 74 68 69 73 20 66 6f 72 20 6c 6f 63 61 6c  e this for local
10c0: 65 20 64 65 62 75 67 67 69 6e 67 20 28 64 69 73  e debugging (dis
10d0: 61 62 6c 65 20 6c 69 6e 65 20 38 37 29 0a 20 20  able line 87).  
10e0: 20 20 20 20 20 20 63 75 72 73 6f 72 2e 67 6f 74        cursor.got
10f0: 6f 53 74 61 72 74 28 46 61 6c 73 65 29 0a 20 20  oStart(False).  
1100: 20 20 20 20 20 20 77 68 69 6c 65 20 63 75 72 73        while curs
1110: 6f 72 2e 67 6f 74 6f 4e 65 78 74 57 6f 72 64 28  or.gotoNextWord(
1120: 46 61 6c 73 65 29 3a 0a 20 20 20 20 20 20 20 20  False):.        
1130: 20 20 20 20 69 66 20 63 75 72 73 6f 72 2e 69 73      if cursor.is
1140: 53 74 61 72 74 4f 66 57 6f 72 64 28 29 3a 0a 20  StartOfWord():. 
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1160: 75 72 73 6f 72 2e 67 6f 74 6f 45 6e 64 4f 66 57  ursor.gotoEndOfW
1170: 6f 72 64 28 54 72 75 65 29 0a 20 20 20 20 20 20  ord(True).      
1180: 20 20 20 20 20 20 20 20 20 20 77 6f 72 64 20 3d            word =
1190: 20 63 75 72 73 6f 72 2e 67 65 74 53 74 72 69 6e   cursor.getStrin
11a0: 67 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  g().            
11b0: 20 20 20 20 69 66 20 6c 65 6e 28 77 6f 72 64 29      if len(word)
11c0: 20 3e 20 30 3a 0a 20 20 20 20 20 20 20 20 20 20   > 0:.          
11d0: 20 20 20 20 20 20 20 20 20 20 69 66 20 77 6f 72            if wor
11e0: 64 5b 2d 31 5d 3d 3d 22 2e 22 3a 0a 20 20 20 20  d[-1]==".":.    
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1200: 20 20 20 20 20 20 20 20 77 6f 72 64 20 3d 20 77          word = w
1210: 6f 72 64 5b 30 3a 2d 31 5d 0a 20 20 20 20 20 20  ord[0:-1].      
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1230: 20 6e 6f 74 20 77 6f 72 64 20 69 6e 20 77 6f 72   not word in wor
1240: 64 73 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ds:.            
1250: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 75              if u
1260: 6e 72 65 63 57 6f 72 64 73 4f 6e 6c 79 3a 0a 20  nrecWordsOnly:. 
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1280: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6e 6f             if no
1290: 74 20 73 70 65 6c 6c 63 68 65 63 6b 65 72 2e 69  t spellchecker.i
12a0: 73 56 61 6c 69 64 28 77 6f 72 64 2c 20 6c 6f 63  sValid(word, loc
12b0: 61 6c 65 2c 20 28 29 29 3a 0a 20 20 20 20 20 20  ale, ()):.      
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 20 20 77 6f 72 64 73 5b            words[
12e0: 77 6f 72 64 5d 20 3d 20 31 0a 20 20 20 20 20 20  word] = 1.      
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20    else:.        
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1320: 20 20 20 20 77 6f 72 64 73 5b 77 6f 72 64 5d 20      words[word] 
1330: 3d 20 31 0a 20 20 20 20 20 20 20 20 20 20 20 20  = 1.            
1340: 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20          else:.  
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 20 20 20 20 69 66 20 75 6e 72 65 63 57 6f        if unrecWo
1370: 72 64 73 4f 6e 6c 79 3a 0a 20 20 20 20 20 20 20  rdsOnly:.       
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 20 20 20 20 20 69 66 20 6e 6f 74 20 73 70 65 6c       if not spel
13a0: 6c 63 68 65 63 6b 65 72 2e 69 73 56 61 6c 69 64  lchecker.isValid
13b0: 28 77 6f 72 64 2c 20 6c 6f 63 61 6c 65 2c 20 28  (word, locale, (
13c0: 29 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  )):.            
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 77 6f 72 64 73 5b 77 6f 72 64 5d 20      words[word] 
13f0: 3d 20 77 6f 72 64 73 5b 77 6f 72 64 5d 20 2b 20  = words[word] + 
1400: 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1.              
1410: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a            else:.
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 20 20 20 20 20 20 77 6f 72 64              word
1440: 73 5b 77 6f 72 64 5d 20 3d 20 77 6f 72 64 73 5b  s[word] = words[
1450: 77 6f 72 64 5d 20 2b 20 31 0a 20 20 20 20 20 20  word] + 1.      
1460: 20 20 77 6f 72 64 73 20 3d 20 6c 69 73 74 28 77    words = list(w
1470: 6f 72 64 73 2e 69 74 65 6d 73 28 29 29 0a 20 20  ords.items()).  
1480: 20 20 20 20 20 20 69 66 20 73 6f 72 74 4f 6e 46        if sortOnF
1490: 72 65 71 75 65 6e 63 79 3a 0a 20 20 20 20 20 20  requency:.      
14a0: 20 20 20 20 20 20 77 6f 72 64 73 2e 73 6f 72 74        words.sort
14b0: 28 6b 65 79 20 3d 20 6c 61 6d 62 64 61 20 78 3a  (key = lambda x:
14c0: 20 28 78 5b 31 5d 2c 20 78 5b 30 5d 29 2c 20 72   (x[1], x[0]), r
14d0: 65 76 65 72 73 65 3d 54 72 75 65 29 0a 20 20 20  everse=True).   
14e0: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
14f0: 20 20 20 20 20 20 20 77 6f 72 64 73 2e 73 6f 72         words.sor
1500: 74 28 29 0a 20 20 20 20 20 20 20 20 72 65 74 75  t().        retu
1510: 72 6e 20 77 6f 72 64 73 0a 20 20 20 20 20 20 0a  rn words.      .
1520: 20 20 20 20 64 65 66 20 63 72 65 61 74 65 4f 75      def createOu
1530: 74 70 75 74 44 6f 63 75 6d 65 6e 74 20 28 73 65  tputDocument (se
1540: 6c 66 2c 20 6f 75 74 70 75 74 54 65 78 74 2c 20  lf, outputText, 
1550: 63 6f 6e 74 65 78 74 29 3a 0a 20 20 20 20 20 20  context):.      
1560: 20 20 22 22 22 43 72 65 61 74 65 73 20 61 20 6e    """Creates a n
1570: 65 77 20 74 65 78 74 20 64 6f 63 75 6d 65 6e 74  ew text document
1580: 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 6f 75   and puts the ou
1590: 74 70 75 74 20 74 65 78 74 20 69 6e 20 69 74 2e  tput text in it.
15a0: 22 22 22 0a 20 20 20 20 20 20 20 20 73 6d 67 72  """.        smgr
15b0: 20 3d 20 63 6f 6e 74 65 78 74 2e 53 65 72 76 69   = context.Servi
15c0: 63 65 4d 61 6e 61 67 65 72 0a 20 20 20 20 20 20  ceManager.      
15d0: 20 20 64 65 73 6b 74 6f 70 20 3d 20 73 6d 67 72    desktop = smgr
15e0: 2e 63 72 65 61 74 65 49 6e 73 74 61 6e 63 65 57  .createInstanceW
15f0: 69 74 68 43 6f 6e 74 65 78 74 28 22 63 6f 6d 2e  ithContext("com.
1600: 73 75 6e 2e 73 74 61 72 2e 66 72 61 6d 65 2e 44  sun.star.frame.D
1610: 65 73 6b 74 6f 70 22 2c 63 6f 6e 74 65 78 74 29  esktop",context)
1620: 0a 20 20 20 20 20 20 20 20 64 6f 63 20 3d 20 64  .        doc = d
1630: 65 73 6b 74 6f 70 2e 6c 6f 61 64 43 6f 6d 70 6f  esktop.loadCompo
1640: 6e 65 6e 74 46 72 6f 6d 55 52 4c 28 22 70 72 69  nentFromURL("pri
1650: 76 61 74 65 3a 66 61 63 74 6f 72 79 2f 73 77 72  vate:factory/swr
1660: 69 74 65 72 22 2c 22 5f 62 6c 61 6e 6b 22 2c 20  iter","_blank", 
1670: 30 2c 20 28 29 29 0a 20 20 20 20 20 20 20 20 74  0, ()).        t
1680: 65 78 74 20 3d 20 64 6f 63 2e 54 65 78 74 0a 20  ext = doc.Text. 
1690: 20 20 20 20 20 20 20 63 75 72 73 6f 72 20 3d 20         cursor = 
16a0: 74 65 78 74 2e 63 72 65 61 74 65 54 65 78 74 43  text.createTextC
16b0: 75 72 73 6f 72 28 29 0a 20 20 20 20 20 20 20 20  ursor().        
16c0: 74 65 78 74 2e 69 6e 73 65 72 74 53 74 72 69 6e  text.insertStrin
16d0: 67 28 63 75 72 73 6f 72 2c 20 6f 75 74 70 75 74  g(cursor, output
16e0: 54 65 78 74 2c 20 30 29 0a 0a 20 20 20 20 64 65  Text, 0)..    de
16f0: 66 20 6c 69 78 50 72 6f 63 65 73 73 57 6f 72 64  f lixProcessWord
1700: 73 20 28 73 65 6c 66 2c 20 64 6f 63 75 6d 65 6e  s (self, documen
1710: 74 2c 20 63 6f 6e 74 65 78 74 29 3a 0a 20 20 20  t, context):.   
1720: 20 20 20 20 20 22 22 22 54 72 61 76 65 72 73 65       """Traverse
1730: 73 20 74 72 6f 75 67 68 20 74 68 65 20 77 6f 72  s trough the wor
1740: 64 73 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65  ds in the docume
1750: 6e 74 2c 20 65 78 61 6d 69 6e 69 6e 67 20 65 61  nt, examining ea
1760: 63 68 20 77 6f 72 64 2e 0a 20 20 20 20 20 20 20  ch word..       
1770: 20 52 65 74 75 72 6e 73 20 61 20 74 75 70 6c 65   Returns a tuple
1780: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 75 6d 62   containing numb
1790: 65 72 20 6f 66 20 77 6f 72 64 73 2c 20 6e 75 6d  er of words, num
17a0: 62 65 72 20 6f 66 20 66 75 6c 6c 2d 73 74 6f 70  ber of full-stop
17b0: 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 6e 75  s and.        nu
17c0: 6d 62 65 72 20 6f 66 20 6c 6f 6e 67 20 77 6f 72  mber of long wor
17d0: 64 73 20 28 37 20 6f 72 20 6d 6f 72 65 20 63 68  ds (7 or more ch
17e0: 61 72 61 63 74 65 72 73 29 2e 22 22 22 0a 20 20  aracters).""".  
17f0: 20 20 20 20 20 20 63 75 72 73 6f 72 20 3d 20 64        cursor = d
1800: 6f 63 75 6d 65 6e 74 2e 54 65 78 74 2e 63 72 65  ocument.Text.cre
1810: 61 74 65 54 65 78 74 43 75 72 73 6f 72 28 29 0a  ateTextCursor().
1820: 20 20 20 20 20 20 20 20 6e 75 6d 57 6f 72 64 73          numWords
1830: 20 3d 20 31 0a 20 20 20 20 20 20 20 20 6e 75 6d   = 1.        num
1840: 46 75 6c 6c 53 74 6f 70 73 20 3d 20 30 0a 20 20  FullStops = 0.  
1850: 20 20 20 20 20 20 6e 75 6d 4c 6f 6e 67 57 6f 72        numLongWor
1860: 64 73 20 3d 20 30 0a 20 20 20 20 20 20 20 20 63  ds = 0.        c
1870: 75 72 73 6f 72 2e 67 6f 74 6f 53 74 61 72 74 28  ursor.gotoStart(
1880: 46 61 6c 73 65 29 0a 20 20 20 20 20 20 20 20 77  False).        w
1890: 68 69 6c 65 20 63 75 72 73 6f 72 2e 67 6f 74 6f  hile cursor.goto
18a0: 4e 65 78 74 57 6f 72 64 28 46 61 6c 73 65 29 3a  NextWord(False):
18b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
18c0: 63 75 72 73 6f 72 2e 69 73 53 74 61 72 74 4f 66  cursor.isStartOf
18d0: 57 6f 72 64 28 29 3a 0a 20 20 20 20 20 20 20 20  Word():.        
18e0: 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e 67          cursor.g
18f0: 6f 74 6f 45 6e 64 4f 66 57 6f 72 64 28 54 72 75  otoEndOfWord(Tru
1900: 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e).             
1910: 20 20 20 77 6f 72 64 20 3d 20 63 75 72 73 6f 72     word = cursor
1920: 2e 67 65 74 53 74 72 69 6e 67 28 29 0a 20 20 20  .getString().   
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1940: 6c 65 6e 28 77 6f 72 64 29 20 3e 20 30 3a 0a 20  len(word) > 0:. 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 6e 75 6d 57 6f 72 64 73 20 3d 20 6e 75     numWords = nu
1970: 6d 57 6f 72 64 73 20 2b 20 31 0a 20 20 20 20 20  mWords + 1.     
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1990: 66 20 77 6f 72 64 5b 2d 31 5d 3d 3d 22 2e 22 3a  f word[-1]==".":
19a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19b0: 20 20 20 20 20 20 20 20 20 77 6f 72 64 20 3d 20           word = 
19c0: 77 6f 72 64 5b 30 3a 2d 31 5d 0a 20 20 20 20 20  word[0:-1].     
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e0: 20 20 20 6e 75 6d 46 75 6c 6c 53 74 6f 70 73 20     numFullStops 
19f0: 3d 20 6e 75 6d 46 75 6c 6c 53 74 6f 70 73 20 2b  = numFullStops +
1a00: 20 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   1.             
1a10: 20 20 20 20 20 20 20 69 66 20 6c 65 6e 28 77 6f         if len(wo
1a20: 72 64 29 3e 3d 37 3a 0a 20 20 20 20 20 20 20 20  rd)>=7:.        
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 6e 75 6d 4c 6f 6e 67 57 6f 72 64 73 20 3d 20 6e  numLongWords = n
1a50: 75 6d 4c 6f 6e 67 57 6f 72 64 73 20 2b 20 31 0a  umLongWords + 1.
1a60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
1a70: 75 6d 57 6f 72 64 73 2c 20 6e 75 6d 46 75 6c 6c  umWords, numFull
1a80: 53 74 6f 70 73 2c 20 6e 75 6d 4c 6f 6e 67 57 6f  Stops, numLongWo
1a90: 72 64 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  rds.            
1aa0: 0a 67 5f 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  .g_Implementatio
1ab0: 6e 48 65 6c 70 65 72 20 3d 20 75 6e 6f 68 65 6c  nHelper = unohel
1ac0: 70 65 72 2e 49 6d 70 6c 65 6d 65 6e 74 61 74 69  per.Implementati
1ad0: 6f 6e 48 65 6c 70 65 72 28 29 0a 67 5f 49 6d 70  onHelper().g_Imp
1ae0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 48 65 6c 70 65  lementationHelpe
1af0: 72 2e 61 64 64 49 6d 70 6c 65 6d 65 6e 74 61 74  r.addImplementat
1b00: 69 6f 6e 28 4c 69 6e 67 75 69 73 74 2c 20 22 64  ion(Linguist, "d
1b10: 6b 2e 67 72 75 77 69 65 72 2e 6c 69 6e 67 75 69  k.gruwier.lingui
1b20: 73 74 2e 4c 69 6e 67 75 69 73 74 22 2c 20 28 22  st.Linguist", ("
1b30: 63 6f 6d 2e 73 75 6e 2e 73 74 61 72 2e 74 61 73  com.sun.star.tas
1b40: 6b 2e 4a 6f 62 22 2c 29 2c 29 0a                 k.Job",),).