Browse Source

ox-icalendar: Small refactoring

* lisp/ox-icalendar.el (org-agenda-collect-markers,
  org-create-marker-find-array): Remove functions.
(org-icalendar-export-current-agenda): Integrate previous functions.
Nicolas Goaziou 12 years ago
parent
commit
8a3e72208a
1 changed files with 26 additions and 28 deletions
  1. 26 28
      lisp/ox-icalendar.el

+ 26 - 28
lisp/ox-icalendar.el

@@ -891,39 +891,37 @@ The file is stored under the name chosen in
 	  `(apply 'org-icalendar--combine-files nil ',files)))
     (apply 'org-icalendar--combine-files nil (org-agenda-files t))))
 
-(defun org-agenda-collect-markers ()
-  "Collect the markers pointing to entries in the agenda buffer."
-  (let (m markers)
-    (save-excursion
-      (goto-char (point-min))
-      (while (not (eobp))
-	(when (setq m (or (org-get-at-bol 'org-hd-marker)
-			  (org-get-at-bol 'org-marker)))
-	  (push m markers))
-	(beginning-of-line 2)))
-    (nreverse markers)))
-
-(defun org-create-marker-find-array (marker-list)
-  "Create an alist of files names with all marker positions in that file."
-  (let (f tbl m a p)
-    (while (setq m (pop marker-list))
-      (setq p (marker-position m)
-	    f (buffer-file-name
-	       (or (buffer-base-buffer (marker-buffer m))
-		   (marker-buffer m))))
-      (if (setq a (assoc f tbl))
-	  (push (marker-position m) (cdr a))
-	(push (list f p) tbl)))
-    (mapcar (lambda (x) (setcdr x (sort (copy-sequence (cdr x)) '<)) x)
-	    tbl)))
-
 (defun org-icalendar-export-current-agenda (file)
   "Export current agenda view to an iCalendar FILE.
 This function assumes major mode for current buffer is
 `org-agenda-mode'."
-  (let ((org-icalendar-combined-agenda-file file))
+  (let ((org-icalendar-combined-agenda-file file)
+	(marker-list
+	 ;; Collect the markers pointing to entries in the current
+	 ;; agenda buffer.
+	 (let (markers)
+	   (save-excursion
+	     (goto-char (point-min))
+	     (while (not (eobp))
+	       (let ((m (or (org-get-at-bol 'org-hd-marker)
+			    (org-get-at-bol 'org-marker))))
+		 (and m (push m markers)))
+	       (beginning-of-line 2)))
+	   (nreverse markers))))
     (apply 'org-icalendar--combine-files
-	   (org-create-marker-find-array (org-agenda-collect-markers))
+	   ;; Build restriction alist.
+	   (let (restriction)
+	     ;; Sort markers in each association within RESTRICTION.
+	     (mapcar (lambda (x) (setcdr x (sort (copy-sequence (cdr x)) '<)) x)
+		     (dolist (m marker-list restriction)
+		       (let* ((pos (marker-position m))
+			      (file (buffer-file-name
+				     (org-base-buffer (marker-buffer m))))
+			      (file-markers (assoc file restriction)))
+			 ;; Add POS in FILE association if one exists
+			 ;; or create a new association for FILE.
+			 (if file-markers (push pos (cdr file-markers))
+			   (push (list file pos) restriction))))))
 	   (org-agenda-files nil 'ifmode))))
 
 (defun org-icalendar--combine-files (restriction &rest files)