#!/bin/bash
# gutenberg2latex
# Project Gutenberg eBook in LaTeX-Dokument umwandeln
#set -xv
Usage="Usage: $0 [-h|-p|-n|-s|-4|-5]-l] eBookfile.txt"

phelp()
{
echo "
$Usage

Projekt Gutenberg eBook in ein LaTeX-Dokument umwandeln
(Convert Project Gutenberg eBook into a LaTeX-Document)

  Option -h: diese Hilfe
  Option -p: Leerzeile vor Absätzen als LaTeX-Anweisung
  Option -n: * * * * * durch \newpage ersetzen
  Option -s: einige Strukturierungen vornehmen
  Option -4: Zielformat A4-Buch (Standard)
  Option -5: Zielformat A5-Buch
  Option -l: Zeilenenden in Unix-Format wandeln (benötigt 'flip')

gutenberg2latex v0.1, Juni 2007
(c)2007 Patrick Grochowy -- gadgets.grochowy.de

Darf genutzt, verändert und verteilt werden, solange dieser Hinweis erhalten bleibt.
(May be used, changed and distributed, as long as this notice remains unchanged)
"
}

# Paramter verarbeiten
paragraph="false"
newpage="false"
structure="false"
format="a4"
nl_conv="false"

while getopts "hpns45l" optionen; do
	case "$optionen" in
	h)	phelp; exit 0;;
	p)	paragraph="true";;
	n)	newpage="true";;
	s)	structure="true";;
	4)	format="a4";;
	5)	format="a5";;
	l)	nl_conv="true";;
	*)	echo "$Usage" 1>&2 ; exit 2;;
	esac
done

if  [ $# == 0 -o "$1" == "--help" ]; then
  phelp
  exit 0
fi

eval eBookfile=\$$#

# eBookfile und Pfad trennen
eBookfileDirname=`dirname $eBookfile`
eBookfileBasename=`basename $eBookfile`
eBookfilePurename=${eBookfileBasename%.*}
tmpFile=$eBookfile.tmp
latexfile=$eBookfileDirname/$eBookfilePurename.tex

#
# Start
echo ""
echo "$latexfile erzeugen am: " `date +%T`

# eBookfile in Temp-Datei kopieren
cp $eBookfile $tmpFile # Quelldatei in Arbeitsdatei kopieren
chmod 644 $tmpFile # Arbeitsdatei auf 644 setzen

# Zeilenenden in Unix-Format wandeln mit flip
case "$nl_conv" in
	false)	;;
	true)	flip -b -u $tmpFile;; # Zeilenenden in $tmpFile in Unix-Format umwandeln
esac


# Title, Autor, Datum und eBook#  holen
title=`grep "^Title: " $tmpFile | sed -e 's/Title: //'`
author=`grep "^Author: " $tmpFile | sed -e 's/Author: //'` 
reldate=`grep "^Release Date: " $tmpFile | sed -e 's/Release Date: //' | sed -e 's/\[/\\\\\\\\ (/g' | sed -e 's/\#/\\\\#/'  | sed -e 's/\]/)/g'`

# LaTeX-Dateikopf bauen
case "$format" in
    a4)	header=`cat <<EOF
\documentclass[a4paper,10pt]{book}
%\usepackage[latin1]{inputenc}
%\usepackage[dvips,pdftex]{graphicx}

\author{$author}
\title{$title}
\date{$reldate}

% Formatänderungen

\begin{document}
\maketitle
\thispagestyle{empty}
EOF`
echo "$header" > $latexfile;;

    a5)	header=`cat <<EOF
\documentclass[a5paper,10pt]{book}
%\usepackage[latin1]{inputenc}
%\usepackage[dvips,pdftex]{graphicx}

\author{$author}
\title{$title}
\date{$reldate}

% Formatänderungen

\setlength{\parskip}{\baselineskip}

\begin{document}
\maketitle
\thispagestyle{empty}
EOF`
echo "$header" > $latexfile;;
esac

# LaTeX-Datei-Body schreiben

sed -e 's/\\/!-ssr-!/g' $tmpFile |
sed -e 's/\^/\\^/g' |
sed -e 's/\$/\\$/g' |
sed -e 's/&/\\&/g' |
sed -e 's/%/\\%/g' |
sed -e 's/~/\\~/g' | 
sed -e 's/#/\\#/g' |
sed -e 's/}/\\}/g' |
sed -e 's/{/\\{/g' |
sed -e ':begin
/_\([^_]*\)_/{
s//\\textsl{\1}/g
b begin
}
/_.*/{
N
s/_\([^_]*\n[^_]*\)_/\\textsl{\1}/g
t again
b begin
}
:again
P
D' |
sed -e 's/_/\\_/g' |
sed -e 's/!-ssr-!/\\\\/g' >> $latexfile

# LaTeX-Datei abschließen
echo "" >> $latexfile
echo "\end{document}" >> $latexfile

# Temp-Datei löschen
rm $tmpFile

# Strukturierungen versuchen
struct()
{
#
# Seitenumbrüche für den Buchbereich
	tmpFile=$latexfile.tmp
	cp $latexfile $tmpFile # LaTeXdatei in Tempdatei kopieren
sed -e '/^\*\*\* *START OF.*\|^\*\*\* *END OF.*/i\
\\newpage' $tmpFile > $latexfile
	rm $tmpFile # Temp-Datei wieder löschen

#
# Gutenberglizenz winzig und zweispaltig machen zum Platzsparen
	tmpFile=$latexfile.tmp
	cp $latexfile $tmpFile # LaTeXdatei in Tempdatei kopieren
sed -e '/^\*\*\* *START: FULL LICENSE *\*\*\*/i\
\\newpage\
\
\\twocolumn\
\\sloppy\
\\begin{tiny}' $tmpFile > $latexfile
	rm $tmpFile # Temp-Datei wieder löschen

	tmpFile=$latexfile.tmp
	cp $latexfile $tmpFile # LaTeXdatei in Tempdatei kopieren
sed -e '/^\\end{document}/i\
 \\end{tiny}' $tmpFile > $latexfile
	rm $tmpFile # Temp-Datei wieder löschen

#
# Kapitel suchen und falls gefunden als Kapitel deklarieren
	tmpFile=$latexfile.tmp
	cp $latexfile $tmpFile # LaTeXdatei in Tempdatei kopieren
sed -e 's/\(^CHAPTER \)\(.*\)/\\chapter{\2}/' $tmpFile > $latexfile
	rm $tmpFile # Temp-Datei wieder löschen

#
# Gerahmte Kästen als Minipages erzeugen
 #
 # Definition für gerahmte Box als Mnipage oben einfügen
	tmpFile=$latexfile.tmp
	cp $latexfile $tmpFile # LaTeXdatei in Tempdatei kopieren
sed -e '/^% Formatänderungen/a\
\\usepackage{fancybox}\
\\newenvironment{fminipage}\
    {\\begin{Sbox}\\begin{minipage}}\
    {\\end{minipage}\\end{Sbox}\\fbox{\\TheSbox}}' $tmpFile > $latexfile
	rm $tmpFile # Temp-Datei wieder löschen
 #
 #gerahmten Textblock finden und behandeln
	tmpFile=$latexfile.tmp
	cp $latexfile $tmpFile # LaTeXdatei in Tempdatei kopieren
sed -e '/\(^ *+-*+$\)/{
s//\\begin{center}\
 \\begin{fminipage}{0.85\\textwidth}/
:mitte
n
s/ *|//g
t mitte
s/\(^ *+-*+$\)/ \\end{fminipage}\
\\end{center}/}' $tmpFile > $latexfile
	rm $tmpFile # Temp-Datei wieder löschen
}

case "$structure" in
false)	;;
true)	struct;;
esac

#
# Absätze mit Leerzeile trennen?
conv_par()
{
tmpFile=$latexfile.tmp
cp $latexfile $tmpFile # LaTeXdatei in Tempdatei kopieren
sed -e '/^% Formatänderungen/a\
\\setlength{\\parskip}{\\baselineskip}' $tmpFile > $latexfile
rm $tmpFile # Temp-Datei wieder löschen
}

case "$paragraph" in
false)	;;
true)	conv_par;;
esac

#
# Sternchen in \newpage wandeln
conv_newpage()
{
tmpFile=$latexfile.tmp
cp $latexfile $tmpFile # LaTeXdatei in Tempdatei kopieren
sed -e 's/^       \*       \*       \*       \*       \*/\\newpage/' $tmpFile > $latexfile
rm $tmpFile # Temp-Datei wieder löschen
}

case "$newpage" in
false)	;;
true)	conv_newpage;;
esac

#
# Fertig
echo "$latexfile erzeugt  am: " `date +%T`
echo ""

