Hatte schon seit einiger Zeit vor mal rauszufinden, ob der Replace Task von Ant auch mehrere Zeilen auf einmal ersetzen kann. Also entweder ein Token durch mehrere Zeilen bzw. den Inhalt einer Datei zu ersetzen oder mehrere Zeilen als Token durch eine oder mehrere Zeilen zu ersetzen. Während das Ersetzen eines mehrzeiligen Tokens mittels replacetoken ganz gut funktioniert hatte ich so meine Schwierigkeiten mit dem Einfügen von mehreren Zeilen via Ant.
Ein kurzer Besuch bei Google hat mir die erste Idee bei devdaily.com gegeben, bei der mittels Schlüsse in einer Property-Datei ein einzelner Token durch mehrere Zeilen ersetzt werden soll. Um den Schlüssel auf mehrere Zeilen auszudehnen hat man dort ${line.separator} genutzt, was allerdings bei mir nicht funktioniert hat. Warum-auch-immer wollte Ant (1.7) ${line.separator} nicht auflösen und daher war das Ergebnis nicht ganz so schön. Außerdem war mir auch nicht ganz klar, ob ich die einzelnen Zeilen auch (unterschiedlich) einrücken kann. Da die HTML Seiten auf meiner Homepage alle möglichst gleichmäßig eingerückt sind hab ich mir also was anderes überlegt.
Anstelle der Server-Side-Includes (SSI), die ich erst letztes Jahr eingeführt hatte, wollte ich ich Ant die Arbeit des Ersetzens erledigen lassen. Die SSIs waren damals auch nur die Notlösung gewesen, weil das mehrzeilige Ersetzen mit Ant noch nicht so wollte. Die Ant-Lösung finde ich deswegen schöner, weil ich hier ausschließlich statischen Inhalt einfüge, der sich niemals dynamisch ändert. D. h. alle Besucher bekommen vom Server den selben Inhalt zugespielt. Der Einsatz von SSIs ist für sowas zwar möglich aber irgendwie überflüssig, wenn ich schon vor dem Hochladen der HTML Dateien den Inhalt anpasse. Was ich also gemacht habe ist folgendes:
- Mittels LoadFile Task die bisherigen Include Dateien ausgelesen und an einen Wert gebunden.
- Die jeweiligen Tokens durch die jeweiligen Werte ersetzt.
Problematisch dabei sind allerdings wieder die Tokens. Nimmt man irgendwas wie @VCard@ (o. ä.) beschwert sich der HTML-Editor in Eclipse, dass ein einzelnes @VCard@ mittem in einem HTML-Dokument kein richtig gültiges HTML (bzw. XHTML) ist. Schreibt man <p>@VCard@</p> und benutzt den gesamten Ausdruck als Token beschwert sich Eclipse, dass spitze Klammern keine gültigen Tokens sind. Die Lösung ist relativ einfach: Man erstellt neue Schlüssel in der Property-Datei, die diese kompletten Ausdrücke enthalten und referenziert diese im Buildfile von Ant mittels ${Key} und das wars
Schön dabei ist auch, dass ich die bisherigen Include Dateien weiterhin nutzen kann, ich also nichtmal eine Zeile neuen HTML Code schreiben musste. Im Ergebnis sieht das dann etwa so aus:
<loadfile srcfile=”${source.dir}/Includes/back-button.inc” property=”back-button”/>
<replace dir=”${deploy.dir}” token=”${backButton}” value=”${back-button}”/>
Mit den beiden Zeilen hab ich mal eben schnell in allen HTML-Dateien einen Back-Button zurück auf die Startseite hinzugefügt.