emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Orgmode] Exporting org-diary-class to icalendar


From: Rémi Vanicat
Subject: [Orgmode] Exporting org-diary-class to icalendar
Date: Mon, 06 Dec 2010 20:20:15 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux)

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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]