#!/bin/sh
# Benoetigte Pakete: grep sed awk aspell
#
################################################################
# Environment
################################################################
#
# Unter diesem Verzeichnis ist die Woerterbuch-Datei zu finden  
SteakDIR=/usr/lib64/Steak/Datensatz
#SteakDIR=$HOME/bin/Steak/Datensatz
# Der Name der Woerterbuch-Datei
SteakFILE=ger-eng.txt
#SteakFILE=Datenbank.txt
# Unter diesem Verzeichnis ist die ausfuehrbaren Dateien zu finden  
BINDIR=/usr/lib64/Steak
#BINDIR=$HOME/bin/Steak
# Temp-Dir
TMPDIR=/tmp
# Dieses Programm braucht unbeding gnu-grep
GREP="grep"
# 
SLEEPTIME=30
# Die Option, mit der man aspell bei den deutschsprachigen Texten aufruft:
ASPELLDEUTSCH="--lang de"
# Die Uebersetzung folgt nach dem Regel:
#CONFIGVAR="ENGLISCH<->DEUTSCH"
CONFIGVAR="ENGLISCH->DEUTSCH"
#CONFIGVAR="DEUTSCH->ENGLISCH"
#
NLSEP='-s ) '
#NLSEP='-s )\ '
#NLSEP='-s'
################################################################
#
# Hier wird nach der persoenlichen Config-Datei gesucht! 
#
if [ -r $HOME/.Steakconfig ]
then
    . $HOME/.Steakconfig
fi
#
#
################################################################
HELPFILE=$BINDIR/help.txt
# Die Dateien heissen woerterbuch+pid
TMPDATEI="$TMPDIR/woerterbuch_$$"
#
#
IGNORVAR="J"
POLLVAR="J"
KONTEXTAUSGABEVAR="J"
WAITVAR="J"
ASPELLVAR="J"
CLIPBOARDVAR="N"
# 1 steht fuer AND, 2 fuer OR und 0 fuer gar keine Verbindung
ANDORVAR="0"
WORTANZAHLVAR="1"
#
# Mit Hilfe von "printbuffer" (bzw. "xcb") hat man Zugriff auf den Zwischenpuffer 
BUFFERPROGRAMM="$BINDIR/printbuffer"
#BUFFERPROGRAMM="xcb -p 0"
# Zeitbeschraenktes Lesen (poll)
#READPROGRAMM="timed-read"
READPROGRAMM="$BINDIR/poll"
#READPROGRAMM="read"
SPACEFILTER="$BINDIR/spacefilter"
################################################################




terminat_funktion ()
{
    rm -f $TMPDATEI $TMPDATEI~
    exit 0
}


# Routine fuer den Fall "ctrl-c"
trap terminat_funktion 2


or_funktion ()
{
    WORTANZAHLVAR="$#"
    if [ $# != 1 ]
    then
	XXX="$1"
	shift
	for YYYSCHLEIFE
	do
	    XXX="$XXX"'\>\|\<'"$YYYSCHLEIFE"
	done
    fi
}


and_funktion ()
{
    WORTANZAHLVAR="$#"
    if [ $# != 1 ]
    then
	if [ $# = 2 ]
	then
	    XXX="$1"'\>.*\<'"$2"'\>\|\<'"$2"'\>.*\<'"$1"
	else
	    XXX="$1"'\>.*\<'"$2"'\>.*\<'"$3"'\>\|\<'"$1"'\>.*\<'"$3"'\>.*\<'"$2"'\>\|\<'"$2"'\>.*\<'"$1"'\>.*\<'"$3"'\>\|\<'"$2"'\>.*\<'"$3"'\>.*\<'"$1"'\>\|\<'"$3"'\>.*\<'"$1"'\>.*\<'"$2"'\>\|\<'"$3"'\>.*\<'"$2"'\>.*\<'"$1"
	fi
    fi
}


ganze_wort_suchen_funktion ()
{
    if [ $IGNORVAR = "J" ]
    then                           # Zwischen Gross- und Kleinschreibung nicht unterscheiden
	case $CONFIGVAR in
	    "ENGLISCH->DEUTSCH")
		$GREP -i "::.*::.*\(\<$XXX\>\)" $SteakDIR/$SteakFILE 1> $TMPDATEI
		;;
	    "DEUTSCH->ENGLISCH")
		$GREP -i "\(\<$XXX\>\).*::.*::" $SteakDIR/$SteakFILE 1> $TMPDATEI
		;;
	    "ENGLISCH<->DEUTSCH")
		$GREP -i "\(\<$XXX\>\).*::.*::\|::.*::.*\(\<$XXX\>\)" $SteakDIR/$SteakFILE 1> $TMPDATEI
	esac
    else
	case $CONFIGVAR in
	    "ENGLISCH->DEUTSCH")
		$GREP "::.*\(\<$XXX\>\)" $SteakDIR/$SteakFILE 1> $TMPDATEI
		;;
	    "DEUTSCH->ENGLISCH")
		$GREP "\(\<$XXX\>\).*::.*::" $SteakDIR/$SteakFILE 1> $TMPDATEI
		;;
	    "ENGLISCH<->DEUTSCH")
		$GREP "\(\<$XXX\>\).*::.*::\|::.*::.*\(\<$XXX\>\)" $SteakDIR/$SteakFILE 1> $TMPDATEI
	esac
    fi
}


wort_praefix_suchen_funktion ()
{
    if [ $IGNORVAR = "J" ]
    then
	case $CONFIGVAR in
	    "ENGLISCH->DEUTSCH")
		$GREP -i "::.*::.*\(\<$XXX\)" $SteakDIR/$SteakFILE 1> $TMPDATEI
		;;
	    "DEUTSCH->ENGLISCH")
		$GREP -i "\(\<$XXX\).*::.*::" $SteakDIR/$SteakFILE 1> $TMPDATEI
		;;
	    "ENGLISCH<->DEUTSCH")
		$GREP -i "::.*::.*\(\<$XXX\)\|\(\<$XXX\).*::.*::" $SteakDIR/$SteakFILE 1> $TMPDATEI
	esac
    else
	case $CONFIGVAR in
	    "ENGLISCH->DEUTSCH")
		$GREP "::.*::.*\(\<$XXX\)" $SteakDIR/$SteakFILE 1> $TMPDATEI
		;;
	    "DEUTSCH->ENGLISCH")
		$GREP "\(\<$XXX\).*::.*::" $SteakDIR/$SteakFILE 1> $TMPDATEI
		;;
	    "ENGLISCH<->DEUTSCH")
		$GREP "::.*::.*\(\<$XXX\)\|\(\<$XXX\).*::.*::" $SteakDIR/$SteakFILE 1> $TMPDATEI
	esac
    fi
}


ausgabe_funktion ()
{
    case $CONFIGVAR in
	"ENGLISCH->DEUTSCH")
	    echo "--------------------------------------------------"
	    echo "          English     ->     Deutsch" 
	    awk -F"::" '{print $3 " :== " $2}' $TMPDATEI | nl -w 3 "$NLSEP"
	    ;;
	"DEUTSCH->ENGLISCH")
	    echo "--------------------------------------------------"
	    echo "          Deutsch     ->     English" 
	    awk -F"::" '{print $2 " :== " $3}' $TMPDATEI | nl -w 3 "$NLSEP"
	    ;;
	"ENGLISCH<->DEUTSCH")
	    echo "--------------------------------------------------"
	    echo "          Deutsch     <->     English" 
	    awk -F"::" '{print $2 " :== " $3}' $TMPDATEI | nl -w 3 "$NLSEP"
    esac
}


