Definition eigener XML-Tags | ab Version 3 |
Code:
<h1>Meine Datenbank</h1> <do action=all>
Wie bei diesem Beispiel (durch den grauen Hintergrund) möchte man diese Code-Teile herausstellen; es ist übersichtlicher und sieht besser aus. Hinzu kommt: Darin enthaltene HTML-Tags sollen NICHT ausgeführt, sondern inklusive der < und >-Zeichen dargestellt werden. Dazu ist die Umwandlung in < bzw. > nötig.
Der Quelltext des obigen HTML-Abschnitts sieht also auf der Seite so aus:
<b>Code:</b> <div style="background:#f0f0f0;padding:8px"><pre> <h1>Meine Datenbank</h1> <do action=all> </pre></div>
Ohne XML-Parser darf man all dies jedesmal per Hand machen - ein extrem mühsamer und fehleranfälliger Weg (Wobei man sicherlich einiges in eine CSS-Klassendefinition auslagern könnte, dies sei hier allerdings dem Beispiel geschuldet). Hinzu kommt: Entschliesst man sich irgendwann die Darstellung zu ändern, so darf man dies an allen entsprechenden Stellen im Text erledigen. Und noch ein Vorteil: Durch mehrere unterschiedliche Definitionen für das neue "code"-Tag lässt sich aus ein und derselben Quelldatei die Ausgabe für verschiedene Formate erzeugen, z.B. einmal für HTML, einmal für WAP, einmal als reiner Text für EMails.
So, jetzt zur Praxis:
Mit den neuen XML-Funktionen von baseportal ist es jetzt möglich folgendes zu schreiben:
und baseportal erzeugt automatisch das gewünschte Drumherum und ersetzt die < und >-Zeichen.
Dabei ist der Name des neuen Tags "code" völlig frei gewählt, ebenso wie die Funktionalität, wie wir im folgenden sehen werden. Übrigens existiert ein Tag namens "code" bereits im HTML-Standard, es hat aber ausser einem anderen Zeichensatz ("Schreibmaschinenschrift", diesen Effekt kann man ebenso mit <tt>..</tt> erreichen) üblicherweise keine andere Wirkung. Hier sieht man eine weitere Eigenschaft der neuen Tags: Neuere Definitionen können ältere überlagern, auch bestehende HTML-Tags können neu definiert werden - wer mag, kann sogar die baseportal-internen Tags wie do, loop, include oder perl umschreiben. ;-)
Wie sieht nun die Definition der Funktionalität des neuen Tags aus? Oder anders: Was soll es machen?
Die Definition ist ganz einfach:
<b>Code:</b><div style="background:#f0f0f0;padding:8px"><pre>$_</pre></div>
Wichtig ist das $_: Stösst baseportal bei der Analyse eines Templates (dem sog. "Parsing") auf das Tag "code" setzt es den vom <code>...</code> umschliessenden Text an die Stelle der Definition an der das $_ steht. Dann setzt es das komplette Ergebnis an die Stelle des "code"-Tag im Template.
Hier der Ablauf im Detail:
1. baseportal "entdeckt" das Tag code:
2. Der umschlossene Text wird $_ zugewiesen...
<h1>Meine Datenbank</h1> <do action=all>
3. ...und an der Stelle von $_ in die Definition des code-Tags eingefügt:
<b>Code:</b><div style="background:#f0f0f0;padding:8px"><pre> <h1>Meine Datenbank</h1> <do action=all> </pre></div>
4. Der ganze resultierende Text wird jetzt an der Stelle des Tags eingefügt:
Ein Beispiel. <b>Code:</b><div style="background:#f0f0f0;padding:8px"><pre> <h1>Meine Datenbank</h1> <do action=all> </pre></div> Weiter mit normalen HTML...
5. baseportal sucht weiter nach definierten Tags, ab der Stelle nach dem eingefügten Text, also genau 1 Zeichen nach dem ...</pre></div>.
Nun könnte man sich wünschen, für verschiedene Code-Teile verschiedene Texte auszugeben. Dies erreicht man mit Parametern:
baseportal übernimmt die Analyse und Bereitstellung der Parameter. Diese sind als einfache Variablen in der Tag-Definition verfügbar:
<b>$title:</b><div style="background:#f0f0f0;padding:8px"><pre>$_</pre></div>
Das ist alles... ;-) baseportal setzt an die Stelle der Variablen automatisch die übergebenen Parameter.
Allerdings stellt sich hier ein Problem: Wenn nun KEINE Parameter angegeben werden, wird für die Variablen NICHTS eingesetzt, es steht also ein <b>:</b>, was unschön aussieht und sicher nicht gewollt ist. Ausserdem will man ja für die Standard-Fälle weiterhin nur <code> ohne Parameter angeben können. Man benötigt also Standard-Werte, falls nichts übergeben wurde. Das lässt sich mit einer eigenen Programmierung erledigen.
Man ist nicht auf einfache Ersetzungen angewiesen, sondern -wie in baseportal üblich- kann auch hier eine komplette Programmierung eingesetzt werden. Das komplette obige Beispiel für das "code"-Tag sieht z.B. so aus:
s/</</g; s/>/>/g; $title="Code" if $title eq ""; out "<b>$title</b><div style=\"background:#f0f0f0;padding:8px\"><pre>$_</pre></div>"
Der Reihe nach:
s/</</g;
Dies ist eine (einfache) "Regular Expression" mit Ersetzung ("Substitute"). Es bedeutet: "Suche ein <-Zeichen und ersetze es mit <. Mach dies mit allen <-Zeichen (durch das g am Ende, es bedeutet global)".
Normalerweise muss man die Variable auf die diese Ersetzung wirken soll vorne dran schreiben, z.B. so:
$text=~ s/</</g;
Da es sich aber um die Variable $_ handelt, kann man dies auch weglassen: $_ ist eine "besondere Variable" - sie wird immer dann verwendet wenn man man eben keine Variable angibt. So kann man prägnantere Programme schreiben.
Der nächste Befehl ersetzt entsprechend alle >-Zeichen mit >. Die zweite Zeile füllt den Parameter $title mit "Code" falls er leer ist. Der letzte Befehl bestimmt den Text der als Ersatz dienen soll. Er wird mit dem baseportal-typischen out ausgegeben.