#!/usr/bin/ksh93 # wotd - generates random WOTD (Words of the Day) list from the system # dictionary file; provides refresh and/or definition lookups. # DICT="/usr/share/dict/words" HISTFILE="/tmp/wotd$$" touch $HISTFILE # make # of suggestions +1: HISTSIZE=4 set -o emacs header() { printf '\n Welcome to the KornShell Vocabulary Builder! \n' } suggestions() { WRD="$1" set -A SUGGEST ${WRD%%?(s|\'s|y|ly|ed|ing|ness)} ${WRD##?(un|re|non|in)} ${WRD%%?(er|ish|ine|iest)} for WRD in {2..0} ;do echo "${SUGGEST[$WRD]}" |read -s done } # need either dict(1) or lynx(1) installed for dictionary lookups: lookup() { WORD="$1" while : ;do clear if [[ "$(which dict)" ]] ;then dict "$WORD" |less -ReX elif [[ "$(which lynx)" ]] ;then WWWdict="http://www.dict.org/bin/Dict?Form=Dict2&Database=*&Query=$WORD" TERM=linux lynx -dump -nolist -cookies "$WWWdict" |tail +18 |more else printf '\n\n sorry, neither dict(1) nor lynx(1) was found - ask your sysadmin to fix it.\n' sleep 3 ;return 1 fi printf '\n . . . . . \n\n' read -n1 REPLY?' type "e" to edit word; any other key to continue: ' printf '\n\n' case "${REPLY}" in e) suggestions $WORD read -r -s WORD?' revise word - use up|down arrows for suggestions: ' continue ;; *) return 0 ;; esac done } word() { grep -m8000 "^$1[a-z]*[a-z][a-z]$" $DICT |shuf -n1 - } makelist() { unset allwords typeset -A allwords for LTR in {a..z} ;do allwords[$LTR]="$(word $LTR)" done export allwords } printlist() { clear header printf '\n Words of the Day \n ---------------- \n\n' for LTR in {a..z} ;do printf ' %s) %s\n' $LTR ${allwords[$LTR]} done printf '\n ---------------- \n\n' } selectword() { read -r -n1 REPLY?' type [a-z] for definitions; R to refresh, Q to quit: ' printf '\b\n' case "${REPLY:-'Q'}" in [a-z]) lookup "${allwords[$REPLY]}" ;; R) makelist ;; *|Q) rm $HISTFILE ;exit 0 ;; esac } main() { makelist while : ;do printlist selectword done } # run main