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 2 months 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.
 
 ** 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
 Given the increasing popularity of wide screen monitors, splitting
 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:
 
-`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
-  :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)
   "Contexts where iCalendar export should use a scheduling time stamp.
 
 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
-  :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)
   "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
 	  ;; "VEVENT" component from scheduled, deadline, or any
 	  ;; 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
-		 (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
 		  entry deadline (concat "DL-" uid)
 		  (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
-		 (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
 		  entry scheduled (concat "SC-" uid)
 		  (concat "S: " summary) loc desc cat tz class)))