Makrá v OpenOffice.org: Typografické úpravy textu (7)

Július Pastierik  /  20. 07. 2011, 00:00

V ďalších pokračovaniach seriálu o typografických makrách sa budeme venovať problematike zalomiteľných medzier a ich rôznych náhrad za nezalomiteľné medzery.

 

Medzi základné typografické úpravy patrí o. i. to, že na konci riadku nezostáva zalomiteľná medzera napr. za jednoznakovou predložkou a spojkou. V prvých dieloch sme si už ukázali základné funkcie pre zámenu zalomiteľných medzier za nezalomiteľné. Nie vždy však chceme, aby sa úpravy robili automaticky v celom dokumente, ale požadujeme, aby sa urobili iba v označenom texte resp. iba na konci riadkov a pod.

Tieto požiadavky vychádzajú napr. z toho, že znak nezalomiteľnej medzery (NBSP) sa v OpenOffice.org (na rozdiel od DTP programov) nezobrazuje „pružne“ a znak Word Joiner nie vždy zabráni nesprávnemu zalomeniu. Inokedy vložená nezalomiteľná medzera bráni vo vyhľadávaní slovných spojení, pretože musíme hľadať spojenia ako s obyčajnou, tak aj s nezalomiteľnou medzerou.

Za účelom riešenia uvedenej problematiky si preto teraz ukážeme rad funkcií, pomocou ktorých dokážeme hľadať a nahrádzať medzery navzájom – zalomiteľné za nezalomiteľné a naopak a to v celom dokumente, v označenom texte alebo na konci riadku. Všetky funkcie uložíme do modulu Medzery_ex.

V dnešnej časti si na úvod uvedieme funkcie pre jazykovú lokalizáciu, pre vyhľadávanie v označenom texte alebo v celom dokumente a procedúry pre prácu s dialógovým oknom,pomocou ktorého voláme príslušné funkcie zámen medzier.



dim oDlgm as object

REM Procedúra pre nastavenie jazyka dialógu s dvojriadkovými výpismi
Sub Set_jazyk_dvoj_dialogu(oDlg, sNazov, sZahlavie)
 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))
    if premenna=sZahlavie then
     oDlg.Title=definicia
    else
     select case sZahlavie' Dvojriadkové a iné výpisy
      case "Dialog_Zamena_medzier"
       select case premenna
        case "CB17a", "CB18a", "CB27a", "CB28a", "CB35a" ' Prvý riadok popisu
         nnn=left(premenna,4)
         oDlg.model.getByName(nnn).setpropertyvalue("Label",definicia)
        case "CB17b", "CB18b", "CB27b", "CB28b", "CB35b" ' Druhý riadok popisu
         nnn=left(premenna,4)
         pom=oDlg.model.getByName(nnn).getpropertyvalue("Label")
         oDlg.model.getByName(nnn).setpropertyvalue("Label",pom+chr$(&H0A)+definicia)
        case else
         oDlg.model.getByName(premenna).setpropertyvalue("Label",definicia)
        end select
      case "Dialog_Odsadenie_riadkov"
       select case premenna
        case "Label2a", "Label3a", "Label4a" ' Prvý riadok popisu
         nnn=left(premenna,6)
         oDlg.model.getByName(nnn).setpropertyvalue("Label",definicia)
        case "Label2b", "Label3b", "Label4b" ' Druhý riadok popisu
         nnn=left(premenna,6)
         pom=oDlg.model.getByName(nnn).getpropertyvalue("Label")
         oDlg.model.getByName(nnn).setpropertyvalue("Label",pom+chr$(&H0A)+definicia)
        case else
         oDlg.model.getByName(premenna).setpropertyvalue("Label",definicia)
        end select
      case else
       oDlg.model.getByName(premenna).setpropertyvalue("Label",definicia)
     end select
    end if
   end if
  loop
  ' Zatvorenie definičného súboru – namiesto close #subor
  inStream.closeInput
  inFile.closeInput
 end if
