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