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"