]> git.eshelyaron.com Git - emacs.git/commitdiff
New option `icalendar-export-alarms'.
authorUlf Jasper <ulf.jasper@web.de>
Mon, 17 Nov 2014 19:51:26 +0000 (20:51 +0100)
committerUlf Jasper <ulf.jasper@web.de>
Mon, 17 Nov 2014 19:51:26 +0000 (20:51 +0100)
lisp/ChangeLog
lisp/calendar/icalendar.el
test/ChangeLog
test/automated/icalendar-tests.el

index 9d22d7609e228c005fb9331ea290801bcd563ad7..2bca643199f05a23add9930c2058470be5d667f4 100644 (file)
@@ -1,3 +1,12 @@
+2014-11-17  Ulf Jasper  <ulf.jasper@web.de>
+
+       * calendar/icalendar.el (icalendar-export-alarms): New
+       customizable variable.
+       (icalendar-export-region): Export alarms as specified in
+       `icalendar-export-alarms'.
+       (icalendar--create-ical-alarm, icalendar--do-create-ical-alarm):
+       New functions for exporting alarms.
+
 2014-11-16  Ulf Jasper  <ulf.jasper@web.de>
 
        * calendar/icalendar.el (icalendar--convert-tz-offset): Return
index dddcc640736d45687433d6cbfd34ea2597a6e399..af9b2a48324d56c19e1897b0fd41c691b49be24e 100644 (file)
@@ -270,8 +270,7 @@ other sexp entries are enumerated in any case."
 
 (defcustom icalendar-export-alarms
   nil
-  "Determine if and how alarms are included in exported diary events.
-FIXME"
+  "Determine if and how alarms are included in exported diary events."
   :version "25.1"
   :type '(choice (const :tag "Do not include alarms in export"
                         nil)
@@ -304,7 +303,6 @@ FIXME"
 ;; ======================================================================
 (require 'calendar)
 (require 'diary-lib)
-(require 'appt)
 
 ;; ======================================================================
 ;; misc
@@ -1115,7 +1113,7 @@ FExport diary data into iCalendar file: ")
                                                  (icalendar--create-uid
                                                   entry-full contents))))
                         (setq alarm (icalendar--create-ical-alarm
-                                     (car contents-n-summary))))
+                                     (cdr contents-n-summary))))
                       (setq result (concat result header contents alarm
                                            "\nEND:VEVENT")))
                     (if (consp cns-cons-or-list)
@@ -1292,33 +1290,41 @@ Returns an alist."
                     (if uid (cons 'uid uid) nil))))))))
 
 (defun icalendar--create-ical-alarm (summary)
+  "Return VALARM blocks for the given SUMMARY."
   (when icalendar-export-alarms
     (let* ((advance-time (car icalendar-export-alarms))
            (alarm-specs (cadr icalendar-export-alarms))
            (fun (lambda (spec)
                   (icalendar--do-create-ical-alarm advance-time spec summary))))
-      (mapconcat fun alarm-specs "\n"))))
+      (mapconcat fun alarm-specs ""))))
 
 (defun icalendar--do-create-ical-alarm (advance-time alarm-spec summary)
+  "Return a VALARM block.
+Argument ADVANCE-TIME is a number giving the time when the alarm
+fires (minutes before the respective event).  Argument ALARM-SPEC
+is a list which must be one of '(audio), '(display) or
+'(email (ADDRESS1 ...)), see `icalendar-export-alarms'.  Argument
+SUMMARY is a string which contains a short description for the
+alarm."
   (let* ((action (car alarm-spec))
-         (act (format "ACTION:%s\n"
+         (act (format "\nACTION:%s"
                       (cdr (assoc action '((audio . "AUDIO")
                                            (display . "DISPLAY")
                                            (email . "EMAIL"))))))
-         (tri (format "TRIGGER:-PT%dM\n" advance-time))
+         (tri (format "\nTRIGGER:-PT%dM" advance-time))
          (des (if (memq action '(display email))
-                  (format "DESCRIPTION:%s\n" summary)
+                  (format "\nDESCRIPTION:%s" summary)
                 ""))
          (sum (if (eq action 'email)
-                  (format "SUMMARY:%s\n" summary)
+                  (format "\nSUMMARY:%s" summary)
                 ""))
          (att (if (eq action 'email)
                   (mapconcat (lambda (i)
-                               (format "ATTENDEE:MAILTO:%s\n" i))
+                               (format "\nATTENDEE:MAILTO:%s" i))
                              (cadr alarm-spec) "")
                 "")))
 
-    (concat "BEGIN:VALARM\n" act tri des sum att "END:VALARM")))
+    (concat "\nBEGIN:VALARM" act tri des sum att "\nEND:VALARM")))
 
 ;; subroutines for icalendar-export-region
 (defun icalendar--convert-ordinary-to-ical (nonmarker entry-main)
index 4a6f0059344fac5d897338e4969b8a47826cd1fb..5290ef30b42fa02b5a6de9a60967be1dcfa53c82 100644 (file)
@@ -1,3 +1,11 @@
+2014-11-17  Ulf Jasper  <ulf.jasper@web.de>
+
+       * automated/icalendar-tests.el (icalendar-tests--test-export): New
+       optional parameter `alarms'.
+       (icalendar-export-alarms): New test for exporting icalendar
+       alarms.
+       (icalendar-tests--test-cycle): Let `icalendar-export-alarms' be nil.
+
 2014-11-16  Ulf Jasper  <ulf.jasper@web.de>
 
        * automated/icalendar-tests.el (icalendar--parse-vtimezone): Add
index 3e2fecff1cd9ebb487995f932b2a8052cd2b3815..ddff15544b33ce136cd0d5fc39ec14552d98c545 100644 (file)
@@ -503,33 +503,25 @@ END:VEVENT
       ;; restore time-zone even if something went terribly wrong
       (setenv "TZ" tz)))  )
 
