Philipp Hasenfratz: OOP für XHTML-Generierung...

Halihallo Forumer

Na, in Perl wurde ja schon ziemlich viel modularisiert. Von Net::Cmd über Mail::POP3Client, über Time::Local zurück zu PDF::Create und dann noch nach SOAP::Lite... Alles modularisiert. Auch die (X)HTML Generierung ist schon ein wenig dort gelandet (CGI.pm - ist noch alles etwas zu funktional aufgebaut), jedoch hab ich folgendes noch nie gesehen:

---
use XHTML;

my $doc = new XHTML;

my $head = $doc->head;
$head->title( 'test' );

my $body = $doc->body;
$body->h1( 'My name is...' );
$body->p( 'Philipp Hasenfratz', align=>'left' );

$head->meta( 'http-equiv' => 'refresh', content => '5; url=./t' );

my $http_header = $doc->http_head;
$http_header->status( 304, 'fuer immer weg...' );
$http_header->location( '/test/jetzt_hier.html' );

print $doc->xhtml_http_header;
print $doc->as_string;
---

jetzt frage ich mich, warum es das noch nicht gibt (oder irre ich mich?). Ich habe zumindest noch nix vergleichbares gefunden (würde mich freuen, wenn's das schon gäbe). Was mir so vorschwebt, wäre ein XHTML-OOP-Modul, womit man 100% validierte Dokumente erstellen kann (eg. bei -w Warnungen ausgeben, dass z. B. kein <font> - Tag in XHTML existiert oder so...). Vorteile würde ich darin sehen, dass

a) ein 100% validierter Code per definition ausgegeben werden würde und
b) Fehler frühzeitig erkennt würden
c) Fehler implizit teilweise unmöglich sind (eg. impliziertes head-tag)
d) Design-Module von XHTML erben können (eg. ein FarbigeTabelle1.pm Modul, oder ein ForumThreadAnsicht.pm Modul)

Meine Fragen:

