利用dict.cn api的在线查询脚本,可以通过notify-send输出,支持声音,不需要w3m

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
jarryson
帖子: 4002
注册时间: 2005-08-14 19:53
送出感谢: 1 次
接收感谢: 2 次
联系:

利用dict.cn api的在线查询脚本,可以通过notify-send输出,支持声音,不需要w3m

#1

帖子 jarryson » 2010-12-20 23:17

arch上没有安装w3m,也不想安装这个东西,会在家目录生成个配置文件夹,不喜欢家目录太乱,而stardict的命令行实现这点功能有些不值,因此花了点时间写了这个,写bash不是很熟悉,大家提提意见。考虑加个缓存机制,不过并不是很必要,因此没有实现。

[bash]
#!/bin/bash
help(){
echo -e "Usage: $0 [OPTIONS] STRING"
echo -e " OPTINOS:"
echo -e " -h: Show this help."
echo -e " -n: Use notify-send, use standard output by default."
echo -e " -s: Enalbe sound, use mplayer to play."
echo -e ""
}
error1(){
echo "No word attached!"
help
exit 0
}

[ -z "$1" ] && help && exit 1

for i in $@; do
if [ "x$i" != "x${i#-}" ]; then
[ "x$i" == "x-n" ] && NOTIFY=1
[ "x$i" == "x-h" ] && HELP=1
[ "x$i" == "x--help" ] && HELP=1
[ "x$i" == "x-s" ] && SOUND=1
else
WORD=$i
fi
done

[ "$HELP" == "1" ] && help && exit 1
[ -z "$WORD" ] && [ "x$NOTIFY" != "x1" ] && error1
[ -z "$WORD" ] && [ "x$NOTIFY" == "x1" ] && WORD=$(xsel)

WEBAPI="http://dict.cn/ws.php?utf8=true&q="
TMPFILE=/tmp/dict.tmp

wget "$WEBAPI""$WORD" -O $TMPFILE &> /dev/null
cache=$(cat $TMPFILE | sed '/^<?.*/d;/dict>$/d')
while IFS='<>' read _ starttag value endtag; do
case "$starttag" in
key) key+=("$value") ;;
lang) lang+=("$value");;
audio) audio+=("$value");;
pron) pron+=("$value");;
esac
done < $TMPFILE

if [ -n "$key" ]; then
if echo $pron | grep "&#" >/dev/null; then
pron=$(echo $pron | sed 's/&#658;/ʒ/g;s/&#652/ʌ/g;s/&#643;/ʃ/g;s/&#603;/ɜ/g;s/&#601;/ə/g;s/&#596;/ɔ/g;s/&#593;/ɑ/g;s/&#331;/ŋ/g;s/&#240;/ð/g;s/&#230;/æ/g')
fi

sent=$(echo "$cache" | grep '<sent>' | sed 's/<sent>//g;s/<\/sent>//g;s/<orig>//g;s/<\/orig>//g;s/<trans>//g;s/<\/trans>//g;s/<em>//g;s/<\/em>//g')
#FIXME
cache1=$(echo "$cache" | sed -n '/<sent>/,/<\/sent>/!p')
def=$(echo "$cache1" | sed '/<def>/,/<\/def>/!d;s/<def>//;s/<\/def>//')
else
sugg=$(echo "$cache" | sed 's/<sugg>//g;s/<\/sugg>//g')
fi

if [ "x$NOTIFY" == "x1" ];then
[ -n "$key" ] && notify-send -i accessories-dictionary "$key" "[$pron]\n$def"
[ -z "$key" ] && notify-send -i dialog-warning "$WORD" "未找到!"
else
echo ""
if [ -n "$key" ]; then echo "======== $key ========"; else echo "$WORD Not found!"; fi
[ -n "$pron" ] && echo "[$pron]"
[ -n "$def" ] && echo "$def"
[ -n "$sent" ] && echo -e "\n$sent"
[ -n "$sugg" ] && echo "Maybe you mean:" $sugg
echo ""
fi
[ "x$SOUND" == "x1" ] && [ -n "$audio" ] && mplayer -really-quiet $audio &>/dev/null
[/bash]

效果:

代码: 全选

$./dict.sh game
========  game  ========
[geim]
n.游戏, 运动会, 比赛 
v.赌博 

Who'll climb up to get it?' I'm game (to try).'`谁愿意爬上去把它拿下来?'`我来(试试).'
John only pretends to do his share of the work; he's just not playing the game.约翰只是装成做他那份工作,实际上并不真心好好干。
The little boy was shocked by the fall, but he was game enough to get up and try again.这个小男孩因摔倒而受到惊吓,但他勇敢地站起来准备再试。
附件
screenshot1.jpg
screenshot1.jpg (11.62 KiB) 查看 1404 次
上次由 jarryson 在 2010-12-20 23:49,总共编辑 1 次。
头像
jarryson
帖子: 4002
注册时间: 2005-08-14 19:53
送出感谢: 1 次
接收感谢: 2 次
联系:

Re: 利用dict.cn api的在线查询脚本,可以通过notify-send输出,支持声音,不需要w3m

#2

帖子 jarryson » 2010-12-20 23:21

-h和--help都是现实帮助
-n是使用notify-send显示结果
-s是启用声音,使用mplayer播放

需要带参数运行,-n模式可以查询鼠标框选单词,方便绑定快捷键

./dict.sh game

./dict.sh -n

./dict.sh -n game

都是可以的
头像
qiang_liu8183
论坛版主
帖子: 10670
注册时间: 2006-09-10 22:36
来自: 北京
送出感谢: 1 次
接收感谢: 6 次

Re: 利用dict.cn api的在线查询脚本,可以通过notify-send输出,支持声音,不需要w3m

#3

帖子 qiang_liu8183 » 2010-12-21 0:39

发现jarryson一个习惯,喜欢半夜发技术帖
看破、放下、自在、随缘、念佛
真诚、清净、平等、正觉、慈悲
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

Re: 利用dict.cn api的在线查询脚本,可以通过notify-send输出,支持声音,不需要w3m

#4

帖子 eexpress » 2010-12-21 9:14

代码窗口太小。
没看出api?
只建议play代替mplayer
● 鸣学
头像
jarryson
帖子: 4002
注册时间: 2005-08-14 19:53
送出感谢: 1 次
接收感谢: 2 次
联系:

Re: 利用dict.cn api的在线查询脚本,可以通过notify-send输出,支持声音,不需要w3m

#6

帖子 jarryson » 2010-12-21 13:48

我这里木有play,没有alsa,而且那东西可以播放mp3音频?因为dictcn传过来的是mp3

WEBAPI是http://dict.cn/ws.php?utf8=true&q=,是一个xml,只需要对应处理一下就可以了。
回复

回到 “Shell脚本”