diff options
Diffstat (limited to 'oedquery.sh')
-rwxr-xr-x | oedquery.sh | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/oedquery.sh b/oedquery.sh new file mode 100755 index 0000000..6bdad65 --- /dev/null +++ b/oedquery.sh @@ -0,0 +1,148 @@ +#!/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 + +# 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/.* //') + 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 [ -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 +} + +# 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}") + if [[ "$examplePhrase" != "null" ]] + then + output=$word" - "$lexicalCategory" - "$definition" - "$examplePhrase + else + output=$word" - "$lexicalCategory" - "$definition + fi + 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 +elif [[ ${word} =~ "-d" ]] +then + _wod +else + _define +fi |