Makrá v OpenOffice.org 6/V. – Čarujeme s koncami odstavcov.

Július Pastierik  /  08. 08. 2007, 00:00

V ďalšom pokračovaní seriálu o programovaní makier v OpenOffice.org si naprogramujeme dve podobné makrá, pomocou ktorých budeme upravovať konce odstavcov.

Pri písaní textu bežne používame viacero odstavcov, t.j. odstavec ukončujeme klávesou „Enter“. V niektorých prípadoch to však nie je žiadúce, pretože potrebujeme, aby sme v dokumente vlastne nemali klasické odstavce, ale aby sa celý dokument správal v skutočnosti ako jediný odstavec (t.j. ako keby sme namiesto klávesy „Enter“ stláčali kombináciu „Shift + Enter“, ktorá predstavuje zalomenie riadku).

Samozrejme, môžete sa opýtať, v akých prípadoch to niekto vôbec môže potrebovať. Odpoveď je veľmi jednoduchá – napr. aj ja pri písaní príspevkov na Inet.sk. Je to tak preto, lebo redakčný systém, pomocou ktorého sa príspevky vkladajú, pri klasickom ukončení odstavca vkladá iné odsadenie, ako pri zalomení riadku. Pri obyčajnom texte by to ešte nebolo na prekážku, ale pri vkladaní zdrojových textov programov by to dopadlo priam katastrofálne, pretože by sa tento nedal prakticky nastaviť ako osobitný štýl (ten totiž aplikuje redakčný systém na označený text, pričom však rešpektuje aj zadané odstavce, takže každý riadok by bol uvedený v osobitnom rámiku).

V makrách pre formátovanie dokumentu sme si o. i. uviedli makro pre odstraňovanie prázdnych odstavcov. A tu sa znovu dostávame k opačnému problému – niekedy potrebujeme mať prázdne odstavce medzi ostatnými odstavcami. Pre príklad takejto potreby nemusíme chodiť ďaleko. Znovu sa vrátime k problematike uverejňovania textov na internete, kde ich jednoducho inak nedokážeme opticky oddeliť (t.j. príslušný redakčný systém musí medzi ne vložiť dvakrát ukončenie riadku – <BR>
<BR>). Pokiaľ však máme text pripravený tak, že odstavce sme si odsadzovali iba nastavením vzdialenosti medzi nimi, je to pre takéto (ale nielen pre takéto) spracovanie naozaj nepostačujúce.

Dosť však bolo teórie, uveďme si teraz vlastné makrá pre upravovanie odstavcov. Na tomto mieste musíme upozorniť, že vzhľadom na možnosti, ktoré nám ponúka aplikačné programovacie rozhranie OpenOffice.org sa tieto zmeny dajú previesť iba v označenom texte a preto, ak ich chceme aplikovať na celý dokument, musíme si ho najprv celý označiť (napr. klávesovou skratkou „Ctrl + A“).

Ešte upozornime, že makrá pre úpravu odstavcov menia aj formát celého označeného textu na formát posledného odstavca. Táto vlastnosť je automatická a programovo by sa riešila naozaj veľmi obtiažne (pokiaľ by sa vôbec dala vyriešiť). Vzhľadom na to sa v makrách vôbec nerieši a preto s ňou musíme počítať ešte pred tým, ako makro spustíme. Z uvedeného dôvodu som do makier pridal aj upozornenie s možnosťou jeho ukončenia bez prevedenia týchto zmien.

Upozornenie na zmenu formátu

Preto, pokiaľ chcete v texte používať rôzne formáty textu, najprv spustite tieto makrá a až následne meňte formáty textu. Pokiaľ vám to nevyhovuje, nezostáva vám nič iné, ako príslušné zmeny previesť manuálne, čo je však pri dlhých dokumentoch časovo naozaj náročná činnosť. Na druhej strane práve táto vlastnosť môže mnohým vyhovovať – jednoduchým spôsobom si práve pomocou tohto makra môžu zmeniť formát celého dokumentu, napr. v prípade, že spracovávali podklady od viacerých autorov resp. s rôznych zdrojov.

Ak náhodou nepotrebujú ich ďalšie vlastnosti (ako je vloženie prázdnych odstavcov či zmenu koncov odstavcov na zalomenie riadku), môžu v ďalších krokoch tieto zmeny vrátiť späť. Na to môže slúžiť napr. formátovanie dokumentu, kde nájdeme možnosť odstránenia prázdnych odstavcov, alebo v prípade zalomenia riadku použiť náhradu reťazca „\n“ za reťazec „\n“ s využitím regulárnych výrazov (v budúcom dieli si na to uvedieme krátke makro).

Výpis počtu zmien

