| 1 | #!/usr/bin/env bash |
| 2 | |
| 3 | word=${1:-$(xclip -o -selection primary 2>/dev/null || wl-paste 2>/dev/null)} |
| 4 | |
| 5 | # Check for empty word or special characters |
| 6 | [[ -z "$word" || "$word" =~ [\/] ]] && notify-send -h string:bgcolor:#bf616a -t 3000 "Invalid input." && exit 0 |
| 7 | |
| 8 | query=$(curl -s --connect-timeout 5 --max-time 10 "https://api.dictionaryapi.dev/api/v2/entries/en_US/$word") |
| 9 | |
| 10 | # Check for connection error (curl exit status stored in $?) |
| 11 | [ $? -ne 0 ] && notify-send -h string:bgcolor:#bf616a -t 3000 "Connection error." && exit 1 |
| 12 | |
| 13 | # Check for invalid word response |
| 14 | [[ "$query" == *"No Definitions Found"* ]] && notify-send -h string:bgcolor:#bf616a -t 3000 "Invalid word." && exit 0 |
| 15 | |
| 16 | # Show only first 3 definitions |
| 17 | def=$(echo "$query" | jq -r '[.[].meanings[] | {pos: .partOfSpeech, def: .definitions[].definition}] | .[:3].[] | "\n\(.pos). \(.def)"') |
| 18 | |
| 19 | # Requires a notification daemon to be installed |
| 20 | notify-send -t 60000 "$word -" "$def" |
| 21 | |
| 22 | |
| 23 | ### MORE OPTIONS :) |
| 24 | |
| 25 | # Show first definition for each part of speech (thanks @morgengabe1 on youtube) |
| 26 | # def=$(echo "$query" | jq -r '.[0].meanings[] | "\(.partOfSpeech): \(.definitions[0].definition)\n"') |
| 27 | |
| 28 | # Show all definitions |
| 29 | # def=$(echo "$query" | jq -r '.[].meanings[] | "\n\(.partOfSpeech). \(.definitions[].definition)"') |
| 30 | |
| 31 | # Regex + grep for just definition, if anyone prefers that to jq |
| 32 | # def=$(grep -Po '"definition":"\K(.*?)(?=")' <<< "$query") |
| 33 | |
| 34 | # bold=$(tput bold) # Print text bold with echo, for visual clarity |
| 35 | # normal=$(tput sgr0) # Reset text to normal |
| 36 | # echo "${bold}Definition of $word" |
| 37 | # echo "${normal}$def" |