V minulom dieli sme si spomínali, že v normách pre úpravu písomností sa spomína, že okrem niekoľkých výnimiek sa za interpunkčné znamienka vkladá medzera. A práve na tento problém sa teraz zameriame. Aby sme ho mohli vyriešiť, znovu si pripomeňme, že za interpunkčné znamienka sa vkladá medzera okrem tých prípadov, keď ich nasleduje viac za sebou, medzera sa nevkladá ani za bodku oddeľujúcu rády v číslach, desatinnú čiarku a za dvojbodku v časových údajoch. Z hľadiska programovania to znamená, že medzeru budeme vkladať za diakritické znamienka vtedy, ak za nimi bezprostredne nasleduje písmeno a v prípade diakritických znamienok otáznika, výkričníka a bodkočiarky aj vtedy, ak za nimi bezprostredne nasleduje aj číslo.
Na rozdiel od predchádzajúcich makier nebudeme teraz nič mazať, ale iba vkladať. Preto si najprv musíme naprogramovať funkciu pre vloženie reťazca do nájdeného textu:
function Vloz_hladanim(V_Com, Co as string, Kde as long, Regularne, Cele_slova, Velke_pismena as Boolean)
REM funkcia vyhľadá reťazec V_Com a na pozíciu Kde do neho vloží reťazec Co
dim nasiel as object
dim kolko, i, j as long
dim pom as string
Hladaj.searchString=V_Com
Hladaj.SearchRegularExpression=Regularne
Hladaj.SearchWords=Cele_slova
Hladaj.SearchCaseSensitive=Velke_pismena
kolko=0
REM úprava parametra Kde (pozícia 0 - vloženie pred reťazec sa musí upraviť na 1)
i=kde+1
REM objekt s nájdeným reťazcom priradíme do premennej Nasiel
nasiel = Dokument.findFirst(Hladaj)
rem opakuj, pokiaľ tento objekt obsahuje nejaké údaje
Do While NOT isNull(nasiel)
rem ak sa našiel reťazec
if len(nasiel.String)>0 then
REM veľkosť zvyšku pravej strany pôvodného reťazca
j=len(nasiel.String)-i+1
REM do výsledku priradíme ľavú časť pôvodného reťazca plus vkladaný reťazec
pom=left(nasiel.String,i-1)+Co
REM ak je za hľadaným reťazcom ešte nejaký zvyšok pôvodného reťazca
if j>0 then
REM do výsledku priradíme aj tento zvyšok
pom=pom+right(nasiel.String,j)
end if
nasiel.String=pom
kolko=kolko+1
end if
rem vyhľadáme ďalší reťazec
nasiel = Dokument.findNext( nasiel.End, Hladaj)
Loop
Vloz_hladanim=kolko
end function
S využitím tejto funkcie môžeme potom naprogramovať makro pre vkladanie medzier napríklad takto:
sub Vloz_interpunkcia_medzera
dim kolko as long
REM a týchto šesť interpunkčných znamienok: , . ! ? ; :
REM Znaky , . ? musíme zadať pomocou uvádzajúceho znaku \
REM Za znakmi ? ! ; hľadáme ľubovoľný alfanumerický znak
kolko=Vloz_hladanim("(\?|!|;)[:alnum:]{1}"," ",1,true,false,false)
REM Za znakmi , . : hľadáme ľubovoľné písmeno
kolko=kolko+Vloz_hladanim("(\,|\.|:)[:alpha:]{1}"," ",1,true,false,false)
msgbox("Vložených "+kolko+" medzier.",0,"Vložené medzery")
end sub
Toto makro však nevkladá medzeru medzi bodku (čiarku, dvojbodku) a číslo v tom prípade, ak sa pred ním nachádza iný znak ako číslo (napr. „… sa zúčastnili všetci.12 ľudí potom …“). Komu to nevyhovuje, musí si makro príslušne upraviť:
sub Vloz_interpunkcia_medzera
dim kolko as long
REM a týchto šesť interpunkčných znamienok: , . ! ? ; :
REM Znaky , . ? musíme zadať pomocou uvádzajúceho znaku \
REM Za znakmi ? ! ; hľadáme ľubovoľný alfanumerický znak
kolko=Vloz_hladanim("(\?|!|;)[:alnum:]{1}"," ",1,true,false,false)
REM Za znakmi , . : hľadáme ľubovoľné písmeno
kolko=kolko+Vloz_hladanim("(\,|\.|:)[:alpha:]{1}"," ",1,true,false,false)
REM Ak pred znakmi , . : nie je číslica a za nimi je číslica, vložíme medzeru
kolko=kolko+Vloz_hladanim("[^0-9](\,|\.|:)[:digit:]{1}"," ",2,true,false,false)
msgbox("Vložených "+kolko+" medzier.",0,"Vložené medzery")
end sub
Teraz však prehľadávame dokument v prípade znakov bodky, čiarky a dvojbodky dvakrát. Toto sa dá vyriešiť napríklad takto:
sub Vloz_interpunkcia_medzera
dim kolko as long
REM a týchto šesť interpunkčných znamienok: , . ! ? ; :
REM Znaky , . ? musíme zadať pomocou uvádzajúceho znaku \
REM Za znakmi ? ! ; hľadáme ľubovoľný alfanumerický znak
kolko=Vloz_hladanim("(\?|!|;)[:alnum:]{1}"," ",1,true,false,false)
REM Ak pred znakmi , . : nie je číslica a za nimi je ľubovoľný alfanumerický znak
kolko=kolko+Vloz_hladanim("[^0-9](\,|\.|:)[:alnum:]{1}"," ",2,true,false,false)
msgbox("Vložených "+kolko+" medzier.",0,"Vložené medzery")
end sub
Na budúce: Koľko rôznych funkcií sme už naprogramovali, alebo kto to má neustále spúšťať osobitne.