ttcal2tsv - ics2txt - convert icalendar .ics file to plain text
(HTM) git clone git://bitreich.org/ics2txt git://hg6vgqziawt5s4dj.onion/ics2txt
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) README
---
ttcal2tsv (1638B)
---
1 #!/usr/bin/awk -f
2
3 function isleap(year)
4 {
5 return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)
6 }
7
8 function mdays(mon, year)
9 {
10 return (mon == 2) ? (28 + isleap(year)) : (30 + (mon + (mon > 7)) % 2)
11 }
12
13 function maketime(tm,
14 sec, mon, day)
15 {
16 sec = tm["sec"] + tm["min"] * 60 + tm["hour"] * 3600
17
18 day = tm["mday"] - 1
19
20 for (mon = tm["mon"] - 1; mon > 0; mon--)
21 day = day + mdays(mon, tm["year"])
22
23 # constants: x * 365 + x / 400 - x / 100 + x / 4
24 day = day + int(tm["year"] / 400) * 146097
25 day = day + int(tm["year"] % 400 / 100) * 36524
26 day = day + int(tm["year"] % 100 / 4) * 1461
27 day = day + int(tm["year"] % 4 / 1) * 365
28
29 return sec + (day - 719527) * 86400
30 }
31
32 function text_to_epoch(str, tz,
33 tm)
34 {
35 tm["year"] = substr(str, 1, 4)
36 tm["mon"] = substr(str, 6, 2)
37 tm["mday"] = substr(str, 9, 2)
38 tm["hour"] = substr(str, 12, 2)
39 tm["min"] = substr(str, 15, 2)
40 return maketime(tm) - tz
41 }
42
43 BEGIN {
44 FIELDS = "beg end cat loc sum des"
45 fields["len"] = split(FIELDS, fields, " ")
46
47 for (i = 1; i <= fields["len"]; i++) {
48 pos[fields[i]] = i
49 printf("%s%s", (i > 1 ? "\t" : ""), fields[i])
50 }
51 printf("\n")
52 }
53
54 {
55 gsub(/\t/, " ")
56 }
57
58 /^TZ[+-]/ {
59 TZOFFSET = substr($1, 3, 1) substr($0, 4, 2)*3600 + substr($0, 6, 2)*60
60 while (getline && $0 ~ /^$/)
61 continue
62 }
63
64 /^[0-9]+-[0-9]+-[0-9]+/ {
65 if ("beg" in ev)
66 ev["end"] = text_to_epoch($0, TZOFFSET)
67 else
68 ev["beg"] = text_to_epoch($0, TZOFFSET)
69 next
70 }
71
72 /^ / {
73 tag = $1
74 sub("^ *[^ :]+: *", "")
75 sub(":$", "", tag)
76 ev[tag] = $0
77 next
78 }
79
80 /^$/ {
81 for (i = 1; i <= fields["len"]; i++)
82 printf("%s%s", (i > 1 ? "\t" : ""), ev[fields[i]])
83 printf("\n")
84 delete ev
85 }