emacs/lib/ics2org.el
Evie Litherland-Smith 2f0ebbf9b4 Add initial version of ics2org function
Function parses an ICS file and returns formatted as an Org event,
currently just prints to standard out, but will modify to insert to
current buffer / buffer of choosing

Move a couple of extra functions into lib directory with ics2org, to
be a bit more organised
2024-06-24 11:25:41 +01:00

70 lines
2.9 KiB
EmacsLisp

;;; 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