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
Copyright © 2002 - 2013 inet.sk, s. r. o. | Všetky práva vyhradené | Neprešlo jazykovou úpravou | ISSN 1336-1899
Využívame kvalitný webhosting za rozumnú cenu od Inet.sk