diff options
Diffstat (limited to 'src/td.in')
-rwxr-xr-x | src/td.in | 44 |
1 files changed, 42 insertions, 2 deletions
@@ -184,6 +184,44 @@ mkdtemp() { # Core functions # +optimal_line_for_type() { + GOAL_TYPE="$1" + GOAL_INDEX="$(echo "$TD_TYPES" | awk "/^$GOAL_TYPE:/ { printf NR }")" + TYPE_HEADINGS="$(mkstemp)" + echo "$TD_TYPES" | cut -d: -f2- | sed 's/^/# /' > "$TYPE_HEADINGS" + IN_TD_SECTION=false + IN_TD_ENTRY=false + LINE_NUMBER=0 + LAST_MATCH=0 + IN_TD_REGION=false + while read -r line; do + LINE_NUMBER=$((LINE_NUMBER + 1)) + if ! echo "$line" | grep -Eq '^# .+$'; then + continue + fi + MATCH="$(grep -nF "$line" "$TYPE_HEADINGS" ||:)" + if [ -n "$MATCH" ]; then + MATCH_N="$(echo "$MATCH" | cut -d: -f1)" + MATCH_LINE="$(echo "$MATCH" | cut -d: -f2-)" + if [ "$line" = "$MATCH_LINE" ]; then + IN_TD_REGION=true + if [ "$MATCH_N" -lt "$GOAL_INDEX" ]; then + LAST_MATCH="$MATCH_N" + else + echo $((LINE_NUMBER - 1)) + return + fi + fi + elif [ "$IN_TD_REGION" = true ]; then + echo $((LINE_NUMBER - 1)) + echo uhu >&2 + return + fi + done < "$TD_FILE" + echo "chegou" >&2 + echo $((LINE_NUMBER)) +} + insert_at_line() { N="$1" F="$2" @@ -194,10 +232,12 @@ insert_at_line() { printf "$MSG_FILE_DOESNT_EXIST_CREATING\n" "$TD_FILE" >&2 cat - > "$TMPF" elif [ "$N" = 0 ]; then + DESIRED_N="$(optimal_line_for_type "$TYPE")" printf "$MSG_TYPE_DOESNT_EXIST_CREATING\n" "$TYPE" >&2 - printf '%s\n\n\n%s\n' \ + printf '%s\n\n\n%s\n\n\n%s\n' \ + "$(head -n "$DESIRED_N" "$F")" \ "$(cat -)" \ - "$(cat "$F")" \ + "$(tail -n +$((DESIRED_N+1)) "$F")" \ > "$TMPF" else printf '%s\n\n%s\n\n%s\n' \ |