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

Július Pastierik  /  29. 06. 2011, 00:00

V už štvrtom dieli typografických makier si ukážeme ďalšie funkcie pre vkladanie nezalomiteľných medzier a funkciu, pomocou ktorej spustíme celkové formátovanie dokumentu.

 

Okrem predložiek a akademických titulov sa vkladajú nezalomiteľné medzery aj v iných prípadoch – napr. medzi čísla a merné jednotky, v skratkách typu „o. i.“ a pod., a práve preto si dnes ukážeme tieto funkcie. Podobne, ako minule, aj teraz budeme pri merných jednotkách predpokladať, že ich máme zadefinované v externom súbore, pretože nie každý používa všetky a pri definícii veľkého množstva týchto jednotiek by sa zbytočne spomaľoval beh makra.

Zároveň si dnes ukážeme poslednú funkciu modulu Formatovanie_funkcie, pomocou ktorej spúšťame vlastné typografické úpravy dokumentu. Týmto, samozrejme, nekončíme seriál o typografických makrách, pretože množstvo funkcií, vlastné definície už spomínaných zoznamov budeme predstavovať postupne v ďalších a ďalších moduloch typografického rozšírenia.

REM Makro pre vkladanie nezalomiteľných medzier medzi čísla a merné jednotky
function f_Nezalomitelne_Jednotky (NM as integer) as long
 dim kolko as long
 dim merne_jednotky as string
 dim znak as string
 
 ' Definícia znaku, za ktorý budeme meniť zalomiteľnú medzeru
 if NM=1 then
  znak=NBSP
 else
  znak=WJ+" "
 endif
 
 kolko=0
 ' Načítanie zoznamu merných jednotiek zo súboru ako regulárny výraz
 merne_jednotky=UpravNaRV(trim(nacitaj_subor("ProfilM_"+Profily_funkcie.JP_aktualny_profil+"_jednotky")))
 if merne_jednotky<>"" then
  kolko=Vymen_hladanim("(\<([:digit:]+)) (("+merne_jednotky+")\>)"," ",znak,true,false,true)
 endif
 f_Nezalomitelne_Jednotky=kolko
end function

REM Makro pre vkladanie nezalomiteľných medzier medzi čísla a text
function f_Nezalomitelne_Cisla (NM as integer) as long
 dim kolko as long
 dim znak as string
 
 ' Definícia znaku, za ktorý budeme meniť zalomiteľnú medzeru
 if NM=1 then
  znak=NBSP
 else
  znak=WJ+" "
 endif
 
 ' Nezalomiteľné medzery do dátumov
 kolko=Vymen_hladanim("[0-9]\. [0-9]"," ",znak,true,false,false)
 kolko=kolko+Vymen_hladanim("[0-9]\. [0-9]"," ",znak,true,false,false)
 ' Jednociferné čísla
 kolko=kolko+Vymen_hladanim("\<([:digit:]) "," ",znak,true,false,false)
 ' Medzi čísla (napr. telefónne)
 kolko=kolko+Vymen_hladanim("[0-9] [0-9]"," ",znak,true,false,false)
 f_Nezalomitelne_Cisla=kolko
end function

REM Makro pre vloženie NBSP v skratkách typu t.č., t.j., a. s., o. i.
function f_skratky as long
 dim kolko as long
 kolko=Vymen_hladanim("\<[:alpha:]\.[:alpha:]\.",".","."+NBSP,true,false,false) ' Vloženie chýbajúceho NBSP
 kolko=kolko+Vymen_hladanim("\<[:alpha:]\. [:alpha:]\.",". ","."+NBSP,true,false,false) ' Oprava nesprávneho SP za NBSP
 f_skratky=kolko
end function

