Jelajahi Sumber

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 tahun lalu
induk
melakukan
8a3e72208a
1 mengubah file dengan 26 tambahan dan 28 penghapusan
  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 ',files)))
     (apply 'org-icalendar--combine-files nil (org-agenda-files t))))
     (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)
 (defun org-icalendar-export-current-agenda (file)
   "Export current agenda view to an iCalendar FILE.
   "Export current agenda view to an iCalendar FILE.
 This function assumes major mode for current buffer is
 This function assumes major mode for current buffer is
 `org-agenda-mode'."
 `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
     (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))))
 	   (org-agenda-files nil 'ifmode))))
 
 
 (defun org-icalendar--combine-files (restriction &rest files)
 (defun org-icalendar--combine-files (restriction &rest files)