#!/bin/bash read word word=$(echo $word | tr '[:upper:]' '[:lower:]') # Create array of variable to read from config file config=( appId appKey language maxSynonyms ) # curl options OPTS='--silent -L -H "app_id: $appId" -H "app_key: $appKey"' while read line do # If config file variable doesn't match variable in config array then ignore it. if [[ " ${config[@]} " =~ " $(echo "$line" | cut -d '=' -f 1) " ]] then # Declare variables eval $(echo "$line" | cut -d '=' -f 1)=$(echo "$line" | cut -d '=' -f 2-) fi done < oedquery.conf # function to provide data to a for loop _jq() { echo ${json} | base64 --decode | jq -r ${1} } _getdata() { # Take everything after final space as the requested word (assuming everything before the last space is a flag) word=$(echo $word | sed 's/.* //') if [[ "$word" = "null" ]] then echo "Missing word. Usage: !oed [option] [word]. Use -h for help." fi lemmasUrl=https://od-api.oxforddictionaries.com/api/v2/lemmas/$language/$word # get lemmas to link an inflected form back to its headword (required to get definition) result=$(eval curl $OPTS $lemmasUrl) ret=$? if [ "$ret" -ne 0 ] then echo "cURL error $ret when fetching." exit fi # get definition of headword if it exists headWord=$(echo $result | jq '.results[0].lexicalEntries[0].inflectionOf[0].id') if [ "$headWord" == "null" ] then echo "Word not found. Use -h for help." exit fi entriesUrl=https://od-api.oxforddictionaries.com/api/v2/entries/$language/$headWord result=$(eval curl $OPTS $entriesUrl) ret=$? if [ "$ret" -ne 0 ] then echo "cURL error $ret when fetching." exit fi } # Return definition for the first sense of each lexical entry and create output string _define() { _getdata for json in $(echo "${result}" | jq -r '.results[].lexicalEntries[] | @base64') do output="$output $(_jq '.lexicalCategory.text'): " output="$output $(_jq '.entries[0].senses[0].definitions[0]'). " examplePhrase=$(_jq '.entries[0].senses[0].examples[0].text') if [[ "$examplePhrase" != "null" ]] then output=$output" \"$examplePhrase\"" fi done echo $output exit 0 } # Return etymology if available _etym() { _getdata output=$(echo "${result}" | jq '.results[].lexicalEntries[0].entries[0].etymologies[0]' | tr -d \") if [[ "$output" = "null" ]] then echo "No etymology found." else echo $output fi exit 0 } # Return synonyms of first sense of first lexical entry _thes() { _getdata count=0 for json in $(echo "${result}" | jq -r '.results[].lexicalEntries[0].entries[0].senses[0].synonyms[]? | @base64'); do output="$output $(_jq '.text'), " ((count=count+1)) # Limit output to a resonable number of synonyms if [[ $count -ge $maxSynonyms ]] then break fi done if [[ -z $output ]] then echo "No synonyms found." exit 0 else # remove trailing comma output=$(echo $output | sed '$s/,$//') echo $output exit 0 fi } # Get URL for first audio file in returned data _audio() { _getdata output=$(echo "${result}" | jq '.results[0].lexicalEntries[0].entries[0].pronunciations[0].audioFile' | tr -d \") if [[ "$output" != "null" ]] then echo $output else echo "No audio file found." fi exit 0 } # Return first defintion with lexical category for Lexico's word of the day. _wod() { # Get word from lexico word=$( curl --silent https://www.lexico.com/ | hxnormalize -x | hxselect -i "a.linkword" | grep -o '>.*<' | sed 's/[><]//g') _getdata definition=$(echo $result | jq '.results[].lexicalEntries[].entries[0].senses[0].definitions[]') lexicalCategory=$(echo $result | jq '.results[].lexicalEntries[0].lexicalCategory.text') examplePhrase=$(echo $result | jq '.results[].lexicalEntries[0].entries[0].senses[0].examples[0].text') # Remove surrounding quotes definition=$(echo "${definition:1: -1}") lexicalCategory=$(echo "${lexicalCategory:1: -1}") # Don't output example sentence if not returned from OED if [[ "$examplePhrase" != "null" ]] then output=$word" - "$lexicalCategory" - "$definition" - "$examplePhrase else output=$word" - "$lexicalCategory" - "$definition fi echo $output exit 0 } _help() { echo "Usage: !oed [option] [word]. Options: -h help, -t thesaurus, -e etymology, -d define, -a audio, -wod word of the day, -s source." exit 0 } if [[ ${word} == "-h" ]] || [[ ${word} == "--help" ]] || [[ -z $word ]] then _help elif [[ ${word} == "--source" ]] || [[ ${word} == "-s" ]] then echo "https://www.blatech.co.uk/ars/oeddefine" exit 0 elif [[ ${word} =~ "-t" ]] then _thes elif [[ ${word} =~ "-et" ]] then _etym elif [[ ${word} =~ "-a" ]] then _audio elif [[ ${word} =~ "-wod" ]] then _wod else _define fi