Ein weiteres wichtiges Hilfsmittel sind die Modi. Für unterschiedliche Ansichten eines Dokuments empfiehlt es sich, einen Modus zu definieren. Übliches Beispiel ist ein Inhaltsverzeichnis. Es zeigt eigentlich auch das gesamte Dokument, mit dem Unterschied, dass außer den Überschriften alles fehlt.
<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN"> ; =========== Jade-Besonderheiten: (declare-flow-object-class element "UNREGISTERED::James Clark//Flow Object Class::element") ; =========== Funktion zum Duplizieren der Attribute (define (copy-attributes #!optional (nd (current-node))) (let loop ((atts (named-node-list-names (attributes nd)))) (if (null? atts) '() (let* ((name (car atts)) (value (attribute-string name nd))) (if value (cons (list name value) (loop (cdr atts))) (loop (cdr atts))))))) ; =========== Regel für den HTML-Rumpf (element BODY (make element gi: "BODY" attributes: (copy-attributes) (make sequence (make element gi: "H1" (literal "Inhaltsverzeichnis")) (make element gi: "OL" (with-mode inhalt (process-children))) (process-children)))) ; =========== Modus Inhalt ; erzeugt Links auf die Überschriften (mode inhalt (element H1 (make element gi: "LI" (make element gi: "A" attributes: (cons (list "HREF" (string-append "#" (number->string (child-number)))) '()) (literal (data (current-node)))))) ; Vorgabe: Verarbeite alle H1-Elemente (default (process-node-list (select-elements (descendants (current-node)) "H1"))) ) ; =========== normaler Modus ; erzeugt Name-Anker (element H1 (make element gi: "H1" (make element gi: "A" attributes: (cons (list "NAME" (number->string (child-number))) '()) (process-children)))) ; =========== Vorgabe für alle anderen Elemente (default (make element attributes: (copy-attributes)))
Nach dem Verweis auf die Style-Sheet-DTD von James Clark und das von ihm stammende Flow Object element enthält das Listing zunächst die Funktion copy-attributes. Sie bewirkt, dass eventuelle Attribute im Quelltext 1 : 1 in die Ausgabe übernommen werden. Am Ende des Listings ist sie in die default-Regel aufgenommen worden; dadurch wird sie für jedes Element genutzt, für das keine explizite Angabe existiert, was mit ihm zu geschehen hat.
Zu sehen ist sie auch in der Definition für den
BODY. Innerhalb dieses
Elements wird eine Folge von Flow Objects erzeugt: eine
Überschrift mit dem String Inhaltsverzeichnis
und
eine geordnete Liste. In letzterer findet sich der Aufruf:
(with-mode inhalt (process-children))
der die Kindelemente nicht auf die übliche Weise verarbeitet, sondern dazu die Funktion (den Modus) inhalt benutzt. Darin (direkt im Anschluß) wird für jede Instanz des Elements H1 ein für die geordnete Liste notwendiges LI erzeugt, innerhalb dessen mittels A eine Referenz zum Kapitel steht. Die wiederum erzeugt
(string-append "#" (number->string (child-number))))
So enthält der Verweis neben dem Hashzeichen die zu
einem String gewandelte Zahl, die benennt, um das wievielte
Element seiner Art (H1) es
sich beim gegenwärtigen handelt. Die zum Modus gehörende
default-Regel bringt zum
Ausdruck, welche Elemente verarbeitet werden
sollen. Anschließend an den Modus folgt die normale
Verarbeitung eines Elements H1.