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

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

V druhom dieli typografických makier si ukážeme jednu jedinú funkciu – funkciu pre odstraňovanie viacnásobných a nadbytočných medzier. Prečo iba jednu, to uvidíte z rozsahu možností, ktoré obsahuje.

 

Odstránenie viacnásobných a nadbytočných medzier je základnou požiadavkou typografických úprav. Ide pri nich napr. o to, že na začiatku odseku sa odsadenie, na rozdiel od písacieho stroja, nerobí medzerami. Ďalej sa nemajú vyskytovať medzery medzi zátvorkou a textom, úvodzovkami a textom a pod. Tieto všetky funkcie (podľa nastavených parametrov) rieši nasledujúca funkcia f_Viacnasobna_Medzera:

REM Makro pre odstraňovanie viacnásobných medzier
function f_Viacnasobna_Medzera (viacnasobne, odseky, konce, zatvorky, uvodzovky, znamienka, tribodky, sp_nbsp_zac as integer) as long
 ' Funkcia odstráni medzery podľa parametrov (ak sa =1, tak platia):
 ' 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žú)
 
 dim kolko as Long
 dim hladany_retazec as string
 kolko=0

 if sp_nbsp_zac=1 then ' Ak na začiatku odseku chceme zmeniť SP za nemazané NBSP
  kolko=kolko+Vymen_All_hladanim("^ *"," ",NBSP,true,false,false) ' Zámena všetkých SP na začiatku odseku za NBSP
 endif

 if viacnasobne=1 then
  kolko=kolko+Vymen(" +"," ",TRUE,false,false) ' Vymazanie viacnásobných SP
  kolko=kolko+Vymen("\t\t+",TAB,TRUE,false,false) ' Vymazanie viacnásobných TAB
  if sp_nbsp_zac=1 then ' Ak sú na začiatku odseku nemazané NBSP
   kolko=kolko+Vymen_All_hladanim("(^[:space:]| |\t)+"+NBSP+"+",NBSP+NBSP,NBSP,true,false,false) ' Vymazanie viacnásobných NBSP vo vnútri textu
  else
   kolko=kolko+Vymen_All_hladanim(NBSP+NBSP+"+",NBSP+NBSP,NBSP,true,false,false) ' Vymazanie viacnásobných NBSP
  endif
  kolko=kolko+Vymen(" "+NBSP+" |"+NBSP+" | "+NBSP,NBSP,TRUE,false,false) ' Ak je SP+NBSP+SP, NBSP+SP alebo SP+NBSP, zameníme za NBSP
  kolko=kolko+Vymen(" \t |\t | \t","\t",TRUE,false,false) ' Ak je SP+TAB+SP, TAB+SP, SP+TAB, zameníme za TAB
  kolko=kolko+Vymen(NBSP+"\t"+NBSP+"|\t"+NBSP+"|"+NBSP+"\t",TAB,TRUE,false,false) ' Ak je NBSP+TAB+NBSP, NBSP+TAB, TAB+NBSP, zameníme za TAB
  'Pretože mohli byť absoútne rôzne kombinácie, preventívne ešte raz vymažeme viacnásobné NBSP a TAB
  kolko=kolko+Vymen("\t\t+",TAB,TRUE,false,false) ' Vymazanie viacnásobných TAB
  if sp_nbsp_zac=1 then ' Ak sú na začiatku odseku nemazané NBSP
   kolko=kolko+Vymen_All_hladanim("(^[:space:]| |\t)+"+NBSP+"+",NBSP+NBSP,NBSP,true,false,false) ' Vymazanie viacnásobných NBSP vo vnútri textu
  else
   kolko=kolko+Vymen_All_hladanim(NBSP+"+",NBSP+NBSP,NBSP,true,false,false) ' Vymazanie viacnásobných NBSP
  endif
 endif
 
 if odseky=1 then
  if sp_nbsp_zac=1 then
   kolko=kolko+Vymen("^ *","",TRUE,false,false) ' Vymazanie viacnásobných SP na začiatku odseku
  else
   kolko=kolko+Vymen("^[:space:]*","",TRUE,false,false) ' Vymazanie viacnásobných SP a NBSP na začiatku odseku
  endif
  kolko=kolko+Vymen("^\t*","",TRUE,false,false) ' Vymazanie viacnásobných TAB na začiatku odseku
 endif
 
 if konce=1 then
  kolko=kolko+Vymen("[:space:]*$","",TRUE,false,false) ' Vymazanie viacnásobných SP a NBSP na konci odseku
  kolko=kolko+Vymen("\t*$","",TRUE,false,false) ' Vymazanie viacnásobných TAB na začiatku odseku
 endif
 
 ' Makro naprogramujeme tak, aby čo nejmenejkrát prechádzalo dokumentom
 ' T.j. najprv si pripravíme kompletný regulárny výraz a až potom budeme prevádzať výmeny
 hladany_retazec=""
 if uvodzovky=1 then
  ' Nastavíme si regulárny výraz pre ľavé úvodzovky
  hladany_retazec="(„|«|‚"
 endif
 if zatvorky=1 then
  ' Nastavíme si regulárny výraz pre ľavé zátvorky
  if hladany_retazec<>"" then
   ' Ak už máme úvodzovky, musíme pridať znak "alebo"
   hladany_retazec=hladany_retazec+"|"
  else
   ' Ešte nemáme nič, musíme zadať začiatok regulárneho výrazu
   hladany_retazec="("
  endif
  hladany_retazec=hladany_retazec+"\(|\[|{"
 endif
 if hladany_retazec<>"" then
  ' Ešte ukončíme regulárny výraz
  hladany_retazec=hladany_retazec+")"
  ' Ak máme nastavený výraz pre zátvorky alebo úvodzovky, tak vymažeme nadbytočné medzery
  ' Za nadbytočné medzery považujeme SP, NBSP a TAB
  kolko=kolko+Vymen_hladanim(hladany_retazec+" "," ","",true,false,false)
  kolko=kolko+Vymen_hladanim(hladany_retazec+NBSP,NBSP,"",true,false,false)
  kolko=kolko+Vymen_hladanim(hladany_retazec+TAB,TAB,"",true,false,false)
 endif
 
 hladany_retazec=""
 if uvodzovky=1 then
  ' Nastavíme si regulárny výraz pre pravé úvodzovky
  hladany_retazec="(“|»|‘"
 endif
 if zatvorky=1 then
  ' Nastavíme si regulárny výraz pre pravé zátvorky
  if hladany_retazec<>"" then
   ' Ak už máme úvodzovky, musíme pridať znak "alebo"
   hladany_retazec=hladany_retazec+"|"
  else
   ' Ešte nemáme nič, musíme zadať začiatok regulárneho výrazu
   hladany_retazec="("
  endif
  hladany_retazec=hladany_retazec+"\)|\]|}"
 endif
 if znamienka=1 then
  ' Nastavíme si regulárny výraz pre interpunkčné znamienka
  if hladany_retazec<>"" then
   ' Ak už máme úvodzovky alebo zátvorky, musíme pridať znak "alebo"
   hladany_retazec=hladany_retazec+"|"
  else
   ' Ešte nemáme nič, musíme zadať začiatok regulárneho výrazu
   hladany_retazec="("
  endif
  hladany_retazec=hladany_retazec+"\,|!|\?|;"
 endif
 if tribodky=1 then
  ' Nastavíme si regulárny výraz pre tri bodky
  if hladany_retazec<>"" then
   ' Ak už máme úvodzovky, zátvorky alebo znamienka, musíme pridať znak "alebo"
   hladany_retazec=hladany_retazec+"|"
  else
   ' Ešte nemáme nič, musíme zadať začiatok regulárneho výrazu
   hladany_retazec="("
  endif
  hladany_retazec=hladany_retazec+"…" ' trojbodka
 endif
 if hladany_retazec<>"" then
  ' Ešte ukončíme regulárny výraz
  hladany_retazec=hladany_retazec+")"
  ' Ak máme nastavený výraz pre zátvorky alebo úvodzovky, tak vymažeme nadbytočné medzery
  ' Za nadbytočné medzery považujeme obyčajné medzery, NBSP a tabelátory
  kolko=kolko+Vymen_hladanim(" "+hladany_retazec," ","",true,false,false)
  kolko=kolko+Vymen_hladanim(NBSP+hladany_retazec,NBSP,"",true,false,false)
  kolko=kolko+Vymen_hladanim(TAB+hladany_retazec,TAB,"",true,false,false)
 endif
 if znamienka=1 then
  kolko=kolko+Vymen_hladanim("([:alpha:]) (:|\.)"," ","",true,false,false) ' Vymazanie SP medzi písmenom a dvojbodkou a bodkou.
  kolko=kolko+Vymen_hladanim("([:alpha:])"+NBSP+"(:|\.)",NBSP,"",true,false,false) ' Vymazanie NBSP medzi písmenom a dvojbodkou a bodkou.
  kolko=kolko+Vymen_hladanim("([:alpha:])\t(:|\.)",TAB,"",true,false,false) ' Vymazanie TAB medzi písmenom a dvojbodkou a bodkou.
  kolko=kolko+Vymen_hladanim("([:digit:]) \.([:space:]|\t)([:alpha:])"," ","",true,false,false) ' Vymazanie prvej SP medzi číslom bodkou medzerou a písmenom.
  kolko=kolko+Vymen_hladanim("([:digit:])"+NBSP+"\.([:space:]|"+TAB+")([:alpha:])",NBSP,"",true,false,false) ' Vymazanie prvej NBSP medzi číslom bodkou medzerou a písmenom.
  kolko=kolko+Vymen_hladanim("([:digit:])"+TAB+"\.([:space:]|"+TAB+")([:alpha:])",TAB,"",true,false,false) ' Vymazanie prvého TAB medzi číslom bodkou medzerou a písmenom.
 Endif
 f_Viacnasobna_Medzera=kolko
end function

Neprehliadnite: