Makrá v OpenOffice.org 07/2008

Július Pastierik  /  03. 07. 2008, 00:00

V ďalšom dieli seriálu o programovaná makier v OpenOffice.org si ukážeme už avizované makro pre prípravu slov pre slovenský slovník (jeho prvú časť).

Dnešný diel seriálu makier bude trochu netradičný, pretože si uvedieme makro pre prácu so slovníkmi. Preto netradičný, lebo sa jedná o veľmi špecifické makro, ktoré je viazané nielen na rozšírenie, pomocou ktorého je šírené, ale aj na konkrétnu verziu tvarovania slov v slovníku slovenského jazyka.

Pre pochopenie, ako je makro vytvorené si musíme aspoň v skratke uviesť, ako sú definované slovníky v programoch OpenOffice.org, Mozilla Thunderbird a Mozilla Firefox. Slovníky sa vlastne skladajú z dvoch súborov. Prvý má príponu „.dic“ a v ňom sú definované vlastné slová v tvare: slovo/tvarovanie (napríklad „tvar/B“, „nakázaný/NY“ ...).

Tvarovanie je vlastne definícia prefixov a sufixov, ktorými sa slovo môže upravovať. Táto definícia sa skladá z piatich častí. Prvá časť (PFX alebo SFX) určuje, či sa jedná o tvarovanie na začiatku (prefix) alebo konci (sufix) slova. Druhá časť je definičné písmeno príslušného tvarovania (to, ktoré je uvedené v slovníku za znakom lomky). Tretia časť je časť slova, ktorá sa nahrádza, štvrtá časť sú znaky, ktorými sa nahrádza a piata časť sú podmienky (definované pomocou regulárnych výrazov).

Napríklad definícia: „SFX z a e [^euo]a“ hovorí, že v slove, ktoré tvarujeme podľa vzoru žena (to hovorí časť „SFX z“) sa nahrádza posledné písmeno „a“ za „e“ ak slovo končí na písmeno „a“, pred ktorým však nesmú byť znaky „eou“. Vďaka tomuto zápisu stačí mať v slovníku slovo „žena/z“ a automaticky sa za správne považuje aj slovo „žene“.

Pri tvarovaní nájdeme aj špecifické tvarovania, kde sa nič nenahrádza, ale iba s pridáva. Vtedy sa namiesto znaku, ktorý sa má nahradiť píše číslo 0. Napríklad definícia „PFX N 0 ne.“ je určená pre zápory, teda definíciou slova „nakázaný/NY“ automaticky definujeme aj slovo „nenakázaný“.

Pred vlastným uvedením makra ešte musíme spomenúť, že ako prvý riadok definícii tvarovania je vždy uvedený ich počet, napríklad „SFX Z Y 157“. Pretože tento sa môže meniť, musíme pri čítaní definičného súboru tento počet zisťovať.

OpenOffice.org pri čítaní textových súborov používa kódovú stránku OpenOffice.org. Preto sme museli pripraviť definičné súbory špeciálne pre rôzne kódové stránky, pretože sa tam, prirodzene, nachádzajú aj znaky s diakritikou. Aby sme tieto súbory nemuseli hľadať, vložili sme ich priamo do rozšírenia.

Rozsah makier je naozaj veľký a preto ho rozdelíme do viacerých dielov tohto seriálu. Dnes začneme funkciami, ktoré sú uložené v module „Slovnik_init“ a sú určené pre počiatočnú prípravu rozšírenia pre spracovanie slova. Upozorňujeme, že makrá nie sú veľmi okomentované a preto sú určené pre vyspelejších programátorov.

Tak isto sa nebudeme bližšie zaoberať dialógmi, pretože to, ako sú definované (ich premenné) sa dá pozrieť v ich definícii.

