Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   Programmierung und Datenbanken (https://boardunity.de/programmierung-datenbanken-f23.html)
-   -   What about Templatescripting? (https://boardunity.de/what-about-templatescripting-t1463.html)

exe 30.05.2004 23:34

Zitat:

Zitat von Reimer
Aber auch ich habe ein paar Probleme damit hatte und ich deswegen auf ebenso auf die eval-Variante umgestiegen bin.

Die Grammatik ist gut :D

Zitat:

Zitat von codethief
Mir ist eben noch eine Frage gekommen:
Funktionieren diese REGEXP eigentlich auch noch, wenn man {if} verschachtelt, mehrere {if}'s hintereinander oder sogar beides im Template hat?

Mehrere if-Konstrukte hintereinander sind kein Problem, Rekursion unterstützt dieser reguläre Ausdruck nicht.
Man kann zwar mit regulären Ausdrücken auch rekursive Muster finden, allerdings ist das dann ein bisschen aufwändiger.

Patrick Gotthardt 31.05.2004 08:14

Ich hab ja schon unzählige TemplateEngines geschrieben. Einige davon auch mit Template-Scripting.
Und ich muss ehrlich sagen, dass meine mir alles bieten was ich brauche, dabei aber (der Parser) nicht auf über 100 Zeilen kommt.
@Reimer: Und da ist eine Funktion zum Formatieren eines Timestamps, bzw. auslesen der aktuellen Tageszeit mit drin.
Cache usw. ebenfalls, If-Abfragen und der Aufruf von PHP-Funktionen (nebenher noch Variablen und das einbinden von Dateien).
Also im Prinzip ne ganze Menge in ziehmlich wenig Zeilen.

Aber für meinen Geschmack ist auch das schon wieder zuviel.

Was Schleifen in Templates betrifft... generell nicht schlecht, aber ich mag allzu große Templates auch nicht.
Ich bin momentan gezwungen mit Smarty zu arbeiten (als "Designer" - nicht als Programmierer) und ich finde es einfach schrecklich.
Leider hat der Autor des Programmes vergessen, dass Smarty Kommentare anbietet, wodurch der Smarty-Code für mich wirklich schwerer durchzuarbeiten ist, als es der Code vom wBB jemals war (nimm's nicht persönlich, frederic).

Zitat:

wahrscheinlich bessere Performence, da man sicherlich so viele Funktionen wie bei Smarty oder so garantiert nicht einbauen wird
Nö. Das ist ja einer der Vorteile von Smarty. Es gibt quasi keinen Performance-Nachteil, da die Templates einfach cached werden (wie es der PHP Interpreter auch mit deinen PHP-Dateien macht).
Die Templates werden in reines PHP/HTML umgewandelt. Mehr nicht.

Zitat:

Man kann zwar mit regulären Ausdrücken auch rekursive Muster finden
Direkt mit dem RegEx? Das ist mir noch nie geglückt. Ich jage meist die Funktion zum ersetzen von If-Abfragen nochmal über die Teile der If-Abfragen.

codethief 31.05.2004 11:01

@exe: Sicher? Schließlich sind Regexp von Geburt aus greedy (gierig) wodurch beispielsweise folgendes passieren würde:

Code:

{if $var == "meineVar"}
hier kommt irgendwas hin
{/if}

{if $name == "meinName"}
hier auch
{/if}

Der Regexp "schnappt" sich das {if $var == "meineVar"} aus der 1. Zeile und das {/if} aus der letzten, wodurch er, wenn $var == "meineVar" true ergibt, das Ganze:
Code:

{if $var == "meineVar"}
hier kommt irgendwas hin
{/if}

{if $name == "meinName"}
hier auch
{/if}

durch

Code:

hier kommt irgendwas hin
{/if}

{if $name == "meinName"}
hier auch

ersetzen würde. Oder etwa nicht?
Wenn er nicht greedy sein soll, müsste man als Modifier U hinzufügen.


Und diese Rekursion kann man IMHO nicht nur durch einen Regexp lösen, wenn doch, hätte ich gerne ein Beispiel. :)


Bis dann,

codethief

Patrick Gotthardt 31.05.2004 11:36

Die RegExp sind ungreedy. ;)

.*? = .* (mit U)

codethief 31.05.2004 11:44

Achso? Wusste ich ja noch gar nicht...
Danke, man lernt hier jeden Tag mehr. :)



PS: Hab mal eine Frage - ich will bei der nächsten Version meiner Forensoftware Languagevars benutzen und will nun in jedem Template, bevor es benutzt wird, die $language-Variablen durch ihren Wert ersetzen, damit ich in selbigen auch Variablen benutzen kann:

$temp = preg_replace("/\$language\[(.*)\]/eU", "\$language['\\1']", $temp);

Aber das funktioniert jetzt irgendwie nicht mehr (früher hat's damit immer geklappt). :(

[EDIT]: Irgendwie bin ich nicht richtig ausgeschlafen: das \ vor $language war falsch, entweder \\\ oder den String in 's fassen.



Bis dann,

codethief

exe 31.05.2004 17:05

Zitat:

Zitat von codethief
@exe: Sicher? Schließlich sind Regexp von Geburt aus greedy (gierig) wodurch beispielsweise folgendes passieren würde:

Wie TDM schon sagte macht das Fragezeichen (alternativ der U Modifier) die + und * Quantifier ungreedy.

Zitat:

Zitat von TheDragonMaster
Direkt mit dem RegEx? Das ist mir noch nie geglückt. Ich jage meist die Funktion zum ersetzen von If-Abfragen nochmal über die Teile der If-Abfragen.

Zitat:

Zitat von codethief
Und diese Rekursion kann man IMHO nicht nur durch einen Regexp lösen, wenn doch, hätte ich gerne ein Beispiel. :)

Die PCRE-Bibliothek in PHP unterstützt rekursive Muster, siehe http://www.php.net/manual/en/pcre.pattern.syntax.php Abschnitt "Recursive patterns".
Direkt benutzt habe ich es noch nicht da man die verschachtelten if/else-Konstrukte zwar auslesen kann, man dann aber immernoch die einzelnen Anweisungen voneinander Trennen muss da man eben nur das komplette if/else-Konstrukt mit allen Verschachtelungen als ganzes auslesen kann.

Patrick Gotthardt 31.05.2004 20:00

Na ja. Da bleibe ich lieber dabei die einzelnen Zweige nochmal zu parsen. ;)

Philipp Gérard 01.06.2004 00:08

Zum Thema:

* http://www.massassi.com/php/articles/template_engines/
* http://www.massassi.com/bTemplate/benchmarks/

Und wenn wir schon dabei sind:

* http://www.sitepoint.com/forums/atta...achmentid=6772

exe 01.06.2004 02:57

Interessante Links, danke :)
Den ersten Artikel kannte ich schon, aber die anderen beiden sind mir neu.

Patrick Gotthardt 01.06.2004 07:32

Na ja. Kannte den ersten ebenfalls. Hätte mich fast in's schwanken gebracht, damals. ;)

Den letzten Link werde ich mir bei Zeiten nochmal genauer durchlesen.

Wenn XML von den Browsern besser supported wäre bräuchte man keine Template-Engine.
Dann würde man die Ausgaben einfach in XML machen und den Kunden die Möglichkeit geben eine XSLT- oder CSS-Datei zu modifizieren... naja... aber das scheint ja noch etwas zu dauern.

Philipp Gérard 01.06.2004 11:51

Nein, die XML/XSLT-Lösung funktioniert bereits.

Patrick Gotthardt 01.06.2004 12:15

Ich bin zwar kein Fan davon, aber irgendwo muss man ja auch an die älteren Browser denken, oder?


Aber eigentlich hast du recht... ich könnt mal was mit XML als Ausgabe basteln. :)

BTW: Sicher, dass das XSS heißt?

codethief 01.06.2004 16:16

@TheDragonMaster:
Hm, ich komm irgendwie auf keine allzu sinnvolle Lösung - wie hast du das denn gelöst?

Patrick Gotthardt 01.06.2004 16:49

Ich hab momentan auch keine "Up-To-Date"-Variante mehr.
Zumindest keine getestete. ^^"

Generell musst du aber nur nochmal den If-Parser über die Zweige der Bedingungen drüber jagen.
Das sollte schon reichen.

TRS 05.08.2004 17:03

Übrigens scheint die REGEX für Elseanweisungen noch etwas verbugt zu sein. Die Runtime beim Output meiner Website ist mit der else-REGEX 2,8s, ohne 0,02s.

codethief 22.08.2004 12:43

Hallo,
mit verschachtelten IF's hab ich's jetzt auch hinbekommen, aber sicherlich ganz anders als vermutet:
Ich habe mit strpos, substr() und substr_replace() jedem IF eine ID zugewiesen, wobei jede else bzw. /if-Anweisung die ID des letzten IF's bekommt. Dies geschieht beim ersten Laden des Templates.
Anschließend (wenn man das Template ausgeben will) wird der folgende REGEXP drüber gejagt:
/\{if (\d+) (.*)\}(.*)\{else \\1\}(.*)\{\/if \\1\}/sieU
bzw.
/\{if (\d+) (.*)\}(.*)\{\/if \\1\}/sieU

wobei \\1 die ID ist, die jeden "If-Tag" identifiziert und somit einzigartig macht.


Ich möchte nun aber auch Schleifen einbauen, also beispielsweise foreach.
Das Problem ist, dass man auch If in Schleifen verwenden können soll und umgekehrt (also Schleifen zwischen {if ...} und {/if}.
Wenn ich das aber nacheinander parse (also nacheinander einen REGEXP für If und danach einen für Schleifen drüberjage), dann funzt If in Schleifen nicht. Wenn ich erst Schleifen parsen würde und dann If würde wiederum Schleifen zwischen {if} und {/if} nicht funktionieren.

Hat jemand eine Idee, wie man das lösen könnte?

MrNase 03.10.2004 09:17

Ich hol das Thema nochmal hoch weil es für mich grade Interessant wird ;)

Ich hab leider komplett die Übersicht verloren deswegen wäre es für mich ganz nützlich wenn mir jemand kurz nochmal das komplette, funktionierende Script posten könnte :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 Uhr.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25