!!! Listing 1: wmake
#!/bin/sh
# Basiswerte.
source="$HOME/WWW"
target="$HOME/www"
# $RANDOM nimmt einen Wert von 0 bis 32767 an.
# Häufigkeit des Löschens in Prozent.
prob=10
if [ $RANDOM -lt $(($prob * 328)) ]; then
delete=y;
else
delete=n;
fi
# Definiere Ausgabe.
function say {
echo $*
}
# Zielverzeichnis säubern.
say "Zielverzeichnis '$target' anlegen."
if [ $delete = y ]; then
rm -rf "$target"
mkdir "$target"
fi
# Unterverzeichnisse erzeugen.
say "Unterverzeichnisse anlegen."
cd "$source"
for dir in `find . -type d`; do
if [ ! -d "$target/$dir" ]; then
# Bestimmte Verzeichnisse müssen nicht erwähnt werden.
if [ `basename $dir` != CVS -a `basename $dir` != m4 -a \
`basename $dir` != bin -a `basename $dir` != '.~' ]; then
say "'$dir' anlegen."
fi
mkdir "$target/$dir"
fi
done
# Dateitypen, die nicht modifiziert werden, werden kopiert.
for suffix in gif png jpg jpeg mpg mpeg; do
say "Dateien '*.$suffix' werden kopiert."
# Jede Datei wird bearbeitet.
for file in `find . -type f -name \*.$suffix`; do
if [ "$file" -nt "$target/$file" ]; then
cp -p "$file" "$target/$file"
fi
done
done
# Verarbeite Makrodateien.
macrodir="$source/m4"
for suffix in html htm xhtml phtml css; do
say "Dateien '*.$suffix' werden verarbeitet."
# Jede Datei wird bearbeitet.
for file in `find . -type f -name \*.$suffix`; do
# Wenn eine der Dateien neuer als das Ziel ist, wird kompiliert.
for f in "$file" $source/m4/*; do
# Ist die Datei neuer als eine Makrodefintion?
if [ "$f" -nt "$target/$file" ]; then
# Kommentare sollen in der Ausgabe nicht erscheinen.
# Sonderzeichen und Umlaute werden umgesetzt.
# Leerzeilen werden entfernt.
# Die Zieldatei wird geschrieben.
m4 --include=m4 "$file" |
sed -e 's/¤/\€/g' \
-e 's/Ä/\Ä/g' \
# viele weitere Ersetzungen...
-e 's/`u/\ú/g' |
egrep -v '^\s*$|^##' > "$target/$file"
if [ "$?" -ne "0" ]; then
echo "Fehler bei Datei '$file'." >&2
fi
fi
done
done
done
# Entfernen überflüssiger Verzeichnisse im Zielverzeichnisbaum
for dir in CVS bin m4 .~; do
say "Verzeichnisse '$dir' werden gelöscht."
find "$target" -type d -name $dir -depth -exec rm -rf {} \;
done
!!! Listing 2: one_page.m4
changecom(`##')dnl
## Änderung des Kommentarzeichens.
## Änderung der String-Begrenzer wegen ' in der englischen Sprache.
changequote({,})dnl
## LANG muss definiert sein.
ifdef({LANG}, {}, {errprint(LANG ist nicht definiert.
)m4exit(1)})dnl
## Links
include(link_intern.m4)dnl
## HTML und XHTML sind möglich.
define({_HTML}, {yes})dnl
ifelse({_HTML}, {yes}, define(DOCTYPE, {})dnl,
define(DOCTYPE, {
})dnl
)dnl
ifelse({_HTML}, {yes}, define(BR, { }), define(BR, { }))dnl
## Informationen zur Datei.
define(DATE, {esyscmd(date -r __file__ "+%Y-%m-%d %H:%M:%S")})dnl
define(STAND, {