sub slovnik_init(oDialog)
 dim Kurzor, Povodny as object
 dim riadok, slovo, parametre as string
 dim i, kolko as integer

 kurzor= ThisComponent.currentcontroller.getViewCursor() ' viditeľný kurzor
 Povodny=kurzor.getstart()
 kurzor.collapsetostart()
 Kurzor.gotoStartOfLine(false)
 Kurzor.gotoEndOfLine(true)
 riadok=trim(Kurzor.getstring())
 Kurzor.collapseToEnd()
 kurzor.gotoRange(Povodny,false)
 
 if riadok<>"" then
  slovo=riadok
  parametre=""
  i=instr(riadok,"/")
  if i<>0 then
   slovo=left(riadok,i-1)
   parametre=right(riadok,len(riadok)-i)
  endif
  oDialog_slovnik.model.Slovo_slovnika.Text=slovo
  
  if instr(1,parametre,"N",0)<>0 then oDialog_slovnik.model.pfx_N.State=1
  if instr(1,parametre,"F",0)<>0 then oDialog_slovnik.model.pfx_F.State=1
  if instr(1,parametre,"Z",0)<>0 then oDialog_slovnik.model.sfx_Z.State=1
  if instr(1,parametre,"z",0)<>0 then oDialog_slovnik.model.sfx_mz.State=1
  if instr(1,parametre,"U",0)<>0 then oDialog_slovnik.model.sfx_U.State=1
  if instr(1,parametre,"D",0)<>0 then oDialog_slovnik.model.sfx_D.State=1
  if instr(1,parametre,"K",0)<>0 then oDialog_slovnik.model.sfx_K.State=1
  if instr(1,parametre,"M",0)<>0 then oDialog_slovnik.model.sfx_M.State=1
  if instr(1,parametre,"S",0)<>0 then oDialog_slovnik.model.sfx_S.State=1
  if instr(1,parametre,"V",0)<>0 then oDialog_slovnik.model.sfx_V.State=1
  if instr(1,parametre,"A",0)<>0 then oDialog_slovnik.model.sfx_A.State=1
  if instr(1,parametre,"C",0)<>0 then oDialog_slovnik.model.sfx_C.State=1
  if instr(1,parametre,"H",0)<>0 then oDialog_slovnik.model.sfx_H.State=1
  if instr(1,parametre,"B",0)<>0 then oDialog_slovnik.model.sfx_B.State=1
  if instr(1,parametre,"b",0)<>0 then oDialog_slovnik.model.sfx_mb.State=1
  if instr(1,parametre,"o",0)<>0 then oDialog_slovnik.model.sfx_mo.State=1
  if instr(1,parametre,"O",0)<>0 then oDialog_slovnik.model.sfx_O.State=1
  if instr(1,parametre,"J",0)<>0 then oDialog_slovnik.model.sfx_J.State=1
  if instr(1,parametre,"L",0)<>0 then oDialog_slovnik.model.sfx_L.State=1
  if instr(1,parametre,"Q",0)<>0 then oDialog_slovnik.model.sfx_Q.State=1
  if instr(1,parametre,"Y",0)<>0 then oDialog_slovnik.model.sfx_Y.State=1
  if instr(1,parametre,"I",0)<>0 then oDialog_slovnik.model.sfx_I.State=1
  if instr(1,parametre,"P",0)<>0 then oDialog_slovnik.model.sfx_P.State=1
  if instr(1,parametre,"X",0)<>0 then oDialog_slovnik.model.sfx_X.State=1
  if instr(1,parametre,"E",0)<>0 then oDialog_slovnik.model.sfx_E.State=1
  if instr(1,parametre,"W",0)<>0 then oDialog_slovnik.model.sfx_W.State=1
  if instr(1,parametre,"T",0)<>0 then oDialog_slovnik.model.sfx_T.State=1
  if instr(1,parametre,"R",0)<>0 then oDialog_slovnik.model.sfx_R.State=1
  if instr(1,parametre,"č",0)<>0 then oDialog_slovnik.model.sfx_c_c.State=1
  
 endif
end sub

function citaj_definiciu as boolean

 ' dim cesty as object
 dim subor as integer
 dim riadok as string
 dim prvy as long
 dim cesta as string
 dim nacital as boolean
 dim nazov as string
  
 'cesty=CreateUnoService("com.sun.star.util.PathSettings")
 
 ' DialogLibraries.LoadLibrary("SK_SK_Slovnik")
 
 oDialog_CP=CreateUnoDialog(DialogLibraries.SK_SK_Slovnik.Dialog_CP)
 
 oDialog_CP.model.UTF_8.state=1
 oDialog_CP.model.CP_1250.state=0
 oDialog_CP.model.ISO_8859_2.state=0
 
 nacital=false
 
 if oDialog_CP.Execute()=1 then
  if oDialog_CP.model.UTF_8.state=1 then nazov="sk_SK_aff_UTF_8.txt"
  if oDialog_CP.model.CP_1250.state=1 then nazov="sk_SK_aff_CP_1250.txt"
  if oDialog_CP.model.ISO_8859_2.state=1 then nazov="sk_SK_aff_ISO_8859_2.txt"
  REM Cesta, kde je nainštalované rozšírenie SK_SK_Slovnik – treba si najprv nechať vypísať, aby sa zistilo, čo je potrebné ponechať
  cesta=basiclibraries.getLibraryLinkURL("SK_SK_Slovnik")
  cesta=left(cesta,len(cesta)-10)+nazov
  subor = Freefile
  open cesta for Input as #subor
  'open cesty.Work+"/sk_SK_aff.txt" for Input as #subor
  prvy=0
  While not eof(subor)
   Line Input #subor, riadok
   prvy=spracuj_riadok(riadok,prvy)
  wend
  close #subor
  nacital=true
 endif
 oDialog_CP.dispose()
 citaj_definiciu=nacital
 
end function

Neprehliadnite: