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