Home » Tutorials » Sonstiges » rtf2html

rtf2html

Schritt 5

Jetzt beginnt die wirkliche Arbeit:

for loop:=0 to loop2 do
begin
  // immer das nächste Zeichen
  Source.SelStart:=loop;
  Source.SelLength:=1;

  // jetzt wird geschaut, ob sich etwas getan hat
  with Source.SelAttributes do
  begin

In loop2 haben wir zuvor gespeichert, wieviele Zeichen die RTF-Datei insgesamt enthält. Diese Zeichen gehen wir jetzt eines nach dem anderen ab, indem wir immer SelStart um einen Zähler erhöhen und SelLength auf 1 setzen. Für jedes dieser Zeichen wird dann getestet, ob sich im Vergleich zum vorherigen Zeichen etwas an den Attributen geändert hat.
Bevor es aber zu diesen Attributen kommt, testen wir zuerst, ob wir vielleicht eine neue Zeile erreicht haben:

 // Testen, ob wir eine neue Zeile erreicht haben, wenn ja,
   // dann entweder neuer Paragraph oder 

   if AktLine <> SendMessage (Source.Handle, EM_LINEFROMCHAR,
   Source.SelStart, 0) then
   begin
     // wenn wir in einer Aufzählung sind, dann wird durch eine neue
     // Zeile diese immer abgeschlossen
     if bullet then
     begin
       s:=s+'</li>';
       bullet:=false;

       ReihenFolge.Move(ReihenFolge.IndexOf(Pointer(6)),
       ReihenFolge.Count-1);
       // wenn in der neuen Zeile nicht wieder eine Aufzählung
       // ist, dann erstellen wir eine neue Zeile
       if Source.Paragraph.Numbering <> nsBullet then
       begin
         // Bevor wir in die neue Zeile wechseln, schließen wir
         // alle offenen Tags
         for loop2:=0 to ReihenFolge.Count-1 do
           case Integer(Reihenfolge[loop2]) of
             1: if fett then s:=s+'</strong>';
             2: if kursiv then s:=s+'</em>';
             3: if us then s:=s+'</u>';
             4: s:=s+'</font>';
           end; // case
         fett:=false;
         kursiv:=false;
         us:=false;

         s:=s+'
';
       end;
     end
     else begin
       if Trim(Source.Lines[AktLine])='' then
       begin
         // wenn die nächste Zeile leer ist, dann fügen wir einen
         //  neuen Paragraphen ein, sonst nur ein 

         // Alle offenen Tags werden geschlosssen
         for loop2:=0 to ReihenFolge.Count-1 do
           case Integer(Reihenfolge[loop2]) of
             1: if fett then s:=s+'</strong>';
             2: if kursiv then s:=s+'</em>';
             3: if us then s:=s+'</u>';
             4: s:=s+'</font>';
           end; // case
         fett:=false;
         kursiv:=false;
         us:=false;
         s:=s+'</p>';
         Align:=Source.Paragraph.Alignment;
         case Align of
           taLeftJustify:s:=s+'<p align="left">';
           taRightJustify:s:=s+'<p align="right">';
           taCenter:s:=s+'<p align="center">';
         end;
       end
       else s:=s+'
';

     end; // keine Aufzählung
     AktLine:=SendMessage (Source.Handle, EM_LINEFROMCHAR,
     Source.SelStart, 0);
  end; // neue Zeile

Der Code testet also zuerst, ob wir in einer neuen Zeile sind. Wenn ja, dann wird getestet, ob wir außerdem in einer Auzählung sind. Ist die Antwort wiederum ja, so wird zuerst diese geschlossen, indem wir ein

einfügen.
Dann wird der „li“ Eintrag in der Reihenfolge ganz an den Schluss gestellt.
Bevor wir dann in eine neue Zeile wechseln, schließen wir nochmals alle offenen Tags und fügen dann ein „br“ an.
Befanden wir uns aber in keiner Aufzählung, so wird differenziert: Ist die nächste Zeile leer „“, so interpretieren wir das als Paragraphen, ist in der nächsten Zeile Text, so fügen wir ein einfaches „br“ ein.