Makrá v OpenOffice.org: Export a import používateľských slovníkov (3.)

Július Pastierik  /  23. 03. 2011, 00:00

V poslednom pokračovaní makier pre prácu s používateľskými slovníkmi si uvedieme zvyšné makrá pre import slovníkov a pre vkladanie slov do slovníkov.


REM Dialóg pre výber a vytvorenie používateľských slovníkov
Sub Import_slovnikov
 dim oPom_zoznam, oSlovniky, oZoznam as object
 dim oCesty : oCesty=CreateUnoService("com.sun.star.util.PathSettings")
 dim sPom$
 
 DialogLibraries.LoadLibrary("JP_dictionary_IO") ' Otvorenie knižnice
 oDlgi=CreateUnoDialog(DialogLibraries.JP_dictionary_IO.Import_dictionary) ' Sprístupnenie dialógu
 
 kde=basiclibraries.getLibraryLinkURL("JP_dictionary_IO") ' Adresár, kde je rozšírenie nainštalované
 nazov=left(kde,len(kde)-10)+"jp_dictionary_"+Jazyk_OOo+".txt" ' Súbor s jazykovou lokalizáciou
 
 Set_jazyk_dialogu(oDlgi, nazov, "Import_dictionary") ' Nastavenie jazyka dialógu
 
 ' Načítanie zoznamu slovníkov
 oPom_zoznam=createUnoService("com.sun.star.linguistic2.DictionaryList") ' sprístupnenie zoznamu slovníkov
 oSlovniky=oPom_zoznam.GetDictionaries ' zoznam slovníkov
 
 oZoznam=oDlgi.getControl("zoznam_slovnikov") ' prístup k zoznamu slovníkov v dialógu
 ' Vloženie názvov slovníkov do zoznamu v dialógu
 for i=LBound(oSlovniky) to Ubound(oSlovniky)
  oZoznam.AddItem(oSlovniky(i).Name, oZoznam.ItemCount)
 next i
 oZoznam.Text=oZoznam.Items(0) ' Zobrazenie prvej položky
 
 ' Zistenie a nastavenie adresárov používateľských knižníc
 oZoznam=oDlgi.getControl("zoznam_adresarov") ' prístup k zoznamu adresárov v dialógu
 sPom=oCesty.Linguistic ' Adresáre ku slovn9kom pre kontrolu gramatiky
 REM Adresárov môže byť viac, oddelené sú bodkočiarkami
 i=0
 do
  j=instr(sPom,";") ' Ak je viac adresárov, sú oddelené bodkočiarkou
  if j<>0 then ' Bola bodkočiarka – posúvame sa za bodkočiarku a nájdený adresár uložíme do zoznamu
   oZoznam.AddItem(ConvertFromURL(left(sPom,j-1)+"/"), oZoznam.ItemCount)
   i=i+1
   sPom=right(sPom,len(sPom)-j)
  else ' Nebola bodkočiarka – máme priamo adresár s knižnicami
   oZoznam.AddItem(ConvertFromURL(sPom+"/"), oZoznam.ItemCount)
   i=i+1
  endif
 loop until j=0
 if i>0 then i=i-1
 oZoznam.Text=oZoznam.Items(i) ' Zobrazenie poslednej položky
  
 oDlgi.setVisible(true) ' zviditeľnenie dialógu – namiesto dlg.Execute(), aby sa dalo paralelne pracovať s textom
 while oDlgi.isVisible() ' Cyklus, ktorý čaká na stlačenie klávesy "Koniec" v dialógu (kým je dialóg viditeľný)
  wait 500 ' Časová medzera 500 milisekúnd (0,5 sec) na to, aby sa dalo paralelne pracovať s dokumentom
 wend
 oDlgi.dispose() ' Zatvorenie dialógu
end sub

REM Funkcia pre nastavenie slovníka pre import
function DajAktualnySlovnik as boolean
 dim oPom_zoznam
 dim nastaveny as boolean : nastaveny=false
 
 if NacitajNazovSlovnika then
  'Je zadaný názov slovníka a slovník existuje
  oPom_zoznam=createUnoService ("com.sun.star.linguistic2.DictionaryList") ' Sprístupnenie zoznamu slovníkov
  oAktualnySlovnik=oPom_zoznam.GetDictionaryByName(sSlovnik) ' Sprístupnenie zadaného slovníka
  if oAktualnySlovnik.isFull() then ' Slovník je plný, nemôže sa do neho importovať
   VypisOznam(sSlovnik,1) ' Oznam, že slovník je plný – preto sa do neho nedá importovať
  else
   ' Slovník nie je plný, môžeme do neho importovať
   DajAktualnySlovnik=true
   exit function
  endif
  sSlovnik="" ' Názov slovníka vymažeme, lebo musíme vybrať iný
 endif
 ' Slovník nie je zadaný alebo je plný – vyberieme nový
 Import_slovnikov
 if sSlovnik<>"" then ' Ak sme vybrali slovník alebo sme vytvorili nový slovník
  oPom_zoznam=createUnoService ("com.sun.star.linguistic2.DictionaryList") ' Sprístupnenie zoznamu slovníkov
  oAktualnySlovnik=oPom_zoznam.GetDictionaryByName(sSlovnik) ' Sprístupnenie zadaného slovníka
  if not oAktualnySlovnik.isFull() then nastaveny=true ' Slovník nie je plný, môže sa do neho importovať
 endif
 DajAktualnySlovnik=nastaveny
end function

