Makrá v OpenOffice.org: Náhodný text pre ľubovoľný jazyk

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

Robíte návrhy, v ktorých používate pseudonáhodný text v rôznych jazykoch? Chcete pritom používať svoj vlastný text? Vytvorte si makro, pomocou ktorého ho dokážete nielen vkladať, ale aj pripravovať.

 

Generátor tzv. Lorem Ipsum textu nie je pre tých, ktorí sa zaoberajú grafikou neznámy pojem. Pri vlastnom návrhu mnohí z nich potrebujú, aby vložený pseudonáhodný text bol „v jazyku“, pre aký návrh pripravujú z dôvodu jeho špecifík, ako sú napr. dĺžne, mäkčene, azbuka a pod. V opačnom prípade totiž pripravený návrh po vložení reálneho textu sa môže značne líšiť od predstáv.

Z tohto dôvodu si uvedieme makrá, pomocou ktorých dokážete vkladať do dokumentu náhodný text a zároveň si takýto text dokážete pre ľubovoľný jazyk pripraviť. Pre jednoduchosť budeme predpokladať, že pri tvorbe vlastného pseudonáhodného textu sa použije aktuálne otvorený dokument, ktorý do pracovného súboru uloží všetky neprázdne odseky dokumentu.

Pre maximálnu pohodlnosť pri práci budeme zisťovať jazyk dokumentu a podľa toho automaticky nastavovať jazyka ako pri vkladaní, tak aj pri definícii náhodného textu. Aby sme predišli prípadu, že pre niektorý jazyk nie je definícia k dispozícii, bude súčasťou makra klasický latinský Lorem Ipsum text.

Samozrejme, ako pri všetkých makrách, ktoré uvádzame v rámci seriálu o ich programovaní, budeme predpokladať, že z makier sa vytvorí rozšírenie, v ktorom dialógy a pracovné okná môžu byť jazykovo lokalizované podľa pracovného jazyka OpenOffice.org.


 

dim nahodny_text(0) as string
dim nahodny_pocet as integer
dim dlg as object

REM Funkcia pre zistenie jazyka OO.o
function Jazyk_OOo as string
 dim ConfigProvider, MasterKey as object
 dim NodePath(0) as new com.sun.star.beans.PropertyValue
  
 NodePath(0).Name = "nodepath"
 NodePath(0).Value = "org.openoffice.Setup/L10N/"
 
 ConfigProvider = createUnoService("com.sun.star.configuration.ConfigurationProvider")
 MasterKey = ConfigProvider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", NodePath())
 Jazyk_OOo = left(MasterKey.getByName("ooLocale"),2) '"sk", "cs", …
end function

REM Procedúra pre nastavenie náhodného textu
function Set_nahodny_text(sNazov) as boolean
 dim riadok, premenna, definicia as string
 dim rovna as integer
 dim sf, inStream, inFile ' Pre čítanie z lokalizačného súboru
 dim existuje as boolean

 on error resume next
 
 existuje=fileexists(sNazov)
 
 if existuje then ' Ak lokalizačný súbor existuje, tak načítame definície do premenných
  sf = createUnoService("com.sun.star.ucb.SimpleFileAccess")
  inStream = sf.openFileRead(sNazov)
  inFile = createUnoService("com.sun.star.io.TextInputStream")
  inFile.InputStream = inStream
  inFile.Encoding = "UTF-8" ' lokalizačný súbor musí byť v UTF-8, inak nebude dobrá diakritika
  
  nahodny_pocet=0
  
  Do While not inFile.IsEOF
   riadok = trim(inFile.readLine) ' namiesto Line Input #subor, riadok
   rovna=instr(riadok,"=")
   if rovna<>0 then
    premenna=trim(left(riadok,rovna-1)) ' Budeme ignorovať medzery
    definicia=trim(right(riadok,len(riadok)-rovna))
    if premenna="LIT" then
     nahodny_pocet=val(definicia)
     if nahodny_pocet<0 then nahodny_pocet=0
     redim preserve nahodny_text(nahodny_pocet)
    end if
    rovna=val(premenna)
    if (rovna>0) and (rovna<=nahodny_pocet) then nahodny_text(rovna)=definicia
   end if
  loop
  ' Zatvorenie definičného súboru – namiesto close #subor
  inStream.closeInput
  inFile.closeInput
 end if
 Set_nahodny_text=existuje
