* Exporting org-diary-class to icalendar
@ 2010-12-06 19:20 Rémi Vanicat
2011-02-11 9:50 ` Bastien
0 siblings, 1 reply; 2+ messages in thread
From: Rémi Vanicat @ 2010-12-06 19:20 UTC (permalink / raw)
To: emacs-orgmode
Hello,
For those who want to use the org-diary-class diary sexp, and who want
to export it to ical (for google calendar consumption for example) Here
is a code that will do it. Beware that my timezone is hardwired in it
(search for Europe/Paris).
For now it doesn't take into account the skipped weeks, my first
implementation seemed to failed for an unknown reason.
--8<---------------cut here---------------start------------->8---
(defun icalendar--convert-org-diary-class-to-ical (nonmarker entry-main)
"Convert `org-diary-class' diary entry to icalendar format.
NONMARKER is a regular expression matching the start of non-marking
entries. ENTRY-MAIN is the first line of the diary entry."
(if (string-match (concat nonmarker
"%%(org-diary-class "
"\\([0-9]+ [0-9]+ [0-9]+\\) " ;date start
"\\([0-9]+ [0-9]+ [0-9]+\\) " ;date start
"\\([0-9]+\\)" ;DAYNAME
"\\([ 0-9]*\\)) "
"\\("
"\\([0-9][0-9]?:[0-9][0-9]\\)\\([ap]m\\)?"
"\\(-\\([0-9][0-9]?:[0-9][0-9]\\)\\([ap]m\\)?\\)?"
"\\)?"
"\\s-*\\(.*\\) ?$")
entry-main)
(let* ((start (match-string 1 entry-main))
(end (match-string 2 entry-main))
(dayname (read (match-string 3 entry-main)))
(skip-week (match-string 4 entry-main))
(remain-week ())
(startisostring (icalendar--datestring-to-isodate start))
(endisostring (icalendar--datestring-to-isodate end))
(starttimestring (icalendar--diarytime-to-isotime
(when (match-beginning 6)
(match-string 6 entry-main))
(when (match-beginning 7)
(match-string 7 entry-main))))
(endtimestring (icalendar--diarytime-to-isotime
(when (match-beginning 9)
(match-string 9 entry-main))
(when (match-beginning 10)
(match-string 10 entry-main))))
(summary (icalendar--convert-string-for-export
(match-string 11 entry-main))))
(icalendar--dmsg "org-diary-class %s" entry-main)
(setq skip-week (read (concat "(" skip-week ")")))
(when skip-week
(setq remain-week (number-sequence 1 52))
(mapc (lambda (el) (setq remain-week (delete el remain-week)))
skip-week))
(when starttimestring
(unless endtimestring
(let ((time
(read (icalendar--rris "^T0?" ""
starttimestring))))
(setq endtimestring (format "T%06d"
(+ 10000 time))))))
(list (concat "\nDTSTART;TZID=Europe/Paris;"
(if starttimestring "VALUE=DATE-TIME:"
"VALUE=DATE:")
startisostring
(or starttimestring "")
"\nDTEND;TZID=Europe/Paris;"
(if endtimestring "VALUE=DATE-TIME:"
"VALUE=DATE:")
startisostring
(or endtimestring "")
"\nRRULE:FREQ=DAILY;INTERVAL=1"
";BYDAY="
(nth dayname '("SU" "MO" "TU" "WE" "TH" "FR" "SA"))
";UNTIL="
endisostring)
summary))
;; no match
nil))
(defadvice icalendar--convert-to-ical (around ical-for-org (nonmarker entry-main))
(let ((res (icalendar--convert-org-diary-class-to-ical nonmarker entry-main)))
(if res
(setq ad-return-value res)
ad-do-it)))
(ad-activate 'icalendar--convert-to-ical)
--8<---------------cut here---------------end--------------->8---
--
Rémi Vanicat
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-02-11 9:50 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-12-06 19:20 Exporting org-diary-class to icalendar Rémi Vanicat
2011-02-11 9:50 ` Bastien
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).