branch: elpa/org-contrib commit 1eed6b71572708a8400b6c871630b48284379400 Author: Ihor Radchenko <yanta...@posteo.net> Commit: Ihor Radchenko <yanta...@posteo.net>
* lisp/org-mac-iCal.el: Fix compiler warnings (org-mac-iCal): Let-bind local variables. Drop obsolete functions. (omi-concat-leopard-ics): Let-bind local variables. (omi-import-ics): Let-bind local variables. Do not use `goto-line' non-interactively. --- lisp/org-mac-iCal.el | 240 ++++++++++++++++++++++++++------------------------- 1 file changed, 124 insertions(+), 116 deletions(-) diff --git a/lisp/org-mac-iCal.el b/lisp/org-mac-iCal.el index e3f3d877d6..936a60e27b 100644 --- a/lisp/org-mac-iCal.el +++ b/lisp/org-mac-iCal.el @@ -66,145 +66,153 @@ today's date" "Selects checked calendars in iCal.app and imports them into the the Emacs diary" (interactive) + (let ( currentBuffer openBuffers caldav-folders + caldav-calendars local-calendars all-calendars + import-calendars usedCalendarsBuffers + usedCalendarsFiles) + ;; kill diary buffers then empty diary files to avoid duplicates + (setq currentBuffer (buffer-name)) + (setq openBuffers (mapcar (function buffer-name) (buffer-list))) + (omi-kill-diary-buffer openBuffers) + (with-temp-buffer + (insert-file-contents diary-file) + (delete-region (point-min) (point-max)) + (write-region (point-min) (point-max) diary-file)) - ;; kill diary buffers then empty diary files to avoid duplicates - (setq currentBuffer (buffer-name)) - (setq openBuffers (mapcar (function buffer-name) (buffer-list))) - (omi-kill-diary-buffer openBuffers) - (with-temp-buffer - (insert-file-contents diary-file) - (delete-region (point-min) (point-max)) - (write-region (point-min) (point-max) diary-file)) - - ;; determine available calendars - (setq caldav-folders (directory-files "~/Library/Calendars" 1 ".*caldav$")) - (setq caldav-calendars nil) - (mapc + ;; determine available calendars + (setq caldav-folders (directory-files "~/Library/Calendars" 1 ".*caldav$")) + (setq caldav-calendars nil) + (mapc (lambda (x) (setq caldav-calendars (nconc caldav-calendars (directory-files x 1 ".*calendar$")))) caldav-folders) - (setq local-calendars nil) - (setq local-calendars (directory-files "~/Library/Calendars" 1 ".*calendar$")) + (setq local-calendars nil) + (setq local-calendars (directory-files "~/Library/Calendars" 1 ".*calendar$")) - (setq all-calendars (append caldav-calendars local-calendars)) + (setq all-calendars (append caldav-calendars local-calendars)) - ;; parse each calendar's Info.plist to see if calendar is checked in iCal - (setq all-calendars (delq 'nil (mapcar - (lambda (x) - (omi-checked x)) - all-calendars))) + ;; parse each calendar's Info.plist to see if calendar is checked in iCal + (setq all-calendars (delq 'nil (mapcar + (lambda (x) + (omi-checked x)) + all-calendars))) - ;; for each calendar, concatenate individual events into a single ics file - (with-temp-buffer - (shell-command "sw_vers" (current-buffer)) - (when (re-search-backward "10\\.[5678]" nil t) - (omi-concat-leopard-ics all-calendars))) + ;; for each calendar, concatenate individual events into a single ics file + (with-temp-buffer + (shell-command "sw_vers" (current-buffer)) + (when (re-search-backward "10\\.[5678]" nil t) + (omi-concat-leopard-ics all-calendars))) - ;; move all caldav ics files to the same place as local ics files - (mapc - (lambda (x) - (mapc - (lambda (y) - (rename-file (concat x "/" y); - (concat "~/Library/Calendars/" y))) - (directory-files x nil ".*ics$"))) - caldav-folders) - - ;; check calendar has contents and import - (setq import-calendars (directory-files "~/Library/Calendars" 1 ".*ics$")) - (mapc - (lambda (x) - (when (/= (nth 7 (file-attributes x 'string)) 0) - (omi-import-ics x))) - import-calendars) + ;; move all caldav ics files to the same place as local ics files + (mapc + (lambda (x) + (mapc + (lambda (y) + (rename-file (concat x "/" y); + (concat "~/Library/Calendars/" y))) + (directory-files x nil ".*ics$"))) + caldav-folders) - ;; tidy up intermediate files and buffers - (setq usedCalendarsBuffers (mapcar (function buffer-name) (buffer-list))) - (omi-kill-ics-buffer usedCalendarsBuffers) - (setq usedCalendarsFiles (directory-files "~/Library/Calendars" 1 ".*ics$")) - (omi-delete-ics-file usedCalendarsFiles) + ;; check calendar has contents and import + (setq import-calendars (directory-files "~/Library/Calendars" 1 ".*ics$")) + (mapc + (lambda (x) + (when (/= (nth 7 (file-attributes x 'string)) 0) + (omi-import-ics x))) + import-calendars) - (org-pop-to-buffer-same-window currentBuffer)) + ;; tidy up intermediate files and buffers + (setq usedCalendarsBuffers (mapcar (function buffer-name) (buffer-list))) + (omi-kill-ics-buffer usedCalendarsBuffers) + (setq usedCalendarsFiles (directory-files "~/Library/Calendars" 1 ".*ics$")) + (omi-delete-ics-file usedCalendarsFiles) + + (pop-to-buffer-same-window currentBuffer))) (defun omi-concat-leopard-ics (list) "Leopard stores each iCal.app event in a separate ics file. Whilst useful for Spotlight indexing, this is less helpful for icalendar-import-file. omi-concat-leopard-ics concatenates these individual event files into a single ics file" - (mapc - (lambda (x) - (setq omi-leopard-events (directory-files (concat x "/Events") 1 ".*ics$")) - (with-temp-buffer - (mapc - (lambda (y) - (insert-file-contents (expand-file-name y))) - omi-leopard-events) - (write-region (point-min) (point-max) (concat (expand-file-name x) ".ics")))) - list)) + (let (omi-leopard-events) + (mapc + (lambda (x) + (setq omi-leopard-events (directory-files (concat x "/Events") 1 ".*ics$")) + (with-temp-buffer + (mapc + (lambda (y) + (insert-file-contents (expand-file-name y))) + omi-leopard-events) + (write-region (point-min) (point-max) (concat (expand-file-name x) ".ics")))) + list))) (defun omi-import-ics (string) "Imports an ics file into the Emacs diary. First tidies up the ics file so that it is suitable for import and selects a sensible date range so that Emacs calendar view doesn't grind to a halt" - (with-temp-buffer - (insert-file-contents string) - (goto-char (point-min)) - (while - (re-search-forward "^BEGIN:VCALENDAR$" nil t) - (setq startEntry (match-beginning 0)) - (re-search-forward "^END:VCALENDAR$" nil t) - (setq endEntry (match-end 0)) - (save-restriction - (narrow-to-region startEntry endEntry) - (goto-char (point-min)) - (re-search-forward "\\(^DTSTART;.*:\\)\\([0-9][0-9][0-9][0-9]\\)\\([0-9][0-9]\\)" nil t) - (if (or (eq (match-string 2) nil) (eq (match-string 3) nil)) - (progn - (setq yearEntry 1) - (setq monthEntry 1)) - (setq yearEntry (string-to-number (match-string 2))) - (setq monthEntry (string-to-number (match-string 3)))) - (setq year (string-to-number (format-time-string "%Y"))) - (setq month (string-to-number (format-time-string "%m"))) - (setq now (list month 1 year)) - (setq entryDate (list monthEntry 1 yearEntry)) - ;; Check to see if this is a repeating event - (goto-char (point-min)) - (setq isRepeating (re-search-forward "^RRULE:" nil t)) - ;; Delete if outside range and not repeating - (when (and - (not isRepeating) - (> (abs (- (calendar-absolute-from-gregorian now) - (calendar-absolute-from-gregorian entryDate))) - (* (/ org-mac-iCal-range 2) 30)) - (delete-region startEntry endEntry))) - (goto-char (point-max)))) - (while - (re-search-forward "^END:VEVENT$" nil t) - (delete-blank-lines)) - (goto-line 1) - (insert "BEGIN:VCALENDAR\n\n") - (goto-line 2) - (while - (re-search-forward "^BEGIN:VCALENDAR$" nil t) - (replace-match "\n")) - (goto-line 2) - (while + (let ( startEntry endEntry yearEntry monthEntry + year month now entryDate isRepeating) + (with-temp-buffer + (insert-file-contents string) + (goto-char (point-min)) + (while + (re-search-forward "^BEGIN:VCALENDAR$" nil t) + (setq startEntry (match-beginning 0)) (re-search-forward "^END:VCALENDAR$" nil t) - (replace-match "\n")) - (insert "END:VCALENDAR") - (goto-line 1) - (delete-blank-lines) - (while - (re-search-forward "^END:VEVENT$" nil t) - (delete-blank-lines)) - (goto-line 1) - (while - (re-search-forward "^ORG.*" nil t) - (replace-match "\n")) - (goto-line 1) - (write-region (point-min) (point-max) string)) + (setq endEntry (match-end 0)) + (save-restriction + (narrow-to-region startEntry endEntry) + (goto-char (point-min)) + (re-search-forward "\\(^DTSTART;.*:\\)\\([0-9][0-9][0-9][0-9]\\)\\([0-9][0-9]\\)" nil t) + (if (or (eq (match-string 2) nil) (eq (match-string 3) nil)) + (progn + (setq yearEntry 1) + (setq monthEntry 1)) + (setq yearEntry (string-to-number (match-string 2))) + (setq monthEntry (string-to-number (match-string 3)))) + (setq year (string-to-number (format-time-string "%Y"))) + (setq month (string-to-number (format-time-string "%m"))) + (setq now (list month 1 year)) + (setq entryDate (list monthEntry 1 yearEntry)) + ;; Check to see if this is a repeating event + (goto-char (point-min)) + (setq isRepeating (re-search-forward "^RRULE:" nil t)) + ;; Delete if outside range and not repeating + (when (and + (not isRepeating) + (> (abs (- (calendar-absolute-from-gregorian now) + (calendar-absolute-from-gregorian entryDate))) + (* (/ org-mac-iCal-range 2) 30))) + (delete-region startEntry endEntry)) + (goto-char (point-max)))) + (while + (re-search-forward "^END:VEVENT$" nil t) + (delete-blank-lines)) + (goto-char (point-min)) + (insert "BEGIN:VCALENDAR\n\n") + (goto-char (point-min)) + (forward-line 1) + (while + (re-search-forward "^BEGIN:VCALENDAR$" nil t) + (replace-match "\n")) + (goto-char (point-min)) + (forward-line 1) + (while + (re-search-forward "^END:VCALENDAR$" nil t) + (replace-match "\n")) + (insert "END:VCALENDAR") + (goto-char (point-min)) + (delete-blank-lines) + (while + (re-search-forward "^END:VEVENT$" nil t) + (delete-blank-lines)) + (goto-char (point-min)) + (while + (re-search-forward "^ORG.*" nil t) + (replace-match "\n")) + (goto-char (point-min)) + (write-region (point-min) (point-max) string))) (icalendar-import-file string diary-file))