REM Makro pre zámenu odstavcov za line break (odstráni znaky CR z textu)
REM Makro funguje iba v označenom (vybranom) texte
Sub Zrusenie_Odstavcov
 ' Na konci odstavcov je kombinácia znakov CR+LF,
 ' na konci riadkov (ručné zalomenie - shift+enter) iba znak LF.
 ' Preto zrušenie odstavcov spočíva vlastne v odstránení znakov CR.

 dim dokument, vyber as object
 dim vyber_ktory, dlzka_riadku, i as long

 dim pocet_CR as long
 dim riadok as string
 dim znak, CR, slovo as string
 dim zamena as boolean

 pocet_CR=0
 CR=chr(&H0D)

 ' Na začiatku upozorníme, že makro mení formát odstavcov
 slovo="Pozor, funkcia nastaví formátovanie odstavcov podľa posledného z nich!"+CR+CR
 slovo=slovo+" Naozaj ju chcete spustiť?"+CR+CR
 ooo=msgbox(slovo,4,"Zrušenie odstavcov") ' Dialógové okno s tlačidlami „Áno/Nie“

 if ooo=6 then
  ' Stlačené tlačidlo "ÁNO"

  Dokument=ThisComponent
  vyber=dokument.getCurrentSelection() ' aktuálny výber
  vyber_pocet=vyber.getCount() ' Počet výberov

  for vyber_ktory=0 to vyber_pocet-1
   riadok = vyber.getByIndex(vyber_ktory).getString() ' reťazec z výberu
   dlzka_riadku=len(riadok)
   zamena=false

   rem pre všetky znaky z príslušného výberu
   for i=1 to dlzka_riadku
    znak=mid(riadok,i,1) ' spracovávame i-ty znak z výberu
    if instr(CR,znak)<>0 then
     ' znak je CR, odstránime ho a spočítame počet odstránených odstavcov
     mid(riadok,i,1,"") ' Nájdený znak CR nahradíme prázdnym znakom
     dlzka_riadku=len(riadok)
     pocet_CR=pocet_CR+1 ' Pripočítame práve odstránený znak CR, t.j. odstránený odstavec
     zamena=true ' Indikácia, že sme odstránili znak CR
    endif
   next i
   if zamena then
    ' Ak sme našli znak CR (t.j. koniec odstavca), zameníme starý text za nový, čím odstránime odstavec
    vyber.getByIndex(vyber_ktory).setString(riadok)
   endif
  next vyber_ktory
 endif
 ' Na konci si vypíšeme počet odstránených odstavcov
 msgbox("Zrušených "+pocet_CR+" odstavcov",0,"Rušenie odstavcov")

End Sub

Upozornenie na zmenu formátovania

REM Makro pre pridanie prázdnych odstavcov za každý iný odstavec
REM Makro funguje iba v označenom (vybranom) texte
Sub 
Zdvojnasobenie_Odstavcov
 ' Na konci odstavcov je kombinácia znakov CR+LF,
 ' preto za znakom LF pridáme ďalšiu kombináciu CR+LF.
 dim dokument, vyber as object
 dim vyber_ktory, dlzka_riadku, i as long

 dim pocet_CR as long
 dim riadok as string
 dim znak, CR, LF, slovo as string
 dim zamena as boolean

 pocet_CR=0
 CR=chr(&H0D)
 LF=chr(&H0A)

 ' Na začiatku upozorníme, že makro mení formát odstavcov
 slovo="Pozor, funkcia nastaví formátovanie odstavcov podľa posledného z nich!"+CR+CR
 slovo=slovo+" Naozaj ju chcete spustiť?"+CR+CR
 ooo=msgbox(slovo,4,"Zdvojnásobenie odstavcov") ' Dialógové okno s tlačidlami „Áno/Nie“

 if ooo=6 then
  ' Stlačené tlačidlo "ÁNO"

  Dokument=ThisComponent
  vyber=dokument.getCurrentSelection() ' aktuálny vyber
  vyber_pocet=vyber.getCount() ' Počet výberov

  for vyber_ktory=0 to vyber_pocet-1
   riadok = vyber.getByIndex(vyber_ktory).getString() ' reťazec z výberu
   dlzka_riadku=len(riadok)
   zamena=false

   rem pre všetky znaky z výberu
   for i=1 to dlzka_riadku
    znak=mid(riadok,i,1) ' spracovávame i-ty znak z výberu
    if instr(LF,znak)<>0 then
     ' znak je LF, nahradíme ho LF+CR+LF čím pridáme odstavec a spočítame počet zámen
     mid(riadok,i,1,LF+CR+LF)
     ' Posunieme index o dva vložené znaky (CR+LF)
     i=i+2
     dlzka_riadku=len(riadok)
     pocet_CR=pocet_CR+1 ' Počet vložených prázdnych odstavcov
     zamena=true ' Indikácia vloženia prázdneho odstavca
    endif
   next i
   if zamena then
    ' Do textu sme vložili prázdny odstavec, preto nahradíme starý text za nový, čím vlastne prevedieme vlastnú úpravu
    vyber.getByIndex(vyber_ktory).setString(riadok)
   endif
  next vyber_ktory
 endif
 ' Na konci si vypíšeme počet vložených prázdnych odstavcov
 msgbox("Pridaných "+pocet_CR+" prázdnych odstavcov",0,"Pridávanie odstavcov")

End Sub

Výpis počtu vložených odstavcovNa budúce: Rôzne náhrady textu, alebo nie sú tri bodky ako tri bodky.

Neprehliadnite: