Christoph Schnauß: RTF nach HTML konvertieren

hallo Forum,

ich habe eine Denksportaufgabe: ich muß versuchen, ein mit Microsoft Word erstelltes RTF-Dokument in eine HTML-Datei (oder ein PHP-Ausgabescript) zu konvertieren - Gründe dafür kennt Thomas J.S.. Diese Frage beschäftigt mich schon ein paar Wochen, und ich habe mich zunächst mit dem Tool eines tschechischen Programmierers beschäftigt - als ZIP downloadbar von http://www.penguin.cz/~martinmv/rtf2htm3.zip. Das Ding basiert wahlweise auf Python oder PHP, ist ganz nett und hat vor allem einige gewaltige und sehr beeindruckende Arrays, die ziemlich zuverlässig alles "proprietäre" Zeugs rausfiltern können.
Aber: der tschechische Entwickler verzichtet vollständig auf CSS. Auch in seinem jüngsten, vor rund einer Woche veröffentlichten Update. Ich habe mit ihm schon ein paar mails gewechselt, aber CSS interessiert ihn nicht.

Das heißt, was mir die vier PHP-Scripts seines Programmpakets liefern, ist zwar tatsächlich eine Konvertierung RTF -> HTM, aber es sind überall <font face ...> und ähnliche Grausamkeiten drin. Ich brauche aber zum Beispiel sowas wie
  <p class=...>
und Ähnliches.

Selbstverständlich läuft das Ganze über eine lange Reihe von RegExpressions. Und da die Scriptergebnisse jeweils in einer Variablen zwischengebunkert werden, hindert mich prinzipiell nichts daran, dann eben alles nochmal durch meine eigenen RegExpressions zu jagen und den font-Kram hinauszuwerfen. Nur: irgendwo stecken in den beiden Arrays, mit denen der tschechische Kollege den gesamten RTF-Krempel erstmal nach HTML konvertiert, irgendwelche winzigen Fehler. Was mich derzeit am meisten stört, ist: wenn man in der RTF-Datei einen Verweis angibt, wird der gnadenlos "rausgefiltert" und gelöscht. Und ich finde bisher nicht heraus, woran das liegt.

Ich habe die beiden Scripts, die dafür "zuständig" sind, mal als Textdateien hochgeladen. rtftophp.php ist das (sehr umfangreiche) Script, das erstmal prinzipiell eine RTF zur Auswertung übergeben bekommt (ist die Originalfassung und ich verstehe nicht alle Bestandteile im Suchmuster), und htmlparser.php ist dasjenige, das eine erste vorsichtige Anpassung der Daten an sowas Ähnliches wie im Browser ausgabefähiges HTML vornimmt - da habe ich ein paar Zeilen aus dem Original bereits gestrichen bzw. auskommentiert oder geändert. In diesem zweiten Script gibt es zur Zeit noch kein <a href=...>, was aber daran liegt, daß es im Ausgabestring des ersten Scripts diese oder eine ähnliche Zeichenfolge erst gar nicht gibt. Das müßte also zuerst dort wieder hinein.

