tics2tsv - 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
---
tics2tsv (2105B)
---
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 ical_to_epoch(str, offset,
33 tm)
34 {
35 tm["year"] = substr(str, 1, 4)
36 tm["mon"] = substr(str, 5, 2)
37 tm["mday"] = substr(str, 7, 2)
38 tm["hour"] = substr(str, 10, 2)
39 tm["min"] = substr(str, 12, 2)
40 offset = (substr(str, 16, 1) == "Z" ? 0 : offset)
41 return maketime(tm) - offset
42 }
43
44 function print_event(ev, fields,
45 i)
46 {
47 for (i = 1; i <= fields["len"]; i++)
48 printf("%s%s", (i > 1 ? "\t" : ""), ev[fields[i]])
49 printf("\n")
50 }
51
52 BEGIN {
53 FIELDS = "DTSTART DTEND CATEGORIES LOCATION SUMMARY DESCRIPTION"
54 fields["len"] = split(FIELDS, fields, " ")
55
56 # by default: "CATEGORIES" -> "cat", "LOCATION" -> "loc"...
57 translate["DTSTART"] = "beg"
58 translate["DTEND"] = "end"
59
60 "date +%z" | getline offset_str
61 close("date +%z")
62 hour = substr($0, 4, 2)
63 min = substr($0, 6, 2)
64 tzoffset = substr(zone, 3, 1) hour * 3600 + min * 60
65
66 FS = "[:;]"
67
68 for (i = 1; i <= fields["len"]; i++) {
69 if (!(s = translate[fields[i]]))
70 s = tolower(substr(fields[i], 1, 3))
71 printf("%s%s", (i > 1 ? "\t" : ""), s)
72 }
73
74 printf("\n")
75 }
76
77 {
78 gsub("\r", "")
79 gsub("\t", "\\\\t")
80 gsub("^ *", "")
81 gsub(" *$", "")
82
83 if (match($0, "^ ")) {
84 ev[type] = ev[type] substr($0, 2, length($0) - 1)
85 } else {
86 type = $1
87 i = index($0, ":")
88 ev[type] = substr($0, i + 1, length($0) - i)
89 }
90 }
91
92 /^END:VEVENT/ {
93 ev["DTSTART"] = ical_to_epoch(ev["DTSTART"], offset)
94 ev["DTEND"] = ical_to_epoch(ev["DTEND"], offset)
95 print_event(ev, fields)
96 }