diff options
author | Sacha Chua <sacha@sachachua.com> | 2022-09-20 20:00:10 -0400 |
---|---|---|
committer | Sacha Chua <sacha@sachachua.com> | 2022-09-20 20:00:10 -0400 |
commit | f7cc8a984fa9cc6e33287ba53d604146a3f08150 (patch) | |
tree | 821dbac2ab61772757061b0c90fa7020e145893c /emacsconf-pentabarf.el | |
parent | de4d2fca0ec34d0bae1b9bf0db66b4bd8f2fcd98 (diff) | |
download | emacsconf-el-f7cc8a984fa9cc6e33287ba53d604146a3f08150.tar.xz emacsconf-el-f7cc8a984fa9cc6e33287ba53d604146a3f08150.zip |
Bring in more code from 2021
Diffstat (limited to 'emacsconf-pentabarf.el')
-rw-r--r-- | emacsconf-pentabarf.el | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/emacsconf-pentabarf.el b/emacsconf-pentabarf.el new file mode 100644 index 0000000..6920845 --- /dev/null +++ b/emacsconf-pentabarf.el @@ -0,0 +1,125 @@ +;;; emacsconf-pentabarf.el --- pentabarf XML export -*- lexical-binding: t; -*- + +;; Copyright (C) 2022 Sacha Chua + +;; Author: Sacha Chua <sacha@sachachua.com> +;; Keywords: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <https://www.gnu.org/licenses/>. + +;;; Commentary: + +;; + +;;; Code: +(defun emacsconf-assign-talk-uuids () + (interactive) + (require 'uuid) + (org-map-entries (lambda () + (when (and (org-entry-get (point) "SLUG") + (not (org-entry-get (point) "UUID"))) + (org-entry-put (point) "UUID" (uuid-string)))))) + +(defun emacsconf-talk-info-as-pentabarf-xml (o) + (require 'svg) + (dom-node + 'event `((id . ,(plist-get o :slug)) + (guid . ,(plist-get o :uuid))) + (dom-node 'date nil (emacsconf-pentabarf-format-datetime (plist-get o :start-time))) + (dom-node 'start nil (format-time-string "%H:%M" (plist-get o :start-time))) + (dom-node 'language nil "en") + (dom-node 'room nil "Main") + (dom-node 'subtitle) + (dom-node 'type nil "Talk") + (dom-node 'track nil "Main") + (dom-node 'slug nil (concat "emacsconf-" emacsconf-year "-talk-" (plist-get o :slug))) + (dom-node 'duration nil (format-seconds "%h:%.2m" + (time-to-seconds + (time-subtract + (plist-get o :end-time) + (plist-get o :start-time))))) + ;; (dom-node 'slug nil (plist-get o :slug)) + (dom-node 'title nil (plist-get o :title)) + (dom-node 'abstract) + (dom-node 'description nil (svg--encode-text (concat "Times are approximate and will probably change.\n\n" (plist-get o :markdown)))) + (dom-node 'url nil (concat "https://emacsconf.org/" emacsconf-year "/talks/" (plist-get o :slug))) + (apply 'dom-node 'persons + nil + (seq-map (lambda (p) + (dom-node 'person nil p)) + (split-string (or (plist-get o :speakers) "EmacsConf") ", "))))) + +(defun emacsconf-pentabarf-format-datetime (time) + (format-time-string "%Y-%m-%dT%H:%M:%SZ" time t)) +(defun emacsconf-pentabarf-days (talks) + (seq-map-indexed + (lambda (day i) + (dom-node + 'day + `((date . ,(car day)) + (start . ,(emacsconf-pentabarf-format-datetime (plist-get (cadr day) :start-time))) + (end . ,(emacsconf-pentabarf-format-datetime (plist-get (car (last day)) :end-time))) + (index . ,(1+ i))) + (apply + 'dom-node 'room + '((name . "Main")) + (seq-map #'conf-talk-info-as-pentabarf-xml + (cdr day))))) + (seq-group-by + (lambda (o) (format-time-string "%Y-%m-%d" (plist-get o :start-time))) + talks))) +;; (emacsconf-pentabarf-days (seq-take (emacsconf-filter-talks emacsconf-info) 3)) +;; based on svg-print, but without spaces +(defun emacsconf-pentabarf-print (dom) + "Convert DOM into a string containing the xml representation." + (if (stringp dom) + (insert dom) + (insert (format "<%s" (car dom))) + (dolist (attr (nth 1 dom)) + ;; Ignore attributes that start with a colon. + (unless (= (aref (format "%s" (car attr)) 0) ?:) + (insert (format " %s=\"%s\"" (car attr) (cdr attr))))) + (insert ">") + (dolist (elem (nthcdr 2 dom)) + (emacsconf-pentabarf-print elem)) + (insert (format "</%s>" (car dom))))) + +(defun emacsconf-pentabarf (emacsconf-info) + (require 'svg) + (apply + 'dom-node + 'schedule + nil + (append + (list + (dom-node 'generator '((name . "EmacsConf") (version . "0.1"))) + (dom-node 'version nil (format-time-string "%Y%m%d%H%M%S")) + (dom-node 'conference nil + (dom-node 'acronym nil "emacsconf" emacsconf-year) + (dom-node 'title nil (concat "EmacsConf " emacsconf-year)) + (dom-node 'start nil "2021-11-27") + (dom-node 'end nil "2021-11-28") + (dom-node 'time_zone_name nil "America/Toronto") + (dom-node 'base_url nil (concat "https://emacsconf.org/" emacsconf-year)))) + (emacsconf-pentabarf-days (emacsconf-filter-talks emacsconf-info))))) + +;; (emacsconf-pentabarf-days (seq-take (emacsconf-filter-talks emacsconf-info) 3)) +;; + +(defun emacsconf-pentabarf-generate () + (unless (file-directory-p emacsconf-directory) (error "Please specify the wiki directory in the emacsconf-directory variable.")) + (with-temp-file (expand-file-name "emacsconf-pentabarf.xml" (expand-file-name emacsconf-year emacsconf-directory)) + (emacsconf-pentabarf-print (emacsconf-pentabarf (emacsconf-filter-talks (emacsconf-get-talk-info 'wiki)))))) + +;;; emacsconf-pentabarf.el ends here |