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.