Július Pastierik / 05. 01. 2011, 08:47
Potrebujete dosiahnuť, aby slovo na konci strany alebo odseku nebolo delené? V nasledujúcom makre si ukážeme, ako to dosiahnuť.
Z typografického hľadiska nie je vhodné, aby sa slová na konci strán delili, pretože sa takýto text potom ťažšie číta. V niektorých prípadoch je však prípustné, aby zostalo rozdelené na párnej (ľavej) strane, pretože pri prechode očami na nepárnu stranu to nie je až také problematické.
Inokedy je však na prekážku aj to, ak je rozdelené posledné slovo odseku, pretože nepôsobí esteticky, ak sú na riadku povedzme iba dve písmená posledného slova.
Z uvedených dôvodov si pripravíme makro, pomocou ktorého dokážeme automaticky zrušiť delenie takýchto slov. Aby sme mohli pracovať univerzálne (pretože aj naše požiadavky sa môžu dokument od dokumentu líšiť), je potrebné, aby sme si pripravili dialógové okno, v ktorom budeme nastavovať, ktoré slová nechceme deliť – či na konci odsekov alebo na konci strán. Pochopiteľne, na konci strán budeme navyše nastavovať, či chceme zrušiť delenie slov na párnych alebo nepárnych stranách, prípadne na obidvoch.
Vlastné zrušenie delenia slova prevedieme nakoniec tak, že nastavíme jazyk príslušného slova na „žiaden“. Pretože OpenOffice.org pri delení slov používa slovníky podľa príslušného jazyka, takéto slovo nedokáže rozdeliť, čím dosiahneme požadovaný efekt.
Vlastné makrá predpokladajú, že máme z nich urobené rozšírenie, ktoré môžeme jazykovo lokalizovať a preto obsahuje aj funkcie pre nastavenie jazyka dialógového okna.
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 jazyka dialógu
Sub Set_jazyk_dialgu(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 = 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
oDlg.model.getByName(premenna).setpropertyvalue("Label",definicia)
endif
end if
loop
' Zatvorenie definičného súboru – namiesto close #subor
inStream.closeInput
inFile.closeInput
end if
end sub
REM Makro pre odstránenie delenia na konci strany
sub Odstran_delenie_strany(parne, neparne as boolean)
dim ViditelnyKurzor, AktualnyText, AktualnyKurzor, PovodnyKurzor as object
dim strana, kolko as long
if parne=false and neparne=false then exit sub ' Ak sa nič nemení
ViditelnyKurzor = ThisComponent.getCurrentController().getViewCursor()
PovodnyKurzor=ViditelnyKurzor.getstart() ' Odpamätanie aktuálnej pozície
AktualnyText = ThisComponent.getText()
ViditelnyKurzor.jumpToLastPage
kolko=ViditelnyKurzor.getpage()
for strana=1 to kolko-1 ' Na poslednej strane neoznačujeme posledné slovo – už sa nemá kam deliť (ak sa delilo, tak na predposlednej strane).
if (parne and (strana mod 2 = 0)) or (neparne and (strana mod 2 = 1)) then ' Podľa nastavenia párnych/nepárnych strán rušíme delenie slov
ViditelnyKurzor.jumpToPage(strana)
ViditelnyKurzor.jumpToEndOfPage ' Skočíme na koniec strany
AktualnyKurzor = AktualnyText.createTextCursorByRange(ViditelnyKurzor.getStart() )
AktualnyKurzor.gotoStartOfWord(false) ' Označíme posledné slovo
AktualnyKurzor.gotoEndOfWord(true)
ViditelnyKurzor.gotoRange(AktualnyKurzor,false)
zrus_jazyk
end if
next strana
ViditelnyKurzor.gotoRange(PovodnyKurzor,false)
end sub
REM Makro pre odstránenie delenia na konci odsekov
sub Odstran_delenie_odsek
dim ViditelnyKurzor, AktualnyText, AktualnyKurzor, PovodnyKurzor as object
ViditelnyKurzor = ThisComponent.getCurrentController().getViewCursor()
PovodnyKurzor=ViditelnyKurzor.getstart() ' Odpamätanie aktuálnej pozície
AktualnyText = ThisComponent.getText()
AktualnyKurzor = AktualnyText.createTextCursorByRange(ViditelnyKurzor.getStart() )
AktualnyKurzor.gotoStart(false) ' Skočíme na začiatok dokumentu
do
AktualnyKurzor.gotoEndOfParagraph(false)
AktualnyKurzor.gotoStartOfWord(false) ' Označíme posledné slovo
AktualnyKurzor.gotoEndOfWord(true)
ViditelnyKurzor.gotoRange(AktualnyKurzor,false)
zrus_jazyk
loop while AktualnyKurzor.gotoNextParagraph(false)
ViditelnyKurzor.gotoRange(PovodnyKurzor,false)
end sub
REM Procedúra pre zrušenie jazyka (z nahrávania makra)
sub zrus_jazyk
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Language"
args1(0).Value = "Current_LANGUAGE_NONE"
dispatcher.executeDispatch(document, ".uno:LanguageStatus", "", 0, args1())
end sub
REM Procedúra pre zmenu viditeľnosti políčiek párne/nepárne strany podľa toho, či rušíme strany alebo odseky
sub Strany_Initiated
if dlg.model.Strany.State=1 then ' Ak rušíme delenie strán, tak sa nastavuje párne/nepárne
dlg.getControl("Parne").Visible = true
dlg.getControl("Neparne").Visible = true
else ' Inak nie
dlg.getControl("Parne").Visible = false
dlg.getControl("Neparne").Visible = false
endif
end sub
REM Vlastná procedúra pre otvorenie dialógu a zrušenie delenia slov
sub Zakaz_Delenie
dim nazov as string
DialogLibraries.LoadLibrary("JP_delenie_strany")
dlg=CreateUnoDialog(DialogLibraries.JP_delenie_strany.Strana_Odsek) ' Sprístupnenie dialógu
kde=basiclibraries.getLibraryLinkURL("JP_delenie_strany") ' Adresár, kde je rozšírenie nainštalované
nazov=left(kde,len(kde)-10)+"jp_delenie_strany_"+Jazyk_OOo+".txt" ' Súbor s jazykovou lokalizáciou
Set_jazyk_dialgu(dlg, nazov, "Strana_Odsek") ' Nastavenie jazyka dialógu
dlg.model.Strany.State=1 ' Prednastavené nastavenie rušenie delenia na konci strán
dlg.model.Odseky.State=0
dlg.model.Parne.State=1 ' Prednastavené nastavenie je nedelenie slov na všetkých stranách
dlg.model.Neparne.State=1
if dlg.execute() then
if dlg.model.Strany.State=1 then
Odstran_delenie_strany(dlg.model.Parne.State=1, dlg.model.Neparne.State=1)
else
Odstran_delenie_odsek
end if
end if
dlg.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