-(ert-deftest icalendar--create-ical-alarm ()
-  "Test `icalendar--create-ical-alarms'."
-  (let ((icalendar-export-alarms))
-    ;; testcase: no alarms
-    (setq icalendar-export-alarm nil)
-    (should (equal nil
-                   (icalendar--create-ical-alarm "sumsum")))))
-
-
 ;; ======================================================================
 ;; Export tests
 ;; ======================================================================
 
 (defun icalendar-tests--test-export (input-iso input-european input-american
-                                               expected-output)
+                                               expected-output &optional alarms)
   "Perform an export test.
 Argument INPUT-ISO iso style diary string.
 Argument INPUT-EUROPEAN european style diary string.
 Argument INPUT-AMERICAN american style diary string.
 Argument EXPECTED-OUTPUT expected iCalendar result string.
+Optional argument ALARMS the value of `icalendar-export-alarms' for this test.
 
 European style input data must use german month names.  American
 and ISO style input data must use english month names."
   (let ((tz (getenv "TZ"))
        (calendar-date-style 'iso)
        (icalendar-recurring-start-year 2000)
-        (icalendar-export-alarms nil))
+        (icalendar-export-alarms alarms))
     (unwind-protect
        (progn
 ;;;      (message "Current time zone: %s" (current-time-zone))
@@ -763,6 +755,97 @@ RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20010706
 SUMMARY:block no end time
 "))
 
+(ert-deftest icalendar-export-alarms ()
+  "Perform export test with different settings for exporting alarms."
+  ;; no alarm
+  (icalendar-tests--test-export
+   "2014 Nov 17 19:30 no alarm"
+   "17 Nov 2014 19:30 no alarm"
+   "Nov 17 2014 19:30 no alarm"
+   "DTSTART;VALUE=DATE-TIME:20141117T193000
+DTEND;VALUE=DATE-TIME:20141117T203000
+SUMMARY:no alarm
+"
+   nil)
+
+    ;; 10 minutes in advance, audio
+    (icalendar-tests--test-export
+     "2014 Nov 17 19:30 audio alarm"
+     "17 Nov 2014 19:30 audio alarm"
+     "Nov 17 2014 19:30 audio alarm"
+     "DTSTART;VALUE=DATE-TIME:20141117T193000
+DTEND;VALUE=DATE-TIME:20141117T203000
+SUMMARY:audio alarm
+BEGIN:VALARM
+ACTION:AUDIO
+TRIGGER:-PT10M
+END:VALARM
+"
+     '(10 ((audio))))
+
+    ;; 20 minutes in advance, display
+    (icalendar-tests--test-export
+     "2014 Nov 17 19:30 display alarm"
+     "17 Nov 2014 19:30 display alarm"
+     "Nov 17 2014 19:30 display alarm"
+     "DTSTART;VALUE=DATE-TIME:20141117T193000
+DTEND;VALUE=DATE-TIME:20141117T203000
+SUMMARY:display alarm
+BEGIN:VALARM
+ACTION:DISPLAY
+TRIGGER:-PT20M
+DESCRIPTION:display alarm
+END:VALARM
+"
+     '(20 ((display))))
+
+    ;; 66 minutes in advance, email
+    (icalendar-tests--test-export
+     "2014 Nov 17 19:30 email alarm"
+     "17 Nov 2014 19:30 email alarm"
+     "Nov 17 2014 19:30 email alarm"
+     "DTSTART;VALUE=DATE-TIME:20141117T193000
+DTEND;VALUE=DATE-TIME:20141117T203000
+SUMMARY:email alarm
+BEGIN:VALARM
+ACTION:EMAIL
+TRIGGER:-PT66M
+DESCRIPTION:email alarm
+SUMMARY:email alarm
+ATTENDEE:MAILTO:att.one@email.com
+ATTENDEE:MAILTO:att.two@email.com
+END:VALARM
+"
+     '(66 ((email ("att.one@email.com" "att.two@email.com")))))
+
+    ;; 2 minutes in advance, all alarms
+    (icalendar-tests--test-export
+     "2014 Nov 17 19:30 all alarms"
+     "17 Nov 2014 19:30 all alarms"
+     "Nov 17 2014 19:30 all alarms"
+     "DTSTART;VALUE=DATE-TIME:20141117T193000
+DTEND;VALUE=DATE-TIME:20141117T203000
+SUMMARY:all alarms
+BEGIN:VALARM
+ACTION:EMAIL
+TRIGGER:-PT2M
+DESCRIPTION:all alarms
+SUMMARY:all alarms
+ATTENDEE:MAILTO:att.one@email.com
+ATTENDEE:MAILTO:att.two@email.com
+END:VALARM
+BEGIN:VALARM
+ACTION:AUDIO
+TRIGGER:-PT2M
+END:VALARM
+BEGIN:VALARM
+ACTION:DISPLAY
+TRIGGER:-PT2M
+DESCRIPTION:all alarms
+END:VALARM
+"
+     '(2 ((email ("att.one@email.com" "att.two@email.com")) (audio) (display)))))
+  
 ;; ======================================================================
 ;; Import tests
 ;; ======================================================================