#!/bin/sh

# TeX-Config version 0.1. I hope, you will love this script :-)

# More comments, more verbose messages, and better error handling are needed.
# It sould give more help (e.g on ls-R and localfont) and ask a bit more
# for confirmations.

# Any comments, improvements, ... please via Email to:
# Thomas Esser, te@informatik.uni-hannover.de
# Copyright: Thomas Esser, September 1994

# These are setup in $TETEXDIR/texmf.cnf.
progname=`basename $0`
tmpdir=${TMP-/tmp}/texconf$$
std_pager=less
xdvi_shrink_scale=75
std_editor=vi

log=$tmpdir/logfile
trap "cd / ; eval rm -rf $tempdir /tmp/menu$$ /tmp/ans$$ /tmp/texconf$$" 0 1 2 15
test -d $tmpdir || mkdir $tmpdir
cd $tmpdir

echo "TeX-Config. Start on `date`" > $log

exist_test()
{
	type=$1 ; name=$2
	if test ! $type $name ; then
            dialog --msgbox \
                "$name does not exist. Aborting." 5 78
	    exit
	fi
}

unset mode

tex=`kpsexpand '$TETEXDIR' 2>> $log`
texmf=`kpsexpand '$TEXMF' 2>> $log`
web2c=`kpsexpand '$WEB2C' 2>> $log`
dvips=`kpsexpand '$DVIPSDIR' 2>> $log`
tools_dir=`kpsexpand '$SETUPDIR' 2>> $log`/etc
formats=$web2c/formats
bases=$web2c/bases
xdvi_app=`kpsexpand '$XDVIDIR' 2>> $log`/lib/X11/app-defaults
xdvi_conf=$xdvi_app/XDvi
dvips_conf_dir=$texmf/dvips
lthyph=`kpsewhich tex language.dat 2>> $log`
texini=`kpsewhich tex tex.ini 2>> $log`
modes=`kpsewhich mf modes.mf 2>> $log`

exist_test -d $tmpdir
exist_test -d $tools_dir

cd $tmpdir

EDIT=${VISUAL-${EDITOR-$std_editor}}
PAGER=${PAGER-$std_pager}
PATH=$PATH:$tools_dir

function readln () {
	if [ "$DEFAULT" = "-d" ] ; then
		echo "$1"
		ans=$2
	else
		echo -n "$1"
		IFS='@' read ans </dev/tty || exit 1
		[ -z "$ans" ] && ans=$2
	fi
}

choose-editor()
{
	clear
	dialog --inputbox \
		"Your editor for changing config-files currently\\nis set to $EDIT.\\n\\nPress RETURN to accept this default or enter\\nthe name of the editor of your choice.\\n\\n" \
		20 60 2> /tmp/menu$$
	x=`cat /tmp/menu$$`
	test -z "$x" || EDIT=$x
}

choose-pager()
{
        clear
        dialog --inputbox \
                "Your pager to view the logfile currently\\nis set to $PAGER.\\n\\nPress RETURN to accept this default or enter\\nthe name of the pager of your choice.\\n\\n" \
                20 60 2> /tmp/menu$$
        x=`cat /tmp/menu$$`
        test -z "$x" || PAGER=$x
}


setup-preferences()
{
    while true ; do
        clear
        dialog \
                --menu "teTeX: preferences section" \
                9 78 3 \
                EDITOR 'Set up editor for changing config-files' \
                PAGER 'Set up pager to view the logfile' \
                RETURN 'Back to main menu' \
                2> /tmp/menu$$
        ans=`cat /tmp/menu$$`
        test -z "$ans" && return
        case "$ans" in
            EDITOR)       choose-editor ;;
            PAGER)      choose-pager ;;
            RETURN)     return ;;
        esac
    done
}

config-tex()
{
	exist_test -d $formats
exist_test -f $texini

	$EDIT $texini
	echo "Running initex. Please wait ..."
	initex $texini 2>&1 | tee -a $log
	mv -f tex.fmt $formats 2>&1 | tee -a $log
	ln -sf tex.fmt $formats/plain.fmt 2>&1 | tee -a $log
	mv -f tex.log $formats 2>&1 | tee -a $log
}

config-latex()
{
	exist_test -d $formats
exist_test -f $lthyph

	$EDIT $lthyph
	echo "Running initex. Please wait ..."
	initex latex.ltx 2>&1 | tee -a $log
	mv -f latex.fmt $formats 2>&1 | tee -a $log
	mv -f latex.log $formats 2>&1 | tee -a $log
}

choose-mode()
{
exist_test -f $modes
	if [ ! -z "$mode" ] ; then
		clear
		if yesno "Use mode $mode as default $2?" 10 78 ; then
			: # nothing
		else
			mode=""
		fi
	fi
	if [ -z "$mode" ] ; then
	    clear
	    eval dialog \
		--title \"teTeX-Config: MetaFont mode\" \
		--menu \"Choose a mode from modes.mf.\\nNote: Do not type too quick.\" \
		23 78 14 `list_mf_modes $modes` \
		2> $1
	else
		echo $mode > $1
	fi
}

config-mf()
{
	exist_test -d $bases
exist_test -f $modes

	choose-mode /tmp/ans$$ "for localfont in modes.mf"
	mode=`cat /tmp/ans$$`
	test -z "$mode" && return
	replace '^localfont :=.*$' "localfont := $mode;" $modes 2>&1 | tee -a $log
	inimf mf.ini		2>&1 | tee -a $log
	mv -f mf.base $bases	2>&1 | tee -a $log
	ln -sf mf.base $bases/plain.base 2>&1 | tee -a $log
	mv -f mf.log $bases	2>&1 | tee -a $log
	inimf cmmf.ini		2>&1 | tee -a $log
	mv -f cmmf.base $bases	2>&1 | tee -a $log
	mv -f cmmf.log $bases	2>&1 | tee -a $log
}

config-dvips-paper()
{
	clear
	eval dialog \
		--title \"teTeX-Config: dvips default paper\" \
		--menu \"Choose the default papersize definition for dvips.\" \
		15 78 8 `list_dvips_papers $dvips_conf` \
		2> /tmp/menu$$
	paper=`cat /tmp/menu$$`
	test -z "$paper" && return ;
	setup-dvips-paper $dvips_conf "$paper" 2>&1 | tee -a $log
}

dvips-choose-printcmd()
{
	clear
        dialog --inputbox \
                "Enter the command to print to the printer '$printer'.\\nIn general, you need a command like 'lpr' or 'lpr -Pfoo'.\\nTo accept the default of 'lpr' just press return.\\n" \
                15 78 2> /tmp/menu$$
        x=`cat /tmp/menu$$`
        if [ -z "$x" ] ; then
		echo lpr >&2
	else
		echo $x >&2
	fi

}

dvips-test-print()
{
	cd $tmpdir					
	clear
	latex testpage					2>&1 | tee -a $log
	case $printer in
	    default)	dvips testpage ;;
	    *)		dvips -P$printer testpage ;;
	esac						2>&1 | tee -a $log
	
}

yesno()
{
	clear
	dialog --yesno "$@"
}

dvips-setup-mode()
{
        choose-mode /tmp/ans$$ "mode for printer '$printer'"
        mode=`cat /tmp/ans$$`
        test -z "$mode" && return
        res=`find_res $mode 2>> $log`
        config-replace $dvips_conf '^M ' "M $mode" 2>&1 | tee -a $log
        config-replace $dvips_conf '^D ' "D $res" 2>&1 | tee -a $log
}

dvips-setup-printcmd()
{
        dvips-choose-printcmd 2> /tmp/ans$$
        printcmd=`cat /tmp/ans$$`
        test -z "$printcmd" && return
        config-replace $dvips_conf '^o ' "o |$printcmd" 2>&1 | tee -a $log
}

dvips-setup-offsets()
{
	clear
        dialog --inputbox \
                "Enter a dimension pair, e.g. 2mm,0.5in" \
                20 60 2> /tmp/menu$$
        x=`cat /tmp/menu$$`
	test -z "$x" || config-replace $dvips_conf '^O ' "O $x" 2>&1 | tee -a $log
}

dvips_config_local()
{
    exist_test -d $dvips_conf_dir

    while true ; do
        clear
        dialog \
                --menu "teTeX: set up printer '$printer' for dvips" \
                12 78 5 \
                MODE 'Set up mf mode (resolution will be calculated as well)' \
                CMD 'Set up the command to print on this printer' \
                OFFSETS 'Set up offsets for prining' \
                TEST 'Print a testpage' \
                RETURN 'Back to dvips main menu' \
                2> /tmp/menu$$
        ans=`cat /tmp/menu$$`
        test -z "$ans" && return
        case "$ans" in
	    MODE)	dvips-setup-mode ;;
	    CMD)	dvips-setup-printcmd ;;
	    OFFSETS)	dvips-setup-offsets ;;
	    TEST)	dvips-test-print ;;
	    RETURN)	return ;;
	esac
    done
}

dvips_config_global()
{
	config-dvips-paper
	printer=default
	dvips_config_local
}

dvips-get-printername()
{
	clear
	dialog --inputbox \
		"Printer name" \
		20 60 2> /tmp/menu$$
	x=`cat /tmp/menu$$`
	test -z "$x" || echo $x >&2
}

config-dvips()
{
    while true ; do
	clear
	dialog \
		--menu "teTeX: dvips section" \
		12 78 5 \
		GLOBAL 'Global settings' \
		ADD 'Set up a new printer' \
		DEL 'Remove a printer definition' \
		CHANGE 'Change an existing printer definition' \
		RETURN 'Back to main menu' \
		2> /tmp/menu$$
	ans=`cat /tmp/menu$$`
	test -z "$ans" && return
	case "$ans" in
		ADD|DEL|CHANGE)
			dvips-get-printername 2> /tmp/ans$$
			printer=`cat /tmp/ans$$`
			test -z "$printer" && continue
			dvips_conf=$dvips_conf_dir/config.$printer
			;;
	esac
	case "$ans" in
	    GLOBAL) 	dvips_conf=$dvips_conf_dir/config.ps
			dvips_config_global ;;
	    ADD)	if [ -f $dvips_conf_dir/config.$printer ] ; then
				clear
				dialog --msgbox \
					"Configuration for $printer already exists." 5 78
				continue
			fi
			touch $dvips_conf_dir/config.$printer
			dvips_config_local ;;
	    DEL)	rm -f $dvips_conf_dir/config.$printer $dvips_conf_dir/config.$printer.orig ;;
	    CHANGE)	if [ ! -f $dvips_conf_dir/config.$printer ] ; then
				clear
				dialog --msgbox \
					"Configuration for $printer not found." 5 78
				continue
			fi
			dvips_config_local ;;
	    RETURN)	return ;;
	esac
    done
}

xdvi-setup-paper()
{
        clear
        eval dialog \
                --title \"TeX-Config: xdvi default paper\" \
                --menu \"Choose the default papersize definition for xdvi.\" \
                23 78 15 `list_xdvi_papers` \
                2> /tmp/menu$$
        paper=`cat /tmp/menu$$`
        test -z "$paper" && return
        config-replace $xdvi_conf 'paper:' "*paper: $paper" 2>&1 | tee -a $log
}

xdvi-setup-mode()
{
        choose-mode /tmp/ans$$ "mode for xdvi"
        mode=`cat /tmp/ans$$`
        test -z "$mode" && return
        res=`find_res $mode 2>> $log`
        shrink=`expr $res / $xdvi_shrink_scale`
        config-replace $xdvi_conf 'mfmode:' "*mfmode: $mode"                    2>&1 | tee -a $log
        config-replace $xdvi_conf 'pixelsPerInch:' "*pixelsPerInch: $res"       2>&1 | tee -a $log
        config-replace $xdvi_conf 'shrinkFactor:' "*shrinkFactor: $shrink"      2>&1 | tee -a $log
}

