Current File : //bin/dict_lookup
#!/bin/sh

# Copyright (c) 2010
#    Alexander Vorontsov <vorontsov@imb.invention-machine.com>
#    Aleksey Cheusov     <vle@gmx.net>
# 
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
# 
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
# 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

############################################################
# Variables settable by user

#D_DICT_CMD=$HOME/bin/your-own-dict-program
D_AWK_PROG=${D_AWK_PROG-awk}
D_XCLIP_PROG=${D_XCLIP_PROG-xclip}
D_XTERM_PROG=${D_XTERM_PROG-xterm}
D_UTF8_LOCALE=${D_UTF8_LOCALE-`locale -a |fgrep .utf8 | head -n 1`}
D_DICT_PROG=${D_DICT_PROG-dict}
D_DICT_SERVER=${D_DICT_SERVER--h dict.org}
D_DICT_PORT=${D_DICT_PORT--p 2628}
D_DICT_DB_OPT=${D_DICT_DB_OPT--d foldoc}
D_XTERM_CLASS=${D_XTERM_CLASS--class XTerm}
D_XTERM_NAME=${D_XTERM_NAME--name xterm_dict}
D_XTERM_TITLE=${D_XTERM_TITLE--title dict_lookup}
D_TEXT_WIDTH=${D_TEXT_WIDTH-cyrillic_text_width}
D_TERM_X=${D_TERM_X-+200}
D_TERM_Y=${D_TERM_Y-+200}
D_TERM_H=${D_TERM_H-+40}
D_PAGER=${D_PAGER-less -R}

#if test -z "$COLORIZER"; then
#    colorit_config=$HOME/.colorit.d/dict
#    if test -f "$colorit_config"; then
	COLORIZER="colorit" # -P - -c $colorit_config"
#    else
#	COLORIZER=cat
#    fi
#fi

############################################################
# functions
#

cyrillic_text_width (){
    # This function may not work properly for languages
    # other than Russian. wcwidth(3) and C language is needed!
    LC_ALL=C $D_AWK_PROG -v h="$D_TERM_H" '
	BEGIN {max = 15}
	{ gsub(/[\300-\337][\200-\277]/, "1")
	  sub(/ +$/, "")
	  curr=length($0)
	  if (curr > max) max=curr
	}
	END { print max "x" (NR < h ? NR : h)+1}' "$@"
}

set_query ()
{
    if test -n "$query"; then
	return 0
    fi
    query=`$D_XCLIP_PROG -o`
    if test -z "$query"; then
	exit
    fi
}

check_system() {
  err=0
  for cmd in $D_XTERM_CMD $D_XCLIP_PROG; do
		if ! which "$cmd" > /dev/null; then
		missing="$missing $cmd"
	fi
  done

  if [ -n "$missing" ] ; then
	echo "Cannot find the following program(s) in the PATH: $missing"
	echo "Please install the appropriate package(s)."
	echo
	err=1
  fi


  if [ -z "$D_UTF8_LOCALE" ] ; then
	echo "Cannot find any UTF-8 locale installed on system."
	echo "Please run \`dpkg-reconfigure locales' and choose some UTF-8 locale."
	echo
	err=1
 fi

 [ "$err" = 0 ] || exit $err;
}


############################################################
# main
#

help (){
    cat 1>&2 <<'EOF'
usage: dict_lookup [OPTIONS]
   -h           display this help
   -x <x>       X coordinate of xterm
   -y <y>       Y coordinate of xterm
   -s <WxH>     size of xterm in symbols, e.g. 50x20
   -q <query>   query
EOF
}

while getopts x:y:s:q:h f
do
    case $f in
	h)      help; exit 0;;
	x)      D_TERM_X=+$OPTARG;;
	y)      D_TERM_Y=+$OPTARG;;
	s)      TERM_WH=$OPTARG;;
	q)      query=$OPTARG;;
	'?')    help; exit 1;;
    esac
done
shift `expr $OPTIND - 1`

check_system

set_query

tmp_dir=`mktemp -d`
test -d "$tmp_dir" || exit 1;
trap "rm -rf $tmp_dir" 0 1 2 3 15

if test -z "$D_DICT_CMD"; then
    D_DICT_CMD="$D_DICT_PROG $D_DICT_SERVER $D_DICT_PORT $D_DICT_DB_OPT"
fi

$D_DICT_CMD "$query" 2>&1 |
env LC_ALL=C grep -Ev "definitions? found" > "$tmp_dir/res.txt"

if test -z "$TERM_WH"; then
    TERM_WH=`$D_TEXT_WIDTH "$tmp_dir/res.txt"`
fi

geometry="-geometry ${TERM_WH}${D_TERM_X}${D_TERM_Y}"

unset LC_ALL || true
unset LANG || true
LC_CTYPE=$D_UTF8_LOCALE $D_XTERM_PROG $geometry \
    -u8 $D_XTERM_CLASS $D_XTERM_NAME $D_XTERM_TITLE \
    -e "$COLORIZER < $tmp_dir/res.txt | $D_PAGER"