Wenn man sich eine RTF-Datei, die einen Verweis im Text enthält, mal in einem Texteditor (z. B. Texpad unter Windows oder nano unter Linux) anschaut, sieht die entsprechende Stelle ungefähr so aus (steht alles in einer einzigen langen Zeile):
  \insrsid2245481  HYPERLINK "http://www.google.de" }{\insrsid2245481 {\*\datafield
  00d0c9ea79f9bace118c8200aa004ba90b02000000170000000e0000007700770077002e0067006f00
  6f0067006c0065002e00640065000000e0c9ea79f9bace118c8200aa004ba90b2c0000006800740074
  0070003a002f002f007700770077002e0067006f006f0067006c0065002e00640065002f000000}}}{
  \fldrslt{\cs15\ul\cf2\insrsid2245481\charrsid8984422 www.google.de}}}{\insrsid2245481

Ich hätte selber nicht ausreichend Muße gehabt, das alles (wozu ja noch ein Riesenberg weiterer ähnlicher Zeichenfolgen kommt) mit einem ewig langen Array abzufangen und dann eben in HTML zu "übersetzen", daher war ich ganz froh, daß ich bei dem tschechischen Programmierer einen entsprechenden Entwurf fand. Mit Listen, die man ja in RTF auch erstellen kann, klappt seine Konvertierung auch, mit Tabellen ansatzweise; fetter, kursiver und unterstrichener Text wird brav mit <b>, <i> und <u> übersetzt, sogar an <sup> hat er gedacht. Nur bei <a> gibt es in seinem Script irgendwas, was nicht hinhaut, obwohl er im Suchstring sowas eingebaut hat:
  "(http([s]?)://([~a-zA-Z0-9\._%\-/:\?%=+&;]*))",
Vielleicht steht das bloß an der falschen Stelle im Array - aber da bin ich vorerst hängengeblieben.

Ansonst sind diese Scripts tatsächlich einigermaßen erfolgreich; wenn man lediglich einen Text in Word schreibt und auf Mätzchen wie Zwischenüberschriften oder eigene Formatierungen verzichtet - Absätze dürfen auch mal rechtsbündig gesetzt werden, das geht - kann man eine RTF-Datei tatsächlich in valides HTML umwandeln.

Hat jemand genügend Langeweile, um sich mit dieser Konstruktion mal zu befassen und eventuell herauszufinden, wo das Problem mit <a> sich versteckt hält?

Hintergrund: wenn jemand Texte auf einer Webseite veröffentlichen möchte, aber partout kein HTML lernen will, sondern grundsätzlich Word benutzt, kommt eben auch kein HTML dabei heraus. Und die Option "als Webseite speichern", die es in Word gibt, ist nun einmal eine der größten Grausamkeiten, die sich Microsoft je ausgedacht hat. Wenn dieser Jemand nun aber seinen Text als RTF speichert, kann man das tatsächlich mithilfe einer einzigen winzigen Befehlseingabe auf der Kommandozeile in valides HTML verwandeln. Das leisten die Scripts des tschechischen Programmierers ziemlich zuverlässig.

Und wenn sich das Problem nicht lösen läßt, mache ich es halt anders. Dann schreibe ich ein Konvertierungstool, das mit Word und "speichern als Webseite" erstellte "HTML-Dokumente" tatsächlich in HTML umwandelt - und beglücke den SELF-Raum mit einem zugehörigen Feature-Artikel. Denn zumindest ist der konzeptionelle Weg, den der tschechische Kollege gegangen ist, nachvollziehbar und erfolgversprechend.

Grüße aus Berlin

Christoph S.

--
Visitenkarte
ss:| zu:) ls:& fo:) va:) sh:| rl:|
  1. Hi Christoph,

    Deine ausführlichen Erläuterungen in aller Ehre, aber:

    Was willst Du eigentlich wissen?

    1. hallo Stefan,

      Was willst Du eigentlich wissen?

      wo der Fehler im angegebenen Script steckt.

      Grüße aus Berlin

      Christoph S.

      --
      Visitenkarte
      ss:| zu:) ls:& fo:) va:) sh:| rl:|
  2. Lieber Christoph,

    das klingt alles sehr interessant, aber ich habe nicht die notwendige Muße (die Du Langeweile nennst), mich mit der Thematik auseinanderzusetzen. Außerdem setze ich ein selbstgestricktes CMS ein, sodass ich mit RTFs nicht in berührung komme.

    Das RTF-Format kennt ja auch Grafiken. Wie werden denn in einer RTF-Datei eingebundene Grafiken von diesem Script (oder diesen Scripten) behandelt? werden dafür dann eigene Dateien daraus extrahiert und angelegt?

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. hallo Felix,

      Das RTF-Format kennt ja auch Grafiken. Wie werden denn in einer RTF-Datei eingebundene Grafiken von diesem Script (oder diesen Scripten) behandelt? werden dafür dann eigene Dateien daraus extrahiert und angelegt?

      Grafiken werden vorerst vollständig gestrichen. Hat der Originalautor so vorgesehen, und da weiß ich auch, wo und wie das geschieht. Ich habe noch nicht darüber nachgedacht, ob und wie man das wieder aktivieren kann.

      Grüße aus Berlin

      Christoph S.

      --
      Visitenkarte
      ss:| zu:) ls:& fo:) va:) sh:| rl:|
  3. Hallo Christoph,

    Hat jemand genügend Langeweile, um sich mit dieser Konstruktion mal zu befassen und eventuell herauszufinden, wo das Problem mit <a> sich versteckt hält?

    Nö, nicht wirklich, schon allein weil RTF ja präsentationsbasiertes Markup ist, strukturell gutes HTML zu erzeugen wird daher schwieriger.

    Und wenn sich das Problem nicht lösen läßt, mache ich es halt anders. Dann schreibe ich ein Konvertierungstool, das mit Word und "speichern als Webseite" erstellte "HTML-Dokumente" tatsächlich in HTML umwandelt - und beglücke den SELF-Raum mit einem zugehörigen Feature-Artikel.

    Ich glaube nicht wirklich, dass Du das brauchst. Die gängige Methode ist es doch, einfach HTML Tidy über das Word-HTML drüber zu jagen, schließlich hat das Ding seit Ewigkeiten eine Option, solches HTML zu säubern.

    Tim

    1. hallo Tim,

      ... weil RTF ja präsentationsbasiertes Markup ist, strukturell gutes HTML zu erzeugen wird daher schwieriger.

      Eben, das ist ja mein Problem damit.

      Ich glaube nicht wirklich, dass Du das brauchst. Die gängige Methode ist es doch, einfach HTML Tidy über das Word-HTML drüber zu jagen

      Möglich, daß das "gängig" ist, allerdings habe ich damit bisher keine befriedigenden Erfahrungen machen können - oder ich habs halt noch nicht wirklich kapiert.

      Grüße aus Berlin

      Christoph S.

      --
      Visitenkarte
      ss:| zu:) ls:& fo:) va:) sh:| rl:|