[ ] Gibt's das schon?
    Wenn ja, wo? - [http://______________________]
[ ] Wäre sowas sinnvoll, nützlich?
    oder [ ] ist der Zeitaufwand/Nutzeffekt-Koeffizient zu gross?
[ ] Wäre ein integrierter Validator sinnvoll?
[ ] sonstiges,
    na, dann formuliere bitte [___________________________]
                              [___________________________]
                              [___________________________]
                              [___________________________]

Viele Grüsse

Philipp

  1. Halihallo Forumer

    Vielleicht noch etwas Background...

    Ich arbeite derzeit an einem Projekt, welches einige (durch den Designer) gefertigte Design-Elemente verwendet. Diese Designelemente, wie ich nunmal bin, liegen alle in gefertigten Design-Modulen, wo ich über OOP dessen Eigenschaften und Inhalte festlege. Das OOP-Interface zu Design finde ich schon sehr schön, da ich neue Designvorschläge bzw. Designkorrekturen leicht implementieren kann, jedoch... und das ist der Grund meines Postings... bin ich etwas unzufrieden, da der Weg vom Designmodul zur HTML-Generierung im gleichen Modul stattfindet und somit etwas mein Konzept der "schönen" Programmierung (Vererbungen, jedes Modul für seinen Zweck, Modulhierarchien/-design) zerstört, da ich zwei getrennte Prozesse (Inhalts-/Eigenschaftsspezifizierung und HTML-Generierung) im selben Modul habe. Als gelungenes modulares Design würde ich folgendes halten:

    Accountübersicht extends HiddenTable extends XHTML extends Output.

    Leider fehlt mir noch XHTML :-)

    Nun gut, HTML::Element ist schon ein guter Anfang (warum fällt mir das erst jetzt ein? :-( ), jedoch die Handhabung scheint mir noch etwas zu tippaufwendig. Aber so könnte ich mir das schon mal vorstellen.

    Viele Grüsse und Danke

    Philipp

  2. Halihallo Forumer

    Hallo? - Keine Rückmeldungen? - Gestattet mir die Frage: Warum?

    [ ] interessiert mich nicht.
    [ ] keine Ahnung, was ich schreiben soll.
    [ ] verwende gefälligst etwas, was schon da ist.
    [ ] du nanntest ja selber HTML::Element und CGI! - das nimm!
    [ ] dein Posting nervt mich, Erklärung: [___________________]
    [ ] musst uns noch etwas Zeit lassen.
    [ ] wegen [___________________]

    Viele Grüsse

    Philipp

    1. Hallo Philipp,

      Ich persönlich wollte eigentlich antworten, aber hab's dann wieder verworfen (weil ich mir da ein bisschen blöd bei vorkam): <kurz-zusammenfassung>Warum mit OOP XHTML generieren? Wieso verwendest Du keine Template-Engine?</kurz-zusammenfassung> Oder habe ich da was falsch verstanden?

      Grüße,

      Christian

      1. Halihallo Christian

        ??? - Das Forum hat mir dieses Posting einfach so geschluckt, böses! - Hab ich nämlich schon erfolgreich gepostet gehabt. Nun denn, gleich nochmal (ich hatte es noch in ner Text-Datei gespeichert gehabt, deshalb bin ich jetzt nicht böse [musste es jedoch aus'm Papierkorb retten ;)]) :

        Ich persönlich wollte eigentlich antworten, aber hab's dann wieder verworfen (weil ich mir da ein bisschen blöd bei vorkam): <kurz-zusammenfassung>Warum mit OOP XHTML generieren? Wieso verwendest Du keine Template-Engine?</kurz-zusammenfassung> Oder habe ich da was falsch verstanden?

        Erstmal, danke, dass trotzdem noch eine Nachricht gekommen ist ;)

        Eine Template-Engine? - Ja, das Prinzip wäre denkbar, jedoch ist dann die generierung des XHTML-Codes dennoch auf der Seite des Programmierers. Was ich gerne hätte, ist ein Tool, welches, unter verwendung von OOP, XHTML Code produziert. In der ersten Version der genannten Software hatte ich auch Templateorientiert gearbeitet, jedoch durch die Sprachunabhängigkeit musste ich, der einfachheithalber, auf eine "im Code stehende Ausgabe" umsteigen, da die Wartung sonst etwas zu mühsam geworden wäre. Da nun der Quelltext eines jeden Designs/Ausgabe im Quellcode stattfindet, würde ich mir eine "Zwischenschicht" für die XHTML Codierung wünschen.
        Ich habe mir lange überlegt, ob ich Templates verwenden soll; ich habe mich dann jedoch anders entschieden, da der Datentyp, den ich übergeben müsste um eine Seite abzubilden, etwas komplex geworden wäre (z. B. Accountübersicht mit variabler Länge und Breite mit verschiedenen Spalten, verschiedenen Inhalts => das abzubilden gäbe ein Datentyp, der ziemlich verschachtelt aussehen würde => meiner Meinung nach ist der Wartungsaufwand hier viel zu gross, einfacher geht es, wenn der Code gleich "on-the-fly" generiert wird).
        Dieses on-the-fly Prinzip hat jedoch den Nachteil, dass die Ausgabe direkt erfolgt (ohne Umweg über Templates), will heissen, dass man den HTML Code direkt in den Modulen/Programmen sieht; das wäre auch kein Problem, jedoch habe ich mich nicht an XHTML-Standard gehalten. Um dies gleich per se aufzuzwingen wäre ein Modul (XHTML) notwendig, welches implizit validierten Code ausgibt.
        Neben bei ein weiterer Grund, warum ich mir ein XHTML-Modul wünschen würde: mir graust etwas vor einer Ausgabe wie print '<h1>t</h1>blabla<p style="align: left">test</p>';
        das ist mir einfach zu "hard-gecoded". Ich habe es lieber, wenn alle Attribute und Tags über ein Modul generiert werden (die Vorteile wurden genannt):

        $body->h1('t');
        $body->text('blabla');
        $body->p('test', { style=>{align=>'left'}} );
        print $body->as_string

        braucht einige Zeichen mehr, jedoch ist das IMO "schönes" Programmieren ;)
        Ach, gleich noch was:

        my $els = $body->getElementsByTagName( 'a' );
        for ( my $i=0; $i < $els->getLength; $i++ ) {
           my $a_element = $els->item( $i );
           $a_element->href->add( 'SessionID'=>42 );
        }

        lässt auch schöne Automatisierungen zu ;)

        Viele Grüsse und Danke

        Philipp

        1. Hallo Philipp,

          braucht einige Zeichen mehr, jedoch ist das IMO "schönes" Programmieren ;)

          my $els = $body->getElementsByTagName( 'a' );
          for ( my $i=0; $i < $els->getLength; $i++ ) {
             my $a_element = $els->item( $i );
             $a_element->href->add( 'SessionID'=>42 );
          }

          <klugscheisser>
          Selber(um)schreiben?
          </klugscheisser>

          Grüße,

          --
          Christian