Ein Blog-Beitrag besitzt immer auch mindestens eine Überschrift, eine Einleitung und optional einen Haupttext. Um solche Bedingungen auszudrücken, gibt es in XHP das Schlüsselwort
»children
«
.
Listing 10
zeigt ein Beispiel für seine Verwendung. Dort muss ein
»admin:beitrag
«
mindestens eine
»admin:ueberschrift
«
und eine
»admin:einleitung
«
haben. Die Notation orientiert sich hier an regulären Ausdrücken.
Listing 10
Festlegen erlaubter Kindelemente
Tabelle 1 führt alle Operatoren auf, die XHP versteht. Bei der Verarbeitung prüft XHP diese Bedingungen und bricht ab, wenn sie nicht zutreffen. Gemäß Listing 10 würde
Tabelle 1
Operatoren für <C>children<C>
Symbol |
Bedeutung |
---|---|
? |
Kein oder ein Element |
* |
Kein oder mehrere Elemente |
+ |
Eine oder mehrere Elemente |
| |
Oder (eine der links und rechts von
» |
, |
Die mit Komma aufgelisteten Elemente müssen in genau dieser Reihenfolge auftauchen |
any |
Beliebige Kindelemente sind erlaubt |
empty |
Keine Kindelemente sind erlaubt |
<admin:beitrag> <admin:ueberschrift /> <admin:einleitung /> </admin:beitrag>
durchgehen, die vergessene Einleitung
<admin:beitrag> <admin:ueberschrift /> </admin:beitrag>
jedoch nicht. Die XHP-Entwickler weisen explizit darauf hin, dass der zugrunde liegende Algorithmus "greedy" vorgeht. Die Bedingung
»children (:elem*, :elem);
«
führt daher zu einem Fehler: Das
»*
«
erschlägt bereits alle
»:elem
«
, ein weiteres
»:elem
«
danach kann es folglich nicht mehr geben.
Muss man sehr viele Elemente aufzählen, kann man sich die Arbeit mit Elementkategorien vereinfachen. In
Listing 11
gehören
»admin:retweet
«
und
»admin:tweet
«
der Kategorie
»admin:twitterkategorie
«
an.
»admin:twitter
«
wiederum darf beliebig viele Kindelemente besitzen, die aber aus der Kategorie
»admin:twitterkategorie
«
stammen müssen.
Listing 11
Einsatz von Elementkategorien
Die Klassen
»x:element
«
und
»x:primitive
«
definiert die Datei
»code.php
«
. Die in ihnen abgelegten Kommentare bieten auch die einzig existierende Referenzdokumentation. In der Datei
»html.php
«
finden sich hingegen Klassen für alle HTML-Elemente,
»:ul
«
kümmert sich etwa um die gleichnamige Liste. Die Datei
»html.php
«
definiert übrigens auch die Klasse
»x:doctype
«
, die wiederum die bereits erwähnte HTML5-Dokumenttypdefinition
»<!DOCTYPE html>
«
repräsentiert. Klassen für andere Doctypes, wie etwa für XHTML, muss man derzeit noch selbst erstellen.
Die Dokumentation von XHP lässt noch zu wünschen übrig. Eine Einführung liefert die Datei README.textile aus dem Quellcode-Archiv, die man auch auf Github zu Gesicht bekommt [1] . Darüber hinaus gibt es noch ein karges Wiki [3] und die Blog-Beiträge des Facebook-Entwicklers Stefan Parker [4] . Er verrät dort unter anderem, wie man CSS-Code mit XHP recht elegant parametrisiert [5] .
XHP vereinfacht nicht nur die Programmierung, sondern auch gleichzeitig das Filtern von Eingaben. So achtet XHP auf eine korrekte Verschachtelung, unbekannte Elemente besitzen keine Ausgaben und Ausdrücke in geschweiften Klammern
»{ ... }
«
laufen direkt durch
»htmlspecialchars()
«
. Darüber hinaus ist XHP recht penibel und prangert beispielsweise vergessene oder falsche End-Tags an. Schließlich lassen sich über eigene Elemente und Tags schnell Bausteine für ein Template-System erstellen.
Andererseits kostet die Umwandlung der Tags in Objekte Rechenzeit, je nach Code und Auslastung sogar massiv. Laut eines Kommentars im Quellcode von XHP rechnen die Entwickler sogar damit, dass das Cache-System APC als Beschleuniger zum Einsatz kommt [6] , [7] . Administratoren müssen zudem die Erweiterung selbst kompilieren, anbieten und warten – was nicht alle Webhoster erlauben. Schlussendlich hängt die verbesserte Lesbarkeit stark vom (HTML-)Code ab. So sind die Unterschiede zwischen Listing 1 und Listing 2 nicht sehr groß.
Infos