#!/bin/bash read word word=$(echo $word | tr '[:upper:]' '[:lower:]') appId= appKey= language=en-gb OPTS='--silent -L -H "app_id: $appId" -H "app_key: $appKey"' maxSynonyms=10 _getdata() { # Take everything after final space as the requested word (assuming everything before the last space is a flag) word=$(echo $word | sed 's/.* //') 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 } # function to provide data to a for loop _jq() { echo ${json} | base64 --decode | jq -r ${1} } # 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]'). " output="$output \"$(_jq '.entries[0].senses[0].examples[0].text')\"" 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 [ -z "$output" ]; 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 echo $output exit 0 } # 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 \") echo $output exit 0 } _help() { echo "Usage: !oeddefine [option] [word]. Options: -h help -t thesaurus -e etymology -d define -a audio -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 else _define fi