aboutsummaryrefslogtreecommitdiff
path: root/functions/__mark_set.fish
blob: c995f2df18e87308059c0e363c99860f453ec969 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
function __mark_set --description 'mark a day in a store'
    # defaults
    set mark_store $__mark_store
    set sign "*"
    set day (math (date +"%d") "*1")
    set month (math (date +"%m") "*1")
    set year (date +"%Y")

    # parse argv
    for i in (seq 1 (count $argv))
        if string match -q -- "-d=*" "$argv[$i]"
            set day (string replace -- "-d=" "" $argv[$i])
        else if string match -q -- "-m=*" "$argv[$i]"
            set month (string replace -- "-m=" "" $argv[$i])
        else if string match -q -- "-y=*" "$argv[$i]"
            set year (string replace -- "-y=" "" $argv[$i])
        else if string match -q -- "-s=*" "$argv[$i]"
            set mark_store (string replace -- "-s=" "" "$argv[$i]")
        else if string match -q -- "-z=*" "$argv[$i]"
            set sign (string replace -- "-z=" "" "$argv[$i]")
        else
            echo unrecognised option: $argv[$i] >&2
            return 1
        end
    end

    if not test -f $mark_store
        return 1
    end

    # calculate offset: $day+1 (+1 if m > 9) because of "<month>:"
    set offset (math "($day + 1 + $month/10)") 

    set marks (__mark_print_block store $mark_store)
    set marks (string split " " $marks)

    # copy everything before #store#
    string split " " (string match -r "^.*#store#" (echo (cat $mark_store))) > $mark_store.new

    # crawl store
    set m 0
    # correct year sub-block
    set is_year false
    for l in $marks
        if begin test $is_year= false
                 and string match -q -r "^$year:\$" $l
                 end
            set year_found true
        end

        if test $is_year= true
            if test $m -ne $month
                echo $l >> $mark_store.new
            else
                # replace the char at offset with $sign
                echo $l | sed "s/^\(.\{$offset\}\)?/\1$sign/" >> $mark_store.new
            end

            set m (math "$m+1")
            # not in year sub-block any more
            if test $m -eq 13
                set is_year false
            end
        else
            echo $l >> $mark_store.new
        end
    end
    
    #copy everything after #store#
    set store_and_rest (string match -r "#store#.*\$" (echo (cat $mark_store)))
    string split " " (string replace -r "#store#[^#]*" "" $store_and_rest) >> $mark_store.new

    mv $mark_store.new $mark_store
end