Erzeugen von Text-Dateien mit m4 Makros

ArticleCategory: [Artikel Kategorie]

Webdesign

AuthorImage:[Bild des Autors]

[Photo of the Author]

TranslationInfo:

Original in fr John Perr

fr to en:John Perr

en to de:Wolfgang Schorer

AboutTheAuthor:[Über den Autor]

Linux user seit 1994; er ist einer der französischen Editoren des LinuxFocus.

Abstract:[Zusammenfassung]

Dieser Lehrartikel beschreibt, wie man sich die Pflege von Text- oder HTML-Dateien erleichtern kann, indem man den m4 Makroprozessor verwendet.

ArticleIllustration:[Titelbild des Artikels]

[Ilustration]

ArticleBody:[Der eigentliche Artikel]

Einleitung

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.

Definition

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.

Ein Beispiel

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:

HTML Version

  
<!-- 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:

[Click here to enlarge image] [Click here to enlarge image]
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:

Makro Version

  
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.

Makro Definitionen

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)
- &copy <A HREF="mailto:webmaster@lynx.browser.org">
lynx.browser.org</A>
_ANNEE_</EM></FONT>
</BODY>
</HTML>
<!-- End of footer -->})dnl

Beschreibung

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.

Erzeugen der Seiten

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.

Zusammenfassung

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...)

Zum Abschluß

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.

Links

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.