Znovu používame regulárne výrazy
Makro pre vkladanie nezalomiteľných medzier za predložky, ktoré sme si naprogramovali naposledy, má niekoľko nedostatkov. Prvý, ktorý si môžeme všimnúť, je ten, že nevkladá medzery za tie predložky, ktoré sa nachádzajú na začiatku odstavca. Pravdaže, tento nedostatok nemusí byť až taký závažný, pretože na tomto mieste nedochádza k nevhodnému zalomeniu. Na druhej strane, ak zlúčime dva odstavce do jedného, tento problém sa už vyskytnúť môže. Môžeme jednoducho vyriešiť pomocou regulárnych výrazov, napríklad takto:
sub nezalomitelne_Spojky
dim predlozky() as string
dim i, kolko as long
predlozky()=array("A","i","I","k","K","o","O","s","S","u","U","v","V","z","Z")
kolko=0
REM pre všetky predložky
for i=lbound(predlozky()) to ubound(predlozky())
kolko=kolko+vymen(" "+predlozky(i)+" "," "+predlozky(i)+NM,false,false,TRUE)
REM Vyhľadáme predložky aj na začiatku odstavca
kolko=kolko+vymen("^"+predlozky(i)+" ",predlozky(i)+NM,TRUE,false,TRUE)
next i
msgbox("Nahradených "+kolko+" zalomiteľných medzier.",0,"Nezalomiteľné medzery")
end sub
Ale spojky a predložky nebývajú vždy osamotené
Pozrime sa však na druhý problém, ktorý nám pri používaní tohto makra vznikol – v prípade, že máme v texte viacej jednoznakových spojok a predložiek tesne za sebou, nezamení všetky potrebné medzery. Takéto prípady sú pomerne časté a nie je problém sa stretnúť aj s tromi predložkami a spojkami za sebou, napr. v texte „… a i s tým sa musíme vyrovnať …“Je to vlastne preto, lebo konkrétne v uvedenom príklade sa za spojku „a“ vloží nezalomiteľná medzera a preto v ďalšom kroku pri teste spojky „i“ túto už nenájde. V makre totiž hľadáme reťazec zalomiteľná medzera + spojka + zalomiteľná medzera a my tam v skutočnosti máme reťazec nezalomiteľná medzera + spojka + zalomiteľná medzeraNaše makro preto rozšírime o ďalší test:
sub nezalomitelne_Spojky
dim predlozky() as string
dim i, kolko as long
predlozky()=array("A","i","I","k","K","o","O","s","S","u","U","v","V","z","Z")
kolko=0
REM pre všetky predložky
for i=lbound(predlozky()) to ubound(predlozky())
kolko=kolko+vymen(" "+predlozky(i)+" "," "+predlozky(i)+NM,false,false,TRUE)
REM pred predložkou môže byť aj nezalomiteľná medzera
kolko=kolko+vymen(NM+predlozky(i)+" ",NM+predlozky(i)+NM,false,false,TRUE)
REM Vyhľadáme predložky aj na začiatku odstavca
kolko=kolko+vymen("^"+predlozky(i)+" ",predlozky(i)+NM,TRUE,false,TRUE)
next i
msgbox("Nahradených "+kolko+" zalomiteľných medzier.",0,"Nezalomiteľné medzery")
end sub
Toto makro už funguje správne. Ako však vidíme, každú jednoznakovú spojku alebo predložku testujeme až tri krát. Je to tak preto, lebo sme si definovali jednoznakové spojky a predložky ako reťazec medzera + písmeno + medzera Predložky však môžeme definovať aj inak – sú to vlastne jednoznakové slová, t.j. hľadané písmeno sa musí zároveň nachádzať na začiatku slova. Na rad teda znovu prichádzajú regulárne výrazy:
sub nezalomitelne_Spojky
dim predlozky() as string
dim i, kolko as long
predlozky()=array("A","i","I","k","K","o","O","s","S","u","U","v","V","z","Z")
kolko=0
REM pre všetky predložky
for i=lbound(predlozky()) to ubound(predlozky())
REM hľadáme jednoznakové spojky, ktoré sú na začiatku slova
kolko=kolko+vymen("\<"+predlozky(i)+" "," "+predlozky(i)+NM,TRUE,false,TRUE)
next i
msgbox("Nahradených "+kolko+" zalomiteľných medzier.",0,"Nezalomiteľné medzery")
end sub
Toto makro rieši v jednom teste všetky problémy, ktoré sme dnes načrtli, pretože jednoznakové predložky a spojky, ktoré sa nachádzajú na začiatku odstavca sa zároveň nachádzajú aj na začiatku slova. Zároveň sa týmto makrom rieši aj ten problém, keď pred jednoznakovou spojku a predložkou nie je medzera, ale tabelátor.
Na budúce: Pridávame ďalšie funkcie, alebo načo niečo robiť ručne, keď to nemusíme robiť ručne.