mit_und_ohne_kontext_ausgabe_funktion ()
{
    echo "--------------------------------------------------"
    case $CONFIGVAR in
	"ENGLISCH->DEUTSCH")
	    echo "          English     ->     Deutsch" 
	    $GREP -i -e "::.*::\( \)*\(.*\(,\|;\)\)*\( \)*\(\<$XXX\>\)\( \)*\({.*}\)\?\( \)*\(\[.*\]\)\?\( \)*\(\(,\|;\)\w*\)*$" $TMPDATEI | awk -F"::" '{print $3 " :== " $2}' | nl -w 3 "$NLSEP"
	    ;;
	"DEUTSCH->ENGLISCH")
	    echo "          Deutsch     ->     English" 
	    $GREP -i -e "^\(.*\(,\|;\)\)*\( \)*\(\<$XXX\>\)\( \)*\({.*}\)\?\( \)*\(\[.*\]\)\?\( \)*\(\(,\|;\).*\)*\( \)*::.*::" $TMPDATEI | awk -F"::" '{print $2 " :== " $3}' | nl -w 3 "$NLSEP"
	    ;;
	"ENGLISCH<->DEUTSCH")
	    echo "          Deutsch     <->     English" 
	    $GREP -i -e "\(^\(.*\(,\|;\)\)*\( \)*\(\<$XXX\>\)\( \)*\({.*}\)\?\( \)*\(\[.*\]\)\?\( \)*\(\(,\|;\).*\)*\( \)*::.*::\)\|\(::.*::\( \)*\(.*\(,\|;\)\)*\( \)*\(\<$XXX\>\)\( \)*\({.*}\)\?\( \)*\(\[.*\]\)\?\( \)*\(\(,\|;\)\w*\)*$\)" $TMPDATEI | awk -F"::" '{print $2 " :== " $3}' | nl -w 3 "$NLSEP"
    esac


    if [ $POLLVAR = "J" ]
    then 
	echo "Moechten Sie das Wort in einem Kontext sehen (j/n)?" # Im Kontext 
	if [ $READPROGRAMM = "read" ]
	then
	    read XXXREAD
	else
	    XXXREAD=`$BINDIR/poll $SLEEPTIME`
	fi
    else
	if [ $KONTEXTAUSGABEVAR = "J" ]
	then
	    echo
	    echo "---------- Jetzt die Kontext-Eintraege ----------"
	    XXXREAD="j"
	else
	    XXXREAD="N"
	fi
    fi
    
    case $XXXREAD in
	[jJyY]) 
	    if [ $POLLVAR = "J" ]
	    then
		clear
	    fi
	    case $CONFIGVAR in
		"ENGLISCH->DEUTSCH")
		    echo "          English     ->     Deutsch" 
		    $GREP -iv -e "::.*::\( \)*\(.*\(,\|;\)\)*\( \)*\(\<$XXX\>\)\( \)*\({.*}\)\?\( \)*\(\[.*\]\)\?\( \)*\(\(,\|;\)\w*\)*$" $TMPDATEI | awk -F"::" '{print $3 " :== " $2}' | nl -w 3 "$NLSEP"
		    XXXKONTEXT=`$GREP -iv -e "::.*::\( \)*\(.*\(,\|;\)\)*\( \)*\(\<$XXX\>\)\( \)*\({.*}\)\?\( \)*\(\[.*\]\)\?\( \)*\(\(,\|;\)\w*\)*$" $TMPDATEI | awk -F"::" '{print $3 " :== " $2}' | nl -w 3 "$NLSEP"`
		    if [ -z "$XXXKONTEXT" ]; then (echo ; echo "      Keine Kontext-Eintraege gefunden!!!"); fi 
		    ;;
		"DEUTSCH->ENGLISCH")
		    echo "          Deutsch     ->     English" 
		    $GREP -iv -e "^\(.*\(,\|;\)\)*\( \)*\(\<$XXX\>\)\( \)*\({.*}\)\?\( \)*\(\[.*\]\)\?\( \)*\(\(,\|;\).*\)*\( \)*::.*::" $TMPDATEI | awk -F"::" '{print $2 " :== " $3}' | nl -w 3 "$NLSEP"
		    XXXKONTEXT=`$GREP -iv -e "^\(.*\(,\|;\)\)*\( \)*\(\<$XXX\>\)\( \)*\({.*}\)\?\( \)*\(\[.*\]\)\?\( \)*\(\(,\|;\).*\)*\( \)*::.*::" $TMPDATEI | awk -F"::" '{print $2 " :== " $3}' | nl -w 3 "$NLSEP"`
		    if [ -z "$XXXKONTEXT" ]; then (echo ; echo "      Keine Kontext-Eintraege gefunden!!!"); fi 
		    ;;
		"ENGLISCH<->DEUTSCH")
		    echo "          Deutsch     <->     English" 
		    $GREP -iv -e "\(^\(.*\(,\|;\)\)*\( \)*\(\<$XXX\>\)\( \)*\({.*}\)\?\( \)*\(\[.*\]\)\?\( \)*\(\(,\|;\).*\)*\( \)*::.*::\)\|\(::.*::\( \)*\(.*\(,\|;\)\)*\( \)*\(\<$XXX\>\)\( \)*\({.*}\)\?\( \)*\(\[.*\]\)\?\( \)*\(\(,\|;\)\w*\)*$\)" $TMPDATEI | awk -F"::" '{print $2 " :== " $3}' | nl -w 3 "$NLSEP"
		    XXXKONTEXT=`$GREP -iv -e "\(^\(.*\(,\|;\)\)*\( \)*\(\<$XXX\>\)\( \)*\({.*}\)\?\( \)*\(\[.*\]\)\?\( \)*\(\(,\|;\).*\)*\( \)*::.*::\)\|\(::.*::\( \)*\(.*\(,\|;\)\)*\( \)*\(\<$XXX\>\)\( \)*\({.*}\)\?\( \)*\(\[.*\]\)\?\( \)*\(\(,\|;\)\w*\)*$\)" $TMPDATEI | awk -F"::" '{print $2 " :== " $3}' | nl -w 3 "$NLSEP"`
		    if [ -z "$XXXKONTEXT" ]; then (echo ; echo "      Keine Kontext-Eintraege gefunden!!!"); fi 
	    esac
	    ;;
	*)  
	    terminat_funktion 
    esac
}



#########################################################################################
# Hier faengt das Programm an!!!
#########################################################################################

if [ -r $BINDIR/version.txt ]
then
    . $BINDIR/version.txt
fi


if [ "$BUFFERPROGRAMM" = "xcb -p 0" ]
then
    xcb -S 0
fi


# Hier wird geschaut, ob das Programm mit einem Argument aufgerufen wurde oder nicht...

if [ $# -eq 0 ]
# Falls das Programm ohne Arg. gerufen wird, wird das Wort, das im Buffer ist uebernommen!
then
    XXX=`$BUFFERPROGRAMM  | recode l9..u8 | sed -f $BINDIR/iso2txt`
    XXXUMLAUT=`$BUFFERPROGRAMM | recode l9..u8`
# Sonst wird nach dem Arg1 gesucht...
else
    for XXXSCHLEIFE
    do
	case $XXXSCHLEIFE in
	    -v) 
		echo "steak, version $VERSIONNUMMER: the dictionary for Unix (razi@cs.uni-frankfurt.de)"
		terminat_funktion 
		;;
	    -h)
		#clear
		echo
		echo "steak, version $VERSIONNUMMER: the dictionary for Unix (razi@cs.uni-frankfurt.de)"
		echo
		cat $HELPFILE
		terminat_funktion 
		;;
	    -noignor)
		IGNORVAR="N"
		;;
	    -and)
		ANDORVAR="1"
		ASPELLVAR="N"
		;;
	    -or)
		ANDORVAR="2"
		ASPELLVAR="N"
		;;
	    -e)
		CONFIGVAR="ENGLISCH->DEUTSCH"

		;;
	    -d)
		CONFIGVAR="DEUTSCH->ENGLISCH"
		;;	
	    -de|-ed)
		CONFIGVAR="ENGLISCH<->DEUTSCH"
		;;
	    -nowait)
		POLLVAR="N"
		WAITVAR="N"
		SLEEPTIME=0
		ASPELLVAR="N"
		;;
	    -noaspell)
		ASPELLVAR="N"
		;;
	    -k)
		POLLVAR="N"
		KONTEXTAUSGABEVAR="N"
		;;
	    +k)
		POLLVAR="N"
		KONTEXTAUSGABEVAR="J"
		;;
	    -clipboard)
		CLIPBOARDVAR="J"
		XXX=`$BUFFERPROGRAMM  | recode l9..u8 | sed -f $BINDIR/iso2txt`
		XXXUMLAUT=`$BUFFERPROGRAMM | recode l9..u8`
		;;
	    *) 
		if [ $CLIPBOARDVAR = "N" ]
		then
		    XXX=`echo "$XXXSCHLEIFE" | sed -f $BINDIR/iso2txt`
		    XXXUMLAUT=`echo "$XXXSCHLEIFE"`
		fi
	esac
    done
    if [ -z "$XXX" ]
    then
	XXX=`$BUFFERPROGRAMM  | recode l9..u8| sed -f $BINDIR/iso2txt`
	XXXUMLAUT=`$BUFFERPROGRAMM | recode l9..u8`
    fi
fi




# Falls das leere Wort als Eingabe -> beende das Programm

if ( test -z "$XXX" || test "$XXX" = " " )
then
    echo
    echo "Bitte geben Sie beim Aufruf des Programms immer ein Wort ein!!!"
    echo
    if [ $WAITVAR = "J" ]
    then
	sleep 5
    fi	
    terminat_funktion
fi


# Anfangs- und End-Leer-Zeichen werden eliminiert!
SPAXXX=`$SPACEFILTER "$XXX"`
XXX="$SPAXXX"


case $ANDORVAR in
    "1")
	and_funktion $XXX
	;;
    "2")
	or_funktion $XXX
esac



if ganze_wort_suchen_funktion
then
    mit_und_ohne_kontext_ausgabe_funktion
else
    echo "Das Wort \"$XXX\" wurde nicht gefunden"
    if wort_praefix_suchen_funktion    
    then
	echo "Die Woerter mit Praefix \"$XXX\" sind:"
	ausgabe_funktion
    else
	echo "Kein Wort wurde mit dem Praefix \"$XXX\" gefunden."
	if [ $ASPELLVAR = "J" ]
	then
	    echo "Aspell wird gestartet!!!"
	    sleep 2
	    case $CONFIGVAR in
		"ENGLISCH->DEUTSCH")
		    echo "$XXX" > $TMPDATEI
		    aspell --lang en -c $TMPDATEI
		    XXX=`cat $TMPDATEI`  #ACHTUNG was passiert falls cat mehrere Namen ausspuckt!!!
		    ;;
		"DEUTSCH->ENGLISCH")
		    echo "$XXXUMLAUT" > $TMPDATEI
		    aspell -c $ASPELLDEUTSCH $TMPDATEI
		    XXX=`cat $TMPDATEI | sed -f $BINDIR/iso2txt`
		    XXXUMLAUT=`cat $TMPDATEI`
		    ;;
		"ENGLISCH<->DEUTSCH")
		    echo "$XXX" > $TMPDATEI
		    aspell --lang en  -c  $TMPDATEI
		    XXX=`cat $TMPDATEI` 
	    esac
	    if ganze_wort_suchen_funktion
	    then
		echo "Das Wort \"$XXX\" existiert im Woerterbuch..."
		mit_und_ohne_kontext_ausgabe_funktion
	    else
		echo "Das Wort \"$XXX\" wurde auch nicht gefunden!"
		if wort_praefix_suchen_funktion    
		then
		    echo "Aber die Woerter mit Praefix \"$XXX\" sind:"
		    ausgabe_funktion
		else
		    echo
		fi
	    fi
	fi	    
    fi	
fi


sleep $SLEEPTIME

terminat_funktion
