Original in fr John Perr
fr to en:John Perr
en to de:Wolfgang Schorer
Linux user seit 1994; er ist einer der französischen Editoren des LinuxFocus.
Dieser Lehrartikel beschreibt, wie man sich die Pflege von Text- oder HTML-Dateien erleichtern kann, indem man den m4 Makroprozessor verwendet.
Wenn man einen Texteditor verwendet, wird oft eine Makro-Kommandosprache benötigt. Die meisten enthalten bereits solche Sprachen als deren Besonderheiten. Selbst der C-Compiler stellt solch eine Austattung mittels des C-preprocessors CPP zur Verfügung. Wenn sie (Makro-Kommandosprache) zum Pflegen von Konfigurationsdateien oder kleinen Webseiten benützt wird, kann der GNU/m4 Prozessor den Arbeitsaufwand erheblich reduzieren. Der GNU/m4 Makro-Prozessor ist Teil jeglicher Linux distribution und ist Standart unter Unix Benutzern.
Im Folgendem zeigen wir, wie man den GNU/m4 Makro-Prozessor benützt, um einen Satz HTML-Seiten einer kleinen Webseite zu pflegen. Dieses System hilft, die gesamte Webseite in sich schlüssig zu halten. Natürlich gibt es Dutzende anderer Möglichkeiten dasselbe Ergebnis mit Unix-Hilfesprogrammen zu erhalten; aber das ist ja das Schöne an Unix.
Diese Technik wird für die Konstruktion des wohlbekannten sendmail.cf verwendet. Ein m4 Makro(bau)satz ist von der Berkley Universität unter Eric Allman erhältlich.
Der GNU/m4 Makro-Prozessor ist nicht auf Text- oder HTML-Editierung beschränkt. Es kann sich dies für Programmierer, die eine Erweiterung der CPP-Besonderheiten wünschen oder jene, die die CPP-gleichen Besonderheiten in anderen Programmiersprachen haben wollen, als äußerst nützlich erweisen.
Ein Makro-Prozessor ist ein Programm, das von Benutzern defienerte Kommandos (benannte Makros) interpretiert. Die Makros sind oft im Text zur Verearbeitung eingebettet. Z.B. erlaubt die folgende Definition
define(AUTHOR,`Agatha Christie<a.christie@scotland-yard.gov>')
das Wort "AUTHOR" irgendwo im Text zu verwenden. Es wird ersetzt werden mit "Agatha Christie<a.christie@scotland-yard.gov>" nachdem es mit m4 verarbeitet worden ist. Wie wir gleich zeigen werden, gibt es natürlich nützlichere Funktionen.
Nehmen wir an, wir haben ein Webseite zu pflegen, mit jeweils gleichen Seiten, aber verschieden Sprachen. Darüberhinaus habe jede Seite den gleichen Kopf und Fuß, um der Seite ein durchgehend schlüssiges Aussehen zu geben. Um die Sache einfach zu halten und damit den Gebrauch eines Browsers für das Betrachten des Ergebines zu vermeiden, wird dieses Beispiel nur mit Text zu tun haben. Dies wird auch Leuten, die Lynx verwenden, einfacher erlauben, durch unsere Seite zu blättern (browsen). Hier ist der HTML Kode für eine Seite:
<!-- Start of header --> <HTML> <HEAD> <TITLE>Lynx homepage</TITLE> <META name="description" content="Site lynx et m4"> </HEAD> <BODY BGCOLOR="#FFFFFF" LINK="#008000" VLINK="#808080" ALINK="#8080FF"> <TABLE> <TBODY> <TR><TD align=middle colspan="2"> <H1>Lynx a fully-featured World Wide Web client for character-cell displays</H1> <TR><TD align="left" valign="top" width="15%"> <a href="./index-en.html">English</A><BR> <a href="./index-fr.html">French</A><BR> <a href="./index-es.html">Italian</A><BR> <a href="./index-it.html">Spanish</A><BR> <a href="./index-de.html">German</A><BR> <TD align=left> <!-- End of header --> <P>Links to the current sources and support materials for Lynx are maintained at <A HREF="http://www.crl.com/~subir/lynx.html">Lynx links</A></P> <P> and at the Lynx homepage <A HREF="http://lynx.browser.org/">Lynx Information.</A></P> <P>View these pages for information about Lynx, including new updates.</P> <P>Lynx is distributed under the GNU General Public License (GPL) without restrictions on usage or redistribution. The Lynx copyright statement, "COPYHEADER", and GNU GPL, "COPYING", are included in the top-level directory of the distribution. Lynx is supported by the Lynx user community, an entirely volunteer (and unofficial) organization.</P> <!-- Start of footer --> </TBODY> </TABLE> <HR size="0" noshadow> <FONT SIZE=-2> <EM>Page maintained by John Perr.<BR> Page updated on 25/07/99 - © <A HREF="mailto:webmaster@lynx.browser.org">lynx.browser.org</A>1999 </EM></FONT> </BODY> </HTML> <!-- End of footer -->
Hier ist das Ergbnis:
Mit Lynx | mit Netscape |
Alle Seiten haben denselben Kopf- und Fußstil, nur die Sprache und der Rumpf (body) einer Seite ist verschieden.
Wir gehen nun dazu, m4 Makros zu entwerfen, die in den HTML-Text unserer Seiten eingefügt werden, um damit all die sich wiederholenden Daten
zu erstezen.
Bevor wir zu sehr ins Detail gehen, werfen wir einen Blick auf das obige Beispiel, das mit solchen Makros geschrieben wurde:
LYNX_TITRE(Lynx a fully-featured World Wide Web client for character-cell displays) LYNX_ENTETE(Lynx homepage) <P>Links to the current sources and support materials for Lynx are maintained at <A HREF="http://www.crl.com/~subir/lynx.html"> Lynx links</A></P> <P> and at the Lynx homepage <A HREF="http://lynx.browser.org/"> Lynx Information.</A></P> <P>View these pages for information about Lynx, including new updates.</P> <P>Lynx is distributed under the GNU General Public License (GPL) without restrictions on usage or redistribution. The Lynx copyright statement, "COPYHEADER", and GNU GPL, "COPYING", are included in the top-level directory of the distribution. Lynx is supported by the Lynx user community, an entirely volunteer (and unofficial) organization.</P> LYNX_PIED
So gesehen ist das Schreiben von HTML-Seiten einfacher und der Text geht nicht zwischen HTML-Tags verloren. Um die Seiten in einer anderen Sprache zu schreiben, müssen Übersetzungen von dieser Datei gebildet werden. Die französische Version wüde so aussehen:
LYNX_TITRE(Lynx un navigateur en mode console) LYNX_ENTETE(Un site pour les utilisateurs de lynx) <P>Visitez le <A HREF="http://lynx.browser.org/"> site officiel de lynx</A> pour plus d'informations sur Lynx, y compris les nouvelles mises à jour.</P> <P>Les liens vers les sources de la version courante et divers supports pour Lynx sont tenus à jour sur le site <A HREF="http://www.crl.com/~subir/lynx.html"> liens Lynx</A>.</P> <P>Lynx est distribue dans le cadre de la lisence GNU (General Public License - GPL) sans restriction sur son utilisation ni sa distribution. Les mentions des droits de reproduction de Lynx, "COPYHEADER", et GNU GPL, "COPYING", sont inclus dans la racine de l'arborescence de la distribution. Lynx est supporte par la communaute des utilisateurs de Lynx, une communaute entièrement benevole (et non-officielle).</P> LYNX_PIED
In jeder Sprache werden die gleichen Makros, LYNX_TITRE, LYNX_ENTETE und LYNX_PIED verwendet, jedoch mit verschiedenen Argumenten. Diese 3 Makros erlauben ein effizientes Ersetzen des HTML-Kodes von Kopf und Fuß. Dies ist der Hauptvorteil des Systems: Die Definition von Kopf und Fuß ist für die ganze (Web)Seite konsistent (schlüssig). Wenn sich der Stil des Kopfes oder Fußes ändert, dann muß lediglich, anstatt jede Seite per Hand zu editieren, die Makro-Definitionsdatei geändert werden.
Um die das Meiste der Formatierung zu erhalten, wurden oben 3 Makros definiert. Hier ist die Datei, die die Makros definiert. Kommentare folgen danach:
divert(-1) # File mac.css # Version 1.0 M4 macros for Lynx # # A file trans-LANG.m4 is defined for each # language, based on the french one. # If no translation file exist, # french is the default. # divert(0) changequote({,})dnl # change quotes to curly braces ifdef({LANG},,{define({LANG},{fr})})dnl # Default= french include({trans-}LANG{.m4})dnl # call translation file undefine({format})dnl # Suppress the format definition define({_ANNEE_},esyscmd(date +%Y))dnl #Current year define({LYNX_TITRE},{define(_TITLE_,$1)})dnl # First macro dnl # Second macro define({LYNX_ENTETE},{<!-- Header start --> <HTML> <HEAD> <TITLE>$1</TITLE> <META name="description" content="Site lynx and m4"> <META name="keywords" content="m4, lynx, GPL"> </HEAD> <BODY BGCOLOR="#FFFFFF" LINK="#008000" VLINK="#808080" ALINK="#8080FF"> <TABLE> <TBODY> <TR><TD align=middle colspan="2"> <H1>_TITLE_</H1> <TR><TD align="left" valign="top" width="15%"> <a href="./index-en.html">_ANGLAIS_</A><BR> <a href="./index-fr.html">_FRANCAIS_</A><BR> <a href="./index-es.html">_ESPAGNOL_</A><BR> <a href="./index-it.html">_ITALIEN_</A><BR> <a href="./index-de.html">_ALLEMAND_</A><BR> <TD align=left> <!-- end of header -->})dnl dnl # Third macro define({LYNX_PIED},{<!-- Start of footer --> </TBODY> </TABLE> <HR size="0" noshadow> <FONT SIZE=-2> <EM>_MAINTENEUR_.<BR> _MAJ_ esyscmd(date +%d/%m/%y) - © <A HREF="mailto:webmaster@lynx.browser.org"> lynx.browser.org</A> _ANNEE_</EM></FONT> </BODY> </HTML> <!-- End of footer -->})dnl
Die Zeilen zwischen "divert(-1)" und "divert(0)" sind Kommentar. "Divert" ist eines der eingebauten Makros des m4-Prozessors. Es ist entworfen, um die Ausgabe des Prozessores abzuwenden. "-1" bedeutet, die kommenden Zeilen nicht in die HTML-Datei zu schreiben; das ist genau, was wir wollen.
Das "changequote" Makro überschreibt die Definition der Anführungszeichen (quotes), die normalerweise für die Quotierung der Makro-Argumente benützt werden. Sie werden hier durch die geschweiften Klammern ersetzt, da in Textdateien, besonders in Französischen, die Anführungszeichen sehr oft verwendet werden; sie würden zu Makro-Fehlinterpretationen führen. Geschweifte Klammern werden für Text oder HTML weniger oft benützt; aus diesem Grunde wurden sie hier ausgewählt.
Das "ifdef" Makro wird benützt, um zu Testen, ob das Makro LANG definiert ist, und, falls nicht, um es auf den Standartwert "fr" zu setzen. Das LANG Makro wird verwendet, um die Sprache zu setzen. Wir werden in den Zeilen unten sehen, wie es beim Aufruf von m4 zur Auswahl der HTML-Seiten-Sprache defieniert wird.
Die "include" Zeile hat die gleiche Bedeutung wie in C und wird verwendet, um eine externe Datei einzufügen. Wir verwenden es, um die spezifischen Makro-Definitionen, die im Kopf und Fuß verwendet werden, zu laden. Hier ist der jeweilige Inhalt bezogen auf die Sprache:
divert(-1) # File trans-fr.m4 # Definitions for french divert(0) define({_ANGLAIS_},{Anglais})dnl define({_FRANCAIS_},{Français})dnl define({_ITALIEN_},{Espagnol})dnl define({_ESPAGNOL_},{Italien})dnl define({_ALLEMAND_},{Allemand})dnl define({_WEBMASTER_},{John Perr})dnl define({_MAINTENEUR_},{Page maintenue par _WEBMASTER_})dnl define({_MAJ_},{Date de mise à jour:})dnl
divert(-1) # File trans-en.m4 # Definitions for english divert(0) define({_ANGLAIS_},{English})dnl define({_FRANCAIS_},{French})dnl define({_ITALIEN_},{Spanish})dnl define({_ESPAGNOL_},{Italian})dnl define({_ALLEMAND_},{German})dnl define({_WEBMASTER_},{John Perr})dnl define({_MAINTENEUR_},{Page maintained by _WEBMASTER_})dnl define({_MAJ_},{Page updated on })dnl
Falls Sie spanisch, italienisch oder deutsch sprechen, sollten Sie in der Lage sein, ähnliche Dateien für diese Sprachen zu schreiben.
Die Zeile "undefine" unterdrückt die Standart-Definition des eingebauten Makros, genannt "format", weil es hier nicht verwendet wird. Wenn diese Zeile ausgelassen wird, so wird jedesmal das Wort "format" , wenn es im Text erscheint, unterdrückt, es sei denn, es ist in Anführungszeichen gesetzt, d.h. umgeben von geschweiften Klammern. Beim Editieren einfacher Webseiten, sind solch Praktiken nicht ratsam.
Als nächstes kommt die Definition des laufenden Jahres. Es wird vom Makro "easyscmd" bezogen, das das Unix-Kommando "date" aufruft. Dieses Kommando wird auch in der Fuß-Definition verwendet, um das Datum, wann die Seite auf neuesten Stand gebracht wurde, auszudrucken.
Die folgende Zeile definiert das erste unserer drei Haupt-Makros: LYNX_TITRE. Diese Makro definiert ein anderes Makro, genannt _TITRE_. Die Doppeldefinition ist notwending um die Überschrift mehrmals innerhalb des Kopfes und des Fußes einer Seite, von einer Definition ausgehend, zu benützen. Beachten Sie den Gebrauch von $1, das sich auf das erste Argument des Makros bezieht.
Die restlichen Zeilen definieren die anderen zwei Haupt-Makros: LYNX_ENTETE und LYNX_PIED, die sich auf die Inhalte des jeweiligen Kopfes und Fußes underer HTNL-Seite beziehen, ausgenommen der veränderlichen (variablen) Elemente der Seite. Diese sind:
Das "dnl", das am Ende einer jeden Zeile erscheint, ist ein eingebautes Makro des m4 mit der Bedetung "Lösche bis zur nähsten Zeile". M4 erzeugt mit "dnl" keine Leerzeile beim Makrointerpretieren.
Da nun unser System abgesetzt ist, wird die Erzeugung einer Webseite mit dem folgendem Kommando bewerkstelligt:
Wobei "XX" der Kode ist, der für die jeweilige Sprache verwendet wird. Beachten Sie, daß , so wie bei gcc, die "-D"-Option verwendet wird, um das Makro von der Kommandozeile aus zu definieren.
Die Liste unten zeigt die Dateien und ihre Verwendung in dieser Anwendung.
Die folgenden Dateien werden verwendet, um die HTML-Seiten zu erzeugen:
index-XX.html | Der Rumpf (body) der Seite, der vom Author oder Übersetzter mit Text beschrieben ist. Er (body) ist verschieden für jede Seite und für jede Sprache. (Der Kode ist XX=en für english, es für spanisch, etc...) |
mac.css | Standart Definitionen. Diese Datei ist gleich zu allen Seiten und allen Sprachen. Es kann als eine Art "stylesheet" (Stilseite) angesehen werden. |
trans-XX.m4 | Standart Definitionen für eine Sprache. Diese Datei ist gleich zu allen Seiten für eine Sprache. (Der kode ist XX=en für english, es für spanish, etc...) |
Der m4 Makro-Prozessor kann ,trotz seiner Leistungsfähigkeit, nicht mit eine Skriptsprache, wie Perl oder Tcl, verglichen werden. Mit seinen wenigen Eigenheiten einmal bekanntgeworden, ist es ein schnelles und handliches Werkzeug, das hilft, Textdateien zu bearbeiten. Um mehr zu lernen, sehen Sie sich die Dokumentation, die mit Ihrer Distribution verbunden ist, an. Sie sollten eine ca. 30 Seiten lange Lehranweisung zum m4 finden, die alle Aspekte des GNU-m4-Proyessors abdeckt. Sie können sich auch die Wenseite Linux User Group of Bordeaux (ABUL) ansehen, die mit einem m4-Kit gepflegt wird, ähnlich des hier Vorgestellten.
GNU/m4 ist erhältlich von
ftp://prep.ai.mit.edu/pub/gnu/m4-1.4.tar.gz
Laden Sie sich die Dateien, die hier aufgeführt sind, herunter: The Lynx m4 macro kit
Vielen Dank Paul Kienzle für das Korrekturlesen dieses Artikels.