1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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
|