end sub

REM Makro pre zámenu textu v označenom/celom texte
sub Zamen_hladany_text(co, zaco as string, cely as boolean)
 ' co – hľadaný text
 ' zaco – text, ktorým sa nahrádza hľadaný text
 ' cely – TRUE, ak v celom dokumente, inak FALSE
 
 dim dokument, dispatcher, kurzor as object
 dim args(18) as new com.sun.star.beans.PropertyValue ' Parametre pre nastavenie hľadania

 args(0).Name = "SearchItem.StyleFamily"
 args(0).Value = 2
 args(1).Name = "SearchItem.CellType"
 args(1).Value = 0
 args(2).Name = "SearchItem.RowDirection"
 args(2).Value = true
 args(3).Name = "SearchItem.AllTables"
 args(3).Value = false
 args(4).Name = "SearchItem.Backward"
 args(4).Value = false
 args(5).Name = "SearchItem.Pattern"
 args(5).Value = false
 args(6).Name = "SearchItem.Content"
 args(6).Value = false
 args(7).Name = "SearchItem.AsianOptions"
 args(7).Value = false
 args(8).Name = "SearchItem.AlgorithmType"
 args(8).Value = 1 ' Regulárne výrazy
 args(9).Name = "SearchItem.SearchFlags"
 if cely then
  args(9).Value = 65536 ' Hľadá sa v celom dokumente
 else
  args(9).Value = 71680 ' Hľadá sa v označenom texte (výbere)
 endif
 args(10).Name = "SearchItem.SearchString"
 args(10).Value = co
 args(11).Name = "SearchItem.ReplaceString"
 args(11).Value = zaco
 args(12).Name = "SearchItem.Locale"
 args(12).Value = 255
 args(13).Name = "SearchItem.ChangedChars"
 args(13).Value = 2
 args(14).Name = "SearchItem.DeletedChars"
 args(14).Value = 2
 args(15).Name = "SearchItem.InsertedChars"
 args(15).Value = 2
 args(16).Name = "SearchItem.TransliterateFlags"
 args(16).Value = 1280
 args(17).Name = "SearchItem.Command"
 args(17).Value = 3
 args(18).Name = "Quiet"
 args(18).Value = true

 dokument=ThisComponent.CurrentController.Frame
 dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
 dispatcher.executeDispatch(dokument, ".uno:ExecuteSearch", "", 0, args())
end sub

REM Makro, ktoré zneviditeľní dialóg – t.j. nastaví, že sa má ukončiť čakací cyklus (volané stlačením klávesy "Koniec" v dialógu)
sub Koniec_Medzery_Initiated
 oDlgm.setVisible(false) ' Zneviditeľnenie dialógu
end sub

Rem Volanie dialógu a makra pre nastavenie medzier
sub Nastav_medzery
 dim kurzor as object
 
 DialogLibraries.LoadLibrary("JP_typografia") ' Otvorenie knižnice
 
 if not isnull(oDlgm) then exit sub ' Ak je okno otvorené, neotvárame druhé
 
 oDlgm=CreateUnoDialog(DialogLibraries.JP_typografia.Dialog_Zamena_medzier) ' Sprístupnenie dialógu
 nazov=inicializacny_subor("JP_Zamena_medzier_"+Jazyk_OOo) ' Súbor s jazykovou lokalizáciou
 Set_jazyk_dvoj_dialogu(oDlgm, nazov, "Dialog_Zamena_medzier") ' Nastavenie jazyka dialógu
 
 oDlgm.model.Vymeny.State=0 ' Nebudeme vypisovať koniec výmen
 
 oDlgm.setVisible(true) ' zviditeľnenie dialógu – namiesto dlg.Execute(), aby sa dalo paralelne pracovať s textom
 while oDlgm.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
 oDlgm.dispose() ' Zatvorenie dialógu
end sub

Neprehliadnite: