Július Pastierik / 22. 06. 2011, 00:00
V ďalšom pokračovaní typografických makier si ukážeme prvé funkcie pre vkladanie nezalomiteľných medzier.
Ďalšou základnou typografickou potrebou sú tzv. nezalomiteľné medzery. Ide o to, že opticky nevyzerá pekne, ak sa na konci riadku nachádza napr. jednoznaková či dvojznaková predložka a spojka. Samozrejme, toto nie je jedná oblasť, v ktorej sa požadujú nezalomiteľné medzery – vkladajú sa aj za akademické tituly a pod.
Pri tejto problematike navyše prichádza do úvahy ďalšia vec – veľké a malé písmená. Niekedy (hlavne pri predložkách a spojkách) nám nezáleží na tom, akým písmenom sú napísané a vždy chceme, aby za nimi bola vložená nezalomiteľná medzera. Inokedy (napr. pri užšej sadzbe, alebo to tak požadujú niektorí zákazníci) sa nezalomiteľná medzera nevkladá za spojku „A“.
Okrem toho však môžeme chcieť, aby sa napr. pri akademických tituloch nielenže vložila nezalomiteľná medzera, ale zároveň chceme tento titul aj opraviť (veľkosť písmen) tak, ako sa má správne písať. A pretože akademické tituly sa píšu nielen pred menom, ale aj za ním, musíme vyriešiť otázku vkladania nezalomiteľných medzier „okolo“ nich.
Aby sme tieto všetky podmienky dodržali, najlepšie je, ak si pripravíme zoznamy všetkých slov, okolo ktorých chceme takéto medzery vkladať, pričom ich rozdelíme do troch základných skupín – slová, pri ktorých nebudeme testovať veľkosť písmen, slová, pri ktorých budeme testovať veľkosť písmen a slová, pri ktorých budeme opravovať prípadné chyby vo veľkosti písmen. Ďalej musíme tieto skupiny rozdeliť do dvoch podmnožín – prvá bude obsahovať slová, pri ktorých vkladáme nezalomiteľné medzery za ne a druhá slová, pri ktorých vkladáme nezalomiteľné medzery pred ne.
Ako malý bonus si k tejto funkcii uvedieme aj funkciu pre mazanie prázdnych odsekov a pomocné funkcie.
REM Odstránenie prázdnych odsekov
function f_Prazdny_odsek as long
f_Prazdny_odsek=Vymen("^$","",TRUE,false,false)
end function
REM Funkcia pre úpravu reťazca oddleného medzerami na regulárny výraz
function UpravNaRV(co as string) as string
dim uprava$ : uprava=""
' Úprava na regulárny výraz typu "a|i|k"
for i=1 to len(co)
if mid(co,i,1)=" " then ' Medzery zameníme za znak "|"
uprava=uprava+"|"
elseif instr(".^$*+?[]|{}()\",mid(co,i,1))<>0 then
' Špeciálne znaky musíme v hľadaní nahradiť regulárnym výrazom "\znak"
uprava=uprava+"\"+mid(co,i,1)
else
uprava=uprava+mid(co,i,1) ' Ostatné znaky necháme bez zmeny
endif
next i
UpravNaRV=uprava
end function
REM Makro pre vkladanie nezalomiteľných medzier za predložky, spojky a iné slová podľa definičného súboru
function f_Nezalomitelne_Spojky(NM as integer) as long
dim spojky$, znak$, hladaj$, vyraz$
dim kolko as long
dim ViditelnyKurzor
kolko=0
' Definícia znaku, za ktorý budeme meniť zalomiteľnú medzeru
if NM=1 then
znak=NBSP
else
znak=WJ+" "
endif
' NBSP "za" bez testu veľkosti písmen (napr. spojky i, s, z)
spojky=UpravNaRV(trim(nacitaj_subor("ProfilM_"+Profily_funkcie.JP_aktualny_profil+"_za_bez_"+JazykDokumentu)))
' Ak sú zadané reťazce bez testu veľkosti písmen
if spojky<>"" then
spojky="\<("+spojky+") " ' Reťazce musia byť ako začiatok slova (teda celé slovo) za ktorým je SP
kolko=Vymen_hladanim(spojky," ",znak,true,false,false)
endif
' NBSP "za" s testom veľkosti písmen (napr. akademické tituly doc., Doc.)
spojky=UpravNaRV(trim(nacitaj_subor("ProfilM_"+Profily_funkcie.JP_aktualny_profil+"_za_vm_"+JazykDokumentu)))
' Ak sú zadané reťazce s testom veľkosti písmen
if spojky<>"" then
spojky="\<("+spojky+") " ' Reťazce musia byť ako začiatok slova (teda celé slovo) za ktorým je SP
kolko=kolko+Vymen_hladanim(spojky," ",znak,true,false,true)
endif
' NBSP "za" s opravou veľkosti písmen (napr. akademické tituly Ing., MUDr.)
spojky=trim(nacitaj_subor("ProfilM_"+Profily_funkcie.JP_aktualny_profil+"_za_oprava_"+JazykDokumentu))
vyraz="" ' Výraz, ktorým budeme opravovať
hladaj="" ' Výraz, ktorý budeme hľadať
for i=1 to len(spojky)
' Zo zadaných reťazcov extrahujeme vlastné reťazce
if mid(spojky,i,1)=" " then ' Medzera ukončuje definíciu, vlastná zámena
if vyraz<>"" then
' Ak sú zadané reťazce s opravou veľkosti písmen
hladaj="\<"+hladaj+" " ' Hľadaný výraz upravíme na regulárny výraz "\<vyraz " – musí byť ako začiatok slova (teda celé slovo)
vyraz=vyraz+znak ' K opravnámu teťazcu pridáme NBSP
kolko=kolko+Vymen(hladaj,vyraz,true,false,false)
hladaj="" ' Vymazanie už nájdeného reťazca
vyraz=""
endif
elseif instr(".^$*+?[]|{}()\",mid(spojky,i,1))<>0 then
' Špeciálne znaky musíme v hľadaní nahradiť regulárnym výrazom "\znak"
vyraz=vyraz+mid(spojky,i,1)
hladaj=hladaj+"\"+mid(spojky,i,1)
else ' Ostatné znaky necháme bez zmeny
vyraz=vyraz+mid(spojky,i,1)
hladaj=hladaj+mid(spojky,i,1)
endif
next i
if vyraz<>"" then ' Posledný reťazec nie je ukončený medzerou a preto ho musíme hľadať osobitne
' Ak sú zadané reťazce s opravou veľkosti písmen
hladaj="\<"+hladaj+" " ' Hľadaný výraz upravíme na regulárny výraz "\<vyraz " – musí byť ako začiatok slova (teda celé slovo)
vyraz=vyraz+znak ' K opravnámu teťazcu pridáme NBSP
kolko=kolko+Vymen(hladaj,vyraz,true,false,false)
endif
' NBSP "pred" bez testu veľkosti písmen
spojky=UpravNaRV(trim(nacitaj_subor("ProfilM_"+Profily_funkcie.JP_aktualny_profil+"_pred_bez_"+JazykDokumentu)))
' Ak sú zadané reťazce bez testu veľkosti písmen
if spojky<>"" then
spojky=" ("+spojky+")\>" ' Reťazce musia byť ako koniec slova (teda celé slovo) pred ktorým je SP
kolko=kolko+Vymen_hladanim(spojky," ",znak,true,false,false)
endif
' NBSP "pred" s testom veľkosti písmen
spojky=UpravNaRV(trim(nacitaj_subor("ProfilM_"+Profily_funkcie.JP_aktualny_profil+"_pred_vm_"+JazykDokumentu)))
' Ak sú zadané reťazce s testom veľkosti písmen
if spojky<>"" then
spojky=" ("+spojky+")\>" ' Reťazce musia byť ako koniec slova (teda celé slovo) pred ktorým je SP
kolko=kolko+Vymen_hladanim(spojky," ",znak,true,false,true)
endif
' NBSP "pred" s opravou veľkosti písmen (napr. akademické tituly ArtD., CSc., DrSc., PhD.)
spojky=trim(nacitaj_subor("ProfilM_"+Profily_funkcie.JP_aktualny_profil+"_pred_oprava_"+JazykDokumentu))
vyraz="" ' Výraz, ktorým budeme opravovať
hladaj="" ' Výraz, ktorý budeme hľadať
for i=1 to len(spojky)
' Zo zadaných reťazcov extrahujeme vlastné reťazce
if mid(spojky,i,1)=" " then ' Medzera ukončuje definíciu, vlastná zámena
if vyraz<>"" then
' Ak sú zadané reťazce s opravou veľkosti písmen
if instr(hladaj,"\>")=0 then ' Ak výraz neobsahuje hľadanie na konci slova
hladaj=" "+hladaj+"\>" ' Hľadaný výraz upravíme na regulárny výraz " vyraz\>" – musí byť ako koniec slova (teda celé slovo)
else
hladaj=" "+hladaj ' Hľadaný výraz upravíme na regulárny výraz " vyraz"
endif
vyraz=znak+vyraz ' Pred opravný teťazec pridáme NBSP
kolko=kolko+Vymen(hladaj,vyraz,true,false,false)
hladaj="" ' Vymazanie už nájdeného reťazca
vyraz=""
endif
elseif mid(spojky,i,1)="." then ' Ak je bodka, musíme ukončiť hľadaný výraz reťazcom "\>\.", inak ho nenájde
vyraz=vyraz+"."
hladaj=hladaj+"\>\."
elseif instr("^$*+?[]|{}()\",mid(spojky,i,1))<>0 then
' Špeciálne znaky musíme v hľadaní nahradiť regulárnym výrazom "\znak"
vyraz=vyraz+mid(spojky,i,1)
hladaj=hladaj+"\"+mid(spojky,i,1)
else ' Ostatné znaky necháme bez zmeny
vyraz=vyraz+mid(spojky,i,1)
hladaj=hladaj+mid(spojky,i,1)
endif
next i
if vyraz<>"" then ' Posledný reťazec nie je ukončený medzerou a preto ho musíme hľadať osobitne
' Ak sú zadané reťazce s opravou veľkosti písmen
if instr(hladaj,"\>")=0 then ' Ak výraz neobsahuje hľadanie na konci slova
hladaj=" "+hladaj+"\>" ' Hľadaný výraz upravíme na regulárny výraz " vyraz\>" – musí byť ako koniec slova (teda celé slovo)
else
hladaj=" "+hladaj ' Hľadaný výraz upravíme na regulárny výraz " vyraz"
endif
vyraz=znak+vyraz ' Pred opravný teťazec pridáme NBSP
kolko=kolko+Vymen(hladaj,vyraz,true,false,false)
endif
f_Nezalomitelne_Spojky=kolko
end function
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