Hoci kancelársky balík nie je určený na typografiu, používa sa aj na tieto účely a, či sa nám to páči alebo nie, častokrát musíme sami takéto úpravy používať. Na druhej strane môže byť zdrojový text z OpenOffice.org výborným podkladom pre profesionálne DTP programy, ak ho vhodne typograficky predpripravíme – vymažeme viacnásobné medzery, vložíme nezalomiteľné medzery, nastavíme znakové štýly atď.
V nasledujúcich dieloch seriálu o programovaní makier si preto ukážeme komplexné rozšírenie pre typografické úpravy. Pretože rozsah procedúr a funkcií potrebných pre tieto účely je veľmi veľký, nielenže tieto funkcie sú rozdelené do viacerých modulov v rámci rozšírenia, ale aj seriál bude rozdelený do mnohých častí, aby ste postupne mohli vniknúť nielen do problematiky programovania, ale aj toho, čo všetko sa pri takýchto úpravách požaduje (pravdaže, seriál si v tomto smere nemôže klásť za cieľ uvedenie úplne všetkých požiadavok).
V dnešnom dieli začneme s uvádzaním modulu „Formatovanie_funkcie“, pričom si uvedieme deklaráciu spoločných premenných a všeobecné funkcie, ktoré budeme používať v ďalších funkciách a makrách. Pravdaže, pri tomto postupe musíme niekedy uviesť niektorú funkciu skôr, ako vysvetlíme, na čo je vlastne určená.
REM Definície spoločných premenných sú úplne pred definíciou podprogramov
dim Dokument, Vymena, Hladaj as object
dim NBSP$, TAB$, WJ$, JazykDokumentu$
dim iNBSP1%, iWJ1%, iNBSP2%, iWJ2%, iNBSP3%, iWJ3%, iTri_Bodky_1%, iTri_Bodky_2%, iTri_Bodky_3%
dim iFi_1%, iFi_2%
dim JP_priznaky_formatovania(20) as integer
REM Inicializácia spoločných premenných
sub Init
Dokument=ThisComponent
Vymena=Dokument.createReplaceDescriptor()
Hladaj=Dokument.createSearchDescriptor()
NBSP=chr$(&HA0) ' Nezalomiteľná medzera – hexadecimálny kód A0
TAB=chr$(&H09) ' Tabelátor – hexadecimálny kód 09
WJ=chr$(&H2060) ' Word Joiner – hexadecimálny kód 2060
ViditelnyKurzor=Dokument.getCurrentController().getViewCursor() ' Aktuálna pozícia kurzoru v texte
JazykDokumentu=ViditelnyKurzor.CharLocale.Language ' Aktuálny jazyk dokumentu
end sub
REM Výmena reťazca Co za reťazec Za
function Vymen(Co, Za as string, Regularne, Cele_slova, Velke_pismena as Boolean) as long
Vymena.SearchString=Co ' Čo hľadám
Vymena.ReplaceString=Za ' Za čo mením
Vymena.SearchRegularExpression=Regularne ' True=regulárne výrazy
Vymena.SearchWords=Cele_slova ' True=iba celé slová
Vymena.SearchCaseSensitive=Velke_pismena ' True=rozoznávenie veľkosti písmen
Vymen=Dokument.replaceAll(Vymena) ' Vlastná výmena, výsledok je počet výmen
end function
REM Vlastná výmena reťazca Co za reťazec Za vo vnútri reťazca V_Com
function Zamen_Vo_Vnutri (V_Com, Co, Za as string) as string
dim pom$ as string
dim i, j as long
pom=V_Com ' V čom hľadám
i=instr(V_Com,Co) ' Nájdenie polohy čo hľadáme
j=len(V_Com)-i-len(Co)+1 ' Dĺžka zvyšku pôvodného reťazca za nájdenou časťou
if i>0 then ' Ak sme našli
pom=left(V_Com,i-1)+Za ' Ľavá časť plus za čo zamieňame
if j>0 then ' Ak bol nejaký zvyšok za nájdenou časťou, pridáme aj tú
pom=pom+right(V_Com,j)
end if
end if
Zamen_Vo_Vnutri=pom
end function
REM Vlastná výmena reťazca Co za reťazec Za vo vnútri reťazca V_Com
function Zamen_All_Vo_Vnutri (V_Com, Co, Za as string) as string
dim pom$, pomV$ as string
dim i, j as long
pom=V_Com ' V čom hľadám
pomV=V_Com ' Pomocný výsledok
do
i=instr(pomV,Co) ' Nájdenie polohy čo hľadáme
j=len(pomV)-i-len(Co)+1 ' Dĺžka zvyšku pôvodného reťazca za nájdenou časťou
if i>0 then ' Ak sme našli
pom=left(pomV,i-1)+Za ' Ľavá časť plus za čo zamieňame
if j>0 then ' Ak bol nejaký zvyšok za nájdenou časťou, pridáme aj tú
pom=pom+right(pomV,j)
end if
end if
pomV=pom ' Výsledok po zámene
loop until i=0 ' Hľadanie opakujeme pre všetky vnútorné výskyty
Zamen_All_Vo_Vnutri=pomV
end function
REM Výmena vnútorného reťazca Co za reťazec Za hľadaním reťazca V_Com
function Vymen_hladanim(V_Com, Co, Za as string, Regularne, Cele_slova, Velke_pismena) as long
dim nasiel as object
dim kolko as long
Hladaj.searchString=V_Com
Hladaj.SearchRegularExpression=Regularne
Hladaj.SearchWords=Cele_slova
Hladaj.SearchCaseSensitive=Velke_pismena
kolko=0 ' Počet nájdených výskytov
nasiel = Dokument.findFirst(Hladaj) ' Hľadanie prvého výskytu v dokumente
Do While NOT isNull(nasiel) ' Pokiaľ nájdeme (not nenájdenie)
if len(nasiel.String)>0 then ' Ak sme vôbec niečo hľadali
nasiel.String=Zamen_Vo_Vnutri(nasiel.String,Co,Za) ' Vlastná zámena
kolko=kolko+1 ' Počet nájdených výskytov
end if
nasiel = Dokument.findNext( nasiel.End, Hladaj) ' Hľadanie ďalšieho výskytu v dokumente
Loop
Vymen_hladanim=kolko ' Počet výmen
end function
REM Výmena vnútorného reťazca Co za reťazec Za hľadaním reťazca V_Com
function Vymen_All_hladanim(V_Com, Co, Za as string, Regularne, Cele_slova, Velke_pismena) as long
dim nasiel as object
dim kolko as long
Hladaj.searchString=V_Com
Hladaj.SearchRegularExpression=Regularne
Hladaj.SearchWords=Cele_slova
Hladaj.SearchCaseSensitive=Velke_pismena
kolko=0 ' Počet nájdených výskytov
nasiel = Dokument.findFirst(Hladaj) ' Hľadanie prvého výskytu v dokumente
Do While NOT isNull(nasiel) ' Pokiaľ nájdeme (not nenájdenie)
if len(nasiel.String)>0 then ' Ak sme vôbec niečo hľadali
nasiel.String=Zamen_All_Vo_Vnutri(nasiel.String,Co,Za) ' Vlastná zámena
kolko=kolko+1 ' Počet nájdených výskytov
end if
nasiel = Dokument.findNext( nasiel.End, Hladaj) ' Hľadanie ďalšieho výskytu v dokumente
Loop
Vymen_All_hladanim=kolko ' Počet výmen
end function
REM Vyhľadanie reťazca V_Com a na pozíciu Kde do neho vloží reťazec Co
function Vloz_hladanim(V_Com, Co as string, Kde as long, Regularne, Cele_slova, Velke_pismena as Boolean) as long
dim nasiel as object
dim kolko, j as long
dim pom as string
Hladaj.searchString=V_Com
Hladaj.SearchRegularExpression=Regularne
Hladaj.SearchWords=Cele_slova
Hladaj.SearchCaseSensitive=Velke_pismena
kolko=0
nasiel = Dokument.findFirst(Hladaj) ' Hľadanie prvého výskytu v dokumente
Do While NOT isNull(nasiel)
if len(nasiel.String)>0 then
j=len(nasiel.String)-kde ' Veľkosť zvyšku (pravej časti)
pom=left(nasiel.String,kde)+Co ' Vloženie Co na miesto, kde ho chceme vložiť
if j>0 then
pom=pom+right(nasiel.String,j) ' Vloženie zvyšku (pravej časti)
end if
nasiel.String=pom ' Vloženie zameneného reťazca do dokumentu
kolko=kolko+1
end if
nasiel = Dokument.findNext( nasiel.End, Hladaj) ' Hľadanie ďalšieho výskytu v dokumente
Loop
Vloz_hladanim=kolko
end function
REM Procedúra pre načítanie definície profilu do premenných
sub Citaj_definiciu_profilu
dim riadok$, premenna$, definicia$, sNazov$
dim rovna as integer
dim sf, inStream, inFile ' Pre čítanie z lokalizačného súboru
' Inicializácia na štandardné štandardné hodnoty
' Vkladáme NBSP
iNBSP1=1
iWJ1=0
iNBSP2=1
iWJ2=0
iNBSP3=1
iWJ3=0
' Tri bodky zamieňame za výpustku
iTri_Bodky_1=0
iTri_Bodky_2=1
iTri_Bodky_3=0
' Zliatky nezamieňame
iFi_1=1
iFi_2=1
' Všetky opravy povolené
for i=1 to 20
JP_priznaky_formatovania(i)=1
next i
' WJ na konci riadkov automaticky neopravujeme
JP_priznaky_formatovania(4)=0
' SP za NBSP na začiatku nezameňame
JP_priznaky_formatovania(17)=0
' Špeciálne formátovanie nerobíme
JP_priznaky_formatovania(19)=0
JP_priznaky_formatovania(20)=0
on error resume next
sNazov=inicializacny_subor("Profil_"+Profily_funkcie.JP_aktualny_profil) ' Súbor s definíciou profilu
if fileexists(sNazov) then ' Ak nastavovací 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 left(premenna,12)="OptionButton" then
i=val(right(premenna,len(premenna)-12)) ' Poradové číslo nastavenia
JP_priznaky_formatovania(i)=val(definicia)
else
select case premenna
case "NBSP1"
iNBSP1=val(definicia)
case "NBSP2"
iNBSP2=val(definicia)
case "NBSP3"
iNBSP3=val(definicia)
case "WJ1"
iWJ1=val(definicia)
case "WJ2"
iWJ2=val(definicia)
case "WJ3"
iWJ3=val(definicia)
case "Tri_Bodky_1"
iTri_Bodky_1=val(definicia)
case "Tri_Bodky_2"
iTri_Bodky_2=val(definicia)
case "Tri_Bodky_3"
iTri_Bodky_3=val(definicia)
case "Fi_1"
iFi_1=val(definicia)
case "Fi_2"
iFi_2=val(definicia)
end select
endif
end if
loop
' Zatvorenie definičného súboru – namiesto close #subor
inStream.closeInput
inFile.closeInput
endif
Nezalomitelne_predlozky_funkcie.JP_WJ=(iWJ1=1)
end sub