Makrá v OpenOffice.org 5/XIII. – Formátovanie dokumentu 5

Július Pastierik  /  21. 03. 2007, 00:00

V už trinástom dieli piatej časti seriálu o programovaní makier v OpenOffice.org sa znovu vrátime k on-line vkladaniu nezalomiteľných medzier za jednoznakové predložky a spojky.

V rámci formátovania dokumentu má osobitné postavenie vkladanie nezalomiteľných medzier za jednoznakové predložky a spojky, pretože pri týchto máme možnosť ich vkladania priamo počas písania textu, a, pravdaže, aj počas celkového formátovania dokumentu.

Čiastočne sa teda musíme vrátiť k štvrtej časti tohto seriálu, kde sme sa zmieňovanou problematikou zaoberali. Pravdaže, nemá zmysel, aby sme znovu rozoberali všetky podrobnosti, ktoré sme vtedy uviedli a preto sa hneď budeme venovať príslušným makrám.

V zozname modulov si zadefinujeme modul – „Nezalomitelna_predlozky_funkcie“, kde si naprogramujeme príslušné funkcie pre vkladanie nezalomiteľných medzier priamo počas písania textu. Pravdaže, v príslušných funkciách už budeme využívať nastavenia, ktoré sme si nastavili a vybrali podľa nami definovaných používateľských profilov.

Aby sme sa v nových nastaveniach (príznakoch) lepšie orientovali, ešte raz si v krátkosti zopakujme ich význam aj s príslušnými hodnotami. Príznaky sú definované v globálnej premennej „Priznaky_formatovania“, ktorú sme zadefinovali v module „Profily_funkcie“:

Priznaky_formatovania(1) – príznak (=1) vkladania nezalomiteľných medzier za jednoznakovými predložkami a spojkami.
Priznaky_formatovania(2) – znak, ktorý sa vkladá za jednoznakové predložky a spojky (NBSP=1, WJ=2).
Priznaky_formatovania(3) – príznak, či sa má vkladať nezalomiteľná medzera aj za predložku „a“ (=1).
Priznaky_formatovania(4) – príznak, či sa majú nezalomiteľné medzery vkladať za jednoznakové spojky (ak je to povolené) priamo (ON-line) počas písania textu (=1).
Priznaky_formatovania(5) – príznak (=1) vkladania nezalomiteľných medzier za akademické tituly.
Priznaky_formatovania(6) – znak, ktorý sa vkladá za akademické tituly (NBSP=1, WJ=2).
Priznaky_formatovania(7) – príznak (=1) vkladania nezalomiteľných medzier za číslice a dátumy.
Priznaky_formatovania(8) – znak, ktorý sa vkladá za číslice a dátumy (NBSP=1, WJ=2).
Priznaky_formatovania(9) – príznak (=1), či sa majú odstrániť viacnásobné medzery.
Priznaky_formatovania(10) – príznak (=1), či sa majú odstrániť viacnásobné medzery na začiatku a konci odstavcov.
Priznaky_formatovania(11) – príznak (=1), či sa majú odstrániť medzery medzi zátvorkami a textom.
Priznaky_formatovania(12) – príznak (=1), či sa majú odstrániť medzery medzi úvodzovkami a textom.
Priznaky_formatovania(13) – príznak (=1), či sa majú odstrániť medzery medzi interpunkčnými znamienkami a textom.
Priznaky_formatovania(14) – príznak (=1), či sa majú odstrániť prázdne odstavce.
Priznaky_formatovania(15) – príznak (=1), či sa má vložiť medzera medzi bodku a text.
Priznaky_formatovania(16) – príznak (=1), či sa má vložiť medzera medzi dvojbodku a text.

Ale teraz sa už venujme vlastným makrám pre vkladanie nezalomiteľných medzier za jednoznakové spojky a predložky priamo počas ich písania:

global ObsluhaDokumentu, ObsluhaKlavesnice as object
global PosledneSlovo, OddelovaceSlov as string
global Obsluhovat_Klavesnicu as boolean

function JednoznakovePredlozky as string
 ' Pretože počas písania môžeme zmeniť nastavenie profilu,
 ' definícia zoznamu predložiek je definovaná ako funkcia
 JednoznakovePredlozky="AiIkKoOsSuUvVzZ"
 if Profily_funkcie.Priznaky_formatovania(3)=1 then
  JednoznakovePredlozky="a"+JednoznakovePredlozky
 endif
end function

sub SpustiObsluhuKlavesnice
 on error goto next
 ' Obsluhu klávesnice spustíme iba vtedy, ak vôbec povolili zámenu predložiek
 ' a zároveň chceme túto zámenu robiť ON-line
 Obsluhovat_Klavesnicu=(Profily_funkcie.Priznaky_formatovania(1)=1) and (Profily_funkcie.Priznaky_formatovania(4)=1)
 PosledneSlovo = ""
 ' medzera, nezalomiteľná medzera, tabelátor, CR, LF
 OddelovaceSlov=" "+chr(&HA0)+chr(&H09)+chr(&H0A)+chr(&H0D)
 ' pomlčka, lomítko, bodka, čiarka, výkričník, otáznik, bodkočiarka, trojbodka
 OddelovaceSlov=OddelovaceSlov+"-/.,!?;…"
 ' zátvorky
 OddelovaceSlov=OddelovaceSlov+"()[]{}"
 if ThisComponent.supportsService("com.sun.star.text.TextDocument") then
  ' Sme v textovom dokumente, kde chceme nahrádzať medzery
  ObsluhaDokumentu = ThisComponent.getCurrentController
  ObsluhaKlavesnice = createUnoListener("Klavesnica_","com.sun.star.awt.XKeyHandler")
  ObsluhaDokumentu.addKeyHandler(ObsluhaKlavesnice)
 endif
end sub

sub UkonciObsluhuKlavesnice
 on error goto next
 if ThisComponent.supportsService("com.sun.star.text.TextDocument") then
  ' Sme v textovom dokumente a chceme ukončiť obsluhu klávesnice
   ObsluhaDokumentu.removeKeyHandler(ObsluhaKlavesnice)
   PosledneSlovo = ""
 endif
end sub

function VlozZnak(Retazec as string)
 ' Na aktuálnu pozíciu v dokumente vložíme reťazec
 dim ViditelnyKurzor, AktualnyText, AktualnyKurzor as object

 ViditelnyKurzor = ThisComponent.getCurrentController().getViewCursor()
 AktualnyText = ThisComponent.getText()
 AktualnyKurzor = AktualnyText.createTextCursorByRange(ViditelnyKurzor.getStart())
 AktualnyText.insertString(AktualnyKurzor.getStart(), Retazec, true)
end function

function Klavesnica_KeyPressed(StlacenaKlavesa) as boolean
' Obsluha stlačenej klávesy
 dim Obsluzena as boolean
 'Predpokláme, že nebudeme vkladať nezalomiteľnú medzeru
 Obsluzena=False
 if instr(OddelovaceSlov, StlacenaKlavesa.KeyChar)<>0 then
  ' Došli sme na koniec slova
  if Obsluhovat_Klavesnicu then
   ' Ak máme vôbec meniť medzery za nezalomiteľné
   if ZistiPredlozku and (StlacenaKlavesa.KeyChar=" ") then
    ' Je to predložka, ktorá končí zalomiteľnou medzerou - túto nahradíme
    if Profily_funkcie.Priznaky_formatovania(2)=1 then
     VlozZnak(chr$(&HA0)) ' No Break Space (NBSP)
     ' Sami sme vložili medzeru - obslúžili sme stlačenú klávesu
     Obsluzena=true
    else
     VlozZnak(chr$(&H2060)) ' Word Joiner (WJ)
     ' V tomto prípade sa musí ešte vložiť aj zadaná medzera a preto sme neobslúžili stlačenú klávesu
    endif
   endif
  endif
  PosledneSlovo=""
 else
  ' Ešte musíme otestovať riadiace znaky, ktoré nebudeme sledovať v zadávanom slove
  select case StlacenaKlavesa.KeyChar
   case chr$(&H00) to chr$(&H07)
    PosledneSlovo=""
   case chr$(&H08) ' BS
    if len(PosledneSlovo)>0 then
     PosledneSlovo=left(PosledneSlovo, len(PosledneSlovo)-1)
    else
     PosledneSlovo=""
    endif
   case chr$(&H09) to chr$(&H1F)
    PosledneSlovo=""
   case chr$(&H20) to chr$(&H7E)
    PosledneSlovo=PosledneSlovo+StlacenaKlavesa.KeyChar
   case chr$(&H7F) ' CTRL BS
    PosledneSlovo=""
   case else
    PosledneSlovo=PosledneSlovo+StlacenaKlavesa.KeyChar
  end select
 endif
 Klavesnica_KeyPressed=Obsluzena
end function

function Klavesnica_KeyReleased(StlacenaKlavesa) as boolean
' Obsluha pustenej klávesy
 Klavesnica_KeyReleased = False
end function

function ZistiPredlozku as boolean
dim JePredlozka as boolean
 JePredlozka=false
 if len(PosledneSlovo)=1 then
  ' Ak je to jednoznakové slovo, tak to môže byť predložka
  JePredlozka=instr(1,JednoznakovePredlozky, PosledneSlovo, 0)
 endif
 ZistiPredlozku=JePredlozka
end function

Pravdaže, nesmieme zabudnúť ani na funkcie, ktoré nám zjednodušujú prístup k uvedeným makrám. Na tieto funkcie si zadefinujeme nový modul „Nezalomitelne_predlozky“:

sub Automaticky_Obsluhuj_Klavesnicu
 ' Procedúra pre automatické spustenie vkladania nezalomiteľných medzier
 ' ktorú môžeme volať počas otvárania súboru. Spustenie závisí od nastavených
 ' parametrov v používateľskom profile.
 Formatovanie.Nastav_formatovanie
 ' Podľa aktuálneho profilu sa zistia príznaky
 if (Profily_funkcie.Priznaky_formatovania(1)=1) and (Profily_funkcie.Priznaky_formatovania(4)=1) then
  Nezalomitelne_predlozky_funkcie.SpustiObsluhuKlavesnice
 endif
end sub

sub Obsluhuj_Klavesnicu
 ' Spustenie automatického vkladania bez ohľadu na nastavené parametre v používateľskom profile.
 Nezalomitelne_predlozky_funkcie.SpustiObsluhuKlavesnice
 Nezalomitelne_predlozky_funkcie.Obsluhovat_Klavesnicu=True
end sub

sub Neobsluhuj_Klavesnicu
 ' Zastavenie automatického vkladania bez ohľadu na nastavené parametre v používateľskom profile.
 Nezalomitelne_predlozky_funkcie.Obsluhovat_Klavesnicu=False 
 Nezalomitelne_predlozky_funkcie.UkonciObsluhuKlavesnice
end sub

sub Povol_Klavesnicu
 ' Povolenie pozastaveného automatického vkladania bez ohľadu na nastavené parametre v používateľskom profile.
 Nezalomitelne_predlozky_funkcie.Obsluhovat_Klavesnicu=True
end sub

sub Pozastav_Klavesnicu
 ' Pozastavenie automatického vkladania bez ohľadu na nastavené parametre v používateľskom profile.
 Nezalomitelne_predlozky_funkcie.Obsluhovat_Klavesnicu=False
end sub

Na budúce: Ďalšie funkcie pre formátovanie dokumentu, alebo dávame to čoraz viac dohromady.


Neprehliadnite: