emacs/lib/ics2org.el

70 lines
2.9 KiB
EmacsLisp
Raw Normal View History

;;; ics2org.el -- ics2org -*- lexical-binding: t -*-
;;; Commentary:
;;; Inspired by / adapted from `fosdem-ics-to-org-list', from
;;; https://geeksocket.in/posts/elisp-ics-org-mode-list/
;;; Original Code:
;;; (defun fosdem-ics-to-org-list ()
;;; "Iterate over the VEVENT entries and create an Org list"
;;; (interactive)
;;; (let (talks-list)
;;; (setq talks-list
;;; (concat
;;; "* FOSDEM talks [/]\n"
;;; (cl-loop while (re-search-forward "BEGIN:VEVENT" nil t) concat
;;; (let (start-time end-time summary url duration duration-minutes)
;;; (re-search-forward "DTSTART:\\(.*\\)")
;;; (setq start-time (match-string 1))
;;; (re-search-forward "DTEND:\\(.*\\)")
;;; (setq end-time (match-string 1))
;;; (re-search-forward "SUMMARY:\\(.*\\)")
;;; (setq summary (match-string 1))
;;; (re-search-forward "URL:\\(.*\\)")
;;; (setq url (match-string 1))
;;; (setq duration (time-subtract
;;; (parse-iso8601-time-string end-time)
;;; (parse-iso8601-time-string start-time)))
;;; (setq duration-minutes (/ duration 60))
;;; (format "- [ ] [[%s][%s]] (%sm)\n" url summary duration-minutes)))))
;;; (with-current-buffer (generate-new-buffer "FOSDEM")
;;; (insert talks-list)
;;; (org-mode)
;;; (org-update-statistics-cookies (point)))))
;;; Code:
(defun ics2org (filename)
"Convert ICS file `FILENAME' to Org event format and insert at point."
(interactive)
(let (output-format
event-start
event-end
event-summary)
(if (not (file-exists-p filename))
(error "File %s not found" filename))
(progn
(find-file filename)
;; Find start time
(goto-char (point-min))
(re-search-forward "DTSTART:\\(.*\\)")
(setq event-start (date-to-time (match-string 1)))
;; Find end time
(goto-char (point-min))
(re-search-forward "DTEND:\\(.*\\)")
(setq event-end (date-to-time (match-string 1)))
;; Get event summary / title
(goto-char (point-min))
(re-search-forward "SUMMARY:\\(.*\\)")
(setq event-summary (match-string 1))
(previous-buffer))
;; Set a default `output-format', but replace with
;; `org-time-stamp-format' if available
(setq output-format "<%Y-%m-%d %a %H:%M>")
(if (fboundp 'org-time-stamp-format)
(setq output-format (org-time-stamp-format t nil)))
;; Return a formatted `org-mode' entry using parsed data
(format "* %s\n%s--%s\n"
event-summary
(format-time-string output-format event-start)
(format-time-string output-format event-end))))
(provide 'ics2org)
;;; ics2org.el ends here