Makrá v OpenOffice.org 01/2008

Július Pastierik  /  04. 04. 2008, 00:00

Aj v roku 2008 budeme pokračovať v seriáli o makrách pre OpenOffice.org. Tento seriál však nebude vychádzať tak pravidelne, ako doteraz, ale jeho diely budú vznikať podľa potreby používateľov. V prvom dieli sa znovu vrátime k formátovaniu dokumentov, ktoré rozšírime o novú funkciu.

 

V minulom roku sme ukončili pomerne rozsiahlu časť makier, ktoré sa venovali formátovaniu dokumentov. Okrem iného sme urobili makrá, ktoré dokázali vkladať do textu nezalomiteľné medzery za jednoznakové preložky a spojky, medzi akademické tituly a meno, medzi číslice a podobne.

Na základe požiadavok niektorých používateľov sme urobili aj verziu, pomocou ktorej sme dokázali vkladať tzv. pružné nezalomiteľné medzery. V podstate išlo o to, že sme pred obyčajnú medzeru vložili znak „Word Joiner“. Tento znak však nie vždy funguje tak, ako by mal – jednoducho niekedy oddelí predložku či spojku a následný text na dva riadky. Toto správanie je záhadou, ale je to tak.

Našťastie, aj na toto existuje riešenie, ktoré si dnes ukážeme. Spočíva v tom, že vyhľadáme, či nám na konci riadku „náhodou“ nezostal „trčať“ znak „Word Joiner“ aj s medzerou a ak áno, tak ho zameníme za obyčajnú nezalomiteľnú medzeru (znak NBSP).

Pretože musíme hľadať konce riadkov, nezostáva nám nič iné, ako použiť viditeľný kurzor, kde je k dispozícii funkcia skočenia na koniec riadku. Pretože budeme prechádzať textom, bude pri vlastnej oprave pred našimi očami celý text rolovať. Pozor, pri dlhšom texte ma z toho trochu rozbolela hlava, preto odporúčam, aby ste priebeh sledovali iba občas.

Ako obvykle, vlastné makro je okomentované a preto nebudeme venovať osobitnú pozornosť príkazom, ktoré sú tam napísané.

Nesprávne zalomený text pomocou WJ

REM Procedúra hľadá nesprávne zalomenia WJ na konci riadku
REM a nahradí ich znakom NBSP
function WJ_za_NBSP_na_konci_riadku as long

 dim NBSP, WJ as string
 dim Kurzor, Povodny as object
 dim Koniec as boolean
 dim pom as string
 dim kolko as long
 
 kolko=0
 
 NBSP=chr$(&HA0)
 WJ=chr$(&H2060)

 kurzor= ThisComponent.currentcontroller.getViewCursor() ' viditeľný kurzor
 Povodny=kurzor.getstart() ' Pôvodná poloha kurzoru – aby sme sa mohli vrátiť po prerolovaní celého textu
 kurzor.collapsetostart() ' ak je niečo označené, tak zrušiť výber, aby fungovala funkcia "skoč na koniec riadku"
 kurzor.gotoStart(false) ' Skočíme na začiatok dokumentu

 do ' Kým neprejdeme celý text, tak
  ' Označíme si tri znaky na konci riadku a ak posledné dva sú WJ+medzera, tak je nesprávne zalomenie
  Kurzor.gotoEndOfLine(false) ' skočíme na koniec riadku
  Kurzor.goLeft(3, false)
  Kurzor.goRight(3, true) ' zvýraznenie posledných troch znakov
  if right(Kurzor.string,2) = WJ+" " then
   ' Je to nesprávne zalomenie WJ+medzera
   pom=Kurzor.getstring() ' z posledných troch znakov (písmeno+WJ+medzera)
   pom=left(pom,1)+NBSP ' písmeno+NBSP ' zoberieme iba prvé písmeno a pridáme za to NBSP
   Kurzor.setstring(pom) ' Vlastná zámena
   kolko=kolko+1 ' počet zámen
  endif
  Kurzor.collapseToEnd() ' Zrušíme označený vymenený text
  Kurzor.gotoEndOfLine(false) ' Skočíme na koniec riadku
  Koniec=not(kurzor.goRight(1,false)) ' a posunieme sa o jeden znak ďalej, ak to ide
 loop until Koniec ' Skončíme, ak sa už nemôžeme posunúť
 kurzor.gotoRange(Povodny,false) ' Vrátime sa na pôvodnú polohu
 WJ_za_NBSP_na_konci_riadku=kolko
