#!/bin/bash # An interactive xpath query commandline tool. # Stores your previous query. # File for previous query touch .prev-xpath.tmp if [[ ! -e ".gitignore" ]]; then echo 'xpath.sh' > .gitignore fi # Colored output GREEN='\033[0;32m' NC='\033[0m' # no color # Ask for canto file clear read -p "Choose a canto: [i,r,p][1-34] " CANTO CANTICLE="$(echo $CANTO | tr -d -c a-z)" CANTO_NUM="$(echo $CANTO | tr -d -c 0-9)" # Create complete filename if [[ "$CANTICLE" == 'i' ]]; then CANTICLE='Inferno' file="inferno-${CANTO_NUM}.xml" elif [[ "$CANTICLE" == 'r' ]]; then CANTICLE='Purgatorio' file="purgatorio-${CANTO_NUM}.xml" elif [[ "$CANTICLE" == 'p' ]]; then CANTICLE='Paradiso' file="paradiso-${CANTO_NUM}.xml" else echo "Not a valid canto file: $file" fi # Start interactive query if [[ -e "$file" ]]; then clear && echo -e "You are searching ${CANTICLE^} ${CANTO_NUM}.\nAdd a trailing slash ${GREEN}\`/\`${NC} to your search before submitting it. The default first two search choices are ${GREEN}\`canto\`${NC} and then ${GREEN}\`terzine\`${NC}. Press ${GREEN}${NC} for those defaults and type something else to search that.\n" read -p "Load previous: (Y)/n " PREV case "$PREV" in N|n) search='' ;; Y|y|*) search="$(cat .prev-xpath.tmp)" ;; esac i='0' # Start while loop for the query. Break the loop if the query ends with a slash `/`. while true; do read -e -i "$search" -p "$(echo -e "\nSearch: \n "${GREEN}"===> "${NC})" nsearch if [[ "${nsearch: -1}" == / ]]; then # if last char trailing slash then search path="${nsearch::-1}" # remove trailing slash echo "$path" > .prev-xpath.tmp # store query for next time # perform the search (requires `xmllint` and `batcat` pager) xmllint --xpath "$path" $file | batcat -l xml exit elif [[ "$i" == 0 ]] && [[ "$nsearch" == '' ]]; then # load '/canto' query on first loop search="/canto" elif [[ "$nsearch" == '/canto' ]]; then # load '/canto/terzine' on second loop search="/canto/terzine" else search="${nsearch}" # else keep search the same fi i=$[$i+1] done else echo "Canto file not found. What directory are you in?" fi