# Die Datei HTML.trans benutzen

Dieses Dokument ist eine Einführung zu dem von Amaya bereitgestellten Mechanismus der strukturierten Transformation. Es beschreibt die Syntax der Transformationssprache und wie Transformationen im Editor durchgeführt werden.

Die Datei `HTML.trans` im Verzeichnis `amaya` enthält die Beschreibung der Transformationen. Diese Datei wird während einer Sitzung mit Amaya dynamisch geparst wenn die Transformationsprozedur vom Editor aufgerufen wird, sodass neue Transformationen während einer Editiersitzung hinzugefügt werden können. Die Datei kann, während man mit Amaya arbeitet, editiert werden.

Warnung: Da die Beschreibung der Transformationen HTML-Tags enthalten kann, sollte diese Datei nicht mit Amaya editiert werden. Man muss irgend einen anderen Editor benutzen.

## Syntax der Transformationssprache

Kommentare beginnen mit `!` und gehen bis zum Zeilenende.

Die Datei enthält eine Liste von Transformationsbeschreibungen. Jede Transformation wird durch drei Teile beschrieben:

- Ein Name, der mit einem Doppelpunkt abgeschlossen wird.
- Ein Muster, das mit einem Semikolon abgeschlossen wird.
- Eine Liste von Regeln, die in geschweifte Klammern eingeschlossen wird. Jede Regel wird mit einem Semikolon terminiert.

Der Name erscheint im Menü Transformation und identifiziert die Transformation.

### Das Muster

Das Muster beschreibt die spezifische Organisation der Elemente, welche transformiert werden sollen. Es agiert als Filter über der DTD von HTML. Der Zweck des Musters ist eine spezielle Kombination von Elementen zu identifizieren auf die die Transformation angewendet werden kann. Mit einem Muster ist es möglich Bedingungen für die Sequenz von Tags, den Inhalt eines Tags oder die Existenz eines Wertes oder Attributs anzugeben.

Formal enthält ein Muster einen HTML-Tag (möglicherweise mit Attributen) und Operatoren:

`|` Auswahl (oder)

`,` Geschwister

`+` Sequenz

`?` Option

`( )` Gruppierung von Knoten

Die Klammern `{` `}` definieren den Inhalt eines Knotens.

Das Symbol `*` ist ein Token, welches auf jedes Element zutrifft.

Es ist möglich ein Tag umzunennen, indem man ihm einen Namen, gefolgt von einem Doppelpunkt (`:`). voranstellt

Das Tag kann Attribute haben. Ist kein Wert angegeben, dann trifft ein Element zu, wenn es das entsprechende Attribut hat. Ist ein Wert für ein Attribut angegeben, dann trifft ein Element zu, wenn das entsprechende Attribut vorhanden ist und den entsprechenden Wert hat.

Beispiele von Mustern findet man am Ende des Dokuments

### Die Regeln

Eine Regel besagt, wie die, durch ein Muster identifizierten Elemente transformiert werden. Eine Regel besteht aus zwei Teilen, die durch das Symbol `>` getrennt sind:

- Ein durch ein Muster oder Namen definiertes Tag.
- Eine Liste, welche die Tags enthält, die generiert werden sollen und eine Stelle wo sie eingefügt werden sollen.

Die Liste selbst besteht aus zwei, durch einen Doppelpunkt (`:`) getrennten Teilen:

- Der Pfad (die Stelle, wo die neuen Tags eingefügt werden sollen).
- Die Liste der Tags, welche generiert werden sollen.

Der Pfad wird im äußersten linken Ast des Dokumentenbaums gesucht und zwar vom Elternelement des Elements welches dem obersten Symbol im Suchmuster entsprach.

In der Tagliste wird der Punkt (`.`) benutzt um in der Baumstruktur hinabzuwandern

Wenn das Symbol Stern (`*`) am Ende der zu generierenden Tagliste steht, so wird das ursprüngliche Tag nicht verändert, kann aber an eine andere Stelle verschoben werden.

Taucht ein Tag oder ein Name im linken Teil der Regel mehrmals in einem Muster auf, dann transformiert die Regel alle die Elemente, welche im Muster vorkommen.

## Der Transformationsprozess

Wählt der Benutzer den Befehl Transformiern aus dem Menü Bearbeiten, dann parst Amaya die Datei `HTML.trans`. Danach werden die markierten Elemente mit dem Muster jeder Transformation gesucht. Die Namen der gefundenen Transformationen werden dem Benutzer in einem Popup-Menü angezeigt.

Treffen mehrere Transformationen mit gleichem Namen auf die markierten Elemente zu, dann wird die Transformation auf der obersten Ebene dem Benutzer angezeigt. Treffen mehrere Transformationen auf der gleichen Ebene zu, dann wird die erste in der Datei `HTML.trans` gefundene genommen. Daher sollte man spezifische Muster vor den allgemeinen anlegen.

Nachdem eine Transformation vom Benutzer ausgewählt wurde, wird die Zielstruktur gemäß den Regeln erstellt, indem die markierten Elemente transformiert werden.

Am Ende wird der Inhalt der zu transformierenden Elemente (Text, Bilder, aber auch strukturierte Elemente) in die transformierten Elemente verschoben.

Der Transformationsprozess für HTML-Elemente ist vollständig in Interactively Restructuring HTML Documents beschrieben, ein Dokument, welches auf der fünften internationalen WWW-Konferenz in Paris im Mai 96 von Cécile Roisin und Stéphane Bonhomme vorgestellt wurde.

## Beispiele:

- Das erste Beispiel vereinigt mehrere unsortierte Listen (ul).

          Merge Lists: (ul{li+})+;
          {
          li > ul:li;
          }

  Das Muster trifft auf eine Sequenz von unsortierten Listen zu, welche eine Sequenz von Listenelementen (li+) enthalten.

  Die Regel besagt, dass jedesmal, wenn ein Element beim Durchgang über die passenden Elemente angetroffen wird, ein neues li-Tag innerhalb einer ul erzeugt werden soll. Wird die Regel das erste Mal angewendet, dann ist die resultierende Struktur noch leer. Es gibt noch kein ul-Element, in das ein li-Element gelegt werden kann. Daher wird das ul-Element zuerst erzeugt damit die Regel angewendet werden kann.

- Das zweite Beispiel transformiert eine Definitionsliste in eine Tabelle.

          Table: dl{(dt|dd)+};
          {
          dt > <table border=1>.tbody:tr.td;
          dd > <table border=1>.tbody.tr:td;
          }

  Das Muster passt auf jedes Definitionslistenelement (dl).

  Die Regel beschreibt, wie die Tabelle inkrementell erstellt werden soll, wenn die Struktur der markierten Definitionsliste durchlaufen wird:

  - jedes dt involviert die Erzeugung einer neuen Tabellenzeile in einem Tabellenkörper.
  - jedes dd involviert die Erzeugung einer neuen Tabellenzelle in der vorher erzeugten Tabellenzeile
- Das dritte Beispiel entfernt ein Tabellenelement, lässt dessen Inhalt aber unverändert.

          Remove Table:
          table{?caption,?(body:*{(tr{(td{(?cell_content:*)+}|
                                   th{(?cell_content:*)+}
                                 )})+})+};
          {
          caption>h3;
          cell_content>:*;
          }

  Das Muster passt auf eine beliebige Tabelle und identifiziert den Inhalt einer jeglichen Tabellenzelle (cell_content).

  Die zweite Regel besagt, dass der Inhalt jeder Zelle an die ursprüngliche Stelle im Dokument verschoben werden soll.

- Die Datei `amaya/HTML.trans` enthält weitere Beispiele.