1
0
mirror of https://github.com/chubin/cheat.sh.git synced 2026-06-20 13:16:44 +02:00

oeis: TOTAL Rework. Use text for serach by ID, use short search for search by pattern

This commit is contained in:
Your Name
2020-06-20 16:48:16 -04:00
parent 89f69bbd40
commit fe0246be96
+48 -78
View File
@@ -8,44 +8,11 @@
# oeis <sequence ID> <language>
# oeis <val_a, val_b, val_c, ...>
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 '<td valign=top align=left>' $DOC \
| sed '/<td valign=top align=left>/d; /--/d; s/^[ \t]*//; s/<[^>]*>//g;' \
| sed 's/&nbsp;/ /g; s/\&amp;/\&/g; s/&gt;/>/g; s/&lt;/</g; s/&quot;/"/g'
return $?
}
# -- get_seq --
# @param MAX_TERMS
# @return Print the first MAX_TERMS terms of a sequence
get_seq() {
local MAX_TERMS=${1}
grep -o '<tt>.*, .*[0-9]</tt>' $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/&nbsp;/ /g; s/\&amp;/\&/g; s/&gt;/>/g; s/&lt;/</g; s/&quot;/"/g'
return $?
}
# -- MAIN --
# Search sequence by ID (optional language arg)
# . oeis <SEQ_ID>
@@ -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 '<td valign=top align=left>' $DOC \
| sed '/--/d; s/<[^>]*>//g; /^\s*$/d; s/^[ \t]*//' \
| sed 's/&nbsp;/ /g; s/\&amp;/\&/g; s/&gt;/>/g; s/&lt;/</g; s/&quot;/"/g' \
> $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 $@