readman

manpage readlist tracker (WIP)
git clone ssh://anon@git.pastanoggin.com
Log | Files | Refs | README

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