diff options
author | Bastien Guerry <bzg@gnu.org> | 2012-09-30 17:14:59 +0200 |
---|---|---|
committer | Bastien Guerry <bzg@gnu.org> | 2012-09-30 17:14:59 +0200 |
commit | 8223b1d23361b74ede10bac47974ce7803804380 (patch) | |
tree | 3a2491c5193fed1bef14acd45092c0b9736fa5d6 /lisp/org/org-icalendar.el | |
parent | 163227893c97b5b41039ea9d5ceadb7e5b2d570c (diff) | |
download | emacs-8223b1d23361b74ede10bac47974ce7803804380.tar.gz |
Sync Org 7.9.2 from the commit tagged "release_7.9.2" in Org's Git repo.
Diffstat (limited to 'lisp/org/org-icalendar.el')
-rw-r--r-- | lisp/org/org-icalendar.el | 81 |
1 files changed, 39 insertions, 42 deletions
diff --git a/lisp/org/org-icalendar.el b/lisp/org/org-icalendar.el index d73a6195b32..8523b442583 100644 --- a/lisp/org/org-icalendar.el +++ b/lisp/org/org-icalendar.el @@ -28,8 +28,7 @@ (require 'org-exp) -(eval-when-compile - (require 'cl)) +(eval-when-compile (require 'cl)) (declare-function org-bbdb-anniv-export-ical "org-bbdb" nil) @@ -194,7 +193,7 @@ or if they are only using it locally." (defcustom org-icalendar-timezone (getenv "TZ") "The time zone string for iCalendar export. -When nil of the empty string, use the abbreviation retrieved from Emacs." +When nil or the empty string, use output from \(current-time-zone\)." :group 'org-export-icalendar :type '(choice (const :tag "Unspecified" nil) @@ -257,7 +256,7 @@ The file is stored under the name `org-combined-agenda-icalendar-file'." If COMBINE is non-nil, combine all calendar entries into a single large file and store it under the name `org-combined-agenda-icalendar-file'." (save-excursion - (org-prepare-agenda-buffers files) + (org-agenda-prepare-buffers files) (let* ((dir (org-export-directory :ical (list :publishing-directory org-export-publishing-directory))) @@ -288,20 +287,19 @@ file and store it under the name `org-combined-agenda-icalendar-file'." (let ((standard-output ical-buffer)) (if combine (and (not started) (setq started t) - (org-start-icalendar-file org-icalendar-combined-name)) - (org-start-icalendar-file category)) - (org-print-icalendar-entries combine) + (org-icalendar-start-file org-icalendar-combined-name)) + (org-icalendar-start-file category)) + (org-icalendar-print-entries combine) (when (or (and combine (not files)) (not combine)) (when (and combine org-icalendar-include-bbdb-anniversaries) (require 'org-bbdb) (org-bbdb-anniv-export-ical)) - (org-finish-icalendar-file) + (org-icalendar-finish-file) (set-buffer ical-buffer) (run-hooks 'org-before-save-iCalendar-file-hook) (save-buffer) (run-hooks 'org-after-save-iCalendar-file-hook) - (and (boundp 'org-wait) (numberp org-wait) (sit-for org-wait)) - )))) + (and (boundp 'org-wait) (numberp org-wait) (sit-for org-wait)))))) (org-release-buffers org-agenda-new-buffers)))) (defvar org-before-save-iCalendar-file-hook nil @@ -315,18 +313,18 @@ A good way to use this is to tell a desktop calendar application to re-read the iCalendar file.") (defvar org-agenda-default-appointment-duration) ; defined in org-agenda.el -(defun org-print-icalendar-entries (&optional combine) +(defun org-icalendar-print-entries (&optional combine) "Print iCalendar entries for the current Org-mode file to `standard-output'. When COMBINE is non nil, add the category to each line." (require 'org-agenda) (let ((re1 (concat org-ts-regexp "\\|<%%([^>\n]+>")) (re2 (concat "--?-?\\(" org-ts-regexp "\\)")) - (dts (org-ical-ts-to-string + (dts (org-icalendar-ts-to-string (format-time-string (cdr org-time-stamp-formats) (current-time)) "DTSTART")) hd ts ts2 state status (inc t) pos b sexp rrule scheduledp deadlinep todo prefix due start tags - tmp pri categories location summary desc uid alarm + tmp pri categories location summary desc uid alarm alarm-time (sexp-buffer (get-buffer-create "*ical-tmp*"))) (org-refresh-category-properties) (save-excursion @@ -359,26 +357,25 @@ When COMBINE is non nil, add the category to each line." (org-id-get-create) (or (org-id-get) (org-id-new))) categories (org-export-get-categories) + alarm-time (org-entry-get nil "APPT_WARNTIME") + alarm-time (if alarm-time (string-to-number alarm-time) 0) alarm "" deadlinep nil scheduledp nil) + (setq tmp (buffer-substring (max (point-min) (- pos org-ds-keyword-length)) pos) + deadlinep (string-match org-deadline-regexp tmp) + scheduledp (string-match org-scheduled-regexp tmp) + todo (org-get-todo-state)) + ;; donep (org-entry-is-done-p) (if (looking-at re2) (progn (goto-char (match-end 0)) (setq ts2 (match-string 1) inc (not (string-match "[0-9]\\{1,2\\}:[0-9][0-9]" ts2)))) - (setq tmp (buffer-substring (max (point-min) - (- pos org-ds-keyword-length)) - pos) - ts2 (if (string-match "[0-9]\\{1,2\\}:[0-9][0-9]-\\([0-9]\\{1,2\\}:[0-9][0-9]\\)" ts) + (setq ts2 (if (string-match "[0-9]\\{1,2\\}:[0-9][0-9]-\\([0-9]\\{1,2\\}:[0-9][0-9]\\)" ts) (progn (setq inc nil) (replace-match "\\1" t nil ts)) - ts) - deadlinep (string-match org-deadline-regexp tmp) - scheduledp (string-match org-scheduled-regexp tmp) - todo (org-get-todo-state) - ;; donep (org-entry-is-done-p) - )) + ts))) (when (and (not org-icalendar-use-plain-timestamp) (not deadlinep) (not scheduledp)) (throw :skip t)) @@ -403,12 +400,12 @@ When COMBINE is non nil, add the category to each line." (if (or (string-match org-tr-regexp hd) (string-match org-ts-regexp hd)) (setq hd (replace-match "" t t hd))) - (if (string-match "\\+\\([0-9]+\\)\\([dwmy]\\)>" ts) + (if (string-match "\\+\\([0-9]+\\)\\([hdwmy]\\)>" ts) (setq rrule (concat "\nRRULE:FREQ=" (cdr (assoc (match-string 2 ts) - '(("d" . "DAILY")("w" . "WEEKLY") + '(("h" . "HOURLY")("d" . "DAILY")("w" . "WEEKLY") ("m" . "MONTHLY")("y" . "YEARLY")))) ";INTERVAL=" (match-string 1 ts))) (setq rrule "")) @@ -419,11 +416,11 @@ When COMBINE is non nil, add the category to each line." ;; (c) only a DISPLAY action is defined. ;; [ESF] (let ((t1 (ignore-errors (org-parse-time-string ts 'nodefault)))) - (if (and (> org-icalendar-alarm-time 0) + (if (and (or (> alarm-time 0) (> org-icalendar-alarm-time 0)) (car t1) (nth 1 t1) (nth 2 t1)) - (setq alarm (format "\nBEGIN:VALARM\nACTION:DISPLAY\nDESCRIPTION:%s\nTRIGGER:-P0DT0H%dM0S\nEND:VALARM" summary org-icalendar-alarm-time)) - (setq alarm "")) - ) + (setq alarm (format "\nBEGIN:VALARM\nACTION:DISPLAY\nDESCRIPTION:%s\nTRIGGER:-P0DT0H%dM0S\nEND:VALARM" + summary (or alarm-time org-icalendar-alarm-time))) + (setq alarm ""))) (if (string-match org-bracket-link-regexp summary) (setq summary (replace-match (if (match-end 3) @@ -446,8 +443,8 @@ SUMMARY:%s%s%s CATEGORIES:%s%s END:VEVENT\n" (concat prefix uid) - (org-ical-ts-to-string ts "DTSTART") - (org-ical-ts-to-string ts2 "DTEND" inc) + (org-icalendar-ts-to-string ts "DTSTART") + (org-icalendar-ts-to-string ts2 "DTEND" inc) rrule summary (if (and desc (string-match "\\S-" desc)) (concat "\nDESCRIPTION: " desc) "") @@ -525,13 +522,13 @@ END:VEVENT\n" due (and (member 'todo-due org-icalendar-use-deadline) (org-entry-get nil "DEADLINE")) start (and (member 'todo-start org-icalendar-use-scheduled) - (org-entry-get nil "SCHEDULED")) + (org-entry-get nil "SCHEDULED")) categories (org-export-get-categories) uid (if org-icalendar-store-UID (org-id-get-create) (or (org-id-get) (org-id-new)))) - (and due (setq due (org-ical-ts-to-string due "DUE"))) - (and start (setq start (org-ical-ts-to-string start "DTSTART"))) + (and due (setq due (org-icalendar-ts-to-string due "DUE"))) + (and start (setq start (org-icalendar-ts-to-string start "DTSTART"))) (if (string-match org-bracket-link-regexp hd) (setq hd (replace-match (if (match-end 3) (match-string 3 hd) @@ -588,10 +585,10 @@ characters." (if (not s) nil (if is-body - (let ((re (concat "\\(" org-drawer-regexp "\\)[^\000]*?:END:.*\n?")) - (re2 (concat "^[ \t]*" org-keyword-time-regexp ".*\n?"))) - (while (string-match re s) (setq s (replace-match "" t t s))) - (while (string-match re2 s) (setq s (replace-match "" t t s)))) + (let ((re (concat "\\(" org-drawer-regexp "\\)[^\000]*?:END:.*\n?")) + (re2 (concat "^[ \t]*" org-keyword-time-regexp ".*\n?"))) + (while (string-match re s) (setq s (replace-match "" t t s))) + (while (string-match re2 s) (setq s (replace-match "" t t s)))) (setq s (replace-regexp-in-string "[[:space:]]+" " " s))) (let ((start 0)) (while (string-match "\\([,;]\\)" s start) @@ -634,7 +631,7 @@ not used right now." (when (string-match "[;,:]" s) (setq s (concat "\"" s "\""))) s)) -(defun org-start-icalendar-file (name) +(defun org-icalendar-start-file (name) "Start an iCalendar file by inserting the header." (let ((user user-full-name) (name (or name "unknown")) @@ -651,11 +648,11 @@ X-WR-TIMEZONE:%s X-WR-CALDESC:%s CALSCALE:GREGORIAN\n" name user timezone description)))) -(defun org-finish-icalendar-file () +(defun org-icalendar-finish-file () "Finish an iCalendar file by inserting the END statement." (princ "END:VCALENDAR\n")) -(defun org-ical-ts-to-string (s keyword &optional inc) +(defun org-icalendar-ts-to-string (s keyword &optional inc) "Take a time string S and convert it to iCalendar format. KEYWORD is added in front, to make a complete line like DTSTART.... When INC is non-nil, increase the hour by two (if time string contains @@ -680,7 +677,7 @@ a time), or the day by one (if it does not contain a time)." (replace-regexp-in-string "%Z" org-icalendar-timezone org-icalendar-date-time-format) - ";VALUE=DATE:%Y%m%d")) + ";VALUE=DATE:%Y%m%d")) (concat keyword (format-time-string fmt time (and (org-icalendar-use-UTC-date-timep) have-time)))))) |