Home
       tics2tsv - ics2txt - convert icalendar .ics file to plain text
  HTML 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 }