METAL Anweisungen
METAL Anweisungen
Die Terminale und Regeln sind in EBNF aufgeführt. Eine Beschreibung für Anweisungen in der Atribut-Sprache findet sich in AttributeLanguage.
Die folgenden TAL 1.0 Anweisungen werden benötigt: define-macro, use-macro, define-slot und use-slot. Jede Anweisung wird unten zusammen mit seiner Syntax noch genauer beschrieben. Obwohl METAL nicht die Syntax von ‚expression’-Nichtterminalen definiert – dies ist Implementierungsspezifika – wird eine kanonische ‚expression’-Syntax für METAL-Argumente in TALES Specification 1.0 beschrieben.
define-macro
Syntax:
argument ::= Name
Um ein Makro zu definieren, muß zuerst ein Name für das Makro festgelegt und dann das ‚define-macro’-Attribut zum Dokumentelement hinzugefügt werden – mit dem Name als Argument. Der Unterbaum des Elements ist der Rumpf des Makros. Ein Beispiel:
<p metal:define-macro=“copyright“>Copyright 2002,
<em>Foobar</em> Inc.</p>
use-macro
Syntax:
argument ::= expression
Um ein Makro anzuwenden, muß zuerst das Dokumentenelement ausgewählt werden, das ersetzt werden soll. Man fügt ein ‚use-macro’-Attribut hinzu, und setzt als Wert des Attributs einen Ausdruck, der die Makrodefinition zurückliefert. Für gewöhnlich ist der Ausdruck ein Pfad oder eine Template Id und ein Makroname. Es ist wichtig zu verstehen, daß dieser Ausdruck unabhängig von jeglichem TAL-Kommando ausgewertet wird, um somit auch nicht davon abhängen kann.
Bemerkung: Page Templates verwenden TALES für diesen Ausdruck, und es können alle Standardnamen des Kontexts verwendet werden. Da die Sammlung von Makrodefinitionen nach außen über das Attribut ‚macros’ verfügbar gemacht werden, kann auf einzelne Makros auch einfach zugegriffen werden. Ein Beispiel:
<hr/>
<p
metal:use-macro=“here/master-page/macros/copyright“>
<hr/>
Makro-Entfaltung
Der Effekt einer Makro-Entfaltung ist das Einpflanzen eines Unterbaums eines anderen Dokuments oder von irgendwo aus dem aktuellen Dokument an die Stelle, wo das Anweisungselement steht. Dabei wird der bestehende Unterbaum ersetzt. Teile davon können als Unterbaum des neuen bestehen bleiben, wenn das Makro Slots enthält. Werden im Rumpf eines Makros weitere Makros verwendet, so werden diese zuerst entfaltet.
Wenn ein Makro entfaltet wird, wird das ‚define-macro’-Attribut durch das ‚use-macro’-Attribut aus dem Anweisungselement ersetzt. Dadurch wird die Wurzel des entfalteten Makros ein gültiges ‚use-macro’-Anweisungselement.
define-slot und fill-slot
Syntax:
argument ::= Name
Makros sind noch viel nützlicher, wenn man Teile von ihnen während der Benutzung überschreiben kann. Beispielsweise könnte man eine komplizierte Tabelle mit jeweils verschiedenem Inhalt wiederverwenden wollen. Nun wäre es möglich, die Tabellendaten irgendwo im Template zu speichern, eine Variable dafür zu deklarieren, und die Variable dann irgendwo im Rumpf des Makros zu verwenden. Damit wird allerdings die Präsentationsstruktur verletzt; die gewünschten Zelleninhalte würden in der Tabelle nicht gesehen werden können.
Um Elemente im Rumpf des Makros überschreibbar zu machen, müssen an der jeweiligen Stelle ‚define-slot’-Attribute eingefügt und als Wert einen Slotnamen zugewiesen bekommen. Egal wo das Makro verwendet wird, man wählt einfach die entsprechenden Unterelemente des Anweisungselements aus, und fügt ein ‚define-slot’-Attribut hinzu und setzt es auf den Namen eines Slots. Wenn das Makro entfaltet wird, ersetzen die ‚fill-slot’-Elemente die ‚define-slot’-Elemente im Rumpf derjenigen Makros, die den selben Slotnamen verwenden.
Slotnamen müßen innerhalb eines Makros und innerhalb einer Makroanwendung eindeutig sein. Es ist jedoch erlaubt, in einem Makro einen Slot zu definieren aber nicht zu füllen. Dies hat dann einfach zur Folge, daß die Standard-Inhalte der Slotdefinition in das Makro kopiert werden. Bezieht sich eine ‚fill-slot’-Anweisung auf einen Slot der im Rumpf des Makros nicht gefunden werden kann, verursacht dies einen Fehler. Es folgt ein Beispiel:
erstes Dokument:
<table metal:define-macro=“sidebar“>
<tr><th>Links</th></tr>
<tr><td
metal:define-slot=”links”>
<a href=”/”>Ein Link</a>
</td></tr>
</table<
zweites Dokument:
<table
metal:use-macro=”here/doc1/macros/sidebar”>
<tr><th>Links</th></tr>
<tr><td metal:fill-slot=”links”>
<a href=”http://www.goodplace.com”>Guter
Platz</a>
<a href=”http://www.badplace.com”>Schlechter
Platz</a>
<a href=”http://www.otherplace.com”>Anderer
Platz</a>
</td></tr>
</table>
Man beachte, daß im zweiten Dokument, welches das Makro aus dem ersten Dokument verwendet, den ganzen Code des Sidebar-Makros enthält außer den Slot namens ‘links’. Das kommt daher, daß das Makro jedesmal eingefügt wird, wenn das zweite Dokument editiert wird.






