From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric S Fraga Subject: Re: Google calendar to org mode script and a feature request for agenda Date: Thu, 08 Jul 2010 19:07:33 +0100 Message-ID: <87k4p57spm.wl%ucecesf@ucl.ac.uk> References: <87d3v95v87.wl%ucecesf@ucl.ac.uk> Reply-To: e.fraga@ucl.ac.uk Mime-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: multipart/mixed; boundary="Multipart_Thu_Jul__8_19:07:33_2010-1" Return-path: Received: from [140.186.70.92] (port=33298 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OWxXb-00028c-RF for emacs-orgmode@gnu.org; Thu, 08 Jul 2010 16:17:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OWxXa-0006rN-1T for emacs-orgmode@gnu.org; Thu, 08 Jul 2010 16:17:51 -0400 Received: from vscane-b.ucl.ac.uk ([144.82.108.141]:55209) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OWxXZ-0006r2-Nw for emacs-orgmode@gnu.org; Thu, 08 Jul 2010 16:17:49 -0400 In-Reply-To: List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Daniel Martins Cc: org-mode mailing list --Multipart_Thu_Jul__8_19:07:33_2010-1 Content-Type: text/plain; charset=US-ASCII On Wed, 7 Jul 2010 17:38:45 -0300, Daniel Martins wrote: > > Eric, > > Your awk seems to get timed appts in GMT > > How can I adapt it to GMT-3 > > Daniel Okay! I think I've got this working for any time zone (as well as adding some more functionality -- read the prologue in the script for info). Attached is the awk script. I use this from within a shell script (on Linux) that essentially does this: --8<---------------cut here---------------start------------->8--- ICS=basic.ics ORG=googlecalendar.org AWK=ical2org.awk # get the Google calendar wget http://www.google.com/calendar/ical/[...]/basic.ics # convert the ical entries to org format, adjusting for the # time zone information # this next command yields hours from UTC, + or -, times 100 # Note: this does not cater for those people living in time zones # that are not aligned with discrete hours (e.g. Newfoundland)... timezone=$(date +%z | sed 's/^\([+-]\)0/\1/') # convert this to seconds for use in the awk script seconds=$(($timezone*36)) # and now process the ics file with appropriate time zone awk -f $AWK --assign SECONDS=$seconds < $ICS > $ORG --8<---------------cut here---------------end--------------->8--- Please test this all out and let me know if it works. If the date and sed commands work, you should be adjusting the times by -3*3600=-10800 seconds. This seems to be working for me with BST (aka GMT+1). eric --Multipart_Thu_Jul__8_19:07:33_2010-1 Content-Type: text/plain; charset=US-ASCII Content-Disposition: attachment; filename="ical2org.awk" Content-Transfer-Encoding: 7bit # awk script for converting an iCal formatted file to a sequence of org-mode headings. # this may not work in general but seems to work for day and timed events from Google's # calendar, which is really all I need right now... # # usage: # awk -f THISFILE --assign SECONDS=SSSS < icalinputfile.ics > orgmodeentries.org # # where "SSSS" is the number of seconds to adjust time to take into # account the local time zone relative to UTC (e.g. GMT+1 == 3600, # GMT-1 == -3600). I have not tested edge effects, specifically what # happens when UTC time is a different day to local time and # especially when an event with a duration crosses midnight in UTC # time. It should work but... # # Note: change org meta information generated below for author and # email entries! # # Known bugs: # - if the iCal entry has an event reminder, the description field in # the VALARM entry for the event will supercede the description field # of the originating entry. # - not so much a bug as a possible assumption: date entries with no time # specified are assumed to be independent of the time zone. # # Eric S Fraga # 20100629 - initial version # 20100708 - added end times to timed events # - adjust times according to time zone information # - fixed incorrect transfer for entries with ":" embedded within the text # - added support for multi-line summary entries (which become headlines) #---------------------------------------------------------------------------------- # a function to take the iCal formatted date+time, converted it into # an internal form (seconds since time 0), and adjust according to the # local time zone (specified by +-SECONDS on the argument to awk) function datetimestamp(input) { # convert the iCal Date+Time entry to a format that mktime can understand datespec = gensub("([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])T([0-9][0-9])([0-9][0-9])([0-9][0-9]).*[\r]*", "\\1 \\2 \\3 \\4 \\5 \\6", "g", input); # print "date spec : " datespec; # convert this date+time into seconds from the beginning of time timestamp = mktime(datespec); # print "time stamp : " timestamp; # and adjust for the time zone, number of seconds from GMT/UTC. timestamp += SECONDS; # print "adjusted : " timestamp # print "Time stamp : " strftime("%Y-%m-%d %H:%M", timestamp); return timestamp; } BEGIN { # use a colon to separate the type of data line from the actual contents FS = ":"; date = ""; time2given = 0; entry = "" icalentry = "" # the full entry for inspection headline = "" id = "" indescription = 0; print "#+TITLE: Main Google calendar entries" print "#+AUTHOR: Eric S Fraga" print "#+EMAIL: e.fraga@ucl.ac.uk" print "#+DESCRIPTION: converted using the ical2org awk script" print "#+CATEGORY: google" print " " } # any line that starts at the left with a non-space character is a new data field /^[A-Z]/ { if (! index("DTSTAMP", $1)) icalentry = icalentry "\n" $0 # this line terminates the collection of description and summary entries indescription = 0; insummary = 0; } # this type of entry represents a day entry, not timed, with date stamp YYYYMMDD /^DTSTART;VALUE=DATE/ { date = gensub("([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9]).*[\r]", "\\1-\\2-\\3", "g", $2) # print date } # this represents a timed entry with date and time stamp YYYYMMDDTHHMMSS # we ignore the seconds /^DTSTART:/ { # print $0 date = strftime("%Y-%m-%d %H:%M", datetimestamp($2)); # print date; } # and the same for the end date; here we extract only the time and append this to the # date+time found by the DTSTART entry. We assume that entry was there, of course. # should probably add some error checking here! In time... /^DTEND:/ { # print $0 time2 = strftime("%H:%M", datetimestamp($2)); date = date "-" time2; } # The description will the contents of the entry in org-mode. # this line may be continued. /^DESCRIPTION/ { $1 = ""; entry = gensub("\r", "", "g", $0); indescription = 1; } # continuation lines (at least from Google) start with two spaces # if the continuation is after a description or a summary, append the entry # to the respective variable /^ / { # print "** continuation line: " $0 if (indescription) { entry = entry gensub("\r", "", "g", $0); } else if (insummary) { summary = summary gensub("\r", "", "g", $0) } icalentry = icalentry "\n" $0 } # the summary will be the org heading /^SUMMARY/ { $1 = ""; summary = gensub("\r", "", "g", $0); insummary = 1; } # the unique ID will be stored as a property of the entry /^UID/ { $1 = ""; id = gensub("\r", "", "g", $0); } # when we reach the end of the event line, we output everything we # have collected so far, creating a top level org headline with the # date/time stamp, unique ID property and the contents, if any /^END:VEVENT/ { print "* " gensub ("\\\\n", " ", "g", summary) print " :PROPERTIES:" print " :ID: " id print " :END:" print " <" date ">" # for the entry, convert all embedded "\n" strings to actual newlines print "" print gensub("\\\\n", "\n", "g", entry); # need 4 backslash to get one in the pattern! print "** COMMENT original iCal entry" print gensub("\r", "", "g", icalentry) summary = "" date = "" entry = "" icalentry = "" indescription = 0 } --Multipart_Thu_Jul__8_19:07:33_2010-1 Content-Type: text/plain; charset=US-ASCII -- Eric S Fraga GnuPG: 8F5C 279D 3907 E14A 5C29 570D C891 93D8 FFFC F67D --Multipart_Thu_Jul__8_19:07:33_2010-1 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Emacs-orgmode mailing list Please use `Reply All' to send replies to the list. Emacs-orgmode@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-orgmode --Multipart_Thu_Jul__8_19:07:33_2010-1--