Browse Source

ox-icalendar: Allow ignoring done scheduled or deadlines tasks

* lisp/ox-icalendar.el (org-icalendar-use-deadline):
(org-icalendar-use-scheduled): Add a value to ignore done tasks.
Nicolas Goaziou 5 years ago
parent
commit
f2f646b6c9
2 changed files with 73 additions and 29 deletions
  1. 7 0
      etc/ORG-NEWS
  2. 66 29
      lisp/ox-icalendar.el

+ 7 - 0
etc/ORG-NEWS

@@ -123,6 +123,13 @@ auto-commit attachments to git:
   one need to require the =org-attach-git= module in the startup.
   one need to require the =org-attach-git= module in the startup.
 
 
 ** New features
 ** New features
+*** New option to handle schedules and deadlines in iCalendar export
+
+Export ignore done tasks with a deadline when
+~org-icalendar-use-deadline~ contains ~event-if-todo-not-done~.
+Likewise, scheduled done tasks are also ignored when
+~org-icalendar-use-scheduled~ contains the same symbol.
+
 *** Add split-window-right option for src block edit window placement
 *** Add split-window-right option for src block edit window placement
 Given the increasing popularity of wide screen monitors, splitting
 Given the increasing popularity of wide screen monitors, splitting
 horizontally may make more sense than splitting vertically.  An
 horizontally may make more sense than splitting vertically.  An

+ 66 - 29
lisp/ox-icalendar.el

@@ -87,37 +87,66 @@ keyword."
 
 
 This is a list with possibly several symbols in it.  Valid symbols are:
 This is a list with possibly several symbols in it.  Valid symbols are:
 
 
-`event-if-todo'       Deadlines in TODO entries become calendar events.
-`event-if-not-todo'   Deadlines in non-TODO entries become calendar events.
-`todo-due'            Use deadlines in TODO entries as due-dates."
+`event-if-todo'
+
+  Deadlines in TODO entries become calendar events.
+
+`event-if-todo-not-done'
+
+  Deadlines in TODO entries with not-DONE state become events.
+
+`event-if-not-todo'
+
+  Deadlines in non-TODO entries become calendar events.
+
+`todo-due'
+
+  Use deadlines in TODO entries as due-dates."
   :group 'org-export-icalendar
   :group 'org-export-icalendar
-  :type '(set :greedy t
-	      (const :tag "Deadlines in non-TODO entries become events"
-		     event-if-not-todo)
-	      (const :tag "Deadline in TODO entries become events"
-		     event-if-todo)
-	      (const :tag "Deadlines in TODO entries become due-dates"
-		     todo-due)))
+  :type
+  '(set :greedy t
+	(const :tag "DEADLINE in non-TODO entries become events"
+	       event-if-not-todo)
+	(const :tag "DEADLINE in TODO entries become events"
+	       event-if-todo)
+	(const :tag "DEADLINE in TODO entries with not-DONE state become events"
+	       event-if-todo-not-done)
+	(const :tag "DEADLINE in TODO entries become due-dates"
+	       todo-due)))
 
 
 (defcustom org-icalendar-use-scheduled '(todo-start)
 (defcustom org-icalendar-use-scheduled '(todo-start)
   "Contexts where iCalendar export should use a scheduling time stamp.
   "Contexts where iCalendar export should use a scheduling time stamp.
 
 
 This is a list with possibly several symbols in it.  Valid symbols are:
 This is a list with possibly several symbols in it.  Valid symbols are:
 
 
-`event-if-todo'       Scheduling time stamps in TODO entries become an event.
-`event-if-not-todo'   Scheduling time stamps in non-TODO entries become an event.
-`todo-start'          Scheduling time stamps in TODO entries become start date.
-                      Some calendar applications show TODO entries only after
-                      that date."
+`event-if-todo'
+
+  Scheduling time stamps in TODO entries become an event.
+
+`event-if-todo-not-done'
+
+  Scheduling time stamps in TODO entries with not-DONE state
+  become events.
+
+`event-if-not-todo'
+
+  Scheduling time stamps in non-TODO entries become an event.
+
+`todo-start'
+
+  Scheduling time stamps in TODO entries become start date.  Some
+  calendar applications show TODO entries only after that date."
   :group 'org-export-icalendar
   :group 'org-export-icalendar
-  :type '(set :greedy t
-	      (const :tag
-		     "SCHEDULED timestamps in non-TODO entries become events"
-		     event-if-not-todo)
-	      (const :tag "SCHEDULED timestamps in TODO entries become events"
-		     event-if-todo)
-	      (const :tag "SCHEDULED in TODO entries become start date"
-		     todo-start)))
+  :type
+  '(set :greedy t
+	(const :tag "SCHEDULED timestamps in non-TODO entries become events"
+	       event-if-not-todo)
+	(const :tag "SCHEDULED timestamps in TODO entries become events"
+	       event-if-todo)
+	(const :tag "SCHEDULED in TODO entries with not-DONE state become events"
+	       event-if-todo-not-done)
+	(const :tag "SCHEDULED in TODO entries become start date"
+	       todo-start)))
 
 
 (defcustom org-icalendar-categories '(local-tags category)
 (defcustom org-icalendar-categories '(local-tags category)
   "Items that should be entered into the \"categories\" field.
   "Items that should be entered into the \"categories\" field.
@@ -566,17 +595,25 @@ inlinetask within the section."
 	  ;; Events: Delegate to `org-icalendar--vevent' to generate
 	  ;; Events: Delegate to `org-icalendar--vevent' to generate
 	  ;; "VEVENT" component from scheduled, deadline, or any
 	  ;; "VEVENT" component from scheduled, deadline, or any
 	  ;; timestamp in the entry.
 	  ;; timestamp in the entry.
-	  (let ((deadline (org-element-property :deadline entry)))
+	  (let ((deadline (org-element-property :deadline entry))
+		(use-deadline (plist-get info :icalendar-use-deadline)))
 	    (and deadline
 	    (and deadline
-		 (memq (if todo-type 'event-if-todo 'event-if-not-todo)
-		       org-icalendar-use-deadline)
+		 (pcase todo-type
+		   (`todo (or (memq 'event-if-todo-not-done use-deadline)
+			      (memq 'event-if-todo use-deadline)))
+		   (`done (memq 'event-if-todo use-deadline))
+		   (_ (memq 'event-if-not-todo use-deadline)))
 		 (org-icalendar--vevent
 		 (org-icalendar--vevent
 		  entry deadline (concat "DL-" uid)
 		  entry deadline (concat "DL-" uid)
 		  (concat "DL: " summary) loc desc cat tz class)))
 		  (concat "DL: " summary) loc desc cat tz class)))
-	  (let ((scheduled (org-element-property :scheduled entry)))
+	  (let ((scheduled (org-element-property :scheduled entry))
+		(use-scheduled (plist-get info :icalendar-use-scheduled)))
 	    (and scheduled
 	    (and scheduled
-		 (memq (if todo-type 'event-if-todo 'event-if-not-todo)
-		       org-icalendar-use-scheduled)
+		 (pcase todo-type
+		   (`todo (or (memq 'event-if-todo-not-done use-scheduled)
+			      (memq 'event-if-todo use-scheduled)))
+		   (`done (memq 'event-if-todo use-scheduled))
+		   (_ (memq 'event-if-not-todo use-scheduled)))
 		 (org-icalendar--vevent
 		 (org-icalendar--vevent
 		  entry scheduled (concat "SC-" uid)
 		  entry scheduled (concat "SC-" uid)
 		  (concat "S: " summary) loc desc cat tz class)))
 		  (concat "S: " summary) loc desc cat tz class)))