Evie Litherland-Smith
2f0ebbf9b4
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
70 lines
2.9 KiB
EmacsLisp
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
|