REM Makro pre vkladanie chýbajúcich medzier pri interpunkčných znamienkach
function f_Vloz_Interpunkcia_Medzera (bodka, ostatne as integer) as long
 dim kolko as long
 
 kolko=0
 if bodka=1 then
  kolko=Vloz_hladanim("[:alnum:]\.[:alnum:]{1}"," ",2,true,false,false) ' Vloženie chýbajúcej medzery medzi text bodku a text
  kolko=kolko+Vloz_hladanim("(\?|!)[:alnum:]{1}"," ",1,true,false,false) ' Vloženie chýbajúcej medzery za otáznik a výkričník
  kolko=kolko+Vloz_hladanim("[^0-9]:[:alnum:]{1}"," ",2,true,false,false) ' Vloženie chýbajúcej medzery medzi číslo dvojbodku a text
 endif
 if ostatne=1 then
  kolko=kolko+Vloz_hladanim("(;|…)[:alnum:]{1}"," ",1,true,false,false) ' Vloženie chýbajúcej medzery za bodkočiarku a výpustku
  kolko=kolko+Vloz_hladanim(",[:alpha:]{1}"," ",1,true,false,false ' Vloženie chýbajúcej medzery medzi čiarku a text
  kolko=kolko+Vloz_hladanim("[^0-9],[:alnum:]{1}"," ",2,true,false,false) ' Vloženie chýbajúcej medzery za čiarku, ak to nie je desatinná čiarka
 endif
 f_Vloz_Interpunkcia_Medzera=kolko
end function

REM Makro pre celkové formátovanie dokumentu
sub Formatuj_dokument
 dim kolko as long
 ' Ak nie je vybraný iný profil, nastaví sa defaultný profil
 if Profily_funkcie.JP_aktualny_profil="" then Profily_funkcie.JP_aktualny_profil="Default"
 
 ' Načítame parametre
 Citaj_definiciu_profilu
 Init ' Inicializácia hlavných premenných (Dokument, NBSP, WJ, JazykDokumentu, …)
 
 ' Zámena troch bodiek
 kolko=rozne.f_Tri_bodky(iTri_Bodky_2, iTri_Bodky_3)
 
 ' NBSP pred výpustku a nastavenie zliatkov
 kolko=rozne.f_Rozne_zameny(JP_priznaky_formatovania(16), iFi_2)
 
 ' Špeciálne formátovanie – Vlož Word Joiner za .!? (náhrada .. za .WJ, !! za !WJ, ?? za ?WJ)
 if JP_priznaky_formatovania(19)=1 then kolko=kolko+rozne.Vloz_WJ_za_bodku
 
 ' Poradie úprav pri medzerách je dôležité, aby sa urobili všetky:
 ' Najrpv treba vymazať viacnásobné a nadbytočné medzery
 ' Potom treba vložiť chýbajúce medzery
 ' Nakoniec treba zamieňať za NBSP, lebo niektoré z vložených sa pritom môžu zameniť
 
 ' Odstránenie nadbytočných medzier. Poradie parametrov:
 ' viacnasobne – odtsránenie viacnásobných medzier v strede dokumentu
 ' odseky – odstránanie viacnásobných medzier na začiatku
 ' konce – a na konci odseku
 ' zatvorky – odstránenie medzery medzi zátvorkou a textom
 ' uvodzovky – odstránenie medzery medzi úvodzovkou a textom
 ' znamienka – odstránenie medzery medzi znamienkami a textom
 ' tribodky – odstránenie medzery pred výpustkou
 ' sp_nbsp_zac – náhrada SP za NBSP na začiatku odseku (tieto NBSP sa nemažú)
 kolko=kolko+f_Viacnasobna_Medzera(JP_priznaky_formatovania(5),_
  JP_priznaky_formatovania(6),_
  JP_priznaky_formatovania(7),_
  JP_priznaky_formatovania(8),_
  JP_priznaky_formatovania(9),_
  JP_priznaky_formatovania(10),_
  JP_priznaky_formatovania(11),_
  JP_priznaky_formatovania(17))
  
 ' Odstránenie prázdnych odsekov
 if JP_priznaky_formatovania(12)=1 then kolko=kolko+f_Prazdny_odsek
 
 ' Vloženie chýbajúcej medzery pri znakoch bodky a (alebo) interpunkcie
 kolko=kolko+f_Vloz_Interpunkcia_Medzera(JP_priznaky_formatovania(13), JP_priznaky_formatovania(15))
 
 ' Náhrada SP za NBSP podľa definičných súborov
 if JP_priznaky_formatovania(1)=1 then kolko=kolko+f_Nezalomitelne_Spojky(iNBSP1)
 
 ' Náhrada SP za NBSP v číslach
 if JP_priznaky_formatovania(3)=1 then kolko=kolko+f_Nezalomitelne_Cisla(iNBSP3)
 
 ' Náhrada SP za NBSP medzi číslom a mernou jednotkou
 if JP_priznaky_formatovania(2)=1 then kolko=kolko+f_Nezalomitelne_Jednotky(iNBSP2)
 
 ' Vloženie NBSP do skratiek typu a. s.
 if JP_priznaky_formatovania(14)=1 then kolko=kolko+f_skratky
  
 ' Zámena nesprávnych WJ za NBSP na konci riadku
 if JP_priznaky_formatovania(4)=1 then kolko=kolko+rozne.WJ_za_NBSP_na_konci_riadku
 
 ' Špeciálne formátovanie – Vymaž Word Joiner za .!?
 if JP_priznaky_formatovania(20)=1 then kolko=kolko+rozne.Zrus_WJ_za_bodkou
 
 ' Zámena spojovníkov za typografické spojovníky
 if JP_priznaky_formatovania(18)=1 then kolko=kolko+rozne.Vymen_spojovniky
 
 VypisSpravu(11, trim(str(kolko)))
end sub

Neprehliadnite: