Makrá v OpenOffice.org 6/III. – Počítanie znakov.

Július Pastierik  /  04. 07. 2007, 00:00

Ani vám nepostačujú štandardné možnosti, ktoré ponúka OpenOffice.org pri počítaní znakov? Dnes si ukážeme makro, pomocou ktorého dokážeme vypočítať o.i. napr. aj počet normostrán.

Tí, ktorí prispievajú do rôznych časopisov (papierových či internetových), alebo píšu romány sa ešte stále stretávajú s tým, že sú odmeňovaní podľa počtu normostrán, napísaných znakov ale bez medzier a pod. Podobne, pri rôznych súťažiach je požadované, aby napr. román mal minimálne toľko a toľko normostrán. Žiaľ, OpenOffice.org nám ponúka v bežnej štatistike iba základné údaje o počte znakov a vyššie uvedené možnosti nemá.

Okrem toho niekedy (napr. pri rozdeľovaní dlhého textu na viacero kratších pokračovaní) potrebujeme spočítať uvedené veci iba pre vybranú časť textu, resp. naraz aj pre celý text aj pre označený text. Preto si dnes uvedieme makro, ktoré nám dokáže spočítať počet slov, počet všetkých znakov, počet všetkých znakov bez medzier, počet normostrán zo všetkých znakov a počet autorských hárkov z normostrán a to naraz ako pre celý dokument, tak aj pre vybranú časť textu (pokiaľ nejakú označíme).

Hoci by sme pre vlastné počítanie niektorých znakov (v našom prípade to budú medzery) mohli teoreticky použiť aj náhradu znaku za ten istý znak, je to nepraktické (zbytočne by sme vykonávali náhradu). Preto si zadefinujeme vlastnú funkciu pre počítanie znakov, kde nebudeme používať štandardnú metódu pre nahrádzanie, ale pre vyhľadávanie.

Vzhľadom na to, že makrá sú, ako obvykle, čiastočne okomentované, nebudeme ich už viac rozoberať a uvedieme si priamo ich zdrojové texty. Ešte podotýkam, že v zozname makier ich mám uložené v osobitnom module „Pocitanie_znakov“ a pre vlastné spočítanie sa volá procedúra „Pocitanie_znakov“. Tím, ktorí budú túto procedúru používať často (u mňa je to každodenná náležitosť a vlastne vôbec nepoužívam počítanie znakov, ktoré má OpenOffice.org štandardne k dispozícii), odporúčam jej umiestnenie na niektorom paneli nástrojov.

public medzery, medzery_regularne as string ' Oddeľovacie znaky medzi slovami
public oddelovac_slov as string ' Znak, ktorý ukončuje slovo
public nepocitane_znaky as string ' Znaky, ktoré sa nikdy nepočítajú
public normo_strana as single ' Počet znakov na normostranu
public autorsky_harok as single ' Počet normostrán na jeden AH

dim Dokument, Hladaj, vyber as object

REM Inicializácia premenných
sub init_znaky

 medzery=chr(&H20)+chr(&HA0)+chr(&H09) ' Space, Hard space, Tab
 ' Definícia medzier pre vyhľadávanie pomocou regulárnych výrazov
 medzery_regularne="("+chr(&H20)+"|"+chr(&HA0)+"|"+chr(&H09)+")"

 oddelovac_slov=medzery+chr(&H0A)+chr(&H0D) ' Medzery, CR, LF
 ' Napr. Frídek-Místek sú dve slova, preto tu je aj pomlčka  ' alebo lomítko a bodka napr. pre http odkazy
 oddelovac_slov=oddelovac_slov+"-"+"/"+"."
 ' alebo lomitko a bodka napr. pre http odkazy

 nepocitane_znaky=chr(&H0A)+chr(&H0D) ' CR, LF

' Ak sa zmení norma, alebo niekto potrebuje tieto údaje počítať inak, môže si zmeniť tieto čísla
 normo_strana=1800 ' Počet znakov na normostranu je 1800
 autorsky_harok=16 ' Počet normostrán na autorský hárok je 16

 Dokument=ThisComponent
 Hladaj=Dokument.createSearchDescriptor()
 vyber=dokument.getCurrentSelection() ' aktuálny vyber
end sub

REM Funkcia spočíta počet výskytov reťazca Co
function Spocitaj_hladanim(Co as string, Regularne, Cele_slova, Velke_pismena as Boolean) as long
 dim nasiel as object
 dim kolko as long
 Hladaj.searchString=Co
 Hladaj.SearchRegularExpression=Regularne
 Hladaj.SearchWords=Cele_slova
 Hladaj.SearchCaseSensitive=Velke_pismena
 kolko=0
' Vyhľadanie prvého výskytu hľadaného reťazca
 nasiel = Dokument.findFirst(Hladaj)
' Pokiaľ sa reťazec našiel, tak
 Do While NOT isNull(nasiel)
  if len(nasiel.String)>0 then
   kolko=kolko+1
  end if
  ' Vyhľadanie ďalšieho výskytu hľadaného rečazca
  nasiel = Dokument.findNext(nasiel.End, Hladaj)
 Loop
 Spocitaj_hladanim=kolko
end function

 rem Procedúra pre spočítanie znakov a slov v celom dokumente a vo výberoch
