From 407caee006a682b0d4981ee9832ab398d423dbde Mon Sep 17 00:00:00 2001 From: Erez Date: Sun, 10 May 2020 15:52:40 -0400 Subject: [PATCH] Create oeis.sh Allows integer sequences from [OEIS](https://oeis.org/) to be browsed, and to print syntax highlighted code samples for sequence implementation. [Demo](https://github.com/ErezBinyamin/Scripts/blob/master/tools/img/oeis.gif) [Source maintained here](https://github.com/ErezBinyamin/Scripts/blob/master/tools/oeis.sh) --- share/adapters/oeis.sh | 110 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 share/adapters/oeis.sh diff --git a/share/adapters/oeis.sh b/share/adapters/oeis.sh new file mode 100644 index 0000000..f2594eb --- /dev/null +++ b/share/adapters/oeis.sh @@ -0,0 +1,110 @@ +#!/usr/bin/env bash + +# Written by Erez Binyamin (github.com/ErezBinyamin) + +# Search for an integer sequence +oeis() { + local URL='https://oeis.org' + local TMP=/tmp/oeis + local DOC=/tmp/oeis/doc.html + mkdir -p $TMP + # Search sequence by ID + if [ $# -eq 1 ] + then + # Generate URL + [[ ${1:0:1} == 'A' ]] && ID=${1:1} || ID=${1} + ID=$(bc <<< "$ID") + ID="A$(printf '%06d' ${ID})" + URL+="/${ID}" + curl $URL 2>/dev/null > $DOC + # ID + printf "ID: ${ID}\n" + # Description + 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 ':' + printf "\n" + # Code + if grep -q 'MAPLE' $DOC + then + GREP_REGEX='MAPLE.*CROSSREFS' + grep -q 'PROG' $DOC && GREP_REGEX='MAPLE.*PROG' + grep -q 'MATHEMATICA' $DOC && GREP_REGEX='MAPLE.*MATHEMATICA' + 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/</]*>//g; /^\s*$/d;' \ + | sed 's/ / /g; s/\&/\&/g; s/>/>/g; s/</]*>//g; /^\s*$/d;' \ + | sed 's/ / /g; s/\&/\&/g; s/>/>/g; s/</ ${TMP}/lang + langs=("Axiom" "MAGMA" "PARI" "Python" "Sage" "Haskell" "Julia" "GAP" "Scala") + for L in ${langs[@]} + do + echo "foo" | pygmentize -l ${L,,} &>/dev/null && PYG="${L,,}" || PYG="c" + if grep -q "(${L})" $DOC + then + awk -v tgt="${L}" -F'[()]' '/^\(/{f=(tgt==$2)} f' ${TMP}/lang \ + | pygmentize -f terminal256 -g -P style=monokai -l ${PYG} + printf "\n" + fi + done + # Search unknown sequence + else + # Build URL + URL+="/search?q=signed%3A$(echo $@ | tr ' ' ',')" + curl $URL 2>/dev/null > $DOC + # Sequence IDs + grep -o '=id:.*&' $DOC \ + | sed 's/=id://; s/&//' > $TMP/id + # Descriptions + grep -A 1 '' $DOC \ + | sed '//d; /--/d; s/^[ \t]*//; s/<[^>]*>//g' \ + | sed 's/ / /g; s/\&/\&/g; s/>/>/g; s/</ $TMP/nam + # Sequences + grep -o '.*' $DOC \ + | sed 's/<[^>]*>//g' > $TMP/seq + # Print data for all + readarray -t ID < $TMP/id + readarray -t NAM < $TMP/nam + readarray -t SEQ < $TMP/seq + for i in ${!ID[@]} + do + printf "${ID[$i]}: ${NAM[$i]}\n" + echo ${SEQ[$i]} + printf "\n" + done + fi +} + +oeis $@