|
|
tics2tsv - ics2txt - convert icalendar .ics file to plain text |
|
|
 |
git clone git://bitreich.org/ics2txt git://hg6vgqziawt5s4dj.onion/ics2txt (git://bitreich.org) |
|
|
 |
Log |
|
|
 |
Files |
|
|
 |
Refs |
|
|
 |
Tags |
|
|
 |
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 } |
|