end function

REM Procedúra pre nastavenie jazyka dialógu
Sub Set_jazyk_dialogu(oDlg, sNazov, sZahlavie, Jazyk)
 dim riadok, premenna, definicia as string
 dim rovna as integer
 dim sf, inStream, inFile ' Pre čítanie z lokalizačného súboru

 on error resume next
 
 if fileexists(sNazov) then ' Ak lokalizačný súbor existuje, tak načítame definície do premenných
  sf = createUnoService("com.sun.star.ucb.SimpleFileAccess")
  inStream = sf.openFileRead(sNazov)
  inFile = createUnoService("com.sun.star.io.TextInputStream")
  inFile.InputStream = inStream
  inFile.Encoding = "UTF-8" ' lokalizačný súbor musí byť v UTF-8, inak nebude dobrá diakritika
  
  Do While not inFile.IsEOF
   riadok = trim(inFile.readLine) ' namiesto Line Input #subor, riadok
   rovna=instr(riadok,"=")
   if rovna<>0 then
    premenna=trim(left(riadok,rovna-1)) ' Budeme ignorovať medzery
    definicia=trim(right(riadok,len(riadok)-rovna))
    select case premenna
     case sZahlavie
      oDlg.Title=definicia
     case "Jazyk"
      oDlg.model.getByName(premenna).setpropertyvalue("Label",definicia+": "+Jazyk)
     case else
      oDlg.model.getByName(premenna).setpropertyvalue("Label",definicia)
    end select
   end if
  loop
  ' Zatvorenie definičného súboru – namiesto close #subor
  inStream.closeInput
  inFile.closeInput
 end if
end sub

