![]() |
Niklas Deutschmann
|
|
| |
| E-Mail: | |
|---|---|
| Homepage-URL: |
Schreiben Sie mir ruhig, wenn Sie Fragen oder Verbesserungsvorschläge haben!
Es kann allerdings vorkommen, dass ich etwas Zeit zum Antworten brauche.
Einige Beispiele in diesem Artikel basieren auf Code von der
WML-Homepage
Laden Sie die Beispiele herunter:
Beispieldateien als ZIP
Achtung: Wenn Sie Informationen zur Seitenbeschreibungssprache für WAP-Handys suchen, sind Sie auf dieser Seite falsch. Diese Sprache heißt leider auch WML!
Vielleicht kennen Sie das Problem: Sie entwickeln ein größeres Web-Projekt und möchten auf jeder Seite ein einheitliches Layout haben. Also entwickeln Sie eine Template-Seite, die diejenigen Elemente enthält, die auf jeder Seite gleich sind. Diese Seite kopieren und überschreiben Sie immer dann, wenn Sie dem Projekt eine neue Seite hinzufügen. Aber was machen Sie, wenn Sie nachträglich am Template etwas ändern möchten? Sie müssen wahrscheinlich jede davon abgeleitete Seite einzeln bearbeiten.
Ein anderes Problem: Eine bestimmte Formatierung kommt immer wieder vor und Sie möchten diese gerne zentral definieren, so dass Sie schnell Änderungen vornehmen können. Bei einfachen Elementen können Sie dafür CSS verwenden, aber diese Methode scheitert spätestens dann, wenn zusammen mit der Formatierung sich auch Inhalte wiederholen. Es wird vielmehr eine Methode benötigt, um das Grundgerüst einer Seite oder einzelner Elemente automatisch zu generieren, wobei nur die veränderlichen Teile als "Parameter" übergeben werden.
Vielleicht möchten Sie auch eine Seite in mehreren Sprachversionen schreiben. Das Layout ist überall exakt dasselbe, nur die Texte unterscheiden sich. Vielleicht möchten Sie aber auch abhängig von der Sprache verschiedene Grafiken einbinden, wie z.B. Buttons mit Beschriftungen in der passenden Sprache oder Flaggen als Symbole für die jeweils anderen Sprachversionen.
Alle diese Beispiele sollen ein wesentliches Problem der Sprache HTML deutlich machen: HTML ist für die Beschreibung eines einzelnen Dokuments gedacht, es fehlen Elemente oder Tags, die die Verwaltung eines größeren Projekts mit mehreren Dokumenten erleichtern. Es gibt keine Modul-Fähigkeit wie in den meisten Programmiersprachen, wo Sie häufig vorkommende Teile als eigenes "Paket" schreiben und dann einbinden können.
Abhilfe für dieses Problem kann von mehreren Seiten kommen. Wenn Sie einen eigenen Webserver betrieben, können Sie
Server Side Includes
verwenden. Damit stecken sie wiederkehrende Elemente, wie z.B. die Navigationsleiste,
in eine eigene Datei, die sie überall einbinden können.
Cascading Style Sheets (CSS)
erlauben es, wie schon erwähnt,
Formatierungen zentral zu definieren. Teurere HTML-Editoren haben teilweise eigene Projektmanagementfunktionen, so
dass sie dort z.B. Seiten-Templates anlegen können.
Wünschenswert wäre jedoch eine Lösung, die transparent in die HTML-Dateien integriert werden kann, mit jedem Editor
funktioniert, keinen eigenen Webserver benötigt und keine zusätzlichen, proprietären Dateiformate verwendet.
Gerade an diesem Punkt setzt das Tool
Website Meta Language (WML)
von Ralf S. Engelschall an. Es besteht aus einem
Präprozessor, der einige in die HTML-Datei geschriebene Anweisungen und Tags vorverarbeitet und erst daraus eine
reine HTML-Datei erzeugt. Genauer gesagt, besteht WML sogar aus 9 (!) Filterprogrammen, die nacheinander
abgearbeitet werden. Damit wird es z.B. möglich,
Include-Dateien zu verwenden,
aus einer Seite mehrere
Sprachversionen zu erzeugen, oder
eigene Tags zu definieren.
Ganz nebenbei werden auch noch so nützliche Aufgaben wie das Umschreiben von Umlauten und das Hinzufügen von Größenangaben
zu Bildern übernommen.
Dieser Artikel soll einige Features dieser "Metasprache" vorstellen und demonstrieren, dass es sich dabei um eine extrem flexible Lösung für die Verwaltung größerer Webprojekte handelt. Es ist sicherlich etwas Einarbeitungszeit nötig, aber dafür bieten sich fast unbeschränkte Möglichkeiten für jeden Webdesigner, der vor dem Bearbeiten von Textdateien und vor Kommandozeilenwerkzeugen nicht zurückschreckt. Oder, wie der Autor von WML selbst sagt:
"It operates as a powerful offline HTML generation toolkit for webmasters. While not trivial and idiot proof it provides most of the features real hackers always wanted for HTML generation."
WML ist ein Programmpaket, das für diverse Unix-Systeme verfügbar ist und unter der GNU General Public License (GPL) steht. Es entspricht auch genau der Unix-Philosphie, mehrere kleine Programme zu verknüpfen, die eine genau definierte Aufgabe verrichten. Die Eingabedatei wird nacheinander von 9 Filterprogrammen verarbeitet:
| Programm | typische Features |
|---|---|
1. Include-Präprozessor (ipp) |
Verarbeitung von Include-Dateien |
2. HTML-Makros (mp4h) |
Definiton eigener Tags |
3. Eingebetter Perl-Interpreter (eperl) |
Ausführung beliebiger Perl-Funktionen |
4. m4-Makros (gm4) |
eine weitere Möglichkeit zur Definition von Makros |
5. Umleitungs-Filter (divert) |
Umordnen von Datenbereichen in der Ausgabeseite |
6. Zeichen- und String-Ersetzung (asubst) |
Ersetzungsoperationen wie z.B. das Codieren von Umlauten |
7. HTML-Fixup (htmlfix) |
Ersetzen veralteter Tags, Hinzufügen von Größenangaben bei Bildern |
8. Komprimierung der Ausgabe (htmlstrip) |
Entfernen überflüssiger Zeilen und Leerzeichen |
9. Aufteilen der Ausgabe (slice) |
Schreiben mehrerer HTML-Dateien aus einer Quelltextdatei |
Aus dieser Beschreibung wird sicherlich schon klar, dass es sich bei WML um ein mächtiges Werkzeug handelt, dass man nicht "mal eben kurz" verwenden kann. WML ist auch sicher nicht für eher grafisch orientierte Webdesigner geeignet, die ihre HTML-Seiten am Windows-PC oder Macintosh mit dem WYSIWYG-Editor zusammenklicken. Es ist vielmehr das perfekte Programm für alle, die schon etwas Erfahrung mit den Kommandozeilenwerkzeugen von Unix gesammelt haben und jetzt nervtötende Routineaufgaben bei der Entwicklung eines größeren Webprojekts dem Computer überlassen wollen.
Fangen wir jetzt mit einem ersten kurzen Beispiel an.
Anmerkung: WML laden Sie am besten von der
WML-Homepage herunter. Dort finden Sie
die Quelltextarchive und auch Binärpakete für einige Linux-Distributionen. Dieser Artikel kann leider
keine Einführung in die Installation von Software unter Unix sein, lesen Sie bei weiteren Fragen
bitte die README-Dateien oder die Dokumentation auf der WML-Homepage.
<html><head> #include "metatags.wmi" <title>Beispiel für Include-Dateien</title> </head> <body>Der kleine grüne Frosch springt über den großen blauen Zaun.</body> </html>
<meta name="author" content="Niklas Deutschmann"> <meta name="description" content="erstes Beispiel für Include-Dateien"> <meta name="keywords" content="HTML, WML, Website Meta Language, Webdesign, Projektmanagement">
Die Datei meta-include.wml bindet durch die #include-Anweisung die Datei
metatags.wmi im gleichen Verzeichnis ein, in der die Meta-Informationen
zum Dateiinhalt wie Autor, Stichworte usw. stehen. Das bedeutet, dass
Sie zukünftig die Meta-Informationen in eine eigene Datei schreiben können,
die dann automatisch in viele HTML-Seiten eingefügt werden kann!
Mit wml -o meta-include.html meta-include.wml erzeugen Sie daraus die fertige
HTML-Datei meta-include.html. Mit Include-Dateien können Sie aber noch
mehr anstellen:
<html> <head><title>Beispiel für Include-Dateien mit Parametern</title></head> <body> Eine völlig überflüssige Seite ohne jeden Inhalt.<br> #include "footer.wmi" mailadr="blabla@hahaha.com" </body> </html>
<hr> Verfasserin dieser Seite: <a href="mailto:$(mailadr)">Susi Schlumpf</a>, letzte Änderung: 27.01.2002
Bei einer Include-Anweisung können sie mit #include "dateiname" variable=wert auch Parameter übergeben.
In diesem Beispiel wird eine E-Mail-Adresse als Parameter an eine Include-Datei übergeben, die die Fußzeile der
HTML-Datei darstellt. Der Inhalt der Variablen mailadr wird in der Include-Datei
mit $(mailadr) eingefügt.
Parameter für Include-Dateien müssen jedoch nicht nicht unbedingt in der WML-Datei definiert werden. Sie können auch mit der
Option -D variable=wert auf der Kommandozeile übergeben werden:
wml -D mailadr=blabla@hahaha.com -o footer-include.html footer-include.wml
Außerdem können Sie in dem Verzeichnis, in dem die WML-Datei liegt, auch eine zentrale Konfigurationsdatei .wmlrc
anlegen, mit folgendem Inhalt:
-D mailadr=blabla@hahaha.com
WML liest diese Datei ein und setzt die darin enthaltenen Optionen so, als ob sie auf der Kommandozeile angegeben worden wären.
Es gibt noch mehr Möglichkeiten im Umgang mit Include-Dateien, als in diesem Artikel vorgestellt werden können.
Variablen können sich an den aktuellen Verzeichnispfad anpassen, d.h. sie können automatisch um
einen Pfad relativ zu einem Wurzelverzeichnis verlängert werden.
Beim Einfügen von Variablen kann auch der Fall behandelt werden, dass der Variableninhalt nicht definiert ist, d.h. es sind
Standardwerte und sogar richtige if-then-else-Konstruktionen möglich. Ein Beispiel
für die Verwendung von Standardwerten sehen Sie im
Kapitel "Projekt-Templates".
Häufig kommt es bei größeren Websites vor, dass eine bestimmte Formatierung oder eine bestimmte Kombination von HTML-Elementen auf vielen verschiedenen Seiten immer wieder vorkommt. In solchen Fällen ist es praktisch, die sich wiederholenden HTML-Tags als eine Art Textbaustein oder Makro an zentraler Stelle einmal zu definieren und dann das Makro als einen neues Tag zu benutzen. Dadurch werden die Seiten auch wesentlich übersichtlicher.
Mit WML können sehr einfach eigene Tags definiert werden. Einfachstes Beispiel ist die Erstellung eines Textbausteins für die eigene E-Mail-Adresse:
<define-tag my_email whitespace=delete> <a href="mailto:blah@blubb.de">blah@blubb.de</a> </define-tag> <html> <head><title>Definition eines Textbausteins</title></head> <body> Meine E-Mail-Adresse: <my_email> </body> </html>
Mit define-tag my_email wird ein neues Tag mit dem Namen my_email angelegt.
whitespace=delete bedeutet, dass Leerzeichen am Anfang und Ende der Tag-Definition sowie
Zeilenumbrüche nicht übernommen werden.
Eigene Tags können selbstverständlich auch mit Parametern versehen werden. Als nächstens entwickeln
wir ein Tag <extlink> für externe Links, das wir für alle externen
Links verwenden, damit diese in einem neuen Fenster geöffnet werden:
<define-tag extlink whitespace=delete endtag=required> <a href="%0" target="_blank">%body</a> </define-tag> <html> <head><title>Definition eines Tags mit Parametern</title></head> <body> <extlink "http://de.selfhtml.org">Link zu SELFHTML</extlink> </body> </html>
Das Tag extlink hat nicht nur einen Parameter (die Link-Adresse), sondern benötigt
auch einen Text, der zwischen öffnendem und schließendem Tag steht. Dies wird durch
die Option endtag=required ausgedrückt. Innerhalb der Tag-Definition kann dann mit
%body auf den eingeschlossenen Text und mit %0, %1 usw.
auf die Parameter zugegriffen werden.
Zum Schluss noch ein längeres Beispiel. Wir möchten ein Tag für die Beschreibung eines Programms auf einer Shareware-Seite entwickeln. Die Beschreibung soll aus einer Tabelle bestehen, bei der im linken Teil das Programm-Icon erscheinen soll. Der rechte Teil soll mehrere Zellen enthalten, in der der Name des Programms, eine Beschreibung, der Download-Link und der Link auf die Homepage des Autors stehen.
<define-tag extlink whitespace=delete endtag=required>
<a href="%0" target="_blank">%body</a>
</define-tag>
<define-tag software-description whitespace=delete endtag=required>
<preserve icon name download homepage />
<set-var %attributes />
<table border="0">
<tr>
<td rowspan="4" width="40">
<img src="<get-var icon />" width="32" height="32" vspace="10" hspace="10">
</td>
<td><b><get-var name /></b></td>
</tr>
<tr>
<td>%body</td>
</tr>
<tr>
<td><a href="<get-var download />">Download</a></td>
</tr>
<tr>
<td><extlink "<get-var homepage />">Homepage der Software</extlink></td>
</tr>
</table>
<restore icon name download homepage />
</define-tag>
#include "sw-descr.wmi" <html><head><title>Beispielseite für komplexe Makros</title></head> <body> <software-description icon="sw-icon.gif" name="NoteTab Light" download="http://www.notetab.ch/ftp/ntfree.zip" homepage="http://www.notetab.ch"> Ein flexibler Texteditor für Windows 9x/NT </software-description> </body> </html>
In diesen Beispiel sehen wir, wie ein Tag mit benannten Attributen definiert werden kann. Bei Tags mit mehreren
Attributen ist es wesentlich übersichtlicher, wenn wir nicht raten müssen, für was jetzt das erste, zweite usw.
Attribut steht. In HTML haben Attribute auch Namen, wie z.B. in <img src="julia.gif"
alt="meine Schwester Julia" width="120" height="260">. Das gleiche ist
auch bei selbstdefinierten Tags möglich. Zuerst müssen wir erreichen, dass innerhalb der Tag-Definition die
Attribute als "lokale Variablen" zur Verfügung stehen. Das wird durch die folgenden
beiden Zeilen erreicht:
<preserve icon name download homepage />
<set-var %attributes />
Die preserve-Anweisung ist für jedes Attribut erforderlich, hier also für icon,
name, download und homepage. Mit der set-var-Anweisung wird
ein Array mit den lokalen Variablen angelegt.
Danach können wir mit <get-var attr /> auf den Inhalt des Attributs attr zugreifen.
Der Schrägstrich am Ende des Tags gehört zur XML-Syntax, sie kann bei den Tags, die Anweisungen für den
HTML-Makroprozessor darstellen, verwendet werden, um den Unterschied zu normalen HTML-Tags deutlich zu machen.
Weiter unten wird in der Definition von software-description das vorher definierte Tag
extlink benutzt. In der Definition eigener Tags können also auch schon woanders definierte eigene
Tags verwendet werden!
Am Ende einer Tag-Definition, die Attribute verwendet, ist schließlich noch folgende Zeile für jedes Attribut
attr nötig:
<restore attr />
Wie bei der preserve-Anweisung können wir auch hier statt <restore attr1 />,
<restore attr2 />, ... auch <restore attr1 attr2 ... /> schreiben.
Wie Sie an diesem Beispiel sehen, können wir schon mit den bisher bekannten Techniken die Verwaltung komplexer, häufig wiederkehrender HTML-Elemente bei großen Webprojekten stark vereinfachen. Die bis jetzt vorgestellten Funktionen gehen bereits weit über das hinaus, was mit CSS, Server Side Includes oder grafischen HTML-Editoren möglich ist.
Bis jetzt fehlt uns noch eine bequeme Möglichkeit, ein längeres Stück mitten in ein Template hineinzuschreiben. Wenn wir ein vorgefertigtes Seitenlayout mit Seitenkopf und Fußzeile haben wollen, müssen wir für beide Teile je eine Include-Datei definieren, diese am Anfang und am Ende der Seite einfügen und dazwischen den variablen Inhalt unterbringen. Es gibt jedoch noch eine elegantere Möglichkeit:
<html>
<head><title>$(title:-Homepage von Udo Schlumpf)</title></head>
<body>
{#CONTENT#}
<hr>
Copyright © 2000-2005 Udo Schlumpf, <a href="mailto:$(email:-schlumpf@blubb.com)">E-Mail</a>
</body>
</html>
{#CONTENT#:
#include "page-template.wmi" Hi Fans,<br> Leider ist diese Seite noch leer :-(
In der Include-Datei erreichen wir mit {#CONTENT#}, dass an dieser Stelle der Inhalt
des Datenbereichs CONTENT eingefügt wird. Dieser Datenbereich
wird aber erst später mit Inhalt "gefüllt", nämlich nach der Zeile {#CONTENT#:.
dass hier die schließende geschweifte Klammer fehlt, ist kein Fehler, sondern weist WML an, alle nach
dieser Zeile gelesenen Zeilen als Inhalt für den Datenbereich CONTENT aufzufassen.
Um genau zu verstehen, was hier passiert, muss man das Ebenenkonzept von WML kennen
(siehe Kapitel "so arbeitet WML"). Die Include-Datei wird schon vom Include-Prozessor,
also im ersten Durchlauf, eingefügt. Die Anweisungen für die Verarbeitung von Datenbereichen werden
dagegen erst in Schritt 5 (divert-Filter) ausgewertet. Das bedeutet, wenn dieser Filter
aktiv wird, ist der Inhalt von page-template.wmi schon eingefügt worden und
CONTENT wird mit dem Inhalt von page-template.wml, der nach der
#include-Zeile kommt, aufgefüllt.
Zusätzlich zur Definition von Projekt-Templates sehen Sie in diesem Beispiel auch, wie
in Include-Dateien bei undefinierten Variablen Standardwerte verwendet werden können. Mit dem
Ausdruck $(var:-ein Text) wird der Inhalt von var eingefügt,
falls dieser definiert ist, ansonsten "ein Text" (ohne die Anführungszeichen!).
Zur Standardbibliothek von WML gehört bereits ein Tag <page>, das ein Template
für eine leere Seite anlegt. Dafür muss mit #include wml::std::page die Include-Datei, in
der dieses Tag definiert ist, eingefügt werden. Um eine neue Seite mit einem Titel anzulegen, verwenden
wir ab sofort also folgende Notation:
#include wml::std::page <page title="Noch eine sinnlose Seite ohne Inhalt"> <!-- Ab hier dann der Inhalt //-->
Nähere Einzelheiten dazu können in der
WML-Dokumentation
nachgelesen werden.
Für eine Seite mit mehreren Sprachversionen brauchen wir noch eine Methode, um aus einer WML-Datei
mehrere Ausgabeseiten zu erzeugen. Genau dies leistet das letzte Filterprogramm, durch das
eine WML-Datei bei der Übersetzung geschickt wird. Der slice-Filter erlaubt es, abhängig
von zuvor definierten Teilabschnitten mehrere HTML-Seiten zu erzeugen. Und so funktioniert es in der Praxis:
#!wml -o (ALL-LANG_*)+LANG_EN:multilang_en.html -o (ALL-LANG_*)+LANG_DE:multilang_de.html #use wml::std::page #use wml::std::lang <lang:new id=en short> <lang:new id=de short> <page> <h1><en: Welcome><de: Willkommen>!</h1> <en> This is Susi Schlumpf's home page.<br> And here is a silly link: </en> <de> Das ist die Homepage von Susi Schlumpf.<br> Und hier ist ein blödsinniger Link: </de> <a href="<lang:star: multilang_*.html>"><lang:star: multilang_*.html></a>
Um diese Seite zu übersetzen, benutzen wir nicht das Programm wml, sondern
rufen wmk -f multilang.wml auf. wmk ist eigentlich für das Übersetzen ganzer
Projekte zuständig, ählich wie make bei einem C-Compiler. Mit der Option
-f dateiname kann wmk aber auch nur eine Datei übersetzen. Der Clou dabei ist,
dass wmk für die angegebene Datei wml mit den Optionen ausführt, die
in der ersten Zeile der WML-Datei hinter den Zeichen #! angegeben sind:
#!wml -o (ALL-LANG_*)+LANG_EN:multilang_en.html -o (ALL-LANG_*)+LANG_DE:multilang_de.html
Diese Zeile bedeutet, dass zwei HTML-Dateien, multilang_en.html und
multilang_de.html, erzeugt werden sollen. Die Datei multilang_en.html
soll dabei aus denjenigen Teilen der WML-Datei bestehen, die entweder in keinem definierten
Sprachabschnitt - (ALL-LANG_*) - oder innerhalb des EN-Abschnitts
stehen, der hier mit LANG_EN bezeichnet werden muss. In der deutschen
Ausgabedatei multilang_de.html landet analog dazu alles, was entweder in keinem
definierten Abschnitt steht oder im DE-Abschnitt.
Die Sprachabschnitte werden dann mit dem in der WML-Standardbibliothek vorhandenen Makro
<lang> definiert. Beachten Sie, dass die Abschnittsnamen auf der Kommandozeile
in Großbuchstaben angegeben werden müssen, auch wenn in der restlichen WML-Datei Kleinbuchstaben
verwendet werden! Nun können Sie den Namen eines Abschnitts wie ein normales Tag verwenden, um die
sprachabhängigen Teile ihrer Seite zu kennzeichnen. Es gibt auch eine Kurzform ohne schließendes
Tag, die in diesem Beispiel innerhalb des h1-Tags verwendet wird. Die mit diesen Tags
markierten Teile werden dann nur in die dafür auf der Kommandozeile angegeben Ausgabedateien
geschrieben.
In der letzten Zeile des Beispiels sehen Sie noch eine Möglichkeit, wie man einen Dateinamen passend zur
jeweiligen Sprachversion erzeugt. Das Makro <lang:star> erzeugt aus seinem Parameter einen Block
für jedem Sprachabschnitt und ersetzt das Zeichen "*"
jeweils durch den Namen des Abschnitts.
Mit dieser Funktion von WML können wir jetzt auch die kleinsten Textschnipsel in einer HTML-Seite,
z.B. Meta-Tags, Alternativ-Texte bei Bildern und Links "internationalisieren". Natürlich
können wir die Abschnitte nicht nur benutzen, um verschiedene Sprachversionen zu schreiben, sondern
auch um z.B. aus einer WML-Datei eine grafische Version und eine Textversion einer Seite zu erstellen.
Abschnitte können auch ineinander geschachtelt sein oder sich überlappen. Auf der Kommandozeile
können mit den Abschnitten beliebige Mengenoperationen durchgeführt werden
(Schnitt, Vereinigung, Differenz usw.) um zu bestimmen, was in welche Datei geschrieben werden soll.
Auch hier finden Sie die Feinheiten in der
WML-Dokumentation.
Um an den Anwender automatisch die passenden Sprachversion auszuliefern, kann entweder
eine
.htaccess-Datei
eingesetzt werden, oder man behilft sich mit
JavaScript.
Einen großen Teil von wml haben wir bis jetzt ausgelassen:
Den integrierten Perl-Interpreter (eperl), der im Übersetzungsschritt 3 aufgerufen wird.
Dieser Interpreter ermöglicht es, in die WML-Datei beliebigen Perl-Code zu schreiben, dessen Ausgabe
dann in der HTML-Datei erscheint. Eine einfache Anwendung dafür besteht z.B. darin, immer
das Datum der letzten Änderung (Übersetzung der WML-Datei) in die HTML-Seite zu schreiben:
#include wml::std::all
<perl>
sub get_date {
my ($time) = @_;
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isds) = localtime($time);
my ($str) = sprintf("%02d.%02d.%04d, %02d:%02d:%02d", $mday, $mon+1, $year+1900, $hour, $min, $sec);
return $str;
}
</perl>
<define-tag print_date>
<:= &get_date(time()) :>
</define-tag>
<page title="Demoseite für Perl-Funktionen">
Letzte Änderung am: <print_date>
Anmerkung: Perl sollten Sie natürlich beherrschen, um ePerl richtig auszunutzen, wenn nicht, finden Sie z.B. bei
SELFHTML im Kapitel über
CGI/Perl eine Einführung.
Im <perl>-Block steht der Code einer Funktion, die Datum und Uhrzeit ermittelt und
in einem String formatiert zurückgibt. Auch das <perl>-Tag ist schon in der
WML-Standardbibliothek definiert. Die Zeile
<:= &get_date(time()) :>
gibt dann das Ergebnis von get_date aus. Wir verwenden nicht direkt die Perl-Funktion
print, da diese bei ineinander verschachtelten WML-Makros im Zusammenspiel mit
dem Perl-Interpreter merkwürdige Ergebnisse produzieren kann, die sehr schwer zu debuggen sind.
Näheres dazu wiederum in der
WML-Dokumentation.
Obwohl gerade eine WML-Datei mit eingebetteten Perl schnell zu einem kryptischen Zeichensalat wird, eröffnen sich damit auch völlig neue Möglichkeiten, die hier alle nur angedeutet werden können:
wml::imp::fsview).
wml::fmt::pod und wml::fmt::sdf)
gfont
Schriftzüge als Grafiken ausgibt.
Der Funktionsumfang von WML ist so groß, dass viele weitere Features hier nur kurz angedeutet werden können:
asubst) können Zeichen- und Stringersetzungen durchgeführt werden. Das wird z.B.
vom <isolatin>-Tag aus der Standardbibliothek ausgenutzt, das in dem von ihm eingeschlossenen
Text Umlaute durch ihre HTML-Codes ersetzt (z.B ä durch ä).
<center> durch
<div align="center">) und schließlich
die HTML-Datei durch Entfernen überflüssiger Zeilenumbrüche und Leerzeichen komprimiert.
<protect>-Tag eingeschlossenen Teile der WML-Datei werden vor der Interpretation
geschützt - wahlweise auch nur vor der Interpretation durch eine Stufe.
Die Nachteile von WML sollen auch nicht ganz verschwiegen werden:
sitecopy oder CVS werden nicht direkt unterstützt. Es fehlt auch eine zufriedenstellende
Verwaltung einer Hierarchie von HTML-Seiten. Eine solche Hierarchie könnte z.B. in
der .wmlrc definiert werden und würde das automatische Einfügen von Links zur
nächsten/vorherigen/übergeordneten Seite ermöglichen.
WML ist ein äußerst mächtiges Werkzeug für die automatische Generierung von HTML-Code und die Verwaltung komplexer Websites. Der Funktionsumfang sieht zuerst furchterregend aus, aber die Möglichkeiten der einzelnen Filterprogramme können unabhängig voneinander erschlossen werden, so dass man schon mit der Benutzung weniger Funktionen viel erreichen kann. Um an WML Freude zu haben, sollte man etwas Unix-Erfahrung mitbringen und die Philosophie dieses Betriebssystems kennen und mögen.
Links:
WML-Homepage
Hier finden Sie immer die neueste Version, die gesamte Doku, ein Tutorial, Beispielseiten und vieles mehr.
gFont-Homepage
Ein Zusatzprogramm für WML, mit dem man Schriftzüge dynamisch als Grafik erzeugen kann.
GTML
Ein anderer HTML-Präprozessor, mit geringerem Funktionsumfang.
Artikel über WML im Linux-Magazin 06/98
Eine kurze Einführung ähnlich wie diese hier.
noch ein Artikel über WML im Linux-Magazin 08/01
Noch eine Einführung.
"Web Factory" der ETH Zürich
Enthält Links auf Sites, die mit WML erstellt wurden.