aboutsummaryrefslogtreecommitdiff
path: root/functions/__mark_get.fish
blob: ecd3d9109ed0c4c0ccf5c8f3a5a97cc8a6ea4abc (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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
function __mark_get --description 'extract information from a mark_store'
    # defaults
    set mark_store $__mark_store
    set year (date "+%Y")
    set month (math (date "+%m") "*1")
    set day (math (date "+%d") "*1")
    # range of marks retunrned around date
    set range 0

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

    if not test -f $mark_store
        return 1
    end

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

    # find year in marks
    for i in (seq 1 (count $marks))
        if string match -q -r "^$year:\$" $marks[$i]
            set year_offset $i
            break
        end
    end

    # return if year not in the data
    if not set -q  year_offset
        echo year $year not found in the store >&2
        return 1
    end

    if test $day -eq 0
        # collect all marks in month
        set marks_list
        for m in (string split "" (string split ':' $marks[(math $month+$year_offset)])[2])
            # check if $m is a mark
            if test $m != '?'
                set incremented false
                # check if a count for $m is already stored in $marks_list
                for e in $marks_list
                    if test $e = mark_$m
                        set incremented true
                        # build count variable name
                        set cur mark_$m
                        # increment mark count
                        set $cur (math $$cur + 1)
                    end
                end
                # add count for $m if it was not in $marks_list
                if test $incremented = false
                    set mark_$m 1
                    set marks_list $marks_list mark_$m
                end
            end
        end
        # print result
        echo (count $marks_list) different marks found:
        for e in $marks_list
            echo (string split '_' $e)[2]:$$e
        end
    else
        # get range
        if test $range -ne 0
            set range (math $range - 1)
            set start_s (date -d "$year-$month-$day - $range days" +%s)
            set start_d (string split "-" (date -d @$start_s +%Y-%m-%d))

            set year_diff (math $year - $start_d[1])
            set first_year_offset (math "$year_offset + 12*$year_diff")

            if test $first_year_offset -gt (count marks)
                echo range is to big for available data! >&2
                return 1
            end

            # collect relevant marks
            # $s = oldest month to add
            set s $start_d[2]
            set e 12
            for y in (seq $first_year_offset -12 $year_offset)
                # set e if last year is reached
                if test $y -eq $year_offset
                    set e $month
                end
                for i in (seq $s $e)
                    set range_marks $range_marks (string split ":" $marks[(math $y + $i)])[2]
                end
                # reset s -> start with january
                set s 0
            end

            set marks (string split "" $range_marks[1])

            if test (count $range_marks) -gt 1
                set marks $marks[$start_d[3]..-1]
                for i in (seq 2 (math (count $range_marks) - 1))
                    set marks $marks (string split "" $range_marks[$i])
                end
                set tmp_marks (string split "" $range_marks[-1])
                set marks $marks $tmp_marks[1..$day]
            else
                set marks $marks[$start_d[3]..$day]
            end
            echo (string join "" $marks)
        else
            set marks (string split "" (string split ":" $marks[(math $month+$year_offset)])[2])
            echo $marks[$day]
        end
    end
end