sub Vloz_Lorem_Ipsum
 dim kurzor, doc as object
 dim i, j, Odsekov as integer
 dim Jazyk as string
 
 ViditelnyKurzor = ThisComponent.getCurrentController().getViewCursor() ' Aktuálna pozícia kurzoru v texte
 Jazyk=left(ViditelnyKurzor.CharLocale.Language,2) ' Jazyk aktuálneho znaku (sk, cs, …)

 DialogLibraries.LoadLibrary("JP_Lorem_Ipsum")
 dlg=CreateUnoDialog(DialogLibraries.JP_Lorem_Ipsum.Dialog_LoremIpsum) ' Sprístupnenie dialógu
 
 kde=basiclibraries.getLibraryLinkURL("JP_Lorem_Ipsum") ' Adresár, kde je rozšírenie nainštalované
 
 nazov=left(kde,len(kde)-10)+"JP_loremipsumtext_"+Jazyk+".txt" ' Súbor s jazykovou lokalizáciou
 if (not Set_nahodny_text(nazov)) or nahodny_pocet<=0 then
  ' Latinčina
  nahodny_pocet=5
  redim preserve nahodny_text(nahodny_pocet)
  nahodny_text(1)="Lorem ipsum dolor sit amet consectetuer mauris sollicitudin eros laoreet turpis. Tellus elit condimentum elit justo ridiculus convallis urna gravida In fames. Lobortis Sed neque felis Lorem ut consectetuer nibh vitae libero a. Tellus dolor augue gravida sodales neque interdum cursus id ac amet. Id tellus Nulla dui Proin condimentum orci condimentum quis congue dui. Mauris diam justo consequat ac velit aliquam Vivamus metus."
  nahodny_text(2)="Molestie vitae In Sed nisl consectetuer a tempus Nulla fringilla ligula. Leo velit nulla ut convallis Sed laoreet morbi sed laoreet urna. Quis Ut congue tincidunt est gravida commodo quis a pede interdum. Sit In magna felis wisi In congue enim pede Vivamus commodo. Nisl dolor ut lacinia eget in velit turpis Curabitur est orci. Vel Suspendisse."
  nahodny_text(3)="Ac at interdum pede quis Nam pulvinar Vestibulum In Mauris orci. A convallis Curabitur dui cursus Vestibulum pellentesque Donec hendrerit amet tortor. Et at vel Nulla porta Vivamus In consequat nibh consequat auctor. Morbi amet habitasse quam augue Ut Phasellus nulla pellentesque Morbi Maecenas. Justo dis condimentum ut Praesent libero malesuada."
  nahodny_text(4)="In sapien et ac leo ac et sem eget at ac. Eget adipiscing orci Vestibulum massa massa Vestibulum commodo ipsum sed libero. Urna ante Vestibulum odio Pellentesque Nam egestas eu sagittis elit urna. Est augue ut Vestibulum leo risus pede ut ut lacus nascetur. Mauris laoreet justo Nam a tincidunt."
  nahodny_text(5)="Sit tristique nascetur accumsan lobortis leo vitae et vel Sed laoreet. Vivamus commodo dolor mauris id nibh tortor vitae pellentesque id congue. Pellentesque ac cursus pellentesque leo aliquam et a tincidunt massa ipsum. Porttitor ligula libero laoreet Vestibulum Donec interdum justo Curabitur mauris libero. Ut elit nulla Quisque semper tempus Curabitur ut ipsum feugiat nisl. Nibh pretium mattis sodales et pellentesque massa quis adipiscing Vestibulum amet. Id nulla habitasse."
  Jazyk="Latin"
 end if
 
 nazov=left(kde,len(kde)-10)+"JP_loremipsum_"+Jazyk_OOo+".txt" ' Súbor s jazykovou lokalizáciou
 Set_jazyk_dialogu(dlg, nazov, "Dialog_LoremIpsum", Jazyk) ' Nastavenie jazyka dialógu
 
 ' Počet odsekov prednastavíme na 1
 dlg.model.PocetOdsekov.text="1"
 
 if dlg.Execute()=1 then
  ' Ak bolo stlačené tlačidlo "OK"
  Odsekov=val(dlg.model.PocetOdsekov.text) ' Počet vkladaných odsekov
  doc=ThisComponent.CurrentController
  kurzor=doc.getViewCursor() ' Aktuálna pozícia kurzora
  kurzor.collapseToEnd() ' Odznačenie textu a skok na jeho koniec
  j=0 ' Počítadlo indexu náhodného textu
  for i=1 to Odsekov ' Pre všetky odseky
   j=j+1 ' Posun na ďalší náhodný text
   if j>nahodny_pocet then j=1 ' Ak chceme viac odsekov, ako máme počet vzoriek náhodného textu
   kurzor.SetString(nahodny_text(j)) ' Vlastné vloženie náhodného textu
   kurzor.collapseToEnd() ' Skok na koniec textu
   if i<Odsekov then kurzor.SetString(chr(&H0D)) ' Vloženie CR na konci odseku
   kurzor.collapseToEnd()
  next i
 endif
 dlg.dispose()
end sub

