|
|
tsv2ics.awk - ics2txt - convert icalendar .ics file to plain text |
|
|
 |
git clone git://bitreich.org/ics2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ics2txt (git://bitreich.org) |
|
|
 |
Log |
|
|
 |
Files |
|
|
 |
Refs |
|
|
 |
Tags |
|
|
 |
README |
|
|
|
--- |
|
|
|
tsv2ics.awk (1973B) |
|
|
|
--- |
|
|
|
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 # Split the time in seconds since epoch into a table, with fields |
|
|
|
14 # named as with gmtime(3): tm["year"], tm["mon"], tm["mday"], |
|
|
|
15 # tm["hour"], tm["min"], tm["sec"] |
|
|
|
16 function gmtime(sec, tm, |
|
|
|
17 s) |
|
|
|
18 { |
|
|
|
19 tm["year"] = 1970 |
|
|
|
20 while (sec >= (s = 86400 * (365 + isleap(tm["year"])))) { |
|
|
|
21 tm["year"]++ |
|
|
|
22 sec -= s |
|
|
|
23 } |
|
|
|
24 tm["mon"] = 1 |
|
|
|
25 while (sec >= (s = 86400 * mdays(tm["mon"], tm["year"]))) { |
|
|
|
26 tm["mon"]++ |
|
|
|
27 sec -= s |
|
|
|
28 } |
|
|
|
29 tm["mday"] = 1 |
|
|
|
30 while (sec >= (s = 86400)) { |
|
|
|
31 tm["mday"]++ |
|
|
|
32 sec -= s |
|
|
|
33 } |
|
|
|
34 tm["hour"] = 0 |
|
|
|
35 while (sec >= 3600) { |
|
|
|
36 tm["hour"]++ |
|
|
|
37 sec -= 3600 |
|
|
|
38 } |
|
|
|
39 tm["min"] = 0 |
|
|
|
40 while (sec >= 60) { |
|
|
|
41 tm["min"]++ |
|
|
|
42 sec -= 60 |
|
|
|
43 } |
|
|
|
44 tm["sec"] = sec |
|
|
|
45 } |
|
|
|
46 |
|
|
|
47 BEGIN { |
|
|
|
48 FS = "\t" |
|
|
|
49 |
|
|
|
50 DTSTART["VEVENT"] = "DTSTART" |
|
|
|
51 DTEND["VEVENT"] = "DTEND" |
|
|
|
52 |
|
|
|
53 DTEND["VTODO"] = "DUE" |
|
|
|
54 |
|
|
|
55 DTSTART["VJOURNAL"] = "DTSTAMP" |
|
|
|
56 |
|
|
|
57 DTSTART["VFREEBUSY"] = "DTSTART" |
|
|
|
58 DTEND["VFREEBUSY"] = "DTEND" |
|
|
|
59 |
|
|
|
60 DTSTART["VALARM"] = "DTSTART" |
|
|
|
61 |
|
|
|
62 print "BEGIN:VCALENDAR" |
|
|
|
63 print "VERSION:2.0" |
|
|
|
64 print "CALSCALE:GREGORIAN" |
|
|
|
65 print "METHOD:PUBLISH" |
|
|
|
66 } |
|
|
|
67 |
|
|
|
68 NR == 1 { |
|
|
|
69 if ($1 != "TYPE" || $2 != "START" || $3 != "END" || $4 != "RECUR") { |
|
|
|
70 print "tsv2ics: invalid column names on first line" >"/dev/stderr" |
|
|
|
71 exit(EXIT = 1) |
|
|
|
72 } |
|
|
|
73 for (i = 1; i <= NF; i++) { |
|
|
|
74 FIELD[$i] = i |
|
|
|
75 NAME[i] = $i |
|
|
|
76 } |
|
|
|
77 next |
|
|
|
78 } |
|
|
|
79 |
|
|
|
80 { |
|
|
|
81 type = $FIELD["TYPE"] |
|
|
|
82 print "BEGIN:"type |
|
|
|
83 |
|
|
|
84 if (type in DTSTART) { |
|
|
|
85 gmtime($FIELD["START"] + offset, tm) |
|
|
|
86 printf "%s:%04d%02d%02dT%02d%02d00Z\n", DTSTART[type], |
|
|
|
87 tm["year"], tm["mon"], tm["mday"], tm["hour"], tm["min"] |
|
|
|
88 } |
|
|
|
89 |
|
|
|
90 if (type in DTEND) { |
|
|
|
91 gmtime($FIELD["END"] + offset, tm) |
|
|
|
92 printf "%s:%04d%02d%02dT%02d%02d00Z\n", DTEND[type], |
|
|
|
93 tm["year"], tm["mon"], tm["mday"], tm["hour"], tm["min"] |
|
|
|
94 } |
|
|
|
95 |
|
|
|
96 for (i = 5; i in NAME; i++) |
|
|
|
97 print$NAME[i]":"$i |
|
|
|
98 |
|
|
|
99 print "END:"type |
|
|
|
100 } |
|
|
|
101 |
|
|
|
102 END { |
|
|
|
103 if (EXIT) exit(EXIT) |
|
|
|
104 print "" |
|
|
|
105 print "END:VCALENDAR" |
|
|
|
106 } |
|