Sub Pocitanie_znakov

 init_znaky

 ' Štatistické údaje o celom dokumente
 dim vsetky_znaky, vsetky_slova, vsetky_znaky_bez as long
 dim vsetky_normo, vsetky_normo_bez, vsetky_AH, vsetky_AH_bez as single

 ' Štatistické údaje o výbere
 dim vyber_pocet, vyber_znaky, vyber_znaky_bez, vyber_slova as long
 dim vyber_normo, vyber_normo_bez, vyber_AH, vyber_AH_bez as single

 dim riadok as string
 dim vyber_ktory, dlzka_riadku, i as long
 dim slovo as boolean
 dim znak, CR, real_format as string

 CR=chr(&H0D)
 ' Formát pre zobrazenie počtu nájdených a vypočítaných údajov (na dve desatinné miesta)
 real_format= "##########0.00"

 ' Údaje pre celý dokument
 ' Celkový počet slov
 vsetky_slova=dokument.WordCount

 ' Celkový počet znakov
 vsetky_znaky=dokument.CharacterCount
 ' Celkový počet znakov bez medzier
 vsetky_znaky_bez=vsetky_znaky-Spocitaj_Hladanim(medzery_regularne, true, false, false)

 ' Výpočet normostrán, AH a to s medzerami aj bez nich pre celý dokument
 vsetky_normo=vsetky_znaky/normo_strana ' počet normostrán
 vsetky_normo_bez=vsetky_znaky_bez/normo_strana ' počet normostrán bez medzier
 vsetky_AH=vsetky_normo/autorsky_harok ' počet autorských hárkov
 vsetky_AH_bez=vsetky_normo_bez/autorsky_harok ' počet AH bez medzier

 ' Údaje pre vybrané časti textu

 ' Počet výberov (naraz môžeme označiť viacero nezávislých častí textu)
 vyber_pocet=vyber.getCount()

 vyber_slova=0 ' počet slov
 vyber_znaky=0 ' počet znakov s medzerami
 vyber_znaky_bez=0 ' počet znakov bez medzier

' Pre všetky výbery
 for vyber_ktory=0 to vyber_pocet-1
  ' Text príslušného výberu
  riadok = vyber.getByIndex(vyber_ktory).getString()
  dlzka_riadku=len(riadok)

  ' Tvorba slova pre počítanie ich počtu
  slovo=false ' slovo neobsahuje ešte žiadny znak

  ' 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 textu
   if instr(oddelovac_slov, znak)=0 then
    ' znak nie je oddeľovač slov, t.j. je časťou slova
    slovo=true ' slovo určite obsahuje nejaký znak
   Elseif slovo then
     ' znak je oddeľovač slova a slovo obsahovalo nejaký znak – zvyšuje sa počet slov
    vyber_slova=vyber_slova+1
    ' Slovo bolo ukončené – znovu začíname tvoriť ďalšie
    slovo=false
   endif
   if instr(nepocitane_znaky, znak)=0 then
    ' znak sa nenachádza v zozname nepočítaných znakov, t.j. počítame ho
    vyber_znaky=vyber_znaky+1
    if instr(medzery, znak)=0 then
     ' znak nie je medzera, počítame ho teda aj medzi všetky ostatné znaky
     vyber_znaky_bez=vyber_znaky_bez+1
    endif
   endif
  next i
 next vyber_ktory

 ' ak sme na konci posledného slova nemali oddeľovač,
 ' tak toto slovo ešte nemáme započítané v celkovom počte slov
 if slovo then
  vyber_slova=vyber_slova+1
 endif

 ' Výpočet normostrán, AH a to s medzerami aj bez nich pre vybranú časť dokumentu
 vyber_normo=vyber_znaky/normo_strana
 vyber_normo_bez=vyber_znaky_bez/normo_strana
 vyber_AH=vyber_normo/autorsky_harok
 vyber_AH_bez=vyber_normo_bez/autorsky_harok

' Využijeme premennú "znak" na vytvorenie výstupného formulára

 znak="Počet všetkých slov: "+vsetky_slova+CR+CR

 znak=znak+"Počet všetkých znakov: "+vsetky_znaky+CR
 znak=znak+"Počet všetkých normostrán: "+format(vsetky_normo, real_format)+CR
 znak=znak+"Počet všetkých autorských hárkov: "+format(vsetky_AH, real_format)+CR+CR

 znak=znak+"Počet všetkých znakov bez medzier: "+vsetky_znaky_bez+CR
 znak=znak+"Počet všetkých normostrán bez medzier: "+format(vsetky_normo_bez, real_format)+CR
 znak=znak+"Počet všetkých autorských hárkov bez medzier: "+format(vsetky_AH_bez, real_format)+CR+CR+CR

 znak=znak+"Počet slov vo výbere: "+vyber_slova+CR+CR

 znak=znak+"Počet znakov vo výbere: "+vyber_znaky+CR
 znak=znak+"Počet normostrán vo výbere: "+format(vyber_normo, real_format)+CR
 znak=znak+"Počet autorských hárkov vo výbere: "+format(vyber_AH, real_format)+CR+CR

 znak=znak+"Počet znakov vo výbere bez medzier: "+vyber_znaky_bez+CR
 znak=znak+"Počet normostrán vo výbere bez medzier: "+format(vyber_normo_bez, real_format)+CR
 znak=znak+"Počet autorských hárkov vo výbere bez medzier: "+format(vyber_AH_bez, real_format)

 msgbox(znak, 0,"Počítanie slov a znakov")
End Sub


Počet znakov a normostrán

Na budúce: Znovu sa vraciame k formátovaniu dokumentu, alebo rôzne drobnosti, ktoré sa nám môžu zísť pri praktickej práci.

Neprehliadnite: