diff --git a/todo.sh b/todo.sh index 45948a5..95fdabd 100755 --- a/todo.sh +++ b/todo.sh @@ -753,13 +753,32 @@ _list() { ## Get our search arguments, if any shift ## was file name, new $1 is first search term - ## Build the filter. - filter_command=$(filtercommand "${pre_filter_command:-}" "${post_filter_command:-}" "$@") + _format "$src" '' "$@" - ## Figure out how much padding we need to use - ## We need one level of padding for each power of 10 $LINES uses - LINES=$( sed -n '$ =' "$src" ) - PADDING=${#LINES} + if [ $TODOTXT_VERBOSE -gt 0 ]; then + echo "--" + echo "$(getPrefix "$src"): ${NUMTASKS:-0} of ${TOTALTASKS:-0} tasks shown" + fi +} +getPadding() +{ + ## We need one level of padding for each power of 10 $LINES uses. + LINES=$(sed -n '$ =' "${1:-$TODO_FILE}") + printf %s ${#LINES} +} +_format() +{ + # Parameters: $1: todo input file; when empty formats stdin + # $2: ITEM# number width; if empty auto-detects from $1 / $TODO_FILE. + # Precondition: None + # Postcondition: $NUMTASKS and $TOTALTASKS contain statistics (unless $TODOTXT_VERBOSE=0). + + FILE=$1 + shift + + ## Figure out how much padding we need to use, unless this was passed to us. + PADDING=${1:-$(getPadding "$FILE")} + shift ## Number the file, then run the filter command, ## then sort and mangle output some more @@ -767,7 +786,11 @@ _list() { TODOTXT_FINAL_FILTER="cat" fi items=$( - sed = "$src" \ + if [ "$FILE" ]; then + sed = "$FILE" + else + sed = + fi \ | sed -e ''' N s/^/ / @@ -775,6 +798,9 @@ _list() { /^[ 0-9]\{1,\} *$/d ''' ) + + ## Build and apply the filter. + filter_command=$(filtercommand "${pre_filter_command:-}" "${post_filter_command:-}" "$@") if [ "${filter_command}" ]; then filtered_items=$(echo -n "$items" | eval "${filter_command}") else @@ -820,16 +846,13 @@ _list() { if [ $TODOTXT_VERBOSE -gt 0 ]; then NUMTASKS=$( echo -n "$filtered_items" | sed -n '$ =' ) TOTALTASKS=$( echo -n "$items" | sed -n '$ =' ) - - echo "--" - echo "$(getPrefix "$FILE"): ${NUMTASKS:-0} of ${TOTALTASKS:-0} tasks shown" fi if [ $TODOTXT_VERBOSE -gt 1 ]; then echo "TODO DEBUG: Filter Command was: ${filter_command:-cat}" fi } -export -f cleaninput getPrefix getTodo getNewtodo shellquote filtercommand _list die +export -f cleaninput getPrefix getTodo getNewtodo shellquote filtercommand _list getPadding _format die # == HANDLE ACTION == action=$( printf "%s\n" "$ACTION" | tr 'A-Z' 'a-z' ) @@ -1073,19 +1096,16 @@ case $action in "listall" | "lsa" ) shift ## Was lsa; new $1 is first search term - [ -w "$TMP_FILE" ] || echo -n > "$TMP_FILE" || die "Fatal Error: Unable to write to $TMP_FILE" - cat "$TODO_FILE" "$DONE_FILE" > "$TMP_FILE" TOTAL=$( sed -n '$ =' "$TODO_FILE" ) + PADDING=${#TOTAL} - post_filter_command="awk -v TOTAL=$TOTAL -v PADDING=${#TOTAL} '{ \$1 = sprintf(\"%\" PADDING \"d\", (\$1 > TOTAL ? 0 : \$1)); print }' " - TODOTXT_VERBOSE=0 _list "$TMP_FILE" "$@" - - [ -f "$TMP_FILE" ] && rm "$TMP_FILE" + post_filter_command="awk -v TOTAL=$TOTAL -v PADDING=$PADDING '{ \$1 = sprintf(\"%\" PADDING \"d\", (\$1 > TOTAL ? 0 : \$1)); print }' " + cat "$TODO_FILE" "$DONE_FILE" | TODOTXT_VERBOSE=0 _format '' "$PADDING" "$@" if [ $TODOTXT_VERBOSE -gt 0 ]; then TDONE=$( sed -n '$ =' "$DONE_FILE" ) - TASKNUM=$(TODOTXT_PLAIN=1 TODOTXT_VERBOSE=0 _list "$TODO_FILE" "$@" | sed -n '$ =') - DONENUM=$(TODOTXT_PLAIN=1 TODOTXT_VERBOSE=0 _list "$DONE_FILE" "$@" | sed -n '$ =') + TASKNUM=$(TODOTXT_PLAIN=1 TODOTXT_VERBOSE=0 _format "$TODO_FILE" 1 "$@" | sed -n '$ =') + DONENUM=$(TODOTXT_PLAIN=1 TODOTXT_VERBOSE=0 _format "$DONE_FILE" 1 "$@" | sed -n '$ =') echo "--" echo "$(getPrefix "$TODO_FILE"): ${TASKNUM:-0} of ${TOTAL:-0} tasks shown" echo "$(getPrefix "$DONE_FILE"): ${DONENUM:-0} of ${TDONE:-0} tasks shown"