REM Funkcia pre zápis Lorem Ipsum textu z aktuálneho dokumentu do definičného súboru podľa jazyka
Sub Definuj_LIT
 dim Dokument, Kurzor as object
 dim Pocet as integer
 Dim Odsek, Jazyk, tt1, tt2 as string
 dim sf, inStream, inFile, outStream, outFile ' Pre čítanie a zápis do lokalizačného súboru
 
 Dokument=StarDesktop
 Kurzor=Dokument.CurrentComponent.Text.CreateTextCursor()
 
 Kurzor.gotoStart(false) ' Skočíme na začiatok dokumentu
 Jazyk=left(Kurzor.CharLocale.Language,2)
 kde=basiclibraries.getLibraryLinkURL("JP_Lorem_Ipsum") ' Adresár, kde je rozšírenie nainštalované
 sSubor="JP_loremipsumtext_"+Jazyk+".txt"
 snazov=left(kde,len(kde)-10)+sSubor ' Súbor s jazykovou lokalizáciou
 sqNazov=left(kde,len(kde)-10)+"JP_loremipsum_"+Jazyk_OOo+".txt" ' Súbor s jazykovou lokalizáciou
 
 ' Spočítame neprázdne odseky
 Pocet=0
 do
  Kurzor.gotoEndOfParagraph(true) ' Označíme odsek
  Odsek=trim(Kurzor.string)
  if Odsek<>"" then Pocet=Pocet+1
 loop while Kurzor.gotoNextParagraph(false)
 if Pocet>0 then ' Ak je počet Lorem Ipsum odsekov nenulový
  ' Overíme, či súbor už neexistuje
  prepisat=true
  if fileexists(sNazov) then ' Ak lokalizačný súbor existuje, tak načítame definície do premenných
   REM Nastavenie textu dialógu
   tt1="Súbor '"
   tt2="' existuje. Prepísať?"
   if fileexists(sqNazov) then ' Ak lokalizačný súbor existuje, tak načítame definície do premenných
    sf = createUnoService("com.sun.star.ucb.SimpleFileAccess")
    inStream = sf.openFileRead(sqNazov)
    inFile = createUnoService("com.sun.star.io.TextInputStream")
    inFile.InputStream = inStream
    inFile.Encoding = "UTF-8" ' lokalizačný súbor musí byť v UTF-8, inak nebude dobrá diakritika
    Do While not inFile.IsEOF
     riadok = trim(inFile.readLine) ' namiesto Line Input #subor, riadok
     rovna=instr(riadok,"=")
     if rovna<>0 then
      premenna=trim(left(riadok,rovna-1)) ' Budeme ignorovať medzery
      definicia=trim(right(riadok,len(riadok)-rovna))
      select case premenna
       case "Subor"
        tt1=definicia+" '"
       case "Existuje"
        tt2="' "+definicia
      end select
     end if
    loop
    ' Zatvorenie definičného súboru – namiesto close #subor
    inStream.closeInput
    inFile.closeInput
   end if
   prepisat=(msgbox(tt1+sSubor+tt2,52,"Lorem Ipsum text")=6)
  end if

  if prepisat then
   sf = createUnoService("com.sun.star.ucb.SimpleFileAccess")
   outStream = sf.openFileWrite(sNazov)
   outFile = createUnoService("com.sun.star.io.TextOutputStream")
   outFile.OutputStream = outStream
   outFile.Encoding = "UTF-8" ' Súbor bude v UTF-8 aby bola dobrá diakritika
   outStream.truncate() ' Vymazanie predchádzajúceho obsahu
   Odsek="LIT="+trim(str(Pocet)) ' Definícia počtu odsekov
   outFile.writeString(Odsek+chr(13))
   i=0
   Kurzor.gotoStart(false) ' Skočíme na začiatok dokumentu
   do
    Kurzor.gotoEndOfParagraph(true) ' Označíme odsek
    Odsek=trim(Kurzor.string)
    if Odsek<>"" then
     i=i+1
     Odsek=trim(str(i))+"="+Odsek
     if i<pocet then
      outFile.writeString(Odsek+chr(13)) ' Ak nie je posledný odsek, vkladáme aj CR
     else
      outFile.writeString(Odsek)
     endif
    end if
   loop while Kurzor.gotoNextParagraph(false)
   outStream.closeOutput
   outFile.closeOutput
  end if
 end if
end sub

Neprehliadnite: