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

Content Management Systeme (CMS) für Webseiten

Ziele des Content Managements

Heutzutage übliche Vorstellung

Aber was ist mit Leuten, die...

... 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

Kleines Beispiel: WML gleich HTML

Input: Output: 1| <HTML> 1| <HTML> 2| <BODY> 2| <BODY> 3| foobar baz 3| foobar baz 4| 4| 42 5| 42 5| </BODY> 6| </BODY> 6| </HTML> 7| </HTML>

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

  1. Optionaler externer Filter (Prolog)

  2.  
  3. Pass: Include Preprocessor (ipp)
  4. Pass: Macro Processor for HTML Documents (mp4h)
  5. Pass: Embedded Perl 5 Language (eperl)
  6. Pass: GNU M4 (gm4)
  7. Pass: Divert (divert)
  8. Pass: Area Subst (asubst)
  9. Pass: HTML Fix (htmlfix)
  10. Pass: HTML Strip (htmlstrip)
  11. Pass: Slice (slice)

  12.  
  13. 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 <category/foobar.wml> #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| <define-tag foo>bar</define-tag> 1| bar 2| <foo> Input: Output: 1| <set-var foo="bar"> 1| bar 2| <get-var foo> Input: Output: 1| <define-tag test whitespace=delete> 1| yes 2| <if %0 "yes" "no"> 2| no 3| </define-tag> 4| 5| <test "string"> 6| <test ""> Input: Output: 1| foobar 1| foobar 2| <comment>Kommentar</comment> 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/ä/&auml;/g]] 1| B&auml;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| &auml;&ouml;&uuml; 2| <isolatin> 3| äöü 4| </isolatin> Input: Output: 1| #use wml::fmt::isolatin global 1| &auml;&ouml;&uuml; 2| äöü

Pass 7: HTML Fix

Pass 8: HTML Strip

Pass 9: Slice

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

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:

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

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 $