REM Procedúra pre aktuálneho slova do vybraného slovníka
Sub Import_aktualneho_slova_do_slovnika
 dim oDokument, oViditelnyKurzor, oKurzor as object
 dim slovo$
 
 if DajAktualnySlovnik then ' Je vybraný slovník, ktorý nie je plný – môžeme do neho zapísať slovo
  oDokument=StarDesktop.getCurrentComponent()
  oViditelnyKurzor=oDokument.getCurrentController().getViewCursor() ' viditeľný kurzor
  oKurzor=oViditelnyKurzor.getText().createTextCursorByRange(oViditelnyKurzor) ' vytvoríme pomocný kurzor podľa viditeľného kurzora
  
  oKurzor.collapseToStart() ' Aby nebolo nič označené
  if not oKurzor.isStartOfWord() then oKurzor.gotoStartOfWord(false) ' Ak nie sme na začiatku slova, skočíme naň
  oKurzor.gotoEndOfWord(true) ' Skočíme na koniec slova a označíme ho
  slovo=trim(oKurzor.String) ' Označené slovo bez mezdier na začiatku a konci
  if slovo<>"" then
   ' Ak je označené slovo neprázdne, tak ho vložíme do slovníka
   oAktualnySlovnik.Add(slovo, False, "") ' Vloženie slova do slovníka
  endif
 endif
end sub

REM Makro, ktoré zastaví import všetkých slov – volané stlačením klávesy "Zruš" v dialógu priebehu
sub Koniec_Priebeh_Initiated
 bKoniecIE=True
end sub

REM Proceedúra pre import všetkých slov z dokumentu, ktoré nie sú v slovníku, do vybraného slovníka
Sub Import_vsetkych_slov_do_slovnika
 dim slovo$ as string
 dim oDokument, oKurzor, oKontrolaJazyka, oSpravneSlovo, oPriebeh as object
 dim koniec as boolean
 dim kolko, celkom as long
 Dim oProperty() As New com.sun.star.beans.PropertyValue
 
 oDokument=StarDesktop.CurrentComponent
 oKurzor=oDokument.Text.createTextCursor() ' Kurzor pre pohyb po dokumente
 oKurzor.collapseToStart() ' Aby nebolo nič označené
 oKurzor.gotoStart(false) ' Skočíme na začiatok dokumentu
 oKurzor.gotoStartOfWord(false) ' Skočíme na začiatok slova
 
 oKontrolaJazyka=createUnoService("com.sun.star.linguistic2.LinguServiceManager")
 oSpravneSlovo=oKontrolaJazyka.getSpellChecker()
 
 DialogLibraries.LoadLibrary("JP_dictionary_IO") ' Otvorenie knižnice
 oDlgp=CreateUnoDialog(DialogLibraries.JP_dictionary_IO.Priebeh) ' Sprístupnenie dialógu
 
 kde=basiclibraries.getLibraryLinkURL("JP_dictionary_IO") ' Adresár, kde je rozšírenie nainštalované
 nazov=left(kde,len(kde)-10)+"jp_dictionary_"+Jazyk_OOo+".txt" ' Súbor s jazykovou lokalizáciou
 
 Set_jazyk_dialogu(oDlgp, nazov, "Priebeh") ' Nastavenie jazyka dialógu
 
 oPriebeh=oDlgp.getModel().getByName("Priebeh") ' Panel priebehu v dialógovom okne exportu
 oPriebeh.setPropertyValue("ProgressValueMin", 0) ' Nastavenie minimálnej hodnoty priebehu
 oPriebeh.setPropertyValue("ProgressValueMax", ThisComponent.WordCount) ' Nastavenie maximálnej hodnoty priebehu (počet slov)
 oPriebeh.setPropertyValue("ProgressValue",0) ' Nastavenie nulovej hodnoty priebehu
 
 oDlgp.setVisible(true) ' zviditeľnenie dialógu priebehu
 bKoniecIE=False
 kolko=0
 celkom=0
 
 if not DajAktualnySlovnik then exit sub
 
 do
  celkom=celkom+1
  if (celkom mod 10)=0 then oPriebeh.setPropertyValue("ProgressValue",celkom) ' Nastavenie aktuálnej hodnoty priebehu
  koniec=false ' Ešte musíme spracovať slová
  if not koniec then
   ' Ak nie sme na konci súboru, spracujeme slovo
   oKurzor.gotoEndOfWord(true) ' Skočíme na koniec slova a označíme ho
   slovo=trim(oKurzor.String) ' Označené slovo bez mezdier na začiatku a konci
   if slovo<>"" then
    ' Ak je označené slovo neprázdne
    If Not isEmpty (oKurzor.getPropertyValue("CharLocale")) Then
     ' Ak je slovo neznáme
     If Not oSpravneSlovo.isValid(slovo, oKurzor.getPropertyValue("CharLocale").Language, oProperty()) Then
      if oAktualnySlovnik.isFull() then
       if not DajAktualnySlovnik then exit sub ' Ak nie je ďalší slovník pre import, ukončíme vkladanie
      endif
      oAktualnySlovnik.Add(slovo, False, "") ' Vloženie slova do slovníka
      kolko=kolko+1 ' Počet slov
     end if
    endif
   endif
   koniec=not(oKurzor.gotoNextWord(false)) or bKoniecIE
   'goRight(1,false)) ' a presunieme sa na ďalší znak
  endif
 loop until Koniec ' Skončíme, ak sme sa nepresunuli na ďalší znak – koniec súboru
 oDlgp.dispose()
 msgbox "Import: "+str(kolko) ' Výpis počtu importovaných slov
End Sub

Neprehliadnite: