#!/bin/sh

test -z "$WG_DIR" && WG_DIR="$HOME/.wg"

for conf in /etc/wg.conf "$WG_DIR/config"; do
 test -f "$conf" && source "$conf"
done

htmlformatter() {
 links -force-html -dump -html-numbered-links 1 $@
}

formattedtidy() {
 sed -e '/^Links:$/,$ d' $@
}

formattedurlscan() {
 sed -e '1,/^Links:$/d;s/^\( *[1-9][0-9]*\)\. /\1 /' $@
}

urlbynum () {
 $HTMLFORMATTER "$2" | $FORMATTEDURLSCAN | \
 grep "^ *$1 " | sed -e 's/^ *[0-9]*  *\(.*\)/\1/'
}

make_track_line () {
 echo -n "<li><a href='`cat $2`'>"
 grep -A4 '<title>' "$1" | tr -s \\012 ' ' | \
  LANG=C sed -e 's/^.*<title>//;s/<.*$//'
 echo " (`cat $2`)</a></li>"
}

last_page_number () {
 expr `grep -o '<li>' "$WG_HISTORY" | wc -l` - 1
}

get_tty_rows() {
 stty -a 2>/dev/null | tr ';' \\012 | grep rows | sed -e 's/ *rows *//'
}

cut_to_length () {
 sed -e "$1 s/.*/.../;$1 q"
}

test -z "$LINES" && LINES=`get_tty_rows`
test -z "$EDITOR" && EDITOR=sensible-editor
test -z "$BROWSER" && BROWSER=sensible-browser
test -z "$WGET" && WGET="wget -k --user-agent=wg0.9"
test -z "$HTMLFORMATTER" && HTMLFORMATTER=htmlformatter
test -z "$FORMATTEDTIDY" && FORMATTEDTIDY=formattedtidy
test -z "$FORMATTEDURLSCAN" && FORMATTEDURLSCAN=formattedurlscan
test -z "$WG_BOOKMARK" && WG_BOOKMARK="$WG_DIR/bookmark"
test -z "$WG_HISTORY" && WG_HISTORY="$WG_DIR/history"
test -z "$WG_LAST" && WG_LAST="$WG_DIR/last"
test -z "$WG_LASTURL" && WG_LASTURL="$WG_DIR/lasturl"
test -z "$WG_TEMP" && WG_TEMP="$WG_DIR/temp"

mkdir -p "$WG_DIR"

URL=
NUMBER=
FILE="$WG_LAST"
MODE=

usage () {
cat <<EOT
Usage:	$0 [-e|-r|-l] URL
Usage:	$0 [-e|-r|-l] [-B|-h] number
Usage:	$0 [-e] [-B|-h]
EOT
}

while test -n "$1"; do
	case "$1" in
	--help) usage; exit ;;
	-B|--bookmark) FILE="$WG_BOOKMARK" ;;
	-h|--history) FILE="$WG_HISTORY" ;;
	--add-bookmark) MODE=bookmark ;;
	-e|--edit) MODE=edit ;;
	-r|--raw) MODE=raw ;;
	-l|--long) MODE=long ;;
	-s|--short) MODE=short ;;
	-i|--interactive) MODE=interactive ;;
	--links) MODE=links ;;
	--address) MODE=address ;;
	-b|--back) FILE="$WG_HISTORY"; NUMBER=`last_page_number "$FILE"` ;;
	-*) echo "wg: unknown option: $1" 1>&2 ;;
	1*|2*|3*|4*|5*|6*|7*|8*|9*) NUMBER="$1" ;;
	*) URL="$1" ;;
	esac
	shift
done

test -z "$MODE" && MODE="$WG_DEFAULTMODE"

if test -n "$NUMBER"; then
	test -n "$URL" && echo "wg: $URL overridden by $NUMBER" 1>&2
	URL=`urlbynum "$NUMBER" "$FILE"`
	test -z "$URL" && echo "wg: no link number $NUMBER" 1>&2 && exit 1
	FILE="$WG_LAST"
fi

if test -n "$URL"; then
	$WGET -O "$WG_TEMP" "$URL" || exit $?
	mv "$WG_TEMP" "$WG_LAST"
	echo "$URL" > "$WG_LASTURL"
	make_track_line "$WG_LAST" "$WG_LASTURL" >> "$WG_HISTORY"
	FILE="$WG_LAST"
	test -z "$MODE" && MODE=short
fi

case "$MODE" in
	bookmark) make_track_line "$WG_LAST" "$WG_LASTURL" >> "$WG_BOOKMARK" ;;
	edit) exec $EDITOR "$FILE" ;;
	interactive) $BROWSER "$FILE" ;;
	raw) cat "$FILE" ;;
	links) $HTMLFORMATTER "$FILE" | $FORMATTEDURLSCAN ;;
	address) cat "$WG_LASTURL" ;;
	short) $HTMLFORMATTER "$FILE" | $FORMATTEDTIDY | \
		cut_to_length `expr $LINES - 1` ;;
	*) $HTMLFORMATTER "$FILE" | $FORMATTEDTIDY ;;
esac

