Encoder: HTML automatisch passend ergänzen

Ja ... schon die Fragestellung ist das Problem :-)
Ich erklär am besten mal was ich habe.
Ich hab eine Art Gästebuch, in dem ich Text eingeben kann. Den eingegebenen Text setze ich in <p> </p>, Zeilenumbrüche werden in <br /> umgewandelt. Soweit alles ok.
Jetzt will ich da zum Beispiel eine Tabelle einfügen, oder Listen oder sonst was aufregenderes als nur Text. Dabei kommt dann ein ziemlicher Blödsinn raus, wenn der ganze Block einfach in <p> </p> eingeschlossen wird. Bei einer Liste siehts dann so aus
<p> <--- automatisch
Hier steht Text, der noch korrekt nach dem Style des p-Tags formatiert wird.
<ul>....</ul>
Hier steht Text, der nicht mehr richtig formatiert wird.
</p> <--- wieder automatisch

Ich such jetzt nach einem Weg, wie ich das etwas intelligenter machen kann. Text soll nach wie vor in <p> eingeschlossen werden, wenn er nicht woanders schon eingeschlossen ist. Wenn ein anderes Element kommt, soll der Text davor korrekt beendet werden, der danach soll wieder mit <p> beginnen. Außer bei einem Bild, das darf ja innerhalb von p stehen, da wär dann schon wieder ein Ausnahmefall.
Man kann davon ausgehen dass alles was ausdrücklich an Elementen eingegeben wird, auch korrektes HTML ist.
Dafür such ich grad ein paar sinnvolle Ansätze. Es braucht nicht alles abdecken, würd schon reichen wenn die paar häufigsten Spielereien berücksichtigt würden.
Wär nett wenn mir dazu jemand einen Anstoß geben könnte. Mir würds schon helfen wenn ich einen Weg finde, wie ich elegant rausfinde welche Teile meines Texts ohne umschließendes Element da stehen.

  1. Hi,

    Man kann davon ausgehen dass alles was ausdrücklich an Elementen eingegeben wird, auch korrektes HTML ist.

    Wenn davon ausgegangen werden kann, dass es sich um valides XHTML und damit XML handelt,

    Mir würds schon helfen wenn ich einen Weg finde, wie ich elegant rausfinde welche Teile meines Texts ohne umschließendes Element da stehen.

    dann könntest du es als XML parsen lassen, und dann das daraus entstehende DOM durchlaufen, und dir dabei die Vorfahrenelemente der Textknoten anschauen. (Bzw. auch gleich nur Textknoten auf oberster Ebene berücksichtigen.)

    Allerdings ist wohlgeformtes XML für Benutzereingaben schon ein recht hoher Anspruch.
    Wenn möglich sollte also ein eher Parser verwendet werden, der Fehler analog zu einem HTML-Tag-Soup-Parser zu korrigieren versucht, bevor er mit Fehlern abbricht.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Wenn davon ausgegangen werden kann, dass es sich um valides XHTML und damit XML handelt

      Ja, das was zusätzlich an wirklichem HTML eingegeben wird, das sollte als korrekt vorausgesetzt werden können.

      dann könntest du es als XML parsen lassen, und dann das daraus entstehende DOM durchlaufen, und dir dabei die Vorfahrenelemente der Textknoten anschauen.

      So wirklich XML ist es halt nicht, da der reine Text kein XML ist.
      Ein Beispiel:

      Der Besucher gibt normalerweise einfach nur Text ein. So wie hier. Bisher wird der ganze Block in einen Absatz eingeschlossen.
      <span ...>jetzt will jemand Text anders auszeichnen so wie hier. Das passt in einen Absatz, hier würde das Verfahren noch funktionieren.</span>
      <table>...Dann baut jemand eine Tabelle ein. Die macht den Absatz kaputt. Das heißt die Automatik sollte hier vor dem table Tag den Absatz schließen und ihn danach wieder öffnen.</table>
      <ul><li>Selbes gilt für Listen. Auch dann sollte der Absatz vorher geschlossen werden. Natürlich nur sofern grad einer offen ist, hier ist das ja nicht der Fall.</li></ul>
      Dann gehts wieder mit Text weiter, der wieder in einem Absatz stehen soll.

      Ich könnte natürlich die irrsten Basteleien veranstalten, aber ich glaube noch an was brauchbares das ich auch in zwei Wochen noch verstehe :-)
      Ich bräuchte also eine Art Parser, der mir sagt hier kommt erst mal einfach nur Text ohne Element (statt einen Fehler auszugeben), dann kommt ne Tabelle (die ich einfach übernehme), dann kommt eine Liste und danach wieder nur reiner Text.

      1. Hi,

        So wirklich XML ist es halt nicht, da der reine Text kein XML ist.

        D'oh!
        Dass du das ganze zum Prüfen in ein Wurzelelement verpackst, hatte ich vorausgesetzt.

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
        1. Achsooooo! Ja klar, wenn ich das erst mal trotzdem noch tu ist es natürlich schon valides XML, aus dem ich dann weiter basteln kann.
          Klar, coole Idee! Danke

  2. Hallo,

    Jetzt will ich da zum Beispiel eine Tabelle einfügen, oder Listen oder sonst was aufregenderes als nur Text. Dabei kommt dann ein ziemlicher Blödsinn raus, wenn der ganze Block einfach in <p> </p> eingeschlossen wird. Bei einer Liste siehts dann so aus
    <p> <--- automatisch
    Hier steht Text, der noch korrekt nach dem Style des p-Tags formatiert wird.
    <ul>....</ul>
    Hier steht Text, der nicht mehr richtig formatiert wird.
    </p> <--- wieder automatisch

    das ist eine Schwäche der HTML-Spezifikation, die innerhalb von p-Elementen keine Blockelemente zulässt. Listen sind oft ein sinnvoller Inhalt von Absätzen.

    Freundliche Grüße

    Vinzenz