end function

Oprava zalomenia pomocou NBSP

Pravdaže, v tejto súvislosti vzniká niekedy potreba drobných makier, pomocou ktorých dokážeme vzájomne konvertovať medzery medzi sebou. V nasledujúcom budeme predpokladať, že makrá, ktoré sme uviedli v minulom roku čiastočne používate – konkrétne funkciu „Vymen“ v module „ Formatovanie_funkcie“.

Text s obyčajnými medzerami

REM Makro pre nahradenie nezalomiteľných medzier zalomiteľnými
function f_Zalomitelna_Medzera as long
 Formatovanie_funkcie.init
 f_Zalomitelna_Medzera=Formatovanie_funkcie.Vymen(chr$(&HA0)," ",false,false,false)+_
  Formatovanie_funkcie.Vymen(chr$(&H2060),"",false,false,false)
end function

REM Makro pre nahradenie zalomiteľných medzier nezalomiteľnými NBSP
function f_Nezalomitelna_Medzera_NBSP as long
 Formatovanie_funkcie.init
 f_Nezalomitelna_Medzera_NBSP=Formatovanie_funkcie.Vymen(" ",chr$(&HA0),false,false,false)
end function

REM Makro pre nahradenie zalomiteľných medzier nezalomiteľnými WJ
function f_Nezalomitelna_Medzera_WJ as long
 Formatovanie_funkcie.init
 f_Nezalomitelna_Medzera_WJ=Formatovanie_funkcie.Vymen(" ",chr$(&H2060)+" ",false,false,false)
end function

REM Makro pre zámenu NBSP za WJ
function f_NBSP_za_WJ as long
 Formatovanie_funkcie.init
 f_NBSP_za_WJ=Formatovanie_funkcie.Vymen(chr$(&HA0),chr$(&H2060)+" ",false,false,false)
end function

REM Makro pre zámenu WJ za NBSP
function f_WJ_za_NBSP as long
 Formatovanie_funkcie.init
 f_WJ_za_NBSP=Formatovanie_funkcie.Vymen(chr$(&H2060)+" ",chr$(&HA0),false,false,false)
end function

Text po úprave pre

A úplne na záver si ako bonus uveďme jedno krátke makro, pomocou ktorého dokážeme rýchlo odstrániť HTML značky. Pozor, nejedná sa o prevod na text, ale iba o odstránenie príkazov, ktoré sú uzatvorené medzi znakmi „<“ a „>“. V mnohých prípadoch je však takýto prevod postačujúci a nie je problém, aby ste si, povedzme ako domácu úlohu, naprogramovali prevod kódov znakov na vlastné znaky.

HTML kódovaný text

REM Makro, ktoré vymaže príkazy HTML uzatvorené medzi <>
function f_Zrus_HTML as long
 Formatovanie_funkcie.init
 ' Pri hľadaní hľadá všetko, čo je uzatvorené v <>, ale vo vnútri nesmú byť tieto znaky,
 ' lebo by označil aj text, ktorý je napr. pri internetových odkazoch.
 f_Zrus_HTML=Formatovanie_funkcie.Vymen("<[^<^>]*>","",true,false,false,false)
end function

Odstránené HTML príkazy

Na záver ešte poprosím čitateľov, aby mi zasielali mailom veci, ktoré by prípadne chceli vyriešiť pomocou makier. Vopred všetkým ďakujem.