wordpractice (2462B)
#!/bin/bash
# A crappy little script for myself to help practice memorizing spanish words. Each text file acts as a kind of pack of flashcards.
function summon_dmenu() {
DIRECTORY="$HOME/spanish_study/vocabulary/"
FILE=${DIRECTORY}$(find "$DIRECTORY" -maxdepth 1 -type f -regextype posix-extended -regex ".*\.txt$" | sed -E 's/(.*)+\/([^/]+\.txt$)/\2/' | dmenu -l 20 -i -p 'Open which file? (type "any" for random)')
if [ $FILE = ${DIRECTORY}"any" ]; then
FILE=$(pick_random_file)
fi
if [ ! -f $FILE ]; then
echo "Missing file!"
exit 1
fi
echo "To exit, answer with :q to quit when prompted for an answer"
}
function pick_random_file() {
CHOSEN_FILE=$(ls -d ${DIRECTORY}/* | grep -v ${FILE} | awk -v x=$RANDOM 'BEGIN{srand(x);}{line[NR]=$0;}END{print line[(int(rand()*NR+1))];}')
echo $CHOSEN_FILE
}
function prepare_file() {
TEMPFILE=$(mktemp --suffix=.txt)
cat $FILE > $TEMPFILE #we don't want to modify the original file, even accidentally
}
function cleanup_file() {
rm $TEMPFILE
}
function prompt_user() {
FLENGTH=$(awk 'END{print NR}' $TEMPFILE)
if [[ $FLENGTH -eq 0 ]]; then
echo "Congratulations, you've answered every question!"
cleanup_file
read -p "Another? (y/n) " RETRY
if [[ "$RETRY" == "y" ]]; then
main
fi
exit 1
fi
# we want to be able to pick a random word to test from the file
function random_num() {
awk -v y=$1 -v x=$RANDOM 'BEGIN{srand(x); print int(rand()*y+1)}'
}
LINE=$(random_num $FLENGTH)
CHOSEN_LINE=$(awk -v LINE=$LINE '{if(NR==LINE){print $0}}' $TEMPFILE)
ANSWER=$(echo $CHOSEN_LINE | awk 'BEGIN{FS=":"}{gsub(/^[ ]+|[ ]+$/, "", $2); print $2}')
QUESTION=$(echo $CHOSEN_LINE | awk 'BEGIN{FS=":"}{gsub(/^[ ]+|[ ]+$/, "", $1); print "What does \x22"$1"\x22 mean?";}')
read -p "$QUESTION " INPUT
if [[ "$INPUT" == ":q" ]]; then
echo "Bye"
cleanup_file
exit 1
fi
INPUT_LC=$(echo "$INPUT" | awk '{print tolower($0)}')
ANSWER_LC=$(echo "$ANSWER" | awk '{print tolower($0)}')
if [[ "$INPUT_LC" == "$ANSWER_LC" ]]; then
echo "Correct."
sed -i "${LINE}d" $TEMPFILE
else
echo "Incorrect."
echo "The answer should have been \"${ANSWER}\""
fi
}
function main() {
summon_dmenu
prepare_file
while true; do
prompt_user
done
}
main