tics2txt-tsv - 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 --- tics2txt-tsv (1410B) --- 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 timegm(year, mon, mday, hour, min, sec) 14 { 15 while (--mon >= 1) 16 mday += mdays(mon, year) 17 while (--year >= 1970) 18 mday += 365 + isleap(year) 19 return (((((mday - 1) * 24) + hour) * 60) + min) * 60 + sec 20 } 21 22 function date_ical(str, offset, 23 year, mon, mday, hour, min) 24 { 25 year = substr(str, 1, 4) 26 mon = substr(str, 5, 2) 27 mday = substr(str, 7, 2) 28 hour = substr(str, 10, 2) 29 min = substr(str, 12, 2) 30 offset = (substr(str, 16, 1) == "Z" ? 0 : offset) 31 return timegm(year, mon, mday, hour, min, 0) - offset 32 } 33 34 BEGIN { 35 "date +%z" | getline offset_str 36 close("date +%z") 37 hour = substr($0, 4, 2) 38 min = substr($0, 6, 2) 39 tzoffset = substr(zone, 3, 1) hour * 3600 + min * 60 40 41 FS = "[:;]" 42 } 43 44 { 45 gsub("\r", ""); gsub("\t", "\\\\t") 46 gsub("^ *", ""); gsub(" *$", "") 47 48 if (match($0, "^ ")) { 49 event[type] = event[type] substr($0, 2, length($0) - 1) 50 } else { 51 type = $1 52 i = index($0, ":") 53 event[type] = substr($0, i + 1, length($0) - i) 54 } 55 56 if ($0 ~ /^END:VEVENT/) 57 printf("%d\t%d\t%s\t%s\t%s\t%s\n", 58 date_ical(event["DTSTART"], offset), 59 date_ical(event["DTEND"], offset), 60 event["CATEGORIES"], 61 event["LOCATION"], 62 event["SUMMARY"], 63 event["DESCRIPTION"]) 64 }