readman (3462B)
1 #!/bin/sh 2 aflag=false 3 dflag=false 4 rflag=false 5 progname=${0##*/} 6 men=$HOME/.manread 7 8 cleanup() { 9 [ -w "$mymen" ] && rm -f "$mymen" 10 [ -w "$allmen" ] && rm -f "$allmen" 11 } 12 13 usage() { 14 echo "usage: ${progname} [-d]" 1>&2 15 echo " ${progname} [-d|-r] section" 1>&2 16 echo " ${progname} [-a|-d] section mantitle" 1>&2 17 return 1 18 } 19 20 err() { 21 echo "$1" 1>&2 22 return 1 23 } 24 25 prompt() { 26 res='' 27 until [ "$res" = no ] || [ "$res" = yes ]; do 28 printf '%s (yes,no)[no]: ' "$1" 29 read -r res 30 [ -z "$res" ] && res=no 31 done 32 [ "$res" = yes ] 33 return $? 34 } 35 36 issec() { 37 [ "$1" -ge 1 ] && [ "$1" -le 9 ]; 38 return $? 39 } 40 41 diffhash() { 42 nread=$(awk "/^${1}/"'{ print $3 }' "$men" | 43 sort | tee "$mymen" | wc -l | tr -d ' ') 44 nall=$(man -ws "$1" -k . | xargs cksum | awk '{ print $1 }' | 45 sort | tee "$allmen" | wc -l | tr -d ' ') 46 changed=$(comm -23 "$mymen" "$allmen") 47 } 48 49 secstats() { 50 nchanged=0 51 diffhash "$1" 52 printf '* man %s: %s/%s' "$1" "$nread" "$nall" 53 if [ -n "$changed" ]; then 54 nchanged="$(echo "$changed" | tr ' ' '\n' | wc -l)" 55 printf '\t(%s changed)' "$nchanged" 56 fi 57 echo 58 } 59 60 diffmen() { 61 diffhash "$1" 62 man -ws "$1" -k . | xargs cksum | \ 63 awk -F/ "/^$(echo "$changed" | tr ' ' '|')$/"'{ split($NF, a, /\.[1-9]/); print a[1] }' 64 } 65 66 trap cleanup EXIT 67 trap exit HUP INT TERM 68 69 while getopts adr arg; do 70 case ${arg} in 71 a) aflag=true;; 72 d) dflag=true;; 73 r) rflag=true;; 74 ?) usage;; 75 esac 76 done 77 shift $((OPTIND - 1)) 78 $aflag && $dflag && usage 79 80 [ -f "$men" ] || touch "$men" 81 [ -r "$men" ] || err "unable to read ${men}!" 82 mymen=$(echo 'mkstemp(/tmp/readman.XXXXXXXXXX)' | m4) 83 allmen=$(echo 'mkstemp(/tmp/readman.XXXXXXXXXX)' | m4) 84 case $# in 85 0) 86 if $aflag || $rflag; then 87 usage 88 elif $dflag; then 89 prompt 'Do you really want to delete all your stats?' && :>"$men" 90 else 91 for sec in $(seq 1 9); do 92 secstats "$sec" 93 done 94 fi 95 ;; 96 1) 97 sec=$1 98 99 if $aflag || ! issec "$sec"; then 100 usage 101 elif $dflag; then 102 $rflag && usage 103 prompt "Do you really want to delete all stats for section ${sec}?" && 104 printf 'g/%s/d\nwq\n' "$sec" | ed - "$men" 105 else 106 secstats "$sec" 107 [ "$nchanged" -gt 0 ] && echo "* to reread: $(diffmen "$sec" | tr '\n' ' ')" 108 awk "/^${1}/"'{ print $2 }' "$men" >"$mymen" 109 man -ws "$1" -k . | awk -F/ '{ split($NF, a, /\.[1-9]/); print a[1] }' >"$allmen" 110 [ "$nread" -gt 0 ] && 111 echo "* have read: $(comm -12 "$mymen" "$allmen" | tr '\n' ' ')" 112 $rflag || echo "* to read: $(comm -13 "$mymen" "$allmen" | tr '\n' ' ')" 113 fi 114 ;; 115 2) 116 sec=$1 117 page=$2 118 mantitle="${page}(${sec})" 119 120 if $rflag || ! issec "$sec"; then 121 usage 122 elif ! manpath=$(man -w "$sec" "$page" 2>/dev/null); then 123 err "man page ${mantitle} doesn't exist!" 124 elif $aflag; then 125 if grep "^${sec} ${page}" "$men" >/dev/null; then 126 echo "You've already read ${mantitle}" 127 exit 0 128 else 129 cksum "$manpath" | awk '{ print $1 }' | 130 xargs printf '%s\t%s\t%s' "$sec" "$page" >>"$men" 131 sort -o "$men" "$men" 132 fi 133 elif $dflag; then 134 if ! grep "^${sec} ${page}" "$men" >/dev/null; then 135 echo "You've not read ${mantitle}" 136 exit 0 137 elif prompt "Do you really want to unread ${mantitle}?"; then 138 printf 'g/%s\t%s/d\nw\nq\n' "$sec" "$page" | ed - "$men" 139 fi 140 else 141 if grep "^${sec} ${page}" "$men" >/dev/null; then 142 echo "You've read ${mantitle}" 143 else 144 echo "You've not read ${mantitle}" 145 fi 146 fi 147 ;; 148 ?) usage ;; 149 esac