Delphi - Word dokumentum tartalomjegyzék exportálása HTML-be

forráskód letöltése
Ha egy saját dokumentumunk tartalomjegyzékét szeretnénk az interneten publikálni, akkor jól jön egy olyan komponens mely egy Word dokumentum tartalomjegyzékéből automatikusan előállítja a szükséges HTML kódot, amit csak a készítendő WEB oldalra be kell másolni a megfelelő helyre. A mellékelt példaprogram megnyitása előtt a ContentGenerator.pas-ban lévő komponenst telepítenie kell a Delphi alá.

A tartalomjegyzékben csupán két szintet fogunk megkülönböztetni. A felső szint az lesz, aminek a stílusa "TJ 1", a többi stílus között pedig nem teszünk különbséget. A felső szint címét a többitől eltérő stílussal adjuk meg. Maga a tartalomjegyzék egy táblázatban jelenik meg, amely középre van igazítva, és két oszlopa van. Az elsőben a címek, a másodikban pedig az oldalszámok jelennek meg. Az oszlopok szélességét és a sorok magasságát property-ken keresztül adhatjuk meg. A táblázat páros és páratlan sorszámú sorai eltérő színekkel jelennek meg.
Az elkészült HTML kódot a HTML property-ből lehet kiolvasni.

A tartalomjegyzék elkészítése az Execute eljárásban történik. Ebben első lépésben töröljük a HTML property értékét, és beírjuk a bevezető HTML kódot. Ezután ellenőrizzük, hogy létezik-e a megadott Word dokumentum, és ha létezik, akkor a Word segítségével megnyitjuk azt. Ez a művelet nem fog látszani, mivel mindent a háttérben csinálunk. A megnyitott dokumentumot a WordDoc objektumon keresztül érjük el. A megnyitás után az első teendőnk a Repaginate függvény meghívása, ami frissíti a dokumentum oldalszámait. Erre nem minden esetben van szükség, de gyakran előfordul, amikor igen, és kárt nem okozunk a meghívásával.
A WordDoc-on keresztül elérjük a TablesOfContents objektumot, amit a Contents változóban tárolunk el. Ez a dokumentum tartalomjegyzékeinek listáját tartalmazza. Ennek Count property-jéből kiolvassuk a tartalomjegyzékek számát. Ha 0, akkor a dokumentumnak nincs tartalomjegyzéke, tehát nem érdemes tovább foglalkozni vele.
A Cont változóban eltároljuk az első tartalomjegyzék Range objektumát. A Range objektum tartalmazza a tartalomjegyzék tartalmát.
Cont:=Contents.Item(1).Range;
Mi csak az első tartalomjegyzékkel foglalkozunk, a többit nem vesszük figyelembe. Ideális esetben egyébként csak egy tartalomjegyzék van dokumentumonként.

Innentől kezdve egy kicsit bonyolódik a helyzet. A cs változóban tároljuk az aktuális sor színmeghatározását. Ennek értéke vagy egy üres sztring, vagy a háttérszín HTML meghatározása. A Cont.Paragraphs objektumon keresztül elérjük a tartalomjegyzék bekezdéseit, amik tulajdonképpen a tartalomjegyzék tételei. A Count property-ből kiolvasható ezek száma. Egy ciklusban sorban beolvassuk őket egyenként. A ciklus minden lépésében a cs változó értékét megváltoztatjuk, így érjük el, hogy a páros és páratlan sorok eltérő háttérszínnel rendelkezzenek. A ContentItem változóban eltároljuk az i. sorszámú bekezdés (tétel) objektumát. Ennek Style property-jéből kiolvasható a bekezdés stílusa. Ellenőrizzük, hogy ez "TJ 1"-e, és ha igen, akkor az st változóban eltároljuk a főcímek stílusát meghatározó HTML kódot. Ellenkező esetben töröljük az st változó tartalmát.
      cs:='';     i:=1;
      while i<=Cont.Paragraphs.Count do begin
        if cs='' then cs:='bgColor=#fffff0 ' else cs:='';
        ContentItem:=Cont.Paragraphs.Item(i);
        if UpperCase(ContentItem.Style)='TJ 1' then begin
          st:=' class='+FTopLevelClassName;
        end else begin
          st:='';
        end;
Az oldal változóban eltároljuk a bekezdés szövegét, amit a Range.Text property-ből tudunk kiolvasni. Mivel ez egy sortörés karaktert is tartalmaz, ezért ezt töröljük a szöveg végéről. A címet és az oldalszámot egy tabulátor karakter (#9) választja el egymástól, ezért ezt megkeressük, és a cim változóban eltároljuk a címet, és az oldal változóból töröljük ezt a részt. Ha a szöveg valamilyen okból kifolyólag nem tartalmaz tabulátor karaktert, akkor az egész szöveget értékül adjuk a cim változónak, és az oldal változó értéke egy üres sztring lesz.
        oldal:=ContentItem.Range.Text;  oldal:=Copy(oldal, 1, length(oldal)-1);
        p:=Pos(#9, oldal);
        if p>0 then begin
          cim:=Copy(oldal, 1, p-1);
          Delete(oldal, 1, p);
        end else begin
          cim:=oldal; oldal:='';
        end;
Elképzelhető, hogy a tartalomjegyzék tartalmaz üres sorokat (bekezdéseket), ezért ellenőrizzük, hogy az aktuálisan vizsgált bekezdés nem ilyen-e. Ha nem, akkor hozzáadjuk a HTML kódot a HTML property tartalmához, és megkezdjük a következő bekezdés (tétel) feldolgozását.
        if cim<>'' then begin
          s:='  <TR '+cs+'height='+IntToStr(FRowHeight)+'>'+CRLF+'    <TD'+st+'>'+cim+'</TD>'+CRLF+'   
              <TD'+st+'>'+oldal+'</TD></TR>';
          FHTML.Append(s);
        end;
        inc(i);
      end;