find_appdir_default()
{
	for i in /usr/X11R6/lib/X11/app-defaults /usr/X386/lib/X11/app-defaults \
		/usr/lib/X11/app-defaults /usr/local/lib/X11/app-defaults \
		/usr/X11/lib/X11/app-defaults; do
		if [ -d $i ]; then
			echo $i
			return
		fi
	done
}

xdvi-make-link()
{
	clear
	appdir_default=`find_appdir_default`
        dialog --inputbox \
                "Enter the directory, where your X app-defaults reside.\\nFor XFree-3.1 this is /usr/X11R6/lib/X11/app-defaults.\\nEarlier version used /usr/X386/lib/X11/app-defaults.\\n\\nThe default is set to '$appdir_default'.\\nPress RETURN to accept this default or enter a new value.\\n" \
                20 63 2> /tmp/menu$$ || return
        x=`cat /tmp/menu$$`
        test -z "$x" && x=$appdir_default
	xapp="$x"
	if [ ! -d "$xapp" ] ; then
	    dialog --msgbox \
		"The directory $xapp does not exist." 5 78
	    return
	fi

	rm -f $xapp/XDvi	2>&1 | tee -a $log
	ln -sf $xdvi_conf $xapp	2>&1 | tee -a $log
}

xdvi-make-test()
{
	if [ -z "$DISPLAY" ] ; then
		:
	fi
        cd $tmpdir                                      2>&1 | tee -a $log
        clear
        latex small2e                                  2>&1 | tee -a $log
	clear ; reset
        xdvi small2e                                 2>&1 | tee -a $log &
}


config-xdvi()
{
    test -d $xdvi_app || mkdir -p $xdvi_app
    test -f $xdvi_conf || touch $xdvi_conf
    exist_test -f $xdvi_conf

    while true ; do
        clear
        dialog \
                --menu "teTeX: xdvi section" \
                12 78 5 \
                MODE 'Set up mf mode (resolution will be calculated as well)' \
                PAPER 'Set the default papertype for xdvi' \
                LINK 'Install the app-default file via symbolic link' \
                TEST 'View a testfile' \
                RETURN 'Back to main menu' \
                2> /tmp/menu$$
        ans=`cat /tmp/menu$$`
        test -z "$ans" && return
        case "$ans" in
            MODE)       xdvi-setup-mode ;;
            PAPER)        xdvi-setup-paper ;;
            LINK)    xdvi-make-link ;;
            TEST)       xdvi-make-test ;;
            RETURN)     return ;;
        esac
    done
}

keep_mode()
{
	clear
	yesno "Use mode $mode" 10 78
}


while true ; do
	clear
	dialog \
		--title "TeX-Config main menu" \
		--menu "
Hint: all output of external commands (e.g. initex) is logged into
a file. You can look at this file using "LOG".

For the first run of this program, it is propably best to run each
menu item (in the given order).
" 22 78 9 \
		"PREF"	'Set up personal preferences' \
		"HASH"	'Rebuild ls-R database' \
		"PLAIN"	'Set up plain-TeX hyphenation tables' \
		"LATEX"	'Set up LaTeX hyphenation tables' \
		"MF"	'Set up MetaFont' \
		"DVIPS"	'Set up dvips' \
		"XDVI"	'Set up xdvi' \
		"LOG"	'View logfile' \
		"EXIT"	'Exit TeX-Config' \
		2> /tmp/menu$$

	
	case "`cat /tmp/menu$$`" in
	HASH)	texhash ;;
	PREF)	setup-preferences ;;
	PLAIN)	config-tex ;;
	LATEX)	config-latex ;;
	MF)	config-mf ;;
	XDVI)	config-xdvi ;;
	DVIPS)	config-dvips ;;
	LOG)	$PAGER $log ;;
	*)	exit ;;
	esac
done
