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

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

Neprehliadnite: