Website Meta Language
Webseiten generieren nach Unix-Art
Linux-Info-Tag 2005 Dresden
29. Oktober 2005, 11:15 Uhr, Dritter Saal
Axel Beckert
<abe@noone.org>
http://noone.org/abe/
Übersicht
- Übersicht
- Content Management Systeme für Webseiten: Ziele,
Vorstellungen
- Die Website Meta Language - Was ist das
- Die Benutzerschnittstellen
- Die neun Filter im Detail
- Externe Filter
- Weitere Features
- Was WML nicht kann
- Zusammenfassung
- Bekannte, mit WML generierte Webseiten
- Links
- Danke
Content Management Systeme (CMS) für Webseiten
Ziele des Content Managements
- Einheitliche Gestaltung, Trennung von Inhalt und Layout
- Einfache, übersichtliche und schnelle Änderung von
Inhalten
- Rechtesystem für die Komponenten der Webseiten
- Nachvollziehbarkeit und Versionierung von Änderungen
Heutzutage übliche Vorstellung
- Server-basiert, Datenbank als Backend (z.B.
PHP +
Typo3 +
MySQL)
- Inhalte werden per Webbrowser gepflegt
- WYSIWYG-HTML-Editoren in JavaScript (z.B.
TinyMCE)
- Benutzer sind dumm und haben keine Ahnung
Aber was ist mit Leuten, die...
- keinen dicken Webserver haben,
- HTML können,
- vollständige Kontrolle über den HTML-Code haben wollen,
- HTML mit ihrem Lieblingseditor (vi, Emacs, ...) bearbeiten
wollen
... und die aber trotzdem eine einfache, schnelle und
übersichtliche Handhabung der Inhalte, ein einheitliches Design
und deswegen Trennung von Inhalt und Layout wollen?
WML - Die Website Meta Language
WML ist eine einerseits sehr einfach zu verwendende und auf der
anderen Seite sehr mächtige Markup-Sprache, die die Erstellung von
HTML-Seiten durch Makros, Templates und die Automatisierung lästiger,
immer wieder vorkommende Arbeiten massiv erleichtert.
Sie besteht aus einer sehr gut auf einander abgestimmten Sammlung von
Werkzeugen zur statischen und damit server- und client-unabhängigen
Generierung von (nicht notwendigerweise statischen) HTML-Seiten.
"While not trivial and idiot proof WML provides most of the core
features real hackers always wanted for HTML generation."
WML
- steht unter der GNU General Public License (GPL),
- läuft auf fast allen Unices
(Linux, *BSD, Solaris, etc.),
- beinhaltet zwei Benutzerschnittstellen (Frontends), neun Filter
(Backends), eine eigene Bibliothek von Include-Files mit
"higher-level features", Schnittstellen zu weiteren Filtern,
- ist klassische Unix-Philosophie: alles "einfache" Filter, die
zusammen sehr mächtig sind, viel wiederverwendeter Code
(m4, ePerl, etc.), gängiges Kommandozeilen-Interface,
- sollte nicht mit WML, der "Wireless Markup Language" des
WAP-Forums oder der "Wesnoth Markup Language" verwechselt
werden.
Kleines Beispiel: WML gleich HTML
Input: Output:
1| 1|
2| 2|
3| foobar baz 3| foobar baz
4| 4| 42
5| 42 5|
6| 6|
7|
Die Benutzerschnittstellen
> wml -O3 -DFOO=bar foobar.wml -o foobar.html
> touch foobar.wml
> wmk
/usr/local/bin/wml -n -o foobar.html foobar.wml
Die Filter: Übersicht
- Optionaler externer Filter (Prolog)
- Pass: Include Preprocessor (ipp)
- Pass: Macro Processor for HTML Documents (mp4h)
- Pass: Embedded Perl 5 Language (eperl)
- Pass: GNU M4 (gm4)
- Pass: Divert (divert)
- Pass: Area Subst (asubst)
- Pass: HTML Fix (htmlfix)
- Pass: HTML Strip (htmlstrip)
- Pass: Slice (slice)
- Optionaler externer Filter (Epilog), z.B.
HTML Tidy
Pass 1: Include Preprocessor
Beispiele:
#include "foobar.wml" BAR=baz
#include "/path/to/category/foobar.wml"
#include
#include "*.wml"
#use category::foobar
# Kommentar
Zeilen über mehrere \
Zeilen hinweg führen.
$(BAR:-foo)
$(BAR)
$(BAR:=foo)
$(BAR)
Kommandozeile:
wml -I/path/to test.wml
Pass 2: Macro Processor for HTML Documents
Input: Output:
1| bar 1| bar
2|
Input: Output:
1| 1| bar
2|
Input: Output:
1| 1| yes
2| 2| no
3|
4|
5|
6|
Input: Output:
1| foobar 1| foobar
2| Kommentar 2| baz
3| baz
Pass 3: ePerl
ePerl bietet die Möglichkeit, Perl-Schnipsel in beliebige Dateien
einzubinden.
Input: Output:
1| foo<: print 3+5; :>bar 1| foo8bar
2| foo<:=3+5:>bar 2| foo8bar
Pass 4: GNU M4
Der Makro-Prozessor GNU m4, wie er für Makro-Funktionaltät
in den Konfigurationsdateien vieler Unix-Programme verwendet wird
(z.B. sendmail, fvwm, etc.)
Input: Output:
1| define(`foo', `Hello world.') 1| Hello world.
2| foo
Pass 5: Divert
Erlaubt die beliebige Reihenfolge von Elementen. Sehr mächtig
zusammen mit ipp.
Input: Output: | inc.wml: Input:
|
1| {#HEAD#} 1| Header | 1| {#HEAD#} 1| #include "inc.wml"
2| {#BODY#} 2| Body | 2| {#BODY#} 2| Body Zeile 1
3| {#FOOT#} 3| Footer | 3| {#FOOT#} 3| Body Zeile 2
4| | 4|
5| {#FOOT#: | 5| {#FOOT#: Output:
6| Footer | 6| Footer
7| :##} | 7| :##} 1| Header
8| {#HEAD#: | 8| {#HEAD#: 2| Body Zeile 1
9| Header | 9| Header 3| Body Zeile 2
10| :##} | 10| :#}# 4| Footer
11| {#BODY#: | 11| {#BODY#:
12| Body |
Pass 6: Area Subst
Input: Output:
1| {: [[s/ä/ä/g]] 1| Bäh!
2| Bäh!
3| :}
Zusammen mit ipp und divert bzw. ipp und
mp4h sind z.B. so nette WML-Features wie die beiden folgenden
möglich:
Input: Output:
1| #use wml::fmt:isolatin 1| äöü
2|
3| äöü
4|
Input: Output:
1| #use wml::fmt::isolatin global 1| äöü
2| äöü
Pass 7: HTML Fix
- Fügt WIDTH und HEIGHT Parameter zu IMG-Tags hinzu, wo nicht
bereits vorhanden.
- Fügt ALT-Parameter zu IMG-Tags hinzu.
- Ändert
<CENTER>...</CENTER>
zu
<DIV ALIGN="center">...</DIV>
.
- Fügt fehlende Hochkommata um die Werte von Tag-Attributen:
foo=bar
wird zu foo="bar"
.
- Korrigiert falsch deklarierte Farbwerte in Attributen wie
z.B.
COLOR="FFFFFF"
zu
COLOR="#FFFFFF"
.
- Rückt Paragraphen ein (mittels
<INDENT N=X
S=Y>
)
- Schnelles Auskommentieren von HTML-Tags:
<A# HREF="foo">bar</A>
wird zu
bar
.
- Einheitliche Groß- oder Kleinschreibung aller
HTML-Tags.
Pass 8: HTML Strip
- Optimiert HTML hinsichtlich redundanter Leerzeichen, Leerzeilen,
etc.
- Verschiedene Optimierungsstufen
- Beachtet
<PRE>...</PRE> und Co.
Pass 9: Slice
- Speichern verschiedener (sich ggf. auch überschneidende)
Abschnitte in verschiedene Ausgabe-Dateien.
- Gestattet die einfache Implementierung verschiedener
(ähnlicher) Varianten eines Dokumentes, z.B. verschiedener
Sprachen, Type-Maps, Header-Dateien, etc.
foobar.txt:
1| Sprache: [DE:Deutsch[EN: Beides :DE]English:EN]
Kommando(s):
slice -o EN+UNDEF:foobar.en.txt -o DE+UNDEF:foobar.de.txt foobar.txt
wml -o EN+UNDEF:foobar.en.txt -o DE+UNDEF:foobar.de.txt foobar.txt
Ergebnis:
foobar.en.txt:
1| Sprache: Beides English
foobar.de.txt:
1| Sprache: Deutsch Beides
Externe Filter
WML kann vor und hinter seine Filterkette noch weitere, externe
Programme als Filter einbinden.
Prolog
> wml -P input-filter.sh foo.wml
Der Prolog-Filter bekommt den Quellcode per STDIN übergeben und WML
erwartet den vom Filter modifizierten Quellcode auf STDOUT.
Epilog
> wml -E output-filter.sh foo.wml
Für bestimmte Programme (z.B. HTML
Tidy) kennt WML die entsprechenden Parameter, um sie direkt auf
den Output anzuwenden. Andere angegebene Programme bekommen den
Dateinamen der Ausgabe-Datei als Parameter.
Weitere Features
- Auswertung von Shebang-Zeilen, auch mit wmk:
#!wml -DTITLE=Foobar -E tidy
$HOME/.wmlrc
, $HOME/.wmkrc
,
(../)*.wmlrc
und (../)*.wmkrc
<PROTECT PASS="1">#blafasel</PROTECT>
- Automatisch gesetzte, in vielen Passes verfügbare
Variablen:
WML_SRC_FILENAME
,
WML_SRC_TIME
, WML_SRC_USERNAME
,
WML_GEN_TIME
, WML_GEN_USERNAME
,
WML_VERSION
, etc.
Was WML nicht kann
WML ist mächtig, flexibel und bietet sehr viele
Möglichkeiten, aber es ist trotzdem keine eierlegende
Wollmilchsau. Manche Dinge können andere Programme einfach besser
und entsprechend sollte man sie auch diesen überlassen:
- Versionierung: CVS,
Subversion, etc.
- Webseiten dynamisch erzeugen:
PHP,
Embperl,
Template Toolkit,
AxKit,
HTML::Mason,
Zope, etc.
- Perl woanders als in HTML oder XML einbetten:
ePerl,
Embperl, etc.
- HTML-Syntax-Check: HTML Tidy,
W3C Validator,
Weblint, etc.
- Benutzer verwalten: Betriebssystem, Access Control Lists, etc.
Zusammenfassung
Wer gerne Webseiten von Hand gestaltet, weil man dabei volle Kontrolle
über den HTML-Code hat, wer sich gerne auf der Kommandozeile
bewegt, viel mit Pipes arbeitet und ein wenig Perl kann, der wird mit
WML sicher viel Spaß haben und auf die Dauer auch viel Zeit
sparen.
Bekannte, mit WML generierte Webseiten
Links
Danke
- Ralf S. Engelschall und Denis Barbier für WML
- Werner Heuser für den Tritt in den Hintern, sich endlich
mal aufzuraffen und einen Vortrag über WML zu machen sowie
für erste Ideen. ;-)
- Lou Montulli, Michael Grobe und Charles Rezac für
Lynx
- dem Debian-Projekt für
Debian GNU/Linux
Letzte Änderung an den Quellen: 2005-10-29 18:31:57
Letzte Generierung: 2005-11-18 23:02:22
Generiert von abe@bijou
mit WML 2.0.8 (30-Oct-2001)
$Id: wml-lit+berlinux2005.wml 37 2005-10-29 16:31:56Z abe $