diff --git a/share/adapters/oeis.sh b/share/adapters/oeis.sh index 7d99690..a7ce1f8 100755 --- a/share/adapters/oeis.sh +++ b/share/adapters/oeis.sh @@ -8,44 +8,11 @@ # oeis # oeis oeis() ( - local URL='https://oeis.org' + local URL='https://oeis.org/search?q=' local TMP=/tmp/oeis local DOC=/tmp/oeis/doc.html local MAX_TERMS=10 mkdir -p $TMP - # -- get_desc -- - # @return print description of OEIS sequence - get_desc() { - grep -A 1 '' $DOC \ - | sed '//d; /--/d; s/^[ \t]*//; s/<[^>]*>//g;' \ - | sed 's/ / /g; s/\&/\&/g; s/>/>/g; s/</.*, .*[0-9]' $DOC \ - | sed 's/<[^>]*>//g' \ - | grep -v '[a-z]' \ - | grep -v ':' \ - | cut -d ',' -f 1-${MAX_TERMS} - return $? - } - # -- parse_code -- - # @param GREP_REGEX - # @return Code snippet that corresponds to GREP_REGEX - parse_code() { - local GREP_REGEX="${1}" - cat $DOC \ - | tr '\n' '`' \ - | grep -o "${GREP_REGEX}" \ - | tr '`' '\n' \ - | sed 's/^[ \t]*//; s/<[^>]*>//g; /^\s*$/d;' \ - | sed 's/ / /g; s/\&/\&/g; s/>/>/g; s/</ @@ -66,61 +33,54 @@ oeis() ( [[ ${ID:0:1} == 'A' ]] && ID=${ID:1} ID=$(bc <<< "$ID") ID="A$(printf '%06d' ${ID})" - URL+="/${ID}" + URL+="id:${ID}&fmt=text" curl $URL 2>/dev/null > $DOC # Print Code Sample if [[ ${LANGUAGE^^} == ':LIST' ]] then rm -f ${TMP}/list - grep -q 'MAPLE' $DOC && printf 'maple\n' >> $TMP/list - grep -q 'MATHEMATICA' $DOC && printf 'mathematica\n' >> $TMP/list - parse_code 'PROG.*CROSSREFS' \ - | grep -o '^(.*)' \ - | sed 's/ .*//g' \ - | tr -d '()' \ - | sort -u >> $TMP/list - [ $(wc -c < $TMP/list) -ne 0 ] && cat ${TMP}/list || printf 'No code snippets available.\n' + grep -q '%p' $DOC && echo 'maple' >> $TMP/list + grep -q '%t' $DOC && echo 'mathematica' >> $TMP/list + grep '%o' $DOC \ + | grep "${ID} (" \ + | sed "s/^.*${ID} (//; s/).*//" >> $TMP/list + [[ -f $TMP/list && $(wc -c < $TMP/list) -ne 0 ]] && cat ${TMP}/list | sort -u || printf 'No code snippets available.\n' return 0 fi - # Print ID, description, and sequence + # Print ID printf "ID: ${ID}\n" - get_desc + # Print Description (%N) + grep '%N' $DOC | sed "s/^.*${ID} //" printf '\n' - get_seq ${MAX_TERMS} + # Print Sequence (Three sections %S %T nd %U) + grep '%S' $DOC | sed "s/^.*${ID} //" + grep '%T' $DOC | sed "s/^.*${ID} //" + grep '%U' $DOC | sed "s/^.*${ID} //" printf '\n' + # Generate code snippet (%p, %t, %o) if [ $# -gt 1 ] then - if [[ ${LANGUAGE^^} == 'MAPLE' ]] && grep -q 'MAPLE' $DOC + # MAPLE section (%p) + if [[ ${LANGUAGE^^} == 'MAPLE' ]] && grep -q '%p' $DOC then - GREP_REGEX='MAPLE.*CROSSREFS' - grep -q 'PROG' $DOC && GREP_REGEX='MAPLE.*PROG' - grep -q 'MATHEMATICA' $DOC && GREP_REGEX='MAPLE.*MATHEMATICA' - parse_code "${GREP_REGEX}" \ - | sed 's/MAPLE/(MAPLE)/; /MATHEMATICA/d; /PROG/d; /CROSSREFS/d' \ - > ${TMP}/code_snippet - elif [[ ${LANGUAGE^^} == 'MATHEMATICA' ]] && grep -q 'MATHEMATICA' $DOC + grep '%p' $DOC | sed "s/^.*${ID} //" > $TMP/code_snippet + # MATHEMATICA section (%t) + elif [[ ${LANGUAGE^^} == 'MATHEMATICA' ]] && grep -q '%t' $DOC + then + grep '%t' $DOC | sed "s/^.*${ID} //" > $TMP/code_snippet + # PROG section (%o) + elif grep -qi '%o' $DOC && grep -qi $LANGUAGE $DOC then - GREP_REGEX='MATHEMATICA.*CROSSREFS' - grep -q 'PROG' $DOC && GREP_REGEX='MATHEMATICA.*PROG' - parse_code "${GREP_REGEX}" \ - | sed 's/MATHEMATICA/(MATHEMATICA)/; /PROG/d; /CROSSREFS/d' \ - > ${TMP}/code_snippet - else - # PROG section contains more code samples (Non Mathematica or Maple) - parse_code 'PROG.*CROSSREFS' \ - | sed '/PROG/d; /CROSSREFS/d' \ - > ${TMP}/prog # Print out code sample for specified language - rm -f ${TMP}/code_snippet - awk -v tgt="${LANGUAGE^^}" -F'[()]' '/^\(/{f=(tgt==toupper($2))} f' ${TMP}/prog > ${TMP}/code_snippet + grep '%o' $DOC \ + | sed "s/^.*${ID} //" \ + | awk -v tgt="${LANGUAGE^^}" -F'[()]' '{act=$2} sub(/^\([^()]+\) */,""){f=(tgt==toupper(act))} f' ${TMP}/prog \ + > ${TMP}/code_snippet fi # Print code snippet with 4-space indent to enable colorization - if [ $(wc -c < $TMP/code_snippet) -ne 0 ] + if [[ -f $TMP/code_snippet && $(wc -c < $TMP/code_snippet) -ne 0 ]] then - printf "${LANGUAGE}" - cat ${TMP}/code_snippet \ - | sed "s/(${LANGUAGE^^})/\n/; s/(${LANGUAGE})/\n/;" \ - | sed 's/^/ /' + cat ${TMP}/code_snippet | sed 's/^/ /' else printf "${LANGUAGE^^} unavailable. Use :list to view available languages.\n" fi @@ -128,16 +88,22 @@ oeis() ( # Search unknown sequence else # Build URL - URL+="/search?q=signed:$(echo $@ | tr -sc '[:digit:]-' ',')" + URL+="signed:$(echo $@ | tr -sc '[:digit:]-' ',')&fmt=short" curl $URL 2>/dev/null > $DOC # Sequence IDs - grep -o '=id:.*&' $DOC \ - | sed 's/=id://; s/&//' > $TMP/id + grep -o '"/A[0-9][0-9][0-9][0-9][0-9][0-9]">A[0-9][0-9][0-9][0-9][0-9][0-9]' $DOC \ + | sed 's/.*>//' \ + > $TMP/id # Descriptions - get_desc > $TMP/desc + grep -A 1 '' $DOC \ + | sed '/--/d; s/<[^>]*>//g; /^\s*$/d; s/^[ \t]*//' \ + | sed 's/ / /g; s/\&/\&/g; s/>/>/g; s/</ $TMP/desc # Sequences - get_seq ${MAX_TERMS} > $TMP/seq - # Print data for all + grep 'style="color:black;font-size:120%' $DOC \ + | sed 's/<[^>]*>//g; s/^[ \t]*//' \ + > $TMP/seq + readarray -t ID < $TMP/id readarray -t DESC < $TMP/desc readarray -t SEQ < $TMP/seq @@ -149,7 +115,11 @@ oeis() ( fi grep 'results, too many to show. Please refine your search.' /tmp/oeis/doc.html | sed -e 's/<[^>]*>//g; s/^[ \t]*//' # Print URL for user - printf "\n[${URL}]\n" | rev | sed 's/,//' | rev + printf "\n[${URL}]\n" \ + | rev \ + | sed 's/,//' \ + | rev \ + | sed 's/&.*/]/' ) oeis $@