Take: Homepage-Framework: Tags parsen?

Moin,

ich baue (schon seit einiger Zeit, mehrere Anfänge/Ansätze habe ich wieder verworfen) an einer Art Framework um mir das erstellen von Webseiten zu erleichtern. Möglicherweise wirds später sogar ein kleines CMS, aber soweit bin ich noch lange nicht.
Zu meinem Problem:
Die Art und Weise wie das Framework funktionieren soll ist, dass ich in meinem HTML-Code bestimmte Tags einbauen kann (z.B. <framework:link page="testseite">Linktext</framework:link> für einen Link zur Seite "testseite". Geparst würde dann daraus <a href="?page=testseite">Linktext</a>.
Ich parse das, in dem ich den HTML-Code mit folgendem Regex aufteile:
(</?framework:\w+\s*(?:\w+\s*=\s*"[^"]*"\s*)*/?>)

Bzw. in PHP:

  
preg_split('#(\</?framework:\w+\s*(?:\w+\s*\=\s*"[^"]*"\s*)*/?>)#', $html, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE);  

Die einzelnen Elemente kann ich dann nacheinander Abarbeiten. Ich loope über die Elemente und merke mir jeden öffnenden Tag. Kommt jetzt Text, wende ich die dem Tag zugeordnete Funktion (bzw. die Funktionen, die allen geöffneten Tags zugeordnet sind) auf diesen an. Kommt ein schließender Tag, kommt dieser wieder runter vom Stack der aktuell geöffneten Tags. Funktioniert erstmal auch ganz gut, jedenfalls bei so simplen Sachen wie Text verkleinern (z.B. <framework:lowercase>GROSSBUCHSTABEN</framework:lowercase> wird zu grossbuchstaben). Probleme treten allerdings bei komplexeren Sachen auf, wie z.B. Schleifen.
Meinetwegen habe ich einen Tag, der den enthaltenen Code n-mal hintereinander ausführt. Innerhalb dieses Codes kann natürlich der aktuelle Schleifendurchlauf ausgegeben werden, usw. Dabei fliege ich mit meinem Ansatz auf die Nase.

Ich hoffe mal mein Roman war verständlich :D

Denke ich komplett verquer, geht das alles viel einfacher? Oder ist der Ansatz mit den Tags kompletter Schwachsinn? Was sind eure Anregungen?

Danke schonmal!

Gruß,
Take

  1. Hi,

    vorweg, worin siehst du denn den großen Vorteil dieser <framework>-Tags? Was ist denn an

      
    <framework:link page="testseite">Linktext</framework:link> 
    

    soviel besser als:

    <a href="?page=testseite">Linktext</a>  
    
    

    Ich verstehe deine Intention noch nicht völlig, erläutere das bitte etwas grundsätzlicher.

    Soweit ich das bisher sehen kann, setzt du an der falschen Stelle an. Vielleicht solltest du dir klar machen, WAS genau dein Framework leisten soll. Links oder Formatierungen durch eigene Tags zu ersetzen, um das dann nochmals Parsen zu lassen, kann es ja eigentlich nicht sein.

    1. Moin,

      Hi,

      vorweg, worin siehst du denn den großen Vorteil dieser <framework>-Tags? Was ist denn an

      <framework:link page="testseite">Linktext</framework:link>

      
      >   
      > soviel besser als:  
      >   
      > ~~~html
      
      <a href="?page=testseite">Linktext</a>  
      
      > 
      
      

      So kann ich z.B. an einer zentralen Stelle definieren, ob ich die Links jetzt "hässlich" (?page=testseite) oder "schön" für mod_rewrite (/testseite.html) ausgeben lassen will. Außerdem ist ein Link ja nur das simpelste Beispiel. Das Framework übernimmt ja auch die Verwaltung der Seiten und der Seiteninformationen (Autor, Titel, usw.), sodass man Templates erstellen kann und dort dann z.B. per <framework:page_title /> den Seitentitel ausgeben lassen kann.

      Ich verstehe deine Intention noch nicht völlig, erläutere das bitte etwas grundsätzlicher.

      Soweit ich das bisher sehen kann, setzt du an der falschen Stelle an. Vielleicht solltest du dir klar machen, WAS genau dein Framework leisten soll.

      Es soll z.B. Menüs vereinfachen. Im Backend kann man dann einzelne Menüs erstellen und diesen Seiten oder ganze Kategorien von Seiten zuordnen. Im Template braucht man dann nurnoch <framework:menu id="3" /> zu schreiben und das Menü wird automatisch erstellt.

      Links oder Formatierungen durch eigene Tags zu ersetzen, um das dann nochmals Parsen zu lassen, kann es ja eigentlich nicht sein.

      Natürlich nicht :D

      Gruß,
      Take

      1. Hi,

        Es soll z.B. Menüs vereinfachen. Im Backend kann man dann einzelne Menüs erstellen und diesen Seiten oder ganze Kategorien von Seiten zuordnen. Im Template braucht man dann nurnoch <framework:menu id="3" /> zu schreiben und das Menü wird automatisch erstellt.

        ok verstehe. Und das ist besser als z.b.

        <?php $myFrameWork->printMenu(3); ?>

        oder eine Template Engine wie z.B. Smarty weil _______________?

        1. Moin,

          ok verstehe. Und das ist besser als z.b.

          <?php $myFrameWork->printMenu(3); ?>

          OK. Das Argument hatte ich erwartet. Nur muss dann derjenige, der das Framework benutzt, PHP können und genau das will ich vermeiden (OK, insgeheim solls doch ein CMS werden, merke ich grade :D). Aber wenn hier nichts mehr kommt, werd ichs wahrscheinlich so machen.

          oder eine Template Engine wie z.B. Smarty weil _______________?

          Toll. Wenn ich sowas wie Smarty nehme, brauch ichs ja nicht selbst bauen :/

          Gruß,
          Take

          1. Hallo!
            Also ich würde an das Problem gar nicht so direkt herangehen.
            Denn wenn du irgendwann tausende eigene Tags hast, würden dir auch tausende RegEx um die Ohren fliegen.
            Du solltest am besten die HTML-Struktur analysieren (das natürlich mit RegEx) und die Baumstuktur in ein Array ablegen. Also immer mit Knoten-Id und Parent-Id. Dann kannst du zu den einzelnen Konten noch Dinge wie Tag-Name, Attribute und Inhalt definieren.
            Anschließend muss man nur noch den Baum durchwandern und anhand der sauber hinterlegten Eigenschaften einen komplett neuen Baum generieren.

            Das wäre mein Ansatz. Es ist selbstverständlich viel Arbeit das alles selber zu machen, du lehnst die fertigen Lösungen ja ab.

            Ich weiß nicht ob es eine viel einfachere und schnellere Lösung gibt. Wenn dem so ist veröffentlicht sie hier hoffentlich jemand.

            Clemens

            1. Moin,

              Hallo!
              Also ich würde an das Problem gar nicht so direkt herangehen.
              Denn wenn du irgendwann tausende eigene Tags hast, würden dir auch tausende RegEx um die Ohren fliegen.
              Du solltest am besten die HTML-Struktur analysieren (das natürlich mit RegEx) und die Baumstuktur in ein Array ablegen. Also immer mit Knoten-Id und Parent-Id. Dann kannst du zu den einzelnen Konten noch Dinge wie Tag-Name, Attribute und Inhalt definieren.
              Anschließend muss man nur noch den Baum durchwandern und anhand der sauber hinterlegten Eigenschaften einen komplett neuen Baum generieren.

              Genau so mache ich das doch... Den RegEx, den ich gepostet habe, trifft auf _alle_ Framework-Tags zu (Schließend, Öffnend, Selbstschließend), welcher Typ jetzt vorliegt, kann ich später mit einem ähnlichen RegEx herausfinden. So erzeuge ich die von dir angesprochene Baumstruktur. Mein Problem ist aber, dass ich in meinem Kopf grad keine Vorstellung habe, wie ich einen Tag umsetzen kann, der seinen Inhalt über etwas Bestimmtes (z.B. alle Seiten oder einfach nur die Zahlen 1-10) iterieren lässt.

              Gruß,
              Take

              1. Hi!

                Mein Problem ist aber, dass ich in meinem Kopf grad keine Vorstellung habe, wie ich einen Tag umsetzen kann, der seinen Inhalt über etwas Bestimmtes (z.B. alle Seiten oder einfach nur die Zahlen 1-10) iterieren lässt.

                Du willst also foreach und for nachbauen.

                Lo!

                1. Moin,

                  Du willst also foreach und for nachbauen.

                  Nicht unbedingt. Im Hintergrund läuft da natürlich schon ein for(-each), aber eben über den Inhalt des Tags.

                  Gruß,
                  Take

                  1. Hi!

                    Du willst also foreach und for nachbauen.
                    Nicht unbedingt. Im Hintergrund läuft da natürlich schon ein for(-each), aber eben über den Inhalt des Tags.

                    Dein Elemente soll veranlassen, dass ein foreach oder for läuft. Wie du das syntaktisch hinbekommst, kannst du dir bei der foreach- und for-schleife abschauen, zumindest, welche Parameter benötigt werden. Das einfachste ist foreach. Da brauchst du eine iterierbare Menge, die du übergeben musst und einen Schleifenkörper, in dem mindestens das aktuelle Element angesprochen werden kann. Zusätzlich dessen Key, wenn die zu iterierende Menge Keys hat. Das for braucht im einfachsten Fall einen Range und den Delta-Wert, um den in-/dekrementiert werden soll. Oder du gehst den Python-Weg, da gibt es nur eine for-Schleife, die die Funktionalität einer foreach-Schleife hat. Für die for-Funktionalität nimmt man die Funktion range(), die eine Menge iterierbarer Werte liefert, über die die for(each)-Schleife laufen kann.

                    Wie du nun siehst, fängt das System an, komplex zu werden. Und da ist die Frage, ob man statt des Erlernens der Syntax deiner Elemente nicht genausogut die Kontrollstrukturen PHPs erlernen kann, und mit denen man sogar, wenn man will, flexibler ist als mit deinem Nachbau.

                    Lo!

                    1. Moin,

                      Wie du nun siehst, fängt das System an, komplex zu werden. Und da ist die Frage, ob man statt des Erlernens der Syntax deiner Elemente nicht genausogut die Kontrollstrukturen PHPs erlernen kann, und mit denen man sogar, wenn man will, flexibler ist als mit deinem Nachbau.

                      Ihr habt mich überzeugt... :D Wahrscheinlich werd ich sowieso der einzige sein, der das benutzt. Ich hatte mir halt ursprünglich überlegt, dass es mit meinem Ansatz sicherer ist, da nicht jeder beliebige PHP-Code in den Seiten ausgeführt wird.

                      Gruß,
                      Take

              2. Moin!

                Mein Problem ist aber, dass ich in meinem Kopf grad keine Vorstellung habe, wie ich einen Tag umsetzen kann, der seinen Inhalt über etwas Bestimmtes (z.B. alle Seiten oder einfach nur die Zahlen 1-10) iterieren lässt.

                Hast du dir denn schon angesehen, wie andere das machen? Smarty wurde ja schon erwähnt. Da wäre evtl. die Methode _compile_foreach_start der Klasse Smarty_Compiler (in der Datei Smarty_Compiler.class.php) interessant. So wie ich das sehe baut Smarty aus den Angaben auch wieder nur eigentlichen PHP-Code, wo wir wieder bei der Rotandor genannten Methode wären.

          2. Hi,

            oder eine Template Engine wie z.B. Smarty weil _______________?

            Toll. Wenn ich sowas wie Smarty nehme, brauch ichs ja nicht selbst bauen :/

            richtig, selber bauen ist immer löblich. Manchmal sogar sehr gut, um dann auf was fertiges umzusteigen.

            Trotzdem musst oder kannst du bei den fertigen Sachen trotzdem dein eigenes CMS bauen. PHP und Smarty sind ja auch nur Bausteine, da gibts noch gewaltig viel zu tun!

            Ist halt immer die Frage: lohnt sich das wirklich? Ist es vielleicht nicht besser, gleich ein Framework wie CakePHP oder Zend zu erlernen, um damit ein CMS zu bauen. Oder gleich ein CMS zu erlernen?

            Wo willst du hin? Schnell gute Websites bauen? Nimm ein existierendes Framework oder ein CMS. Selbst ein CMS basteln... geht meistens schief. Keine Community, keine Tester, womöglich noch nicht mal Anwender. Aus Spaß vielleicht...

    1. Moin,

      http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html

      Kenn ich doch ;) Ich parse aber kein HTML, sondern (praktisch) nur XML (die Framework-Tags), die HTML-Sachen lass ich komplett außen vor. Und bei Fehlern schmeißt das Script sofort alles hin und terminiert sich selbst :p

      Gruß,
      Take

      1. Moin!

        http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html

        Kenn ich doch ;) Ich parse aber kein HTML, sondern (praktisch) nur XML (die Framework-Tags), die HTML-Sachen lass ich komplett außen vor. Und bei Fehlern schmeißt das Script sofort alles hin und terminiert sich selbst :p

        Ja, aber das Parsen von XML ist ein gelöstes Problem, insbesondere wenn du deine eigenen Tags in einen eigenen schönen Namensraum legst. Und es erfordert keine Regexe.

        - Sven Rautenberg

        1. Moin,

          Ja, aber das Parsen von XML ist ein gelöstes Problem, insbesondere wenn du deine eigenen Tags in einen eigenen schönen Namensraum legst. Und es erfordert keine Regexe.

          Toll. Wenn ich jetzt z.B. PHPs XML Parser nehme, dann schmeißt der mir nen Haufen Fehler um die Ohren, weil in dem zu Parsenden Code auch noch der (möglicherweise hochgradig invalide) HTML-Code des Framework-Benutzers drin ist. Der soll den Parser aber nicht intressieren. Außerdem löst das nicht mein Problem mit dem Schleifen-Tag, das ich in meiner ursprünglichen Nachricht angesprochen habe, denn das was der XML-Parser leistet, leistet mein Parser auch schon.

          Gruß,
          Take