#!/bin/bash -u
#-------------------------------------------------------------------------------
# asc2pdf.sh                                (C) 2003-2007 T.Birnthaler OSTC GmbH
# $Id: asc2pdf.sh,v 1.10 2010/07/01 14:45:54 tsbirn Exp $
# Aufruf: asc2pdf.sh FILE... => FILE.pdf ...
#-------------------------------------------------------------------------------
# Liste von ASCII-Dateien in je ein PDF-Dokument (oder PostScript) umwandeln.
# * 1 oder 2 Seiten pro Blatt
# * Endung ".txt" wird automatisch ergänzt.
# * Zeilen ab Text "TODO" auf einer Zeile für sich weglassen.
# * Existiert Datei "FILE.pdf" schon, wird gefragt, ob zu überschreiben.
# * TGZ- oder ZIP-Archiv aus allen angegebenen Dateien erstellbar.
# * Einrückung, Tabulatorbreite, Zeilen pro Seite und Zeilennumerierung wählbar.
# * "???" mit Text danach bis Zeilenende weglassbar oder nicht
#-------------------------------------------------------------------------------
# DONE
# * Dateinamen an Konverter mit übergeben, sonst erscheint "stdin".
#-------------------------------------------------------------------------------
PATH="/bin:/usr/bin:/usr/local/bin"
TMPDIR=$(mktemp -d /tmp/asc2pdf.XXXXXXXXXXX) || exit 1

# Konstanten
STDARCHIVE="kurs.tgz"                 # Archivname
   ARCHIVE=                           # Kein Archiv erstellen
 STDINDENT=5                          # Standardeinrückung 5 Zeichen
    INDENT=0                          # Einrückung 0 Zeichen
STDNUMSTEP=5                          # Standard-Zeilennumerierung all 5 Zeilen
   A2PSOPT="--quiet --pretty-print=plain"
      TODO="/^[ \\t#]*[Tt][Oo][Dd][Oo][ \\t]*\$/,\$d"   # Ab Todo weg (KEIN '...')
     QUEST="s/[ 	]*???.*\$//;/^XX*) /d"      # "??? ..." + "XX)..." weglassen
     LINES=100                        # Anzahl Zeilen -> Zeilenbreite
   TABSIZE=4                          # Tabulatorbreite
        PS=                           # Kein *.ps sondern *.pdf erzeugen
     FORCE=                           # Vorhandene Dateien nicht überschreiben
       ZIP=                           # Kein komprimiertes Archiv erstellen
     TITLE=                           # Titel (Std: Dateiname)

# Zwischenverzeichnis bei Skriptende löschen
trap 'rm -rf $TMPDIR > /dev/null 2>&1' EXIT

# Copyright-Text zusammenbauen
  YEAR=$(date +%Y)
HEADER="(C) $YEAR T.Birnthaler OSTC GmbH (http://www.ostc.de)"
HNGOTT=

# Usage-Meldung
function Usage()
{
	exec 1>&2                        # Alle Ausgaben auf Fehlerkanal umlenken
	[ $# -gt 0 ] && echo -e "error: $*\n"
	echo "Wandelt ASCII-Textdateien in PDF/PostScript-Dateien um,"
	echo "die Dateien können auch in ein tgz/zip-Archiv gepackt werden."
	echo "(Std: Ab '???' bis Zeilenende + ab 'Todo' bis Dateiende weglassen)."
	echo
	echo "usage: $(basename $0 .sh) [OPT] TEXTFILE..."
	echo "       -2       2 Seiten pro Blatt quer ausgeben [twopage]"
	echo "       -a       Dateien in Std-TGZ-Archiv '$STDARCHIVE' packen [archive]"
	echo "       -A FILE  Dateien in TGZ-Archiv FILE packen [Archive]"
	echo "       -e TEXT  Titeltext statt Dateiname [title]"
	echo "       -f       Vorhandene PDF-Dateien überschreiben [force]"
	echo "       -g       Header mit 'Hermann Gottschalk' [hngott]"
	echo "       -h       Diese Usage-Meldung [help]"
	echo "       -H TEXT  Header-Text (Std: '$HEADER') [Header]"
	echo "       -i       Einrücken (Std: '$INDENT') [indent]"
	echo "       -I NN    NN Zeichen einrücken [Indent]"
	echo "       -l NN    NN Zeilen pro Seite ausgeben (Std: '$LINES') [lines]"
	echo "       -n       Zeilen numerieren (Stufe: '$STDNUMSTEP') [number]"
	echo "       -N NN    Numerierungs-Schrittweite NN [Number]"
	echo "       -p       Auch Postskript-Datei erzeugen [postscript]"
	echo "       -q       '???' + Text danach mit ausdrucken [questionable]"
	echo "       -s NN    Tabulator-Breite NN (Std: '$TABSIZE') [step]"
	echo "       -t       Todo mit ausdrucken [todo]"
	echo "       -T       NUR ab Todo ausdrucken [Todo]"
	echo "       -z       Archiv ZIPpen statt TARen [zip]"
	exit 1
}

# Optionen abarbeiten
while getopts ":2aA:e:fghH:iI:l:nN:pqstTz" OPT   # ":" am Anfang unterdrückt Fehlermeldung
do                                               # ":" nach Buchstabe -> "mit Parameter"
	case $OPT in
		2) A2PSOPT="$A2PSOPT -2" ;;
		a) ARCHIVE="$STDARCHIVE" ;;
		A) ARCHIVE="$OPTARG" ;;
		e)   TITLE="$OPTARG" ;;
		f)   FORCE=1 ;;
		g)  HNGOTT=1 ;;
		h)   Usage "" ;;
		H)  HEADER="$OPTARG"; USER=; HNGOTT= ;;
		i)  INDENT="$STDINDENT" ;;
		I)  INDENT="$OPTARG" ;;
		l)   LINES="$OPTARG" ;;
		n) A2PSOPT="$A2PSOPT --line-numbers=$STDNUMSTEP" ;;
		N) A2PSOPT="$A2PSOPT --line-numbers=$OPTARG" ;;
		p)      PS=1 ;;
		q)   QUEST="s/^//" ;;
		s) TABSIZE="$OPTARG" ;;
		t)    TODO="s/^//"            ;;
		T)    TODO="1,/^[ \\t]*[Tt][Oo][Dd][Oo][ \\t]*\$/cTodo" ;;   # Bis Todo weg
		z)     ZIP=1 ;;
		*)   Usage "Option '-$OPTARG' nicht erlaubt" ;;
	esac
done
shift $(expr $OPTIND - 1)

# Keine Argumente => Usage-Meldung
[ $# -eq 0 ] && Usage "Keine Dateien angegeben"

# Optionen gültig?
[ -n "$ZIP" -a -z "$ARCHIVE" ]   && Usage "Option '-z' nur mit '-a' verwendbar"

# Einrückungstext zusammenbauen
INDENT=$(perl -e "print ' ' x $INDENT")

# Anzahl Zeilen pro Seite festlegen
A2PSOPT="$A2PSOPT -l$LINES"

# Copyright-Text zusammenbauen
if [ "$USER" = "hngott" -o -n "$HNGOTT" ]
then
    HEADER="(C) $YEAR H.Gottschalk OSTC GmbH (http://www.ostc.de)"
fi

#-------------------------------------------------------------------------------
# Datei in PDF-Datei umwandeln (Optionen werden per Variable übergeben!)
# 1: FILE
# 2: BASE
#-------------------------------------------------------------------------------
function f_a2pdf()
{
	# Übergebene Parameter holen
	FILE="$1"
	BASE="$2"
	TITL="$3"
	[ "$TITL" ] || TITL="$FILE"
	[ "$PS" ] && PS="$BASE.ps"
# Überschreiben?
	if [ -z "$FORCE" -a -e "$BASE.pdf" ]
	then
		read -n 1 -p "warning: '$BASE.pdf' already exists, overwrite [a/y/j/n]? "
		echo
		case "$REPLY" in
			[Aa]*)   FORCE=1 ;;
			[YyJj]*) ;;
			*)       continue ;;
		esac
	fi
# PDF erzeugen (--stdin=Eingabedatei -o=Ausgabedatei, -=stdin/stdout)
	echo "converting '$FILE' to '$BASE.pdf' ..." 2>&1
	expand -"$TABSIZE" "$FILE" | # Statt --tabsize=$TABSIZE wg. autom. Ext-Behandlung
		sed "$TODO" |            # Zeilen ab/bis TODO entfernen (oder nix)
		sed "$QUEST" |           # "???..." + "XX)..." entfernen (oder nicht)
		sed "s/^/$INDENT/" |     # Einrückung durchführen (oder nicht)
		a2ps $A2PSOPT --header="$HEADER" \
		              --center-title="$TITL" \
		              --stdin="$FILE" -o - 2> /dev/null |
		tee $PS |                      # TRICK: $PS leer => Nix kopiert
		ps2pdf - - > "$BASE.pdf"       # (1.-=stdin, 2.-=stdout)

}
#-------------------------------------------------------------------------------
# ASCII-Dateien nach PDF/PostScript konvertieren.
#-------------------------------------------------------------------------------
# Alle angegebenen Text-Dateien bearbeiten
for FILE
do
	# Endung ".txt" automatisch ergänzen
	[ ! -e "$FILE" ] && FILE="$FILE.txt"
	[ ! -e "$FILE" ] && echo "warning: '$FILE' not found" 2>&1 && continue
	BASE=$(basename "$FILE" .txt)
	f_a2pdf "$FILE" "$BASE" "$TITLE"
	[ "$PS" ] && PS="$BASE.ps"  # TRICK: Leer wenn keine PS-Option
	[ "$ARCHIVE" ] && mv "$BASE.pdf" "$PS" "$TMPDIR"   # TODO: PS leer -> Nix!!!
done

#-------------------------------------------------------------------------------
# Archiv erzeugen?
#-------------------------------------------------------------------------------
if [ "$ARCHIVE" ]
then
	pushd "$TMPDIR" > /dev/null
# Alle typischen Endungen wegwerfen
	ARCHIVE=$(basename "$ARCHIVE" .tar)
	ARCHIVE=$(basename "$ARCHIVE" .tgz)
	ARCHIVE=$(basename "$ARCHIVE" .zip)
	ARCHIVE=$(basename "$ARCHIVE" .tar.gz)
	[ "$PS" ] && PS="*.ps"  # TRICK: Leer wenn keine PS-Option 
	if [ "$ZIP" ]
	then
		ARCHIVE="$ARCHIVE.zip"
		echo "zipping files to '$ARCHIVE' ..."
		zip -q "$ARCHIVE" *.pdf "$PS"        # quiet
	else
		ARCHIVE="$ARCHIVE.tgz"
		echo "taring files to '$ARCHIVE' ..."
		tar czf "$ARCHIVE" *.pdf "$PS"       # create, zip, file
	fi
# Aufräumen
	popd > /dev/null
	mv "$TMPDIR/$ARCHIVE" .
fi

