summaryrefslogtreecommitdiffstats
path: root/2020
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--2020/organizers-notebook.md377
-rw-r--r--2020/organizers-notebook.org413
-rw-r--r--2020/submissions.md750
-rw-r--r--2020/submissions.org448
4 files changed, 1044 insertions, 944 deletions
diff --git a/2020/organizers-notebook.md b/2020/organizers-notebook.md
index 5ca98f07..80a0c81d 100644
--- a/2020/organizers-notebook.md
+++ b/2020/organizers-notebook.md
@@ -1,6 +1,8 @@
<!-- automatically generated from organizers-notebook.org. Please edit that file instead. -->
[[!toc levels=4]]
+[Export and tangle]((progn (org-md-export-to-markdown) (org-babel-tangle)))
+
# Tasks
@@ -70,26 +72,25 @@ organizers-notebook.org back to the repo.
- [ ] <./subtitles/emacsconf-2020--42-closing-remarks-autogen.sbv>
-## DONE Create tasks for each of the subtitles
-
+# Assumptions and settings
-## DONE Link compressed videos on each talk page
+Note that re-evaluating a defvar won't change the value, so if you want to change the value after this is already loaded, use `(setq ...)`.
- (mapc (lambda (o)
- (if (string-match "\\(emacsconf-2020--\\([0-9]+\\).*?\\)-vp9-q56-original-audio\\.webm" o)
- (let ((talk-id (match-string 2 o))
- (base (match-string 1 o)))
- (find-file (expand-file-name (concat talk-id ".md") "~/vendor/emacsconf-wiki/2020/info"))
- (goto-char (point-min))
- (when (re-search-forward base nil t)
- (forward-line 1)
- (beginning-of-line)
- (unless (looking-at "\\[Download")
- (insert (format "[Download compressed %s.webm video (%s)](https://media.emacsconf.org/2020/%s)\n"
- (if (string-match "questions" o) "Q&A " "")
- (file-size-human-readable (file-attribute-size (file-attributes o)))
- (file-name-nondirectory o))))))))
- (directory-files "~/vendor/emacsconf-original-audio" t "webm"))
+ (defvar conf/buffer-minutes 3 "Number of minutes to use as a buffer between talks.")
+ (defvar conf/timezones '("EST" "America/Los_Angeles" "UTC" "CET" "Asia/Singapore") "List of timezones")
+ (defvar conf/autogenerate-talk-pages nil "Set this to t at the beginning of the conference, when we're still autogenerating individual talk pages.
+ Otherwise you might overwrite hand-edited talk pages.")
+ (defvar conf/collaborative-pad "https://etherpad.wikimedia.org/p/emacsconf-2020" "URL of collaborative pad.")
+ (defvar conf/streaming-nick "bandali" "IRC nick of main organizer in charge of streaming.")
+ (defvar conf/topic-templates nil "List of (channel topic-template) entries for mass-setting channel topics.")
+ (defvar conf/rooms '(("A" "http://example.org?room=a")
+ ("B" "http://example.org?room=b")
+ ("C" "http://example.org?room=c"))
+ "List of (code join-url) entries. Room codes should be uppercase.") ; actually set this in organizers' wiki index.org
+ (setq conf/topic-templates
+ '(("#emacsconf" "EmacsConf 2020 is over, thanks for joining! | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates")
+ ("#emacsconf-accessible" "EmacsConf 2020 is over. Thanks for making it more accessible! | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates")
+ ("#emacsconf-org" "EmacsConf2020 is over, thanks for joining! | Dedicated channel for EmacsConf organizers and speakers | this is intended as an internal, low-traffic channel; for main discussion around EmacsConf, please join #emacsconf | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates")))
# Workflows
@@ -103,6 +104,327 @@ STREAM - main organizer, CHECK - secondary organizer or volunteer, PAD - organiz
- See submissions.org for Org scheduling code; 3 minutes of buffer was okay last time, but more would be better for Q&A; opening remarks time could be trimmed
+#### Code for scheduling
+
+ (defun conf/get-talk-info ()
+ (let (talk results)
+ (org-map-entries (lambda ()
+ (let ((heading (org-heading-components)))
+ (cond
+ ((and (elt heading 2) (or (null talk)
+ (<= (car heading)
+ (plist-get talk :level)))) ;; has a todo, therefore is a talk
+ (when talk (setq results (cons talk results)))
+ (setq talk (list
+ :type 'talk
+ :title (elt heading 4)
+ :talk-id (org-entry-get (point) "TALK_ID")
+ :status (elt heading 2)
+ :level (car heading)
+ :scheduled (org-entry-get (point) "SCHEDULED")
+ :duration (org-entry-get (point) "DURATION")
+ :time (org-entry-get (point) "MIN_TIME")
+ :speakers (org-entry-get (point) "NAME"))))
+ ((string-match "^ *Talk information *$" (elt heading 4))
+ (plist-put talk :info
+ (org-export-as 'md t nil t)))
+ ((or (null talk) (< (car heading) (plist-get talk :level))) ;; heading above
+ (when talk
+ (setq results (cons talk results))
+ (setq talk nil))
+ (setq results (cons
+ (list :type 'headline
+ :level (car heading)
+ :speakers (org-entry-get (point) "NAME")
+ :duration (org-entry-get (point) "DURATION")
+ :talk-id (org-entry-get (point) "TALK_ID")
+ :title (elt heading 4)
+ :scheduled (org-entry-get (point) "SCHEDULED"))
+ results))))))
+ nil 'tree)
+ (when talk (setq results (cons talk results)))
+ (reverse results)))
+
+ (defun conf/filter-talks (list)
+ "Return only talk info in LIST."
+ (seq-filter
+ (lambda (talk) (eq (plist-get talk :type) 'talk))
+ list))
+
+ (defun conf/get-talk-info-from-file (&optional filename)
+ (with-temp-buffer
+ (insert-file-contents (or filename "submissions.org"))
+ (org-mode)
+ (org-show-all)
+ (goto-char (point-min))
+ (goto-char (org-find-property "ID" "talks"))
+ (conf/get-talk-info)))
+
+
+ (defun conf/find-talk (filter &optional info)
+ (setq info (or info (conf/filter-talks conf/info)))
+ (when (stringp filter) (setq filter (list filter)))
+ (or (seq-find (lambda (o) (string= (plist-get o :talk-id) (car filter))) info)
+ (seq-find (lambda (o)
+ (let ((case-fold-search t)
+ (all (mapconcat (lambda (f) (plist-get o f)) '(:title :speakers :talk-id) " ")))
+ (null (seq-contains-p
+ (mapcar (lambda (condition) (string-match condition all)) filter)
+ nil))))
+ info)))
+
+ (defun conf/goto-talk-id (id)
+ (goto-char (org-find-property "TALK_ID" id)))
+
+ (defun conf/assign-ids ()
+ "Assign numeric talk IDs."
+ (interactive)
+ (goto-char (point-min))
+ ;; Determine the maximum ID assigned so far
+ (let ((id
+ (1+
+ (apply 'max
+ (or (mapcar
+ 'string-to-number
+ (org-map-entries
+ (lambda ()
+ (let ((org-trust-scanner-tags t))
+ (org-entry-get (point) "TALK_ID"))) "TALK_ID>0" 'file))
+ '(0))))))
+ (goto-char (point-min))
+ (while (re-search-forward "^ *:NAME: " nil t)
+ (unless (org-entry-get (point) "TALK_ID")
+ (org-set-property "TALK_ID" (format "%02d" id))
+ (org-set-property "CUSTOM_ID" (format "talk%02d" id))
+ (setq id (1+ id))))))
+
+ (defun conf/update-talks ()
+ "Update times, tables, and schedules."
+ (interactive)
+ (save-excursion
+ (conf/update-times)
+ (conf/update-tables)
+ (conf/update-schedules)))
+
+ (defun conf/update-times ()
+ "Check whether we need more time or less time based on TARGET_TIME and MIN_TIME_SUM."
+ (goto-char (point-min))
+ (org-map-entries
+ (lambda ()
+ (when (org-entry-get (point) "TARGET_TIME")
+ (conf/org-sum-min-time-in-subtree)
+ (org-entry-put
+ (point)
+ "DIFFERENCE"
+ (let ((diff
+ (-
+ (string-to-number (org-entry-get (point) "TARGET_TIME"))
+ (string-to-number (org-entry-get (point) "MIN_TIME_SUM")))))
+ (cond
+ ((> diff 0) (format "Extra: %d" diff))
+ ((< diff 0) (format "Needs: %d" (- diff)))
+ (t "")))))) nil 'file))
+
+ (defun conf/update-tables ()
+ "Update the time checks and table reports."
+ (goto-char (point-min))
+ (while (re-search-forward "#\\+CALL: check_time()" nil t)
+ (org-ctrl-c-ctrl-c))
+ (goto-char (point-min))
+ (while (re-search-forward "#\\+BEGIN: columnview" nil t)
+ (org-ctrl-c-ctrl-c)))
+
+ (defun conf/update-schedules ()
+ "Schedule the talks based on the MIN_TIME and 3 minutes of buffer.
+ Talks with a FIXED_TIME property are not moved."
+ (interactive)
+ (goto-char (org-find-exact-headline-in-buffer "Talks"))
+ (let (current-time scheduled end-time duration (buffer (seconds-to-time (* conf/buffer-minutes 60)))) ;; assumption: 3 minutes between talks
+ (org-map-entries (lambda ()
+ (if (org-entry-get (point) "FIXED_TIME")
+ (setq current-time (org-get-scheduled-time (point))))
+ (when (org-entry-get (point) "MIN_TIME")
+ (setq duration (* (string-to-number (org-entry-get (point) "MIN_TIME")) 60)
+ end-time (time-add current-time (seconds-to-time duration)))
+ (org-set-property "SCHEDULED" (format "%s-%s" (org-format-time-string "%Y-%m-%d %H:%M" current-time)
+ (org-format-time-string "%H:%M" end-time)))
+ (setq current-time (time-add end-time buffer))))
+ nil 'tree)))
+
+ (defun conf/org-sum-min-time-in-subtree ()
+ "Add up all the MIN_TIME properties of headings underneath the current one
+ The total is written to the MIN_TIME_SUM property of this heading"
+ (interactive)
+ (org-entry-put
+ (point)
+ "MIN_TIME_SUM"
+ (save-excursion
+ (format "%d"
+ (apply
+ '+
+ (mapcar 'string-to-number
+ (delq nil
+ (org-map-entries
+ (lambda () (org-entry-get (point) "MIN_TIME")) nil 'tree))))))))
+
+
+#### Generate schedule file
+
+ (defun conf/format-talk-link (talk)
+ (and talk (if (plist-get talk :talk-id)
+ (format "<a href=\"/2020/talks/%s\">%s</a>"
+ (plist-get talk :talk-id)
+ (plist-get talk :title))
+ (plist-get talk :title))))
+
+ (defun conf/format-talk-info-as-schedule (info)
+ (format "<table width=\"100%%\">%s</table>"
+ (mapconcat
+ (lambda (o)
+ (let* ((time-fmt "%l:%M %p")
+ (timestamp (org-timestamp-from-string (plist-get o :scheduled)))
+ (start (if timestamp (format-time-string time-fmt (org-timestamp-to-time (org-timestamp-split-range timestamp))) ""))
+ (end (if timestamp (format-time-string time-fmt (org-timestamp-to-time (org-timestamp-split-range timestamp t))) ""))
+ (title (plist-get o :title))
+ (speakers (plist-get o :speakers)))
+ (if (eq (plist-get o :type) 'headline)
+ (format "<tr><td colspan=\"4\"><strong>%s<strong></td></tr>"
+ (if (plist-get o :talk-id)
+ (conf/format-talk-link o)
+ title))
+ (format "<tr><td width=100>~%s</td><td width=100>~%s</td><td>%s</td><td>%s</td></tr>"
+ start end (conf/format-talk-link o) speakers))))
+ (cdr info) "\n")))
+
+ (defun conf/filter-talks (info)
+ (seq-filter (lambda (o) (plist-get o :talk-id)) info))
+
+ (defun conf/split-out-talk-information ()
+ (interactive)
+ (let ((talks (conf/filter-talks conf/info)))
+ (mapc (lambda (o)
+ (with-temp-buffer
+ (insert
+ (format "# %s\n%s\n\n%s"
+ (plist-get o :title)
+ (plist-get o :speakers)
+ (plist-get o :info)))
+ (write-file (expand-file-name (format "%s.md" (plist-get o :talk-id)) "info"))))
+ talks)))
+
+ (defun conf/format-talk-pages (info)
+ (let* ((talks (conf/filter-talks info))
+ (next-talks (cdr talks))
+ (prev-talks (cons nil talks)))
+ (mapc (lambda (o)
+ (with-temp-buffer
+ (let* ((timestamp (org-timestamp-from-string (plist-get o :scheduled)))
+ (next-talk (conf/format-talk-link (pop next-talks)))
+ (prev-talk (conf/format-talk-link (pop prev-talks)))
+ (schedule (mapconcat
+ (lambda (tz)
+ (format "%s - %s"
+ (format-time-string "%A, %b %e %Y, ~%l:%M %p"
+ (org-timestamp-to-time (org-timestamp-split-range timestamp)) tz)
+ (format-time-string "%l:%M %p %Z"
+ (org-timestamp-to-time (org-timestamp-split-range timestamp t)) tz)))
+ conf/timezones
+ " \n"))
+ (nav-links (format "Back to the [[schedule]] \n%s%s"
+ (if prev-talk (format "Previous: %s \n" prev-talk) "")
+ (if next-talk (format "Next: %s \n" next-talk) ""))))
+ (insert (format "[[%s title=\"%s\"]]
+ [[%s copyright=\"Copyright &copy; 2020 %s\"]]
+
+ <!-- To edit the talk information, change /2020/info/TALKID.md. Boilerplate automatically generated from submissions.org using conf/generate-schedule-files --->\n
+
+ %s
+
+ [[!inline pages=\"internal(2020/info/%s)\" raw=\"yes\"]]
+
+ %s
+
+ %s
+
+ "
+ "!meta"
+ (replace-regexp-in-string "\"" "\\\\\"" (plist-get o :title))
+ "!meta"
+ (plist-get o :speakers)
+ nav-links
+ (plist-get o :talk-id)
+ schedule
+ nav-links)))
+ (write-file (format "talks/%s.md" (plist-get o :talk-id)))))
+ talks)))
+
+ (defun conf/generate-pad-template ()
+ (interactive)
+ (let ((talks (conf/filter-talks conf/info)))
+ (with-current-buffer (find-file "pad-template.md")
+ (erase-buffer)
+ (insert
+ (concat
+ "Conference info, how to watch/participate: <https://emacsconf.org/2020/>
+ Code of conduct: <https://emacsconf.org/conduct/>
+
+ "
+ (mapconcat
+ (lambda (o)
+ (format "**%s**
+ Speaker(s): %s
+ Talk page: <https://emacsconf.org/2020/schedule/%s>
+
+ *Questions:*
+
+ * Put your questions here, most recent on top
+ * sample text
+
+ *Links:*
+
+ * sample text
+ * sample text
+
+ *Other notes:*
+
+ * sample text
+ * sample text
+ <br>
+ <br>
+ " (plist-get o :title) (plist-get o :speakers) (plist-get o :talk-id))) talks " \n \n")))
+ (save-buffer))))
+
+ (defun conf/generate-talks-page ()
+ (let ((info conf/info))
+ (with-temp-buffer
+ (find-file "talk-details.md")
+ (erase-buffer)
+ (insert (format "<table><thead><th>Duration</th><th>Title</th><th>Speakers</th></thead><tbody>%s</tbody></table>"
+ (mapconcat
+ (lambda (o)
+ (let* ((title (plist-get o :title))
+ (speakers (plist-get o :speakers)))
+ (if (null (plist-get o :talk-id))
+ (format "<tr><td colspan=\"3\">%s</td></tr>" (conf/format-talk-link o))
+ (format "<tr><td>%s</td><td>%s</td><td>%s</td><tr>"
+ (plist-get o :duration)
+ (conf/format-talk-link o)
+ (plist-get o :speakers)))))
+ info "\n")))
+ (save-buffer))))
+
+ (defun conf/generate-schedule-files (&optional filename)
+ (interactive)
+ (with-temp-buffer
+ (insert (conf/format-talk-info-as-schedule conf/info))
+ (write-file "schedule-details.md"))
+ (when conf/autogenerate-talk-pages (conf/format-talk-pages conf/info)))
+
+Set the info based on submissions.org.
+
+ (setq conf/info (conf/get-talk-info-from-file "submissions.org"))
+
+
### Before the conference
- Do tech checks and get alternative ways to contact speakers (phone number? IRC nick? Something that goes ding?)
@@ -226,20 +548,7 @@ Needs the `$main480p` environment variable set to somethnig of the form `icecast
##### Load data
- (defvar conf/collaborative-pad "https://etherpad.wikimedia.org/p/emacsconf-2020" "URL of collaborative pad.")
- (defvar conf/topic-templates nil "List of (channel topic-template) entries for mass-setting channel topics.")
- (defvar conf/streaming-nick "bandali" "IRC nick of main organizer in charge of streaming.")
- "List of (code join-url) entries, one for each meeting room.") ;; Set this in a private file
- (defvar conf/channels nil "List of IRC channels for broadcasts.")
(defvar conf/info nil "List of plists with the following keys: `:talk-id', `:name', `:speakers', and other info.") ; Set from submissions.org
- (setq conf/topic-templates
- '(("#emacsconf" "EmacsConf 2020 is over, thanks for joining! | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates")
- ("#emacsconf-accessible" "EmacsConf 2020 is over. Thanks for making it more accessible! | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates")
- ("#emacsconf-org" "EmacsConf2020 is over, thanks for joining! | Dedicated channel for EmacsConf organizers and speakers | this is intended as an internal, low-traffic channel; for main discussion around EmacsConf, please join #emacsconf | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates")))
- (defvar conf/rooms '(("A" "http://example.org?room=a")
- ("B" "http://example.org?room=b")
- ("C" "http://example.org?room=c"))
- "List of (code join-url) entries. Room codes should be uppercase.") ; set from organizers' wiki index.org
##### Announce topics
@@ -305,7 +614,7 @@ Needs the `$main480p` environment variable set to somethnig of the form `icecast
(defun erc-cmd-BROADCAST (&rest message)
"Say MESSAGE in all the conference channels."
- (conf/erc-with-channels conf/channels
+ (conf/erc-with-channels (mapcar 'car conf/topic-templates)
(erc-send-message (s-join " " message))))
@@ -397,10 +706,10 @@ Another collaborative pad
#### Encode highly-compressed versions
-[Compressing video](#org1261a7d)
+[Compressing video](#org8cc42f6)
-<a id="org1261a7d"></a>
+<a id="org8cc42f6"></a>
#### Compressing video
diff --git a/2020/organizers-notebook.org b/2020/organizers-notebook.org
index d69c4d2d..5e5a3b41 100644
--- a/2020/organizers-notebook.org
+++ b/2020/organizers-notebook.org
@@ -1,12 +1,14 @@
#+todo: TODO(t) INPROGRESS(i) | DONE(d) CANCELLED(c)
#+OPTIONS: h:6
-#+PROPERTY: header-args :results silent :exports code
+#+PROPERTY: header-args :results silent :exports code :tangle yes
#+begin_export md
<!-- automatically generated from organizers-notebook.org. Please edit that file instead. -->
[[!toc levels=4]]
#+end_export
+[[elisp:(progn (org-md-export-to-markdown) (org-babel-tangle))][Export and tangle]]
+
* Tasks
** Manually transcribe
Either subtitles (with timestamps) or a text transcript (no timestamps) is perfectly okay.
@@ -69,32 +71,26 @@ organizers-notebook.org back to the repo.
- [ ] [[./subtitles/emacsconf-2020--41-opening-remarks-autogen.sbv]]
- [ ] [[./subtitles/emacsconf-2020--42-closing-remarks-autogen.sbv]]
-** DONE Create tasks for each of the subtitles
- CLOSED: [2020-12-09 Wed 15:42]
- :LOGBOOK:
- - State "DONE" from "TODO" [2020-12-09 Wed 15:42]
- :END:
-** DONE Link compressed videos on each talk page
- CLOSED: [2020-12-09 Wed 15:42]
- :LOGBOOK:
- - State "DONE" from "TODO" [2020-12-09 Wed 15:42]
- :END:
+* Assumptions and settings
+
+Note that re-evaluating a defvar won't change the value, so if you want to change the value after this is already loaded, use =(setq ...)=.
+
#+begin_src emacs-lisp
- (mapc (lambda (o)
- (if (string-match "\\(emacsconf-2020--\\([0-9]+\\).*?\\)-vp9-q56-original-audio\\.webm" o)
- (let ((talk-id (match-string 2 o))
- (base (match-string 1 o)))
- (find-file (expand-file-name (concat talk-id ".md") "~/vendor/emacsconf-wiki/2020/info"))
- (goto-char (point-min))
- (when (re-search-forward base nil t)
- (forward-line 1)
- (beginning-of-line)
- (unless (looking-at "\\[Download")
- (insert (format "[Download compressed %s.webm video (%s)](https://media.emacsconf.org/2020/%s)\n"
- (if (string-match "questions" o) "Q&A " "")
- (file-size-human-readable (file-attribute-size (file-attributes o)))
- (file-name-nondirectory o))))))))
- (directory-files "~/vendor/emacsconf-original-audio" t "webm"))
+(defvar conf/buffer-minutes 3 "Number of minutes to use as a buffer between talks.")
+(defvar conf/timezones '("EST" "America/Los_Angeles" "UTC" "CET" "Asia/Singapore") "List of timezones")
+(defvar conf/autogenerate-talk-pages nil "Set this to t at the beginning of the conference, when we're still autogenerating individual talk pages.
+Otherwise you might overwrite hand-edited talk pages.")
+(defvar conf/collaborative-pad "https://etherpad.wikimedia.org/p/emacsconf-2020" "URL of collaborative pad.")
+(defvar conf/streaming-nick "bandali" "IRC nick of main organizer in charge of streaming.")
+(defvar conf/topic-templates nil "List of (channel topic-template) entries for mass-setting channel topics.")
+(defvar conf/rooms '(("A" "http://example.org?room=a")
+ ("B" "http://example.org?room=b")
+ ("C" "http://example.org?room=c"))
+ "List of (code join-url) entries. Room codes should be uppercase.") ; actually set this in organizers' wiki index.org
+(setq conf/topic-templates
+ '(("#emacsconf" "EmacsConf 2020 is over, thanks for joining! | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates")
+ ("#emacsconf-accessible" "EmacsConf 2020 is over. Thanks for making it more accessible! | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates")
+ ("#emacsconf-org" "EmacsConf2020 is over, thanks for joining! | Dedicated channel for EmacsConf organizers and speakers | this is intended as an internal, low-traffic channel; for main discussion around EmacsConf, please join #emacsconf | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates")))
#+end_src
* Workflows
@@ -106,6 +102,333 @@ STREAM - main organizer, CHECK - secondary organizer or volunteer, PAD - organiz
- Collect e-mail addresses of accepted speakers into a list for easy pasting into Bcc (organizers' private wiki)
- See submissions.org for Org scheduling code; 3 minutes of buffer was okay last time, but more would be better for Q&A; opening remarks time could be trimmed
+**** Code for scheduling
+#+begin_src emacs-lisp :exports code :results none
+(defun conf/get-talk-info ()
+ (let (talk results)
+ (org-map-entries (lambda ()
+ (let ((heading (org-heading-components)))
+ (cond
+ ((and (elt heading 2) (or (null talk)
+ (<= (car heading)
+ (plist-get talk :level)))) ;; has a todo, therefore is a talk
+ (when talk (setq results (cons talk results)))
+ (setq talk (list
+ :type 'talk
+ :title (elt heading 4)
+ :talk-id (org-entry-get (point) "TALK_ID")
+ :status (elt heading 2)
+ :level (car heading)
+ :scheduled (org-entry-get (point) "SCHEDULED")
+ :duration (org-entry-get (point) "DURATION")
+ :time (org-entry-get (point) "MIN_TIME")
+ :speakers (org-entry-get (point) "NAME"))))
+ ((string-match "^ *Talk information *$" (elt heading 4))
+ (plist-put talk :info
+ (org-export-as 'md t nil t)))
+ ((or (null talk) (< (car heading) (plist-get talk :level))) ;; heading above
+ (when talk
+ (setq results (cons talk results))
+ (setq talk nil))
+ (setq results (cons
+ (list :type 'headline
+ :level (car heading)
+ :speakers (org-entry-get (point) "NAME")
+ :duration (org-entry-get (point) "DURATION")
+ :talk-id (org-entry-get (point) "TALK_ID")
+ :title (elt heading 4)
+ :scheduled (org-entry-get (point) "SCHEDULED"))
+ results))))))
+ nil 'tree)
+ (when talk (setq results (cons talk results)))
+ (reverse results)))
+
+(defun conf/filter-talks (list)
+ "Return only talk info in LIST."
+ (seq-filter
+ (lambda (talk) (eq (plist-get talk :type) 'talk))
+ list))
+
+(defun conf/get-talk-info-from-file (&optional filename)
+ (with-temp-buffer
+ (insert-file-contents (or filename "submissions.org"))
+ (org-mode)
+ (org-show-all)
+ (goto-char (point-min))
+ (goto-char (org-find-property "ID" "talks"))
+ (conf/get-talk-info)))
+
+
+(defun conf/find-talk (filter &optional info)
+ (setq info (or info (conf/filter-talks conf/info)))
+ (when (stringp filter) (setq filter (list filter)))
+ (or (seq-find (lambda (o) (string= (plist-get o :talk-id) (car filter))) info)
+ (seq-find (lambda (o)
+ (let ((case-fold-search t)
+ (all (mapconcat (lambda (f) (plist-get o f)) '(:title :speakers :talk-id) " ")))
+ (null (seq-contains-p
+ (mapcar (lambda (condition) (string-match condition all)) filter)
+ nil))))
+ info)))
+
+(defun conf/goto-talk-id (id)
+ (goto-char (org-find-property "TALK_ID" id)))
+
+(defun conf/assign-ids ()
+ "Assign numeric talk IDs."
+ (interactive)
+ (goto-char (point-min))
+ ;; Determine the maximum ID assigned so far
+ (let ((id
+ (1+
+ (apply 'max
+ (or (mapcar
+ 'string-to-number
+ (org-map-entries
+ (lambda ()
+ (let ((org-trust-scanner-tags t))
+ (org-entry-get (point) "TALK_ID"))) "TALK_ID>0" 'file))
+ '(0))))))
+ (goto-char (point-min))
+ (while (re-search-forward "^ *:NAME: " nil t)
+ (unless (org-entry-get (point) "TALK_ID")
+ (org-set-property "TALK_ID" (format "%02d" id))
+ (org-set-property "CUSTOM_ID" (format "talk%02d" id))
+ (setq id (1+ id))))))
+
+(defun conf/update-talks ()
+ "Update times, tables, and schedules."
+ (interactive)
+ (save-excursion
+ (conf/update-times)
+ (conf/update-tables)
+ (conf/update-schedules)))
+
+(defun conf/update-times ()
+ "Check whether we need more time or less time based on TARGET_TIME and MIN_TIME_SUM."
+ (goto-char (point-min))
+ (org-map-entries
+ (lambda ()
+ (when (org-entry-get (point) "TARGET_TIME")
+ (conf/org-sum-min-time-in-subtree)
+ (org-entry-put
+ (point)
+ "DIFFERENCE"
+ (let ((diff
+ (-
+ (string-to-number (org-entry-get (point) "TARGET_TIME"))
+ (string-to-number (org-entry-get (point) "MIN_TIME_SUM")))))
+ (cond
+ ((> diff 0) (format "Extra: %d" diff))
+ ((< diff 0) (format "Needs: %d" (- diff)))
+ (t "")))))) nil 'file))
+
+(defun conf/update-tables ()
+ "Update the time checks and table reports."
+ (goto-char (point-min))
+ (while (re-search-forward "#\\+CALL: check_time()" nil t)
+ (org-ctrl-c-ctrl-c))
+ (goto-char (point-min))
+ (while (re-search-forward "#\\+BEGIN: columnview" nil t)
+ (org-ctrl-c-ctrl-c)))
+
+(defun conf/update-schedules ()
+ "Schedule the talks based on the MIN_TIME and 3 minutes of buffer.
+Talks with a FIXED_TIME property are not moved."
+ (interactive)
+ (goto-char (org-find-exact-headline-in-buffer "Talks"))
+ (let (current-time scheduled end-time duration (buffer (seconds-to-time (* conf/buffer-minutes 60)))) ;; assumption: 3 minutes between talks
+ (org-map-entries (lambda ()
+ (if (org-entry-get (point) "FIXED_TIME")
+ (setq current-time (org-get-scheduled-time (point))))
+ (when (org-entry-get (point) "MIN_TIME")
+ (setq duration (* (string-to-number (org-entry-get (point) "MIN_TIME")) 60)
+ end-time (time-add current-time (seconds-to-time duration)))
+ (org-set-property "SCHEDULED" (format "%s-%s" (org-format-time-string "%Y-%m-%d %H:%M" current-time)
+ (org-format-time-string "%H:%M" end-time)))
+ (setq current-time (time-add end-time buffer))))
+ nil 'tree)))
+
+(defun conf/org-sum-min-time-in-subtree ()
+ "Add up all the MIN_TIME properties of headings underneath the current one
+The total is written to the MIN_TIME_SUM property of this heading"
+ (interactive)
+ (org-entry-put
+ (point)
+ "MIN_TIME_SUM"
+ (save-excursion
+ (format "%d"
+ (apply
+ '+
+ (mapcar 'string-to-number
+ (delq nil
+ (org-map-entries
+ (lambda () (org-entry-get (point) "MIN_TIME")) nil 'tree))))))))
+
+#+end_src
+
+**** Generate schedule file
+
+ #+begin_src emacs-lisp :results none :eval yes :exports code :tangle "conf.el"
+ (defun conf/format-talk-link (talk)
+ (and talk (if (plist-get talk :talk-id)
+ (format "<a href=\"/2020/talks/%s\">%s</a>"
+ (plist-get talk :talk-id)
+ (plist-get talk :title))
+ (plist-get talk :title))))
+
+ (defun conf/format-talk-info-as-schedule (info)
+ (format "<table width=\"100%%\">%s</table>"
+ (mapconcat
+ (lambda (o)
+ (let* ((time-fmt "%l:%M %p")
+ (timestamp (org-timestamp-from-string (plist-get o :scheduled)))
+ (start (if timestamp (format-time-string time-fmt (org-timestamp-to-time (org-timestamp-split-range timestamp))) ""))
+ (end (if timestamp (format-time-string time-fmt (org-timestamp-to-time (org-timestamp-split-range timestamp t))) ""))
+ (title (plist-get o :title))
+ (speakers (plist-get o :speakers)))
+ (if (eq (plist-get o :type) 'headline)
+ (format "<tr><td colspan=\"4\"><strong>%s<strong></td></tr>"
+ (if (plist-get o :talk-id)
+ (conf/format-talk-link o)
+ title))
+ (format "<tr><td width=100>~%s</td><td width=100>~%s</td><td>%s</td><td>%s</td></tr>"
+ start end (conf/format-talk-link o) speakers))))
+ (cdr info) "\n")))
+
+ (defun conf/filter-talks (info)
+ (seq-filter (lambda (o) (plist-get o :talk-id)) info))
+
+ (defun conf/split-out-talk-information ()
+ (interactive)
+ (let ((talks (conf/filter-talks conf/info)))
+ (mapc (lambda (o)
+ (with-temp-buffer
+ (insert
+ (format "# %s\n%s\n\n%s"
+ (plist-get o :title)
+ (plist-get o :speakers)
+ (plist-get o :info)))
+ (write-file (expand-file-name (format "%s.md" (plist-get o :talk-id)) "info"))))
+ talks)))
+
+ (defun conf/format-talk-pages (info)
+ (let* ((talks (conf/filter-talks info))
+ (next-talks (cdr talks))
+ (prev-talks (cons nil talks)))
+ (mapc (lambda (o)
+ (with-temp-buffer
+ (let* ((timestamp (org-timestamp-from-string (plist-get o :scheduled)))
+ (next-talk (conf/format-talk-link (pop next-talks)))
+ (prev-talk (conf/format-talk-link (pop prev-talks)))
+ (schedule (mapconcat
+ (lambda (tz)
+ (format "%s - %s"
+ (format-time-string "%A, %b %e %Y, ~%l:%M %p"
+ (org-timestamp-to-time (org-timestamp-split-range timestamp)) tz)
+ (format-time-string "%l:%M %p %Z"
+ (org-timestamp-to-time (org-timestamp-split-range timestamp t)) tz)))
+ conf/timezones
+ " \n"))
+ (nav-links (format "Back to the [[schedule]] \n%s%s"
+ (if prev-talk (format "Previous: %s \n" prev-talk) "")
+ (if next-talk (format "Next: %s \n" next-talk) ""))))
+ (insert (format "[[%s title=\"%s\"]]
+ [[%s copyright=\"Copyright &copy; 2020 %s\"]]
+
+ <!-- To edit the talk information, change /2020/info/TALKID.md. Boilerplate automatically generated from submissions.org using conf/generate-schedule-files --->\n
+
+ %s
+
+ [[!inline pages=\"internal(2020/info/%s)\" raw=\"yes\"]]
+
+ %s
+
+ %s
+
+ "
+ "!meta"
+ (replace-regexp-in-string "\"" "\\\\\"" (plist-get o :title))
+ "!meta"
+ (plist-get o :speakers)
+ nav-links
+ (plist-get o :talk-id)
+ schedule
+ nav-links)))
+ (write-file (format "talks/%s.md" (plist-get o :talk-id)))))
+ talks)))
+
+ (defun conf/generate-pad-template ()
+ (interactive)
+ (let ((talks (conf/filter-talks conf/info)))
+ (with-current-buffer (find-file "pad-template.md")
+ (erase-buffer)
+ (insert
+ (concat
+ "Conference info, how to watch/participate: <https://emacsconf.org/2020/>
+ Code of conduct: <https://emacsconf.org/conduct/>
+
+ "
+ (mapconcat
+ (lambda (o)
+ (format "**%s**
+ Speaker(s): %s
+ Talk page: <https://emacsconf.org/2020/schedule/%s>
+
+ ,*Questions:*
+
+ ,* Put your questions here, most recent on top
+ ,* sample text
+
+ ,*Links:*
+
+ ,* sample text
+ ,* sample text
+
+ ,*Other notes:*
+
+ ,* sample text
+ ,* sample text
+ <br>
+ <br>
+ " (plist-get o :title) (plist-get o :speakers) (plist-get o :talk-id))) talks " \n \n")))
+ (save-buffer))))
+
+ (defun conf/generate-talks-page ()
+ (let ((info conf/info))
+ (with-temp-buffer
+ (find-file "talk-details.md")
+ (erase-buffer)
+ (insert (format "<table><thead><th>Duration</th><th>Title</th><th>Speakers</th></thead><tbody>%s</tbody></table>"
+ (mapconcat
+ (lambda (o)
+ (let* ((title (plist-get o :title))
+ (speakers (plist-get o :speakers)))
+ (if (null (plist-get o :talk-id))
+ (format "<tr><td colspan=\"3\">%s</td></tr>" (conf/format-talk-link o))
+ (format "<tr><td>%s</td><td>%s</td><td>%s</td><tr>"
+ (plist-get o :duration)
+ (conf/format-talk-link o)
+ (plist-get o :speakers)))))
+ info "\n")))
+ (save-buffer))))
+
+ (defun conf/generate-schedule-files (&optional filename)
+ (interactive)
+ (with-temp-buffer
+ (insert (conf/format-talk-info-as-schedule conf/info))
+ (write-file "schedule-details.md"))
+ (when conf/autogenerate-talk-pages (conf/format-talk-pages conf/info)))
+ #+end_src
+
+Set the info based on submissions.org.
+
+#+begin_src emacs-lisp
+(setq conf/info (conf/get-talk-info-from-file "submissions.org"))
+#+end_src
+
+ #+RESULTS:
+
*** Before the conference
- Do tech checks and get alternative ways to contact speakers (phone number? IRC nick? Something that goes ding?)
@@ -219,20 +542,7 @@ STREAM - main organizer, CHECK - secondary organizer or volunteer, PAD - organiz
***** Load data
#+begin_src emacs-lisp :results silent
- (defvar conf/collaborative-pad "https://etherpad.wikimedia.org/p/emacsconf-2020" "URL of collaborative pad.")
- (defvar conf/topic-templates nil "List of (channel topic-template) entries for mass-setting channel topics.")
- (defvar conf/streaming-nick "bandali" "IRC nick of main organizer in charge of streaming.")
- "List of (code join-url) entries, one for each meeting room.") ;; Set this in a private file
- (defvar conf/channels nil "List of IRC channels for broadcasts.")
- (defvar conf/info nil "List of plists with the following keys: `:talk-id', `:name', `:speakers', and other info.") ; Set from submissions.org
- (setq conf/topic-templates
- '(("#emacsconf" "EmacsConf 2020 is over, thanks for joining! | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates")
- ("#emacsconf-accessible" "EmacsConf 2020 is over. Thanks for making it more accessible! | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates")
- ("#emacsconf-org" "EmacsConf2020 is over, thanks for joining! | Dedicated channel for EmacsConf organizers and speakers | this is intended as an internal, low-traffic channel; for main discussion around EmacsConf, please join #emacsconf | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates")))
- (defvar conf/rooms '(("A" "http://example.org?room=a")
- ("B" "http://example.org?room=b")
- ("C" "http://example.org?room=c"))
- "List of (code join-url) entries. Room codes should be uppercase.") ; set from organizers' wiki index.org
+ (defvar conf/info nil "List of plists with the following keys: `:talk-id', `:name', `:speakers', and other info.") ; Set from submissions.org
#+end_src
***** Announce topics
@@ -299,7 +609,7 @@ STREAM - main organizer, CHECK - secondary organizer or volunteer, PAD - organiz
(defun erc-cmd-BROADCAST (&rest message)
"Say MESSAGE in all the conference channels."
- (conf/erc-with-channels conf/channels
+ (conf/erc-with-channels (mapcar 'car conf/topic-templates)
(erc-send-message (s-join " " message))))
#+end_src
@@ -399,7 +709,7 @@ Another collaborative pad
Usage: compress-video.sh input-filename.webm output-filename.webm
- #+begin_src sh :tangle compress-video.sh
+ #+begin_src sh :eval no :tangle compress-video.sh
Q=56
nice ffmpeg -y -i $1 -c:v libvpx-vp9 -b:v 0 -crf $Q -aq-mode 2 -an -tile-columns 0 -tile-rows 0 -frame-parallel 0 -cpu-used 8 -auto-alt-ref 1 -lag-in-frames 25 -g 999 -pass 1 -f webm -threads 8 /dev/null &&
nice ffmpeg -y -i $1 -c:v libvpx-vp9 -b:v 0 -crf $Q -c:a copy -tile-columns 2 -tile-rows 2 -frame-parallel 0 -cpu-used -5 -auto-alt-ref 1 -lag-in-frames 25 -pass 2 -g 999 -threads 8 $2
@@ -407,7 +717,7 @@ Another collaborative pad
Here's the original version which compresses audio too. Usage: compress-video-compressed-audio.sh input-filename.webm output-filename.webm
- #+begin_src sh :tangle compress-video-compressed-audio.sh
+ #+begin_src sh :eval no :tangle compress-video-compressed-audio.sh
Q=56
nice ffmpeg -y -i $1 -c:v libvpx-vp9 -b:v 0 -crf $Q -aq-mode 2 -an -tile-columns 0 -tile-rows 0 -frame-parallel 0 -cpu-used 8 -auto-alt-ref 1 -lag-in-frames 25 -g 999 -pass 1 -f webm -threads 8 /dev/null &&
nice ffmpeg -y -i $1 -c:v libvpx-vp9 -b:v 0 -crf $Q -aq-mode 2 -c:a libopus -b:a 12k -tile-columns 2 -tile-rows 2 -frame-parallel 0 -cpu-used -5 -auto-alt-ref 1 -lag-in-frames 25 -pass 2 -g 999 -threads 8 $2
@@ -463,6 +773,23 @@ Take advantage of provided scripts or autogenerated files
ssh front 'sudo -iu ikiwiki ikiwiki --setup ~ikiwiki/emacsconf.setup'
#+end_src
+
+** COMMENT Copyright & License
+
+ Copyright (C) 2020 Sacha Chua
+
+ The EmacsConf 2020 organizers' notebook is part of the EmacsConf
+ wiki, and is dual-licensed under the terms of the Creative Commons
+ Attribution-ShareAlike 4.0 International Public License; and 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.
+
+ A copy of these two licenses is available on the EmacsConf wiki, in
+ the [[https://emacsconf.org/COPYING.CC-BY-SA][COPYING.CC-BY-SA]] and [[https://emacsconf.org/COPYING.GPL][COPYING.GPL]] files.
+
+** COMMENT Local variables
+
# Local Variables:
# org-indent-mode: t
# org-indent-indentation-per-level: 2
diff --git a/2020/submissions.md b/2020/submissions.md
index 21d09dfb..64b197ab 100644
--- a/2020/submissions.md
+++ b/2020/submissions.md
@@ -7,50 +7,53 @@ You can check out the Org Mode source for this page by following the [editing in
# Table of Contents
-- [Actions](#org7d8cc77)
-- [Tables](#orgc89dd54)
- - [Overall](#orgf9d7f69)
- - [By slot](#org33f7445)
- - [Saturday](#org2518c70)
- - [Sunday](#org45ee756)
- - [Table for all talks](#org7e5fd50)
-- [Talks](#orgd54b98f)
- - [NOVEMBER 28 (Saturday)](#org68ef6fa):sat:
- - [9:00 - 9:30 Opening remarks](#org6a91418)
- - [9:30 - 12:00 User talks](#org7f8e774):morning:
- - [12:00 - 13:00 Lunch](#org49ea1ed)
- - [13:00 - 16:30 Afternoon talks](#orga750a7a):afternoon:
- - [16:30 - 17:00 Closing remarks](#org56c93c0)
- - [NOVEMBER 29 (Sunday)](#orgea7cab9):sun:
- - [9:00 - 9:10 Opening remarks](#orgaa9ea5c)
- - [9:10 - 12:00 Morning talks](#org5bba0d4):morning:
- - [12:00 - 13:00 Lunch](#orgaaf69b1)
- - [13:00 - 16:30 Afternoon talks](#org405c07d):afternoon:
- - [16:30 - 17:00 Closing remarks](#orgbfc2b3a)
-- [Code](#talk37)
- - [Planning](#org70194b9)
- - [Generate schedule file](#orgb231870)
-
-
-<a id="org7d8cc77"></a>
+- [Actions](#org7281502)
+- [Tables](#org105055b)
+ - [Overall](#org5df6237)
+ - [By slot](#orge5ba5a0)
+ - [Saturday](#org1146dd9)
+ - [Sunday](#org052126b)
+ - [Table for all talks](#orge6d10a7)
+- [Talks](#orgd992caf)
+ - [NOVEMBER 28 (Saturday)](#org8b4b196):sat:
+ - [Day 1 opening remarks](#talk00)
+ - [9:30 - 12:00 User talks](#org3062065):morning:
+ - [12:00 - 13:00 Lunch](#orgbaf7821)
+ - [13:00 - 16:30 Afternoon talks](#org02ab8bc):afternoon:
+ - [Day 1 closing remarks](#talk40)
+ - [NOVEMBER 29 (Sunday)](#orgf96e9db):sun:
+ - [Day 2 opening remarks](#talk41)
+ - [9:10 - 12:00 Morning talks](#org634a83e):morning:
+ - [12:00 - 13:00 Lunch](#orgf86a59e)
+ - [13:00 - 16:30 Afternoon talks](#org048b0d0):afternoon:
+ - [Day 2 closing remarks](#talk42)
+- [Code](#orgd51f6e5)
+ - [Planning](#org6a3d245)
+ - [Yasnippet for adding video links to the individual talk page](#org3516f2d)
+
+
+<a id="org7281502"></a>
# Actions
-- [Execute buffer]((org-babel-execute-buffer)) - start with this to get the function definitions
+You may want to `(setq org-confirm-babel-evaluate nil)`.
+
+- [Load code from organizers-notebook.org]((org-babel-load-file "organizers-notebook.org")) - run this to load function definitions or reset conf/info if the talk info changes
- [Update talk info]((conf/update-talks)) - run this after changing talk time or order
-- [View as agenda]((let ((org-agenda-files (list (buffer-file-name)))) (org-agenda-list nil (org-read-date nil nil "2020-11-28") 2)))
-- [Generate schedule files](conf/generate-schedule-files)
+- [View as agenda]((let ((org-agenda-skip-function (lambda () (unless (elt (org-heading-components) 2) (org-entry-end-position)))) (org-agenda-files (list (buffer-file-name)))) (org-agenda-list nil (org-read-date nil nil "2020-11-28") 2)))
+- [Generate schedule files](conf/generate-schedule-files) - updates schedule-details.md; set conf/autogenerate-talk-pages to t if you want to overwrite individual talk pages too.
+- [Export this file to Markdown]((org-md-export-to-markdown))
To update the information included in the individual talk page,
execute the buffer, update the talk's info/TALKID.md file.
-<a id="orgc89dd54"></a>
+<a id="org105055b"></a>
# Tables
-<a id="orgf9d7f69"></a>
+<a id="org5df6237"></a>
## Overall
@@ -69,17 +72,17 @@ execute the buffer, update the talk's info/TALKID.md file.
<thead>
<tr>
<th scope="col" class="org-left">DIFFERENCE</th>
-<th scope="col" class="org-right">TARGET_TIME</th>
-<th scope="col" class="org-right">MIN_TIME_SUM</th>
+<th scope="col" class="org-right">TARGET\_TIME</th>
+<th scope="col" class="org-right">MIN\_TIME\_SUM</th>
<th scope="col" class="org-left">ITEM</th>
</tr>
</thead>
<tbody>
<tr>
-<td class="org-left">Needs: 99</td>
+<td class="org-left">Needs: 112</td>
<td class="org-right">768</td>
-<td class="org-right">867</td>
+<td class="org-right">880</td>
<td class="org-left">Talks</td>
</tr>
@@ -96,7 +99,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<td class="org-left">&#xa0;</td>
<td class="org-right">&#xa0;</td>
<td class="org-right">&#xa0;</td>
-<td class="org-left">9:00 - 9:30 Opening remarks</td>
+<td class="org-left">Day 1 opening remarks</td>
</tr>
@@ -128,7 +131,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<td class="org-left">&#xa0;</td>
<td class="org-right">&#xa0;</td>
<td class="org-right">&#xa0;</td>
-<td class="org-left">16:30 - 17:00 Closing remarks</td>
+<td class="org-left">Day 1 closing remarks</td>
</tr>
@@ -144,7 +147,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<td class="org-left">&#xa0;</td>
<td class="org-right">&#xa0;</td>
<td class="org-right">&#xa0;</td>
-<td class="org-left">9:00 - 9:10 Opening remarks</td>
+<td class="org-left">Day 2 opening remarks</td>
</tr>
@@ -165,9 +168,9 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left">Needs: 12</td>
+<td class="org-left">Needs: 25</td>
<td class="org-right">168</td>
-<td class="org-right">180</td>
+<td class="org-right">193</td>
<td class="org-left">13:00 - 16:30 Afternoon talks</td>
</tr>
@@ -176,18 +179,18 @@ execute the buffer, update the talk's info/TALKID.md file.
<td class="org-left">&#xa0;</td>
<td class="org-right">&#xa0;</td>
<td class="org-right">&#xa0;</td>
-<td class="org-left">16:30 - 17:00 Closing remarks</td>
+<td class="org-left">Day 2 closing remarks</td>
</tr>
</tbody>
</table>
-<a id="org33f7445"></a>
+<a id="orge5ba5a0"></a>
## By slot
-<a id="org2518c70"></a>
+<a id="org1146dd9"></a>
### Saturday
@@ -219,17 +222,17 @@ execute the buffer, update the talk's info/TALKID.md file.
<tbody>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 09:33]&#x2013;[2020-11-28 Sat 09:43]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 09:33&gt;&#x2013;&lt;2020-11-28 Sat 09:37&gt;</span></span></td>
<td class="org-left">Emacs News Highlights</td>
<td class="org-left">Sacha Chua</td>
- <td class="org-left">planned</td>
+ <td class="org-left">ready</td>
<td class="org-left">prerec, maybe 9am-3pm EST</td>
</tr>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 09:46]&#x2013;[2020-11-28 Sat 10:06]</span></span></td>
- <td class="org-left">An Emacs Developer Story: From User to Maintainer</td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 09:40&gt;&#x2013;&lt;2020-11-28 Sat 10:00&gt;</span></span></td>
+ <td class="org-left">An Emacs Developer Story: From User to Package Maintainer</td>
<td class="org-left">Leo Vivier</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">9am-12pm EST</td>
@@ -237,16 +240,16 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:09]&#x2013;[2020-11-28 Sat 10:19]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 10:03&gt;&#x2013;&lt;2020-11-28 Sat 10:13&gt;</span></span></td>
<td class="org-left">Idea to Novel Superstructure: Emacs for Writing</td>
<td class="org-left">Bala Ramadurai</td>
- <td class="org-left">&#xa0;</td>
+ <td class="org-left">done, live Q&A</td>
<td class="org-left">8:30am EST-12pm EST</td>
</tr>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:22]&#x2013;[2020-11-28 Sat 10:32]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 10:16&gt;&#x2013;&lt;2020-11-28 Sat 10:26&gt;</span></span></td>
<td class="org-left">Music in Plain Text</td>
<td class="org-left">Jonathan Gregory</td>
<td class="org-left">planned</td>
@@ -255,7 +258,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:35]&#x2013;[2020-11-28 Sat 10:45]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 10:29&gt;&#x2013;&lt;2020-11-28 Sat 10:45&gt;</span></span></td>
<td class="org-left">Bard Bivou(m)acs - Building a bandcamp-like page for an album of music</td>
<td class="org-left">Grant Shangreaux</td>
<td class="org-left">&#xa0;</td>
@@ -264,36 +267,36 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:48]&#x2013;[2020-11-28 Sat 10:58]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 10:48&gt;&#x2013;&lt;2020-11-28 Sat 10:58&gt;</span></span></td>
<td class="org-left">Trivial Emacs Kits</td>
- <td class="org-left">Corwin Brust</td>
+ <td class="org-left">Corwin Brust (mplsCorwin)</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">ok</td>
</tr>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:01]&#x2013;[2020-11-28 Sat 11:21]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 11:01&gt;&#x2013;&lt;2020-11-28 Sat 11:21&gt;</span></span></td>
<td class="org-left">Beyond Vim and Emacs: A Scalable UI Paradigm</td>
- <td class="org-left">Sid Kasivajhula</td>
+ <td class="org-left">Sid Kasivajhula (countvajhula)</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">PST, so maybe 11 AM EST - 5 PM EST?</td>
</tr>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:24]&#x2013;[2020-11-28 Sat 11:44]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 11:24&gt;&#x2013;&lt;2020-11-28 Sat 11:44&gt;</span></span></td>
<td class="org-left">Building reproducible Emacs</td>
- <td class="org-left">Andrew Tropin</td>
+ <td class="org-left">Andrew Tropin (abcdw)</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">After 4pm UTC - 11am-5pm EST</td>
</tr>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:47]&#x2013;[2020-11-28 Sat 12:27]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 11:47&gt;&#x2013;&lt;2020-11-28 Sat 12:27&gt;</span></span></td>
<td class="org-left">On why most of the best features in eev look like 5-minute hacks</td>
- <td class="org-left">Eduardo Ochs</td>
+ <td class="org-left">Eduardo Ochs (edrx)</td>
<td class="org-left">planned</td>
<td class="org-left">ok</td>
</tr>
@@ -328,7 +331,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tbody>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:03]&#x2013;[2020-11-28 Sat 13:13]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 13:03&gt;&#x2013;&lt;2020-11-28 Sat 13:13&gt;</span></span></td>
<td class="org-left">Orgmode - your life in plain text</td>
<td class="org-left">Rainer König</td>
<td class="org-left">&#xa0;</td>
@@ -337,7 +340,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:16]&#x2013;[2020-11-28 Sat 13:26]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 13:16&gt;&#x2013;&lt;2020-11-28 Sat 13:26&gt;</span></span></td>
<td class="org-left">Lead your future with Org</td>
<td class="org-left">Andrea</td>
<td class="org-left">&#xa0;</td>
@@ -346,7 +349,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:29]&#x2013;[2020-11-28 Sat 13:49]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 13:29&gt;&#x2013;&lt;2020-11-28 Sat 13:49&gt;</span></span></td>
<td class="org-left">the org-gtd package: opinions about Getting Things Done</td>
<td class="org-left">Aldric</td>
<td class="org-left">&#xa0;</td>
@@ -355,7 +358,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:52]&#x2013;[2020-11-28 Sat 14:02]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 13:52&gt;&#x2013;&lt;2020-11-28 Sat 14:02&gt;</span></span></td>
<td class="org-left">One Big-ass Org File or multiple tiny ones? Finally, the End of the debate!</td>
<td class="org-left">Leo Vivier</td>
<td class="org-left">&#xa0;</td>
@@ -364,7 +367,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:05]&#x2013;[2020-11-28 Sat 14:15]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 14:05&gt;&#x2013;&lt;2020-11-28 Sat 14:15&gt;</span></span></td>
<td class="org-left">Experience Report: Steps to "Emacs Hyper Notebooks"</td>
<td class="org-left">Joseph Corneli, Raymond Puzio, and Cameron Ray Smith</td>
<td class="org-left">&#xa0;</td>
@@ -373,16 +376,16 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:18]&#x2013;[2020-11-28 Sat 14:38]</span></span></td>
- <td class="org-left">Literate Programming in Emacs Org-Mode</td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 14:18&gt;&#x2013;&lt;2020-11-28 Sat 14:38&gt;</span></span></td>
+ <td class="org-left">README-Driven Design</td>
<td class="org-left">Adam Ard</td>
- <td class="org-left">planned</td>
+ <td class="org-left">done</td>
<td class="org-left">ok</td>
</tr>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:41]&#x2013;[2020-11-28 Sat 14:51]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 14:41&gt;&#x2013;&lt;2020-11-28 Sat 14:51&gt;</span></span></td>
<td class="org-left">Moving from Jekyll to OrgMode, an experience report</td>
<td class="org-left">Adolfo Villafiorita</td>
<td class="org-left">&#xa0;</td>
@@ -391,7 +394,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:54]&#x2013;[2020-11-28 Sat 15:14]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 14:54&gt;&#x2013;&lt;2020-11-28 Sat 15:14&gt;</span></span></td>
<td class="org-left">Org-roam: Presentation, Demonstration, and What's on the Horizon</td>
<td class="org-left">Leo Vivier</td>
<td class="org-left">&#xa0;</td>
@@ -400,7 +403,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 15:17]&#x2013;[2020-11-28 Sat 15:37]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 15:17&gt;&#x2013;&lt;2020-11-28 Sat 15:37&gt;</span></span></td>
<td class="org-left">Org-mode and Org-Roam for Scholars and Researchers</td>
<td class="org-left">Noorah Alhasan</td>
<td class="org-left">&#xa0;</td>
@@ -409,7 +412,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 15:40]&#x2013;[2020-11-28 Sat 16:00]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 15:40&gt;&#x2013;&lt;2020-11-28 Sat 16:00&gt;</span></span></td>
<td class="org-left">Org-roam: Technical Presentation</td>
<td class="org-left">Leo Vivier</td>
<td class="org-left">&#xa0;</td>
@@ -418,7 +421,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 16:03]&#x2013;[2020-11-28 Sat 16:13]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 16:03&gt;&#x2013;&lt;2020-11-28 Sat 16:13&gt;</span></span></td>
<td class="org-left">Sharing blogs (and more) with org-webring</td>
<td class="org-left">Brett Gilio</td>
<td class="org-left">&#xa0;</td>
@@ -427,9 +430,9 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 16:16]&#x2013;[2020-11-28 Sat 16:36]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 16:16&gt;&#x2013;&lt;2020-11-28 Sat 16:36&gt;</span></span></td>
<td class="org-left">OMG Macros</td>
- <td class="org-left">Corwin Brust</td>
+ <td class="org-left">Corwin Brust (mplsCorwin)</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">ok</td>
</tr>
@@ -437,7 +440,7 @@ execute the buffer, update the talk's info/TALKID.md file.
</table>
-<a id="org45ee756"></a>
+<a id="org052126b"></a>
### Sunday
@@ -469,16 +472,16 @@ execute the buffer, update the talk's info/TALKID.md file.
<tbody>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:13]&#x2013;[2020-11-29 Sun 09:30]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 09:13&gt;&#x2013;&lt;2020-11-29 Sun 09:30&gt;</span></span></td>
<td class="org-left">Emacs development update</td>
<td class="org-left">John Wiegley</td>
- <td class="org-left">planned</td>
+ <td class="org-left">done</td>
<td class="org-left">prerec</td>
</tr>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:33]&#x2013;[2020-11-29 Sun 09:53]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 09:33&gt;&#x2013;&lt;2020-11-29 Sun 09:53&gt;</span></span></td>
<td class="org-left">Powering-up Special Blocks</td>
<td class="org-left">Musa Al-hassy</td>
<td class="org-left">&#xa0;</td>
@@ -487,37 +490,37 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:56]&#x2013;[2020-11-29 Sun 10:46]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 09:56&gt;&#x2013;&lt;2020-11-29 Sun 10:46&gt;</span></span></td>
<td class="org-left">Incremental Parsing with emacs-tree-sitter</td>
<td class="org-left">Tuấn-Anh Nguyễn</td>
- <td class="org-left">planned</td>
+ <td class="org-left">24min</td>
<td class="org-left">GMT+7, so earlier is better (9:30 EST?). Can pre-record and answer questions.</td>
</tr>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 10:49]&#x2013;[2020-11-29 Sun 11:09]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 10:49&gt;&#x2013;&lt;2020-11-29 Sun 11:09&gt;</span></span></td>
<td class="org-left">Analyze code quality through Emacs: a smart forensics approach and the story of a hack</td>
<td class="org-left">Andrea</td>
- <td class="org-left">planned</td>
+ <td class="org-left">done</td>
<td class="org-left">ok</td>
</tr>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 11:12]&#x2013;[2020-11-29 Sun 11:22]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 11:12&gt;&#x2013;&lt;2020-11-29 Sun 11:22&gt;</span></span></td>
<td class="org-left">Traverse complex JSON structures with live feedback</td>
<td class="org-left">Zen Monk Alain M. Lafon</td>
- <td class="org-left">planned</td>
+ <td class="org-left">done</td>
<td class="org-left">Available both days, birthday on the 28th</td>
</tr>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 11:25]&#x2013;[2020-11-29 Sun 11:45]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 11:25&gt;&#x2013;&lt;2020-11-29 Sun 11:45&gt;</span></span></td>
<td class="org-left">NonGNU ELPA</td>
<td class="org-left">Richard Stallman</td>
- <td class="org-left">planned</td>
+ <td class="org-left">done</td>
<td class="org-left">tbd</td>
</tr>
</tbody>
@@ -551,25 +554,25 @@ execute the buffer, update the talk's info/TALKID.md file.
<tbody>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:03]&#x2013;[2020-11-29 Sun 13:13]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 13:03&gt;&#x2013;&lt;2020-11-29 Sun 13:13&gt;</span></span></td>
<td class="org-left">Emacs as a Highschooler: How It Changed My Life</td>
<td class="org-left">Pierce Wang</td>
- <td class="org-left">&#xa0;</td>
+ <td class="org-left">done</td>
<td class="org-left">Sun 12pm EST onwards</td>
</tr>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:16]&#x2013;[2020-11-29 Sun 13:26]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 13:16&gt;&#x2013;&lt;2020-11-29 Sun 13:26&gt;</span></span></td>
<td class="org-left">State of Retro Gaming in Emacs</td>
<td class="org-left">Vasilij "wasamasa" Schneidermann</td>
- <td class="org-left">&#xa0;</td>
+ <td class="org-left">done</td>
<td class="org-left">8am-10pm CET, so 9am-3pm EST</td>
</tr>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:29]&#x2013;[2020-11-29 Sun 14:19]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 13:29&gt;&#x2013;&lt;2020-11-29 Sun 14:19&gt;</span></span></td>
<td class="org-left">Welcome To The Dungeon</td>
<td class="org-left">Erik Elmshauser and Corwin Brust</td>
<td class="org-left">&#xa0;</td>
@@ -578,34 +581,34 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:22]&#x2013;[2020-11-29 Sun 14:42]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 14:22&gt;&#x2013;&lt;2020-11-29 Sun 14:42&gt;</span></span></td>
<td class="org-left">Pathing of Least Resistance</td>
- <td class="org-left">Corwin Brust</td>
+ <td class="org-left">Erik Elmshauser and Corwin Brust (mplsCorwin)</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">ok</td>
</tr>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:45]&#x2013;[2020-11-29 Sun 14:55]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 14:45&gt;&#x2013;&lt;2020-11-29 Sun 14:55&gt;</span></span></td>
<td class="org-left">A tour of vterm</td>
<td class="org-left">Gabriele Bozzola (@sbozzolo)</td>
- <td class="org-left">planned</td>
+ <td class="org-left">done</td>
<td class="org-left">MST, so 11am-5pm EST</td>
</tr>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:58]&#x2013;[2020-11-29 Sun 15:08]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 14:58&gt;&#x2013;&lt;2020-11-29 Sun 15:14&gt;</span></span></td>
<td class="org-left">Lakota Language and Emacs</td>
<td class="org-left">Grant Shangreaux</td>
- <td class="org-left">planned</td>
+ <td class="org-left">done</td>
<td class="org-left">Central time, 10am EST-5pm EST</td>
</tr>
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:11]&#x2013;[2020-11-29 Sun 15:31]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 15:17&gt;&#x2013;&lt;2020-11-29 Sun 15:41&gt;</span></span></td>
<td class="org-left">Object Oriented Code in the Gnus Newsreader</td>
<td class="org-left">Eric Abrahamsen</td>
<td class="org-left">planned</td>
@@ -614,7 +617,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:34]&#x2013;[2020-11-29 Sun 15:54]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 15:44&gt;&#x2013;&lt;2020-11-29 Sun 16:04&gt;</span></span></td>
<td class="org-left">Maxima a computer algebra system in Emacs</td>
<td class="org-left">Fermin MF</td>
<td class="org-left">&#xa0;</td>
@@ -623,7 +626,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:57]&#x2013;[2020-11-29 Sun 16:17]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 16:07&gt;&#x2013;&lt;2020-11-29 Sun 16:30&gt;</span></span></td>
<td class="org-left">Extend Emacs to Modern GUI Applications with EAF</td>
<td class="org-left">Matthew Zeng</td>
<td class="org-left">&#xa0;</td>
@@ -632,17 +635,17 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
- <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 16:20]&#x2013;[2020-11-29 Sun 16:30]</span></span></td>
+ <td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 16:33&gt;&#x2013;&lt;2020-11-29 Sun 16:43&gt;</span></span></td>
<td class="org-left">WAVEing at Repetitive Repetitive Repetitive Music</td>
<td class="org-left">Zachary Kanfer</td>
- <td class="org-left">&#xa0;</td>
+ <td class="org-left">done</td>
<td class="org-left">ok</td>
</tr>
</tbody>
</table>
-<a id="org7e5fd50"></a>
+<a id="orge6d10a7"></a>
## Table for all talks
@@ -669,8 +672,8 @@ execute the buffer, update the talk's info/TALKID.md file.
<tbody>
<tr>
-<td class="org-left">planned</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 09:33]&#x2013;[2020-11-28 Sat 09:43]</span></span></td>
+<td class="org-left">ready</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 09:33&gt;&#x2013;&lt;2020-11-28 Sat 09:37&gt;</span></span></td>
<td class="org-left">Emacs News Highlights</td>
<td class="org-left">Sacha Chua</td>
</tr>
@@ -678,15 +681,15 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 09:46]&#x2013;[2020-11-28 Sat 10:06]</span></span></td>
-<td class="org-left">An Emacs Developer Story: From User to Maintainer</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 09:40&gt;&#x2013;&lt;2020-11-28 Sat 10:00&gt;</span></span></td>
+<td class="org-left">An Emacs Developer Story: From User to Package Maintainer</td>
<td class="org-left">Leo Vivier</td>
</tr>
<tr>
-<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:09]&#x2013;[2020-11-28 Sat 10:19]</span></span></td>
+<td class="org-left">done, live Q&A</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 10:03&gt;&#x2013;&lt;2020-11-28 Sat 10:13&gt;</span></span></td>
<td class="org-left">Idea to Novel Superstructure: Emacs for Writing</td>
<td class="org-left">Bala Ramadurai</td>
</tr>
@@ -694,7 +697,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">planned</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:22]&#x2013;[2020-11-28 Sat 10:32]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 10:16&gt;&#x2013;&lt;2020-11-28 Sat 10:26&gt;</span></span></td>
<td class="org-left">Music in Plain Text</td>
<td class="org-left">Jonathan Gregory</td>
</tr>
@@ -702,7 +705,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:35]&#x2013;[2020-11-28 Sat 10:45]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 10:29&gt;&#x2013;&lt;2020-11-28 Sat 10:45&gt;</span></span></td>
<td class="org-left">Bard Bivou(m)acs - Building a bandcamp-like page for an album of music</td>
<td class="org-left">Grant Shangreaux</td>
</tr>
@@ -710,39 +713,39 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:48]&#x2013;[2020-11-28 Sat 10:58]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 10:48&gt;&#x2013;&lt;2020-11-28 Sat 10:58&gt;</span></span></td>
<td class="org-left">Trivial Emacs Kits</td>
-<td class="org-left">Corwin Brust</td>
+<td class="org-left">Corwin Brust (mplsCorwin)</td>
</tr>
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:01]&#x2013;[2020-11-28 Sat 11:21]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 11:01&gt;&#x2013;&lt;2020-11-28 Sat 11:21&gt;</span></span></td>
<td class="org-left">Beyond Vim and Emacs: A Scalable UI Paradigm</td>
-<td class="org-left">Sid Kasivajhula</td>
+<td class="org-left">Sid Kasivajhula (countvajhula)</td>
</tr>
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:24]&#x2013;[2020-11-28 Sat 11:44]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 11:24&gt;&#x2013;&lt;2020-11-28 Sat 11:44&gt;</span></span></td>
<td class="org-left">Building reproducible Emacs</td>
-<td class="org-left">Andrew Tropin</td>
+<td class="org-left">Andrew Tropin (abcdw)</td>
</tr>
<tr>
<td class="org-left">planned</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:47]&#x2013;[2020-11-28 Sat 12:27]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 11:47&gt;&#x2013;&lt;2020-11-28 Sat 12:27&gt;</span></span></td>
<td class="org-left">On why most of the best features in eev look like 5-minute hacks</td>
-<td class="org-left">Eduardo Ochs</td>
+<td class="org-left">Eduardo Ochs (edrx)</td>
</tr>
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:03]&#x2013;[2020-11-28 Sat 13:13]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 13:03&gt;&#x2013;&lt;2020-11-28 Sat 13:13&gt;</span></span></td>
<td class="org-left">Orgmode - your life in plain text</td>
<td class="org-left">Rainer König</td>
</tr>
@@ -750,7 +753,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:16]&#x2013;[2020-11-28 Sat 13:26]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 13:16&gt;&#x2013;&lt;2020-11-28 Sat 13:26&gt;</span></span></td>
<td class="org-left">Lead your future with Org</td>
<td class="org-left">Andrea</td>
</tr>
@@ -758,7 +761,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:29]&#x2013;[2020-11-28 Sat 13:49]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 13:29&gt;&#x2013;&lt;2020-11-28 Sat 13:49&gt;</span></span></td>
<td class="org-left">the org-gtd package: opinions about Getting Things Done</td>
<td class="org-left">Aldric</td>
</tr>
@@ -766,7 +769,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:52]&#x2013;[2020-11-28 Sat 14:02]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 13:52&gt;&#x2013;&lt;2020-11-28 Sat 14:02&gt;</span></span></td>
<td class="org-left">One Big-ass Org File or multiple tiny ones? Finally, the End of the debate!</td>
<td class="org-left">Leo Vivier</td>
</tr>
@@ -774,23 +777,23 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:05]&#x2013;[2020-11-28 Sat 14:15]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 14:05&gt;&#x2013;&lt;2020-11-28 Sat 14:15&gt;</span></span></td>
<td class="org-left">Experience Report: Steps to "Emacs Hyper Notebooks"</td>
<td class="org-left">Joseph Corneli, Raymond Puzio, and Cameron Ray Smith</td>
</tr>
<tr>
-<td class="org-left">planned</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:18]&#x2013;[2020-11-28 Sat 14:38]</span></span></td>
-<td class="org-left">Literate Programming in Emacs Org-Mode</td>
+<td class="org-left">done</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 14:18&gt;&#x2013;&lt;2020-11-28 Sat 14:38&gt;</span></span></td>
+<td class="org-left">README-Driven Design</td>
<td class="org-left">Adam Ard</td>
</tr>
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:41]&#x2013;[2020-11-28 Sat 14:51]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 14:41&gt;&#x2013;&lt;2020-11-28 Sat 14:51&gt;</span></span></td>
<td class="org-left">Moving from Jekyll to OrgMode, an experience report</td>
<td class="org-left">Adolfo Villafiorita</td>
</tr>
@@ -798,7 +801,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:54]&#x2013;[2020-11-28 Sat 15:14]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 14:54&gt;&#x2013;&lt;2020-11-28 Sat 15:14&gt;</span></span></td>
<td class="org-left">Org-roam: Presentation, Demonstration, and What's on the Horizon</td>
<td class="org-left">Leo Vivier</td>
</tr>
@@ -806,7 +809,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 15:17]&#x2013;[2020-11-28 Sat 15:37]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 15:17&gt;&#x2013;&lt;2020-11-28 Sat 15:37&gt;</span></span></td>
<td class="org-left">Org-mode and Org-Roam for Scholars and Researchers</td>
<td class="org-left">Noorah Alhasan</td>
</tr>
@@ -814,7 +817,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 15:40]&#x2013;[2020-11-28 Sat 16:00]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 15:40&gt;&#x2013;&lt;2020-11-28 Sat 16:00&gt;</span></span></td>
<td class="org-left">Org-roam: Technical Presentation</td>
<td class="org-left">Leo Vivier</td>
</tr>
@@ -822,7 +825,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 16:03]&#x2013;[2020-11-28 Sat 16:13]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 16:03&gt;&#x2013;&lt;2020-11-28 Sat 16:13&gt;</span></span></td>
<td class="org-left">Sharing blogs (and more) with org-webring</td>
<td class="org-left">Brett Gilio</td>
</tr>
@@ -830,15 +833,15 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 16:16]&#x2013;[2020-11-28 Sat 16:36]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 16:16&gt;&#x2013;&lt;2020-11-28 Sat 16:36&gt;</span></span></td>
<td class="org-left">OMG Macros</td>
-<td class="org-left">Corwin Brust</td>
+<td class="org-left">Corwin Brust (mplsCorwin)</td>
</tr>
<tr>
-<td class="org-left">planned</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:13]&#x2013;[2020-11-29 Sun 09:30]</span></span></td>
+<td class="org-left">done</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 09:13&gt;&#x2013;&lt;2020-11-29 Sun 09:30&gt;</span></span></td>
<td class="org-left">Emacs development update</td>
<td class="org-left">John Wiegley</td>
</tr>
@@ -846,55 +849,55 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:33]&#x2013;[2020-11-29 Sun 09:53]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 09:33&gt;&#x2013;&lt;2020-11-29 Sun 09:53&gt;</span></span></td>
<td class="org-left">Powering-up Special Blocks</td>
<td class="org-left">Musa Al-hassy</td>
</tr>
<tr>
-<td class="org-left">planned</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:56]&#x2013;[2020-11-29 Sun 10:46]</span></span></td>
+<td class="org-left">24min</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 09:56&gt;&#x2013;&lt;2020-11-29 Sun 10:46&gt;</span></span></td>
<td class="org-left">Incremental Parsing with emacs-tree-sitter</td>
<td class="org-left">Tuấn-Anh Nguyễn</td>
</tr>
<tr>
-<td class="org-left">planned</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 10:49]&#x2013;[2020-11-29 Sun 11:09]</span></span></td>
+<td class="org-left">done</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 10:49&gt;&#x2013;&lt;2020-11-29 Sun 11:09&gt;</span></span></td>
<td class="org-left">Analyze code quality through Emacs: a smart forensics approach and the story of a hack</td>
<td class="org-left">Andrea</td>
</tr>
<tr>
-<td class="org-left">planned</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 11:12]&#x2013;[2020-11-29 Sun 11:22]</span></span></td>
+<td class="org-left">done</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 11:12&gt;&#x2013;&lt;2020-11-29 Sun 11:22&gt;</span></span></td>
<td class="org-left">Traverse complex JSON structures with live feedback</td>
<td class="org-left">Zen Monk Alain M. Lafon</td>
</tr>
<tr>
-<td class="org-left">planned</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 11:25]&#x2013;[2020-11-29 Sun 11:45]</span></span></td>
+<td class="org-left">done</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 11:25&gt;&#x2013;&lt;2020-11-29 Sun 11:45&gt;</span></span></td>
<td class="org-left">NonGNU ELPA</td>
<td class="org-left">Richard Stallman</td>
</tr>
<tr>
-<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:03]&#x2013;[2020-11-29 Sun 13:13]</span></span></td>
+<td class="org-left">done</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 13:03&gt;&#x2013;&lt;2020-11-29 Sun 13:13&gt;</span></span></td>
<td class="org-left">Emacs as a Highschooler: How It Changed My Life</td>
<td class="org-left">Pierce Wang</td>
</tr>
<tr>
-<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:16]&#x2013;[2020-11-29 Sun 13:26]</span></span></td>
+<td class="org-left">done</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 13:16&gt;&#x2013;&lt;2020-11-29 Sun 13:26&gt;</span></span></td>
<td class="org-left">State of Retro Gaming in Emacs</td>
<td class="org-left">Vasilij "wasamasa" Schneidermann</td>
</tr>
@@ -902,7 +905,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:29]&#x2013;[2020-11-29 Sun 14:19]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 13:29&gt;&#x2013;&lt;2020-11-29 Sun 14:19&gt;</span></span></td>
<td class="org-left">Welcome To The Dungeon</td>
<td class="org-left">Erik Elmshauser and Corwin Brust</td>
</tr>
@@ -910,23 +913,23 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:22]&#x2013;[2020-11-29 Sun 14:42]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 14:22&gt;&#x2013;&lt;2020-11-29 Sun 14:42&gt;</span></span></td>
<td class="org-left">Pathing of Least Resistance</td>
-<td class="org-left">Corwin Brust</td>
+<td class="org-left">Erik Elmshauser and Corwin Brust (mplsCorwin)</td>
</tr>
<tr>
-<td class="org-left">planned</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:45]&#x2013;[2020-11-29 Sun 14:55]</span></span></td>
+<td class="org-left">done</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 14:45&gt;&#x2013;&lt;2020-11-29 Sun 14:55&gt;</span></span></td>
<td class="org-left">A tour of vterm</td>
<td class="org-left">Gabriele Bozzola (@sbozzolo)</td>
</tr>
<tr>
-<td class="org-left">planned</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:58]&#x2013;[2020-11-29 Sun 15:08]</span></span></td>
+<td class="org-left">done</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 14:58&gt;&#x2013;&lt;2020-11-29 Sun 15:14&gt;</span></span></td>
<td class="org-left">Lakota Language and Emacs</td>
<td class="org-left">Grant Shangreaux</td>
</tr>
@@ -934,7 +937,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">planned</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:11]&#x2013;[2020-11-29 Sun 15:31]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 15:17&gt;&#x2013;&lt;2020-11-29 Sun 15:41&gt;</span></span></td>
<td class="org-left">Object Oriented Code in the Gnus Newsreader</td>
<td class="org-left">Eric Abrahamsen</td>
</tr>
@@ -942,7 +945,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:34]&#x2013;[2020-11-29 Sun 15:54]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 15:44&gt;&#x2013;&lt;2020-11-29 Sun 16:04&gt;</span></span></td>
<td class="org-left">Maxima a computer algebra system in Emacs</td>
<td class="org-left">Fermin MF</td>
</tr>
@@ -950,15 +953,15 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:57]&#x2013;[2020-11-29 Sun 16:17]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 16:07&gt;&#x2013;&lt;2020-11-29 Sun 16:30&gt;</span></span></td>
<td class="org-left">Extend Emacs to Modern GUI Applications with EAF</td>
<td class="org-left">Matthew Zeng</td>
</tr>
<tr>
-<td class="org-left">&#xa0;</td>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 16:20]&#x2013;[2020-11-29 Sun 16:30]</span></span></td>
+<td class="org-left">done</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 16:33&gt;&#x2013;&lt;2020-11-29 Sun 16:43&gt;</span></span></td>
<td class="org-left">WAVEing at Repetitive Repetitive Repetitive Music</td>
<td class="org-left">Zachary Kanfer</td>
</tr>
@@ -966,22 +969,22 @@ execute the buffer, update the talk's info/TALKID.md file.
</table>
-<a id="orgd54b98f"></a>
+<a id="orgd992caf"></a>
# Talks
-<a id="org68ef6fa"></a>
+<a id="org8b4b196"></a>
## NOVEMBER 28 (Saturday) :sat:
-<a id="org6a91418"></a>
+<a id="talk00"></a>
-### 9:00 - 9:30 Opening remarks
+### Day 1 opening remarks
-<a id="org7f8e774"></a>
+<a id="org3062065"></a>
### 9:30 - 12:00 User talks :morning:
@@ -1037,17 +1040,17 @@ execute the buffer, update the talk's info/TALKID.md file.
<tbody>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 09:33]&#x2013;[2020-11-28 Sat 09:43]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 09:33&gt;&#x2013;&lt;2020-11-28 Sat 09:37&gt;</span></span></td>
<td class="org-left">Emacs News Highlights</td>
<td class="org-left">Sacha Chua</td>
-<td class="org-left">planned</td>
+<td class="org-left">ready</td>
<td class="org-left">prerec, maybe 9am-3pm EST</td>
</tr>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 09:46]&#x2013;[2020-11-28 Sat 10:06]</span></span></td>
-<td class="org-left">An Emacs Developer Story: From User to Maintainer</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 09:40&gt;&#x2013;&lt;2020-11-28 Sat 10:00&gt;</span></span></td>
+<td class="org-left">An Emacs Developer Story: From User to Package Maintainer</td>
<td class="org-left">Leo Vivier</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">9am-12pm EST</td>
@@ -1055,16 +1058,16 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:09]&#x2013;[2020-11-28 Sat 10:19]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 10:03&gt;&#x2013;&lt;2020-11-28 Sat 10:13&gt;</span></span></td>
<td class="org-left">Idea to Novel Superstructure: Emacs for Writing</td>
<td class="org-left">Bala Ramadurai</td>
-<td class="org-left">&#xa0;</td>
+<td class="org-left">done, live Q&A</td>
<td class="org-left">8:30am EST-12pm EST</td>
</tr>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:22]&#x2013;[2020-11-28 Sat 10:32]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 10:16&gt;&#x2013;&lt;2020-11-28 Sat 10:26&gt;</span></span></td>
<td class="org-left">Music in Plain Text</td>
<td class="org-left">Jonathan Gregory</td>
<td class="org-left">planned</td>
@@ -1073,7 +1076,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:35]&#x2013;[2020-11-28 Sat 10:45]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 10:29&gt;&#x2013;&lt;2020-11-28 Sat 10:45&gt;</span></span></td>
<td class="org-left">Bard Bivou(m)acs - Building a bandcamp-like page for an album of music</td>
<td class="org-left">Grant Shangreaux</td>
<td class="org-left">&#xa0;</td>
@@ -1082,36 +1085,36 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 10:48]&#x2013;[2020-11-28 Sat 10:58]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 10:48&gt;&#x2013;&lt;2020-11-28 Sat 10:58&gt;</span></span></td>
<td class="org-left">Trivial Emacs Kits</td>
-<td class="org-left">Corwin Brust</td>
+<td class="org-left">Corwin Brust (mplsCorwin)</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">ok</td>
</tr>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:01]&#x2013;[2020-11-28 Sat 11:21]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 11:01&gt;&#x2013;&lt;2020-11-28 Sat 11:21&gt;</span></span></td>
<td class="org-left">Beyond Vim and Emacs: A Scalable UI Paradigm</td>
-<td class="org-left">Sid Kasivajhula</td>
+<td class="org-left">Sid Kasivajhula (countvajhula)</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">PST, so maybe 11 AM EST - 5 PM EST?</td>
</tr>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:24]&#x2013;[2020-11-28 Sat 11:44]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 11:24&gt;&#x2013;&lt;2020-11-28 Sat 11:44&gt;</span></span></td>
<td class="org-left">Building reproducible Emacs</td>
-<td class="org-left">Andrew Tropin</td>
+<td class="org-left">Andrew Tropin (abcdw)</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">After 4pm UTC - 11am-5pm EST</td>
</tr>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 11:47]&#x2013;[2020-11-28 Sat 12:27]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 11:47&gt;&#x2013;&lt;2020-11-28 Sat 12:27&gt;</span></span></td>
<td class="org-left">On why most of the best features in eev look like 5-minute hacks</td>
-<td class="org-left">Eduardo Ochs</td>
+<td class="org-left">Eduardo Ochs (edrx)</td>
<td class="org-left">planned</td>
<td class="org-left">ok</td>
</tr>
@@ -1180,7 +1183,7 @@ execute the buffer, update the talk's info/TALKID.md file.
sublicensable to the EmacsConf organizers or that my use of them is
fair use.
- - in-progress An Emacs Developer Story: From User to Maintainer :standard:user:community:
+ - in-progress An Emacs Developer Story: From User to Package Maintainer :standard:user:community:
Name: Leo Vivier
@@ -1243,7 +1246,7 @@ execute the buffer, update the talk's info/TALKID.md file.
- Exploring Emacs's flexibility
- - in-progress Idea to Novel Superstructure: Emacs for Writing :standard:lightning:user:
+ - ready Idea to Novel Superstructure: Emacs for Writing :standard:lightning:user:
Name: Bala Ramadurai
@@ -1718,12 +1721,12 @@ execute the buffer, update the talk's info/TALKID.md file.
fair use.
-<a id="org49ea1ed"></a>
+<a id="orgbaf7821"></a>
### 12:00 - 13:00 Lunch
-<a id="orga750a7a"></a>
+<a id="org02ab8bc"></a>
### 13:00 - 16:30 Afternoon talks :afternoon:
@@ -1779,7 +1782,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tbody>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:03]&#x2013;[2020-11-28 Sat 13:13]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 13:03&gt;&#x2013;&lt;2020-11-28 Sat 13:13&gt;</span></span></td>
<td class="org-left">Orgmode - your life in plain text</td>
<td class="org-left">Rainer König</td>
<td class="org-left">&#xa0;</td>
@@ -1788,7 +1791,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:16]&#x2013;[2020-11-28 Sat 13:26]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 13:16&gt;&#x2013;&lt;2020-11-28 Sat 13:26&gt;</span></span></td>
<td class="org-left">Lead your future with Org</td>
<td class="org-left">Andrea</td>
<td class="org-left">&#xa0;</td>
@@ -1797,7 +1800,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:29]&#x2013;[2020-11-28 Sat 13:49]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 13:29&gt;&#x2013;&lt;2020-11-28 Sat 13:49&gt;</span></span></td>
<td class="org-left">the org-gtd package: opinions about Getting Things Done</td>
<td class="org-left">Aldric</td>
<td class="org-left">&#xa0;</td>
@@ -1806,7 +1809,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 13:52]&#x2013;[2020-11-28 Sat 14:02]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 13:52&gt;&#x2013;&lt;2020-11-28 Sat 14:02&gt;</span></span></td>
<td class="org-left">One Big-ass Org File or multiple tiny ones? Finally, the End of the debate!</td>
<td class="org-left">Leo Vivier</td>
<td class="org-left">&#xa0;</td>
@@ -1815,7 +1818,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:05]&#x2013;[2020-11-28 Sat 14:15]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 14:05&gt;&#x2013;&lt;2020-11-28 Sat 14:15&gt;</span></span></td>
<td class="org-left">Experience Report: Steps to "Emacs Hyper Notebooks"</td>
<td class="org-left">Joseph Corneli, Raymond Puzio, and Cameron Ray Smith</td>
<td class="org-left">&#xa0;</td>
@@ -1824,16 +1827,16 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:18]&#x2013;[2020-11-28 Sat 14:38]</span></span></td>
-<td class="org-left">Literate Programming in Emacs Org-Mode</td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 14:18&gt;&#x2013;&lt;2020-11-28 Sat 14:38&gt;</span></span></td>
+<td class="org-left">README-Driven Design</td>
<td class="org-left">Adam Ard</td>
-<td class="org-left">planned</td>
+<td class="org-left">done</td>
<td class="org-left">ok</td>
</tr>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:41]&#x2013;[2020-11-28 Sat 14:51]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 14:41&gt;&#x2013;&lt;2020-11-28 Sat 14:51&gt;</span></span></td>
<td class="org-left">Moving from Jekyll to OrgMode, an experience report</td>
<td class="org-left">Adolfo Villafiorita</td>
<td class="org-left">&#xa0;</td>
@@ -1842,7 +1845,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 14:54]&#x2013;[2020-11-28 Sat 15:14]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 14:54&gt;&#x2013;&lt;2020-11-28 Sat 15:14&gt;</span></span></td>
<td class="org-left">Org-roam: Presentation, Demonstration, and What's on the Horizon</td>
<td class="org-left">Leo Vivier</td>
<td class="org-left">&#xa0;</td>
@@ -1851,7 +1854,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 15:17]&#x2013;[2020-11-28 Sat 15:37]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 15:17&gt;&#x2013;&lt;2020-11-28 Sat 15:37&gt;</span></span></td>
<td class="org-left">Org-mode and Org-Roam for Scholars and Researchers</td>
<td class="org-left">Noorah Alhasan</td>
<td class="org-left">&#xa0;</td>
@@ -1860,7 +1863,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 15:40]&#x2013;[2020-11-28 Sat 16:00]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 15:40&gt;&#x2013;&lt;2020-11-28 Sat 16:00&gt;</span></span></td>
<td class="org-left">Org-roam: Technical Presentation</td>
<td class="org-left">Leo Vivier</td>
<td class="org-left">&#xa0;</td>
@@ -1869,7 +1872,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 16:03]&#x2013;[2020-11-28 Sat 16:13]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 16:03&gt;&#x2013;&lt;2020-11-28 Sat 16:13&gt;</span></span></td>
<td class="org-left">Sharing blogs (and more) with org-webring</td>
<td class="org-left">Brett Gilio</td>
<td class="org-left">&#xa0;</td>
@@ -1878,9 +1881,9 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-28 Sat 16:16]&#x2013;[2020-11-28 Sat 16:36]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-28 Sat 16:16&gt;&#x2013;&lt;2020-11-28 Sat 16:36&gt;</span></span></td>
<td class="org-left">OMG Macros</td>
-<td class="org-left">Corwin Brust</td>
+<td class="org-left">Corwin Brust (mplsCorwin)</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">ok</td>
</tr>
@@ -2197,7 +2200,7 @@ execute the buffer, update the talk's info/TALKID.md file.
sublicensable to the EmacsConf organizers or that my use of them is
fair use.
-- in-progress README-Driven Design :extended:standard:org:tutorial:
+- ready README-Driven Design :extended:standard:org:tutorial:
Name: Adam Ard
@@ -2623,22 +2626,22 @@ execute the buffer, update the talk's info/TALKID.md file.
fair use.
-<a id="org56c93c0"></a>
+<a id="talk40"></a>
-### 16:30 - 17:00 Closing remarks
+### Day 1 closing remarks
-<a id="orgea7cab9"></a>
+<a id="orgf96e9db"></a>
## NOVEMBER 29 (Sunday) :sun:
-<a id="orgaa9ea5c"></a>
+<a id="talk41"></a>
-### 9:00 - 9:10 Opening remarks
+### Day 2 opening remarks
-<a id="org5bba0d4"></a>
+<a id="org634a83e"></a>
### 9:10 - 12:00 Morning talks :morning:
@@ -2694,16 +2697,16 @@ execute the buffer, update the talk's info/TALKID.md file.
<tbody>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:13]&#x2013;[2020-11-29 Sun 09:30]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 09:13&gt;&#x2013;&lt;2020-11-29 Sun 09:30&gt;</span></span></td>
<td class="org-left">Emacs development update</td>
<td class="org-left">John Wiegley</td>
-<td class="org-left">planned</td>
+<td class="org-left">done</td>
<td class="org-left">prerec</td>
</tr>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:33]&#x2013;[2020-11-29 Sun 09:53]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 09:33&gt;&#x2013;&lt;2020-11-29 Sun 09:53&gt;</span></span></td>
<td class="org-left">Powering-up Special Blocks</td>
<td class="org-left">Musa Al-hassy</td>
<td class="org-left">&#xa0;</td>
@@ -2712,37 +2715,37 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 09:56]&#x2013;[2020-11-29 Sun 10:46]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 09:56&gt;&#x2013;&lt;2020-11-29 Sun 10:46&gt;</span></span></td>
<td class="org-left">Incremental Parsing with emacs-tree-sitter</td>
<td class="org-left">Tuấn-Anh Nguyễn</td>
-<td class="org-left">planned</td>
+<td class="org-left">24min</td>
<td class="org-left">GMT+7, so earlier is better (9:30 EST?). Can pre-record and answer questions.</td>
</tr>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 10:49]&#x2013;[2020-11-29 Sun 11:09]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 10:49&gt;&#x2013;&lt;2020-11-29 Sun 11:09&gt;</span></span></td>
<td class="org-left">Analyze code quality through Emacs: a smart forensics approach and the story of a hack</td>
<td class="org-left">Andrea</td>
-<td class="org-left">planned</td>
+<td class="org-left">done</td>
<td class="org-left">ok</td>
</tr>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 11:12]&#x2013;[2020-11-29 Sun 11:22]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 11:12&gt;&#x2013;&lt;2020-11-29 Sun 11:22&gt;</span></span></td>
<td class="org-left">Traverse complex JSON structures with live feedback</td>
<td class="org-left">Zen Monk Alain M. Lafon</td>
-<td class="org-left">planned</td>
+<td class="org-left">done</td>
<td class="org-left">Available both days, birthday on the 28th</td>
</tr>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 11:25]&#x2013;[2020-11-29 Sun 11:45]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 11:25&gt;&#x2013;&lt;2020-11-29 Sun 11:45&gt;</span></span></td>
<td class="org-left">NonGNU ELPA</td>
<td class="org-left">Richard Stallman</td>
-<td class="org-left">planned</td>
+<td class="org-left">done</td>
<td class="org-left">tbd</td>
</tr>
</tbody>
@@ -2797,9 +2800,7 @@ execute the buffer, update the talk's info/TALKID.md file.
defaults to 2 when not given.
<div class="stutter">
- <p>
Emacs for the win ⌣̈
- </p>
</div>
@@ -2869,6 +2870,8 @@ execute the buffer, update the talk's info/TALKID.md file.
Name: Tuấn-Anh Nguyễn
+ prerec and live Q&A
+
- Preferred format
50 minutes (Extended talk)
@@ -3050,12 +3053,12 @@ execute the buffer, update the talk's info/TALKID.md file.
TBD - plans for a NonGNU ELPA that will be easy to enable and contribute to without signing copyright assignment papers
-<a id="orgaaf69b1"></a>
+<a id="orgf86a59e"></a>
### 12:00 - 13:00 Lunch
-<a id="org405c07d"></a>
+<a id="org048b0d0"></a>
### 13:00 - 16:30 Afternoon talks :afternoon:
@@ -3078,8 +3081,8 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-right">-12</td>
-<td class="org-right">180</td>
+<td class="org-right">-25</td>
+<td class="org-right">193</td>
<td class="org-right">168</td>
</tr>
</tbody>
@@ -3111,25 +3114,25 @@ execute the buffer, update the talk's info/TALKID.md file.
<tbody>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:03]&#x2013;[2020-11-29 Sun 13:13]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 13:03&gt;&#x2013;&lt;2020-11-29 Sun 13:13&gt;</span></span></td>
<td class="org-left">Emacs as a Highschooler: How It Changed My Life</td>
<td class="org-left">Pierce Wang</td>
-<td class="org-left">&#xa0;</td>
+<td class="org-left">done</td>
<td class="org-left">Sun 12pm EST onwards</td>
</tr>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:16]&#x2013;[2020-11-29 Sun 13:26]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 13:16&gt;&#x2013;&lt;2020-11-29 Sun 13:26&gt;</span></span></td>
<td class="org-left">State of Retro Gaming in Emacs</td>
<td class="org-left">Vasilij "wasamasa" Schneidermann</td>
-<td class="org-left">&#xa0;</td>
+<td class="org-left">done</td>
<td class="org-left">8am-10pm CET, so 9am-3pm EST</td>
</tr>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 13:29]&#x2013;[2020-11-29 Sun 14:19]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 13:29&gt;&#x2013;&lt;2020-11-29 Sun 14:19&gt;</span></span></td>
<td class="org-left">Welcome To The Dungeon</td>
<td class="org-left">Erik Elmshauser and Corwin Brust</td>
<td class="org-left">&#xa0;</td>
@@ -3138,34 +3141,34 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:22]&#x2013;[2020-11-29 Sun 14:42]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 14:22&gt;&#x2013;&lt;2020-11-29 Sun 14:42&gt;</span></span></td>
<td class="org-left">Pathing of Least Resistance</td>
-<td class="org-left">Corwin Brust</td>
+<td class="org-left">Erik Elmshauser and Corwin Brust (mplsCorwin)</td>
<td class="org-left">&#xa0;</td>
<td class="org-left">ok</td>
</tr>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:45]&#x2013;[2020-11-29 Sun 14:55]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 14:45&gt;&#x2013;&lt;2020-11-29 Sun 14:55&gt;</span></span></td>
<td class="org-left">A tour of vterm</td>
<td class="org-left">Gabriele Bozzola (@sbozzolo)</td>
-<td class="org-left">planned</td>
+<td class="org-left">done</td>
<td class="org-left">MST, so 11am-5pm EST</td>
</tr>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 14:58]&#x2013;[2020-11-29 Sun 15:08]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 14:58&gt;&#x2013;&lt;2020-11-29 Sun 15:14&gt;</span></span></td>
<td class="org-left">Lakota Language and Emacs</td>
<td class="org-left">Grant Shangreaux</td>
-<td class="org-left">planned</td>
+<td class="org-left">done</td>
<td class="org-left">Central time, 10am EST-5pm EST</td>
</tr>
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:11]&#x2013;[2020-11-29 Sun 15:31]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 15:17&gt;&#x2013;&lt;2020-11-29 Sun 15:41&gt;</span></span></td>
<td class="org-left">Object Oriented Code in the Gnus Newsreader</td>
<td class="org-left">Eric Abrahamsen</td>
<td class="org-left">planned</td>
@@ -3174,7 +3177,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:34]&#x2013;[2020-11-29 Sun 15:54]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 15:44&gt;&#x2013;&lt;2020-11-29 Sun 16:04&gt;</span></span></td>
<td class="org-left">Maxima a computer algebra system in Emacs</td>
<td class="org-left">Fermin MF</td>
<td class="org-left">&#xa0;</td>
@@ -3183,7 +3186,7 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 15:57]&#x2013;[2020-11-29 Sun 16:17]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 16:07&gt;&#x2013;&lt;2020-11-29 Sun 16:30&gt;</span></span></td>
<td class="org-left">Extend Emacs to Modern GUI Applications with EAF</td>
<td class="org-left">Matthew Zeng</td>
<td class="org-left">&#xa0;</td>
@@ -3192,10 +3195,10 @@ execute the buffer, update the talk's info/TALKID.md file.
<tr>
-<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">[2020-11-29 Sun 16:20]&#x2013;[2020-11-29 Sun 16:30]</span></span></td>
+<td class="org-left"><span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-29 Sun 16:33&gt;&#x2013;&lt;2020-11-29 Sun 16:43&gt;</span></span></td>
<td class="org-left">WAVEing at Repetitive Repetitive Repetitive Music</td>
<td class="org-left">Zachary Kanfer</td>
-<td class="org-left">&#xa0;</td>
+<td class="org-left">done</td>
<td class="org-left">ok</td>
</tr>
</tbody>
@@ -3389,7 +3392,7 @@ execute the buffer, update the talk's info/TALKID.md file.
- in-progress Pathing of Least Resistance :standard:elisp:
- Name: Corwin Brust
+ Name: Erik Elmshauser and Corwin Brust (mplsCorwin)
- Preferred format
@@ -3819,9 +3822,9 @@ execute the buffer, update the talk's info/TALKID.md file.
fair use.
-<a id="orgbfc2b3a"></a>
+<a id="talk42"></a>
-### 16:30 - 17:00 Closing remarks
+### Day 2 closing remarks
# Withdrawn
@@ -3882,12 +3885,12 @@ sublicensable to the EmacsConf organizers or that my use of them is
fair use.
-<a id="talk37"></a>
+<a id="orgd51f6e5"></a>
# Code
-<a id="org70194b9"></a>
+<a id="org6a3d245"></a>
## Planning
@@ -3902,241 +3905,22 @@ the target time.
(org-entry-get (point) "MIN_TIME_SUM")
(org-entry-get (point) "TARGET_TIME")))
-Some conference-related functions
-
- (defun conf/assign-ids ()
- "Assign numeric talk IDs."
- (interactive)
- (goto-char (point-min))
- ;; Determine the maximum ID assigned so far
- (let ((id
- (1+
- (apply 'max
- (or (mapcar
- 'string-to-number
- (org-map-entries
- (lambda ()
- (let ((org-trust-scanner-tags t))
- (org-entry-get (point) "TALK_ID"))) "TALK_ID>0" 'file))
- '(0))))))
- (goto-char (point-min))
- (while (re-search-forward ":NAME: " nil t)
- (unless (org-entry-get (point) "TALK_ID")
- (org-set-property "TALK_ID" (format "%02d" id))
- (org-set-property "CUSTOM_ID" (format "talk%02d" id))
- (setq id (1+ id))))))
-
- (defun conf/update-talks ()
- (interactive)
- (save-excursion
- (conf/update-times)
- (conf/update-tables)
- (conf/update-schedules)))
-
- (defun conf/update-times ()
- (goto-char (point-min))
- (org-map-entries
- (lambda ()
- (when (org-entry-get (point) "TARGET_TIME")
- (conf/org-sum-min-time-in-subtree)
- (org-entry-put
- (point)
- "DIFFERENCE"
- (let ((diff
- (-
- (string-to-number (org-entry-get (point) "TARGET_TIME"))
- (string-to-number (org-entry-get (point) "MIN_TIME_SUM")))))
- (cond
- ((> diff 0) (format "Extra: %d" diff))
- ((< diff 0) (format "Needs: %d" (- diff)))
- (t "")))))) nil 'file))
- (defun conf/update-tables ()
- (goto-char (point-min))
- (while (re-search-forward "#\\+CALL: check_time()" nil t)
- (org-ctrl-c-ctrl-c))
- (goto-char (point-min))
- (while (re-search-forward "#\\+BEGIN: columnview" nil t)
- (org-ctrl-c-ctrl-c)))
- (defun conf/update-schedules ()
- (interactive)
- (goto-char (org-find-exact-headline-in-buffer "Talks"))
- (let (current-time scheduled end-time duration (buffer (seconds-to-time (* 3 60)))) ;; assumption: 3 minutes between talks
- (org-map-entries (lambda ()
- (if (org-entry-get (point) "FIXED_TIME")
- (setq current-time (org-get-scheduled-time (point))))
- (when (org-entry-get (point) "MIN_TIME")
- (setq duration (* (string-to-number (org-entry-get (point) "MIN_TIME")) 60)
- end-time (time-add current-time (seconds-to-time duration)))
- (org-set-property "SCHEDULED" (format "%s-%s" (org-format-time-string "%Y-%m-%d %H:%M" current-time)
- (org-format-time-string "%H:%M" end-time)))
- (setq current-time (time-add end-time buffer))))
- nil 'tree)))
-
- (defun conf/org-sum-min-time-in-subtree ()
- "Add up all the MIN_TIME properties of headings underneath the current one
- The total is written to the MIN_TIME_SUM property of this heading"
- (interactive)
- (org-entry-put
- (point)
- "MIN_TIME_SUM"
- (save-excursion
- (format "%d"
- (apply
- '+
- (mapcar 'string-to-number
- (delq nil
- (org-map-entries
- (lambda () (org-entry-get (point) "MIN_TIME")) nil 'tree))))))))
-
-
-<a id="orgb231870"></a>
-
-## Generate schedule file
-
- (defvar conf/timezones '("EST" "America/Los_Angeles" "UTC" "CET" "Asia/Singapore") "List of timezones")
-
- (defun conf/get-talk-info ()
- (let (talk results)
- (org-map-entries (lambda ()
- (let ((heading (org-heading-components)))
- (cond
- ((and (elt heading 2) (or (null talk)
- (<= (car heading)
- (plist-get talk :level)))) ;; has a todo, therefore is a talk
- (when talk (setq results (cons talk results)))
- (setq talk (list
- :type 'talk
- :title (elt heading 4)
- :talk-id (org-entry-get (point) "TALK_ID")
- :status (elt heading 2)
- :level (car heading)
- :scheduled (org-entry-get (point) "SCHEDULED")
- :time (org-entry-get (point) "MIN_TIME")
- :speakers (org-entry-get (point) "NAME"))))
- ((string-match "^ *Talk information *$" (elt heading 4))
- (plist-put talk :info
- (org-export-as 'md t nil t)))
- ((or (null talk) (< (car heading) (plist-get talk :level))) ;; heading above
- (when talk
- (setq results (cons talk results))
- (setq talk nil))
- (setq results (cons
- (list :type 'headline
- :level (car heading)
- :title (elt heading 4)
- :scheduled (org-entry-get (point) "SCHEDULED"))
- results))))))
- nil 'tree)
- (when talk (setq results (cons talk results)))
- (reverse results)))
-
- (defun conf/filter-talks (list)
- "Return only talk info in LIST."
- (seq-filter
- (lambda (talk) (eq (plist-get talk :type) 'talk))
- list))
-
- (defun conf/format-talk-link (talk)
- (and talk (format "<a href=\"/2020/schedule/%s\">%s</a>"
- (plist-get talk :talk-id)
- (plist-get talk :title))))
-
- (defun conf/format-talk-info-as-schedule (info)
- (format "<table width=\"100%%\">%s</table>"
- (mapconcat
- (lambda (o)
- (let* ((time-fmt "%l:%M %p")
- (timestamp (org-timestamp-from-string (plist-get o :scheduled)))
- (start (if timestamp (format-time-string time-fmt (org-timestamp-to-time (org-timestamp-split-range timestamp))) ""))
- (end (if timestamp (format-time-string time-fmt (org-timestamp-to-time (org-timestamp-split-range timestamp t))) ""))
- (title (plist-get o :title))
- (speakers (plist-get o :speakers)))
- (if (eq (plist-get o :type) 'headline)
- (format "<tr><td colspan=\"4\"><strong>%s<strong></td></tr>"
- title)
- (format "<tr><td width=100>%s</td><td width=100>%s</td><td>%s</td><td>%s</td></tr>"
- start end (conf/format-talk-link o) speakers)))) (cdr info) "\n")))
-
- (defun conf/filter-talks (info)
- (seq-filter (lambda (o) (eq (plist-get o :type) 'talk)) info))
-
- (defun conf/split-out-talk-information ()
- (interactive)
- (let ((talks (conf/filter-talks (conf/get-talk-info-from-file))))
- (mapc (lambda (o)
- (with-temp-buffer
- (insert
- (format "# %s\n%s\n\n%s"
- (plist-get o :title)
- (plist-get o :speakers)
- (plist-get o :info)))
- (write-file (expand-file-name (format "%s.md" (plist-get o :talk-id)) "info"))))
- talks)))
-
- (defun conf/format-talk-pages (info)
- (let* ((talks (conf/filter-talks info))
- (next-talks (cdr talks))
- (prev-talks (cons nil talks)))
- (mapc (lambda (o)
- (with-temp-buffer
- (let* ((timestamp (org-timestamp-from-string (plist-get o :scheduled)))
- (next-talk (conf/format-talk-link (pop next-talks)))
- (prev-talk (conf/format-talk-link (pop prev-talks)))
- (nav-links (format "Back to the [[schedule]] \n%s%s"
- (if prev-talk (format "Previous: %s \n" prev-talk) "")
- (if next-talk (format "Next: %s \n" next-talk) ""))))
- (insert (format "[[%s title=\"%s\"]]
- [[%s copyright=\"Copyright &copy; 2020 %s\"]]
-
- <!-- To edit the talk information, change /2020/info/TALKID.md. Boilerplate automatically generated from submissions.org using conf/generate-schedule-files --->\n
-
- %s
-
- [[!inline pages=\"internal(2020/info/%s)\" raw=\"yes\"]]
-
- %s
-
- %s
-
- All times are approximate, and we might shuffle talks around as needed.
- Please check <https://emacsconf.org/2020> a few days before the start of the
- conference for instructions on how to watch and participate. See you then!
- "
- "!meta"
- (replace-regexp-in-string "\"" "\\\\\"" (plist-get o :title))
- "!meta"
- (plist-get o :speakers)
- nav-links
- (plist-get o :talk-id)
- (mapconcat
- (lambda (tz)
- (format "%s - %s"
- (format-time-string "%A, %b %e %Y, %l:%M %p"
- (org-timestamp-to-time (org-timestamp-split-range timestamp)) tz)
- (format-time-string "%l:%M %p %Z"
- (org-timestamp-to-time (org-timestamp-split-range timestamp t)) tz)))
- conf/timezones
- " \n")
- nav-links)))
- (write-file (format "schedule/%s.md" (plist-get o :talk-id)))))
- talks)))
-
- (defun conf/get-talk-info-from-file (&optional filename)
- (with-temp-buffer
- (insert-file-contents (or filename "submissions.org"))
- (org-mode)
- (org-show-all)
- (goto-char (point-min))
- (goto-char (org-find-property "ID" "talks"))
- (conf/get-talk-info)))
-
- (defun conf/generate-schedule-files (&optional filename)
- (interactive)
- (let ((info (conf/get-talk-info-from-file filename)))
- (with-temp-buffer
- (insert (conf/format-talk-info-as-schedule info))
- (write-file "schedule-details.txt"))
- (conf/format-talk-pages info)
- (with-current-buffer (find-file "schedule.org")
- (org-export-to-file 'md "schedule.md"))))
+
+<a id="org3516f2d"></a>
+
+## Yasnippet for adding video links to the individual talk page
+
+ # -*- mode: snippet -*-
+ # name: vid
+ # key: vid
+ # --
+ [[!template id=vid src="`(current-kill 0)`"]]
+ [Download $2.webm video, 720p, $1](`(current-kill 0)`)
+
+or with the source code from the directory listing:
+
+ (while (re-search-forward "<a href=\"\\(.*\\)?\">.*?\\([0-9]+[MB]\\)" nil t)
+ (replace-match "[[!template id=vid src=\"https://mirror.csclub.uwaterloo.ca/emacsconf/2020/\\1\"]]
+ [Download .webm video, 720p, \\2B](https://mirror.csclub.uwaterloo.ca/emacsconf/2020/\\1)
+ "))
diff --git a/2020/submissions.org b/2020/submissions.org
index e6a41970..5d7416f7 100644
--- a/2020/submissions.org
+++ b/2020/submissions.org
@@ -12,13 +12,15 @@ You can check out the Org Mode source for this page by following the [[https://e
#+TOC: headlines 3
-
* Actions
-- [[elisp:(org-babel-execute-buffer)][Execute buffer]] - start with this to get the function definitions
+You may want to =(setq org-confirm-babel-evaluate nil)=.
+
+- [[elisp:(org-babel-load-file "organizers-notebook.org")][Load code from organizers-notebook.org]] - run this to load function definitions or reset conf/info if the talk info changes
- [[elisp:(conf/update-talks)][Update talk info]] - run this after changing talk time or order
- [[elisp:(let ((org-agenda-skip-function (lambda () (unless (elt (org-heading-components) 2) (org-entry-end-position)))) (org-agenda-files (list (buffer-file-name)))) (org-agenda-list nil (org-read-date nil nil "2020-11-28") 2))][View as agenda]]
-- [[elisp:conf/generate-schedule-files][Generate schedule files]]
+- [[elisp:conf/generate-schedule-files][Generate schedule files]] - updates schedule-details.md; set conf/autogenerate-talk-pages to t if you want to overwrite individual talk pages too.
+- [[elisp:(org-md-export-to-markdown)][Export this file to Markdown]]
To update the information included in the individual talk page,
execute the buffer, update the talk's info/TALKID.md file.
@@ -32,17 +34,17 @@ execute the buffer, update the talk's info/TALKID.md file.
|------------+-------------+--------------+-------------------------------|
| Needs: 112 | 768 | 880 | Talks |
| | | | NOVEMBER 28 (Saturday) |
-| | | | 9:00 - 9:30 Opening remarks |
+| | | | Day 1 opening remarks |
| Needs: 30 | 120 | 150 | 9:30 - 12:00 User talks |
| | | | 12:00 - 13:00 Lunch |
| Needs: 12 | 168 | 180 | 13:00 - 16:30 Afternoon talks |
-| | | | 16:30 - 17:00 Closing remarks |
+| | | | Day 1 closing remarks |
| | | | NOVEMBER 29 (Sunday) |
-| | | | 9:00 - 9:10 Opening remarks |
+| | | | Day 2 opening remarks |
| Extra: 3 | 140 | 137 | 9:10 - 12:00 Morning talks |
| | | | 12:00 - 13:00 Lunch |
| Needs: 25 | 168 | 193 | 13:00 - 16:30 Afternoon talks |
-| | | | 16:30 - 17:00 Closing remarks |
+| | | | Day 2 closing remarks |
#+END:
** By slot
@@ -52,17 +54,17 @@ execute the buffer, update the talk's info/TALKID.md file.
**** 9:30 - 12:00 User talks :morning:
#+BEGIN: columnview :hlines 1 :id "talks" :format "%SCHEDULED%20ITEM%NAME%PREREC%AVAILABILITY" :match "sat+morning/!"
-| SCHEDULED | ITEM | NAME | PREREC | AVAILABILITY |
-|------------------------------+------------------------------------------------------------------------+-----------------------------+----------------+-------------------------------------|
-| <2020-11-28 Sat 09:33-09:37> | Emacs News Highlights | Sacha Chua | ready | prerec, maybe 9am-3pm EST |
-| <2020-11-28 Sat 09:40-10:00> | An Emacs Developer Story: From User to Package Maintainer | Leo Vivier | | 9am-12pm EST |
-| <2020-11-28 Sat 10:03-10:13> | Idea to Novel Superstructure: Emacs for Writing | Bala Ramadurai | done, live Q&A | 8:30am EST-12pm EST |
-| <2020-11-28 Sat 10:16-10:26> | Music in Plain Text | Jonathan Gregory | planned | ok |
-| <2020-11-28 Sat 10:29-10:45> | Bard Bivou(m)acs - Building a bandcamp-like page for an album of music | Grant Shangreaux | | 10am-5pm EST, daylight Central US |
-| <2020-11-28 Sat 10:48-10:58> | Trivial Emacs Kits | Corwin Brust | | ok |
-| <2020-11-28 Sat 11:01-11:21> | Beyond Vim and Emacs: A Scalable UI Paradigm | Sid Kasivajhula (countvaj`) | | PST, so maybe 11 AM EST - 5 PM EST? |
-| <2020-11-28 Sat 11:24-11:44> | Building reproducible Emacs | Andrew Tropin (abcdw) | | After 4pm UTC - 11am-5pm EST |
-| <2020-11-28 Sat 11:47-12:27> | On why most of the best features in eev look like 5-minute hacks | Eduardo Ochs (edrx) | planned | ok |
+| SCHEDULED | ITEM | NAME | PREREC | AVAILABILITY |
+|------------------------------+------------------------------------------------------------------------+--------------------------------+----------------+-------------------------------------|
+| <2020-11-28 Sat 09:33-09:37> | Emacs News Highlights | Sacha Chua | ready | prerec, maybe 9am-3pm EST |
+| <2020-11-28 Sat 09:40-10:00> | An Emacs Developer Story: From User to Package Maintainer | Leo Vivier | | 9am-12pm EST |
+| <2020-11-28 Sat 10:03-10:13> | Idea to Novel Superstructure: Emacs for Writing | Bala Ramadurai | done, live Q&A | 8:30am EST-12pm EST |
+| <2020-11-28 Sat 10:16-10:26> | Music in Plain Text | Jonathan Gregory | planned | ok |
+| <2020-11-28 Sat 10:29-10:45> | Bard Bivou(m)acs - Building a bandcamp-like page for an album of music | Grant Shangreaux | | 10am-5pm EST, daylight Central US |
+| <2020-11-28 Sat 10:48-10:58> | Trivial Emacs Kits | Corwin Brust (mplsCorwin) | | ok |
+| <2020-11-28 Sat 11:01-11:21> | Beyond Vim and Emacs: A Scalable UI Paradigm | Sid Kasivajhula (countvajhula) | | PST, so maybe 11 AM EST - 5 PM EST? |
+| <2020-11-28 Sat 11:24-11:44> | Building reproducible Emacs | Andrew Tropin (abcdw) | | After 4pm UTC - 11am-5pm EST |
+| <2020-11-28 Sat 11:47-12:27> | On why most of the best features in eev look like 5-minute hacks | Eduardo Ochs (edrx) | planned | ok |
#+END:
**** 13:00 - 16:30 Afternoon talks :afternoon:
@@ -81,7 +83,7 @@ execute the buffer, update the talk's info/TALKID.md file.
| <2020-11-28 Sat 15:17-15:37> | Org-mode and Org-Roam for Scholars and Researchers | Noorah Alhasan | | ok |
| <2020-11-28 Sat 15:40-16:00> | Org-roam: Technical Presentation | Leo Vivier | | 2:30-ish EST ok with tea; in CET timezone |
| <2020-11-28 Sat 16:03-16:13> | Sharing blogs (and more) with org-webring | Brett Gilio | | ok |
-| <2020-11-28 Sat 16:16-16:36> | OMG Macros | Corwin Brust | | ok |
+| <2020-11-28 Sat 16:16-16:36> | OMG Macros | Corwin Brust (mplsCorwin) | | ok |
#+END:
*** Sunday
@@ -102,18 +104,18 @@ execute the buffer, update the talk's info/TALKID.md file.
**** 13:00 - 16:30 Afternoon talks :afternoon:
#+BEGIN: columnview :hlines 1 :id "talks" :format "%SCHEDULED%20ITEM%NAME%PREREC%AVAILABILITY" :match "sun+afternoon/!"
-| SCHEDULED | ITEM | NAME | PREREC | AVAILABILITY |
-|------------------------------+---------------------------------------------------+----------------------------------+---------+----------------------------------------------------------------------------|
-| <2020-11-29 Sun 13:03-13:13> | Emacs as a Highschooler: How It Changed My Life | Pierce Wang | done | Sun 12pm EST onwards |
-| <2020-11-29 Sun 13:16-13:26> | State of Retro Gaming in Emacs | Vasilij "wasamasa" Schneidermann | done | 8am-10pm CET, so 9am-3pm EST |
-| <2020-11-29 Sun 13:29-14:19> | Welcome To The Dungeon | Erik Elmshauser and Corwin Brust | | ok |
-| <2020-11-29 Sun 14:22-14:42> | Pathing of Least Resistance | Erik Elmshauser and Corwin Brust | | ok |
-| <2020-11-29 Sun 14:45-14:55> | A tour of vterm | Gabriele Bozzola (@sbozzolo) | done | MST, so 11am-5pm EST |
-| <2020-11-29 Sun 14:58-15:14> | Lakota Language and Emacs | Grant Shangreaux | done | Central time, 10am EST-5pm EST |
-| <2020-11-29 Sun 15:17-15:41> | Object Oriented Code in the Gnus Newsreader | Eric Abrahamsen | planned | ok |
-| <2020-11-29 Sun 15:44-16:04> | Maxima a computer algebra system in Emacs | Fermin MF | | afternoon if possible |
-| <2020-11-29 Sun 16:07-16:27> | Extend Emacs to Modern GUI Applications with EAF | Matthew Zeng | | after 12pm EST both days; confirmed available November 29, 1pm-4:30pm EST. |
-| <2020-11-29 Sun 16:30-16:40> | WAVEing at Repetitive Repetitive Repetitive Music | Zachary Kanfer | done | ok |
+| SCHEDULED | ITEM | NAME | PREREC | AVAILABILITY |
+|------------------------------+---------------------------------------------------+-----------------------------------------------+---------+----------------------------------------------------------------------------|
+| <2020-11-29 Sun 13:03-13:13> | Emacs as a Highschooler: How It Changed My Life | Pierce Wang | done | Sun 12pm EST onwards |
+| <2020-11-29 Sun 13:16-13:26> | State of Retro Gaming in Emacs | Vasilij "wasamasa" Schneidermann | done | 8am-10pm CET, so 9am-3pm EST |
+| <2020-11-29 Sun 13:29-14:19> | Welcome To The Dungeon | Erik Elmshauser and Corwin Brust | | ok |
+| <2020-11-29 Sun 14:22-14:42> | Pathing of Least Resistance | Erik Elmshauser and Corwin Brust (mplsCorwin) | | ok |
+| <2020-11-29 Sun 14:45-14:55> | A tour of vterm | Gabriele Bozzola (@sbozzolo) | done | MST, so 11am-5pm EST |
+| <2020-11-29 Sun 14:58-15:14> | Lakota Language and Emacs | Grant Shangreaux | done | Central time, 10am EST-5pm EST |
+| <2020-11-29 Sun 15:17-15:41> | Object Oriented Code in the Gnus Newsreader | Eric Abrahamsen | planned | ok |
+| <2020-11-29 Sun 15:44-16:04> | Maxima a computer algebra system in Emacs | Fermin MF | | afternoon if possible |
+| <2020-11-29 Sun 16:07-16:30> | Extend Emacs to Modern GUI Applications with EAF | Matthew Zeng | | after 12pm EST both days; confirmed available November 29, 1pm-4:30pm EST. |
+| <2020-11-29 Sun 16:33-16:43> | WAVEing at Repetitive Repetitive Repetitive Music | Zachary Kanfer | done | ok |
#+END:
** Table for all talks
@@ -126,8 +128,8 @@ execute the buffer, update the talk's info/TALKID.md file.
| done, live Q&A | <2020-11-28 Sat 10:03-10:13> | Idea to Novel Superstructure: Emacs for Writing | Bala Ramadurai |
| planned | <2020-11-28 Sat 10:16-10:26> | Music in Plain Text | Jonathan Gregory |
| | <2020-11-28 Sat 10:29-10:45> | Bard Bivou(m)acs - Building a bandcamp-like page for an album of music | Grant Shangreaux |
-| | <2020-11-28 Sat 10:48-10:58> | Trivial Emacs Kits | Corwin Brust |
-| | <2020-11-28 Sat 11:01-11:21> | Beyond Vim and Emacs: A Scalable UI Paradigm | Sid Kasivajhula (countvaj`) |
+| | <2020-11-28 Sat 10:48-10:58> | Trivial Emacs Kits | Corwin Brust (mplsCorwin) |
+| | <2020-11-28 Sat 11:01-11:21> | Beyond Vim and Emacs: A Scalable UI Paradigm | Sid Kasivajhula (countvajhula) |
| | <2020-11-28 Sat 11:24-11:44> | Building reproducible Emacs | Andrew Tropin (abcdw) |
| planned | <2020-11-28 Sat 11:47-12:27> | On why most of the best features in eev look like 5-minute hacks | Eduardo Ochs (edrx) |
| | <2020-11-28 Sat 13:03-13:13> | Orgmode - your life in plain text | Rainer König |
@@ -141,7 +143,7 @@ execute the buffer, update the talk's info/TALKID.md file.
| | <2020-11-28 Sat 15:17-15:37> | Org-mode and Org-Roam for Scholars and Researchers | Noorah Alhasan |
| | <2020-11-28 Sat 15:40-16:00> | Org-roam: Technical Presentation | Leo Vivier |
| | <2020-11-28 Sat 16:03-16:13> | Sharing blogs (and more) with org-webring | Brett Gilio |
-| | <2020-11-28 Sat 16:16-16:36> | OMG Macros | Corwin Brust |
+| | <2020-11-28 Sat 16:16-16:36> | OMG Macros | Corwin Brust (mplsCorwin) |
| done | <2020-11-29 Sun 09:13-09:30> | Emacs development update | John Wiegley |
| | <2020-11-29 Sun 09:33-09:53> | Powering-up Special Blocks | Musa Al-hassy |
| 24min | <2020-11-29 Sun 09:56-10:46> | Incremental Parsing with emacs-tree-sitter | Tuấn-Anh Nguyễn |
@@ -151,13 +153,13 @@ execute the buffer, update the talk's info/TALKID.md file.
| done | <2020-11-29 Sun 13:03-13:13> | Emacs as a Highschooler: How It Changed My Life | Pierce Wang |
| done | <2020-11-29 Sun 13:16-13:26> | State of Retro Gaming in Emacs | Vasilij "wasamasa" Schneidermann |
| | <2020-11-29 Sun 13:29-14:19> | Welcome To The Dungeon | Erik Elmshauser and Corwin Brust |
-| | <2020-11-29 Sun 14:22-14:42> | Pathing of Least Resistance | Erik Elmshauser and Corwin Brust |
+| | <2020-11-29 Sun 14:22-14:42> | Pathing of Least Resistance | Erik Elmshauser and Corwin Brust (mplsCorwin) |
| done | <2020-11-29 Sun 14:45-14:55> | A tour of vterm | Gabriele Bozzola (@sbozzolo) |
| done | <2020-11-29 Sun 14:58-15:14> | Lakota Language and Emacs | Grant Shangreaux |
| planned | <2020-11-29 Sun 15:17-15:41> | Object Oriented Code in the Gnus Newsreader | Eric Abrahamsen |
| | <2020-11-29 Sun 15:44-16:04> | Maxima a computer algebra system in Emacs | Fermin MF |
-| | <2020-11-29 Sun 16:07-16:27> | Extend Emacs to Modern GUI Applications with EAF | Matthew Zeng |
-| done | <2020-11-29 Sun 16:30-16:40> | WAVEing at Repetitive Repetitive Repetitive Music | Zachary Kanfer |
+| | <2020-11-29 Sun 16:07-16:30> | Extend Emacs to Modern GUI Applications with EAF | Matthew Zeng |
+| done | <2020-11-29 Sun 16:33-16:43> | WAVEing at Repetitive Repetitive Repetitive Music | Zachary Kanfer |
#+END:
* Talks
@@ -196,17 +198,17 @@ SCHEDULED: <2020-11-28 Sat 09:00-09:30>
| -30 | 150 | 120 |
#+BEGIN: columnview :hlines 1 :id "talks" :format "%SCHEDULED%20ITEM%NAME%PREREC%AVAILABILITY" :match "sat+morning/!"
-| SCHEDULED | ITEM | NAME | PREREC | AVAILABILITY |
-|------------------------------+------------------------------------------------------------------------+-----------------------------+----------------+-------------------------------------|
-| <2020-11-28 Sat 09:33-09:37> | Emacs News Highlights | Sacha Chua | ready | prerec, maybe 9am-3pm EST |
-| <2020-11-28 Sat 09:40-10:00> | An Emacs Developer Story: From User to Package Maintainer | Leo Vivier | | 9am-12pm EST |
-| <2020-11-28 Sat 10:03-10:13> | Idea to Novel Superstructure: Emacs for Writing | Bala Ramadurai | done, live Q&A | 8:30am EST-12pm EST |
-| <2020-11-28 Sat 10:16-10:26> | Music in Plain Text | Jonathan Gregory | planned | ok |
-| <2020-11-28 Sat 10:29-10:45> | Bard Bivou(m)acs - Building a bandcamp-like page for an album of music | Grant Shangreaux | | 10am-5pm EST, daylight Central US |
-| <2020-11-28 Sat 10:48-10:58> | Trivial Emacs Kits | Corwin Brust | | ok |
-| <2020-11-28 Sat 11:01-11:21> | Beyond Vim and Emacs: A Scalable UI Paradigm | Sid Kasivajhula (countvaj`) | | PST, so maybe 11 AM EST - 5 PM EST? |
-| <2020-11-28 Sat 11:24-11:44> | Building reproducible Emacs | Andrew Tropin (abcdw) | | After 4pm UTC - 11am-5pm EST |
-| <2020-11-28 Sat 11:47-12:27> | On why most of the best features in eev look like 5-minute hacks | Eduardo Ochs (edrx) | planned | ok |
+| SCHEDULED | ITEM | NAME | PREREC | AVAILABILITY |
+|------------------------------+------------------------------------------------------------------------+--------------------------------+----------------+-------------------------------------|
+| <2020-11-28 Sat 09:33-09:37> | Emacs News Highlights | Sacha Chua | ready | prerec, maybe 9am-3pm EST |
+| <2020-11-28 Sat 09:40-10:00> | An Emacs Developer Story: From User to Package Maintainer | Leo Vivier | | 9am-12pm EST |
+| <2020-11-28 Sat 10:03-10:13> | Idea to Novel Superstructure: Emacs for Writing | Bala Ramadurai | done, live Q&A | 8:30am EST-12pm EST |
+| <2020-11-28 Sat 10:16-10:26> | Music in Plain Text | Jonathan Gregory | planned | ok |
+| <2020-11-28 Sat 10:29-10:45> | Bard Bivou(m)acs - Building a bandcamp-like page for an album of music | Grant Shangreaux | | 10am-5pm EST, daylight Central US |
+| <2020-11-28 Sat 10:48-10:58> | Trivial Emacs Kits | Corwin Brust (mplsCorwin) | | ok |
+| <2020-11-28 Sat 11:01-11:21> | Beyond Vim and Emacs: A Scalable UI Paradigm | Sid Kasivajhula (countvajhula) | | PST, so maybe 11 AM EST - 5 PM EST? |
+| <2020-11-28 Sat 11:24-11:44> | Building reproducible Emacs | Andrew Tropin (abcdw) | | After 4pm UTC - 11am-5pm EST |
+| <2020-11-28 Sat 11:47-12:27> | On why most of the best features in eev look like 5-minute hacks | Eduardo Ochs (edrx) | planned | ok |
#+END:
**** User stories
@@ -935,7 +937,7 @@ SCHEDULED: <2020-11-28 Sat 12:00-13:00>
| <2020-11-28 Sat 15:17-15:37> | Org-mode and Org-Roam for Scholars and Researchers | Noorah Alhasan | | ok |
| <2020-11-28 Sat 15:40-16:00> | Org-roam: Technical Presentation | Leo Vivier | | 2:30-ish EST ok with tea; in CET timezone |
| <2020-11-28 Sat 16:03-16:13> | Sharing blogs (and more) with org-webring | Brett Gilio | | ok |
-| <2020-11-28 Sat 16:16-16:36> | OMG Macros | Corwin Brust | | ok |
+| <2020-11-28 Sat 16:16-16:36> | OMG Macros | Corwin Brust (mplsCorwin) | | ok |
#+END:
**** in-progress Orgmode - your life in plain text :standard:tutorial:org:nudge:
@@ -2234,18 +2236,18 @@ SCHEDULED: <2020-11-29 Sun 12:00-13:00>
#+BEGIN: columnview :hlines 1 :id "talks" :format "%SCHEDULED%20ITEM%NAME%PREREC%AVAILABILITY" :match "sun+afternoon/!"
-| SCHEDULED | ITEM | NAME | PREREC | AVAILABILITY |
-|------------------------------+---------------------------------------------------+----------------------------------+---------+----------------------------------------------------------------------------|
-| <2020-11-29 Sun 13:03-13:13> | Emacs as a Highschooler: How It Changed My Life | Pierce Wang | done | Sun 12pm EST onwards |
-| <2020-11-29 Sun 13:16-13:26> | State of Retro Gaming in Emacs | Vasilij "wasamasa" Schneidermann | done | 8am-10pm CET, so 9am-3pm EST |
-| <2020-11-29 Sun 13:29-14:19> | Welcome To The Dungeon | Erik Elmshauser and Corwin Brust | | ok |
-| <2020-11-29 Sun 14:22-14:42> | Pathing of Least Resistance | Erik Elmshauser and Corwin Brust | | ok |
-| <2020-11-29 Sun 14:45-14:55> | A tour of vterm | Gabriele Bozzola (@sbozzolo) | done | MST, so 11am-5pm EST |
-| <2020-11-29 Sun 14:58-15:14> | Lakota Language and Emacs | Grant Shangreaux | done | Central time, 10am EST-5pm EST |
-| <2020-11-29 Sun 15:17-15:41> | Object Oriented Code in the Gnus Newsreader | Eric Abrahamsen | planned | ok |
-| <2020-11-29 Sun 15:44-16:04> | Maxima a computer algebra system in Emacs | Fermin MF | | afternoon if possible |
-| <2020-11-29 Sun 16:07-16:27> | Extend Emacs to Modern GUI Applications with EAF | Matthew Zeng | | after 12pm EST both days; confirmed available November 29, 1pm-4:30pm EST. |
-| <2020-11-29 Sun 16:30-16:40> | WAVEing at Repetitive Repetitive Repetitive Music | Zachary Kanfer | done | ok |
+| SCHEDULED | ITEM | NAME | PREREC | AVAILABILITY |
+|------------------------------+---------------------------------------------------+-----------------------------------------------+---------+----------------------------------------------------------------------------|
+| <2020-11-29 Sun 13:03-13:13> | Emacs as a Highschooler: How It Changed My Life | Pierce Wang | done | Sun 12pm EST onwards |
+| <2020-11-29 Sun 13:16-13:26> | State of Retro Gaming in Emacs | Vasilij "wasamasa" Schneidermann | done | 8am-10pm CET, so 9am-3pm EST |
+| <2020-11-29 Sun 13:29-14:19> | Welcome To The Dungeon | Erik Elmshauser and Corwin Brust | | ok |
+| <2020-11-29 Sun 14:22-14:42> | Pathing of Least Resistance | Erik Elmshauser and Corwin Brust (mplsCorwin) | | ok |
+| <2020-11-29 Sun 14:45-14:55> | A tour of vterm | Gabriele Bozzola (@sbozzolo) | done | MST, so 11am-5pm EST |
+| <2020-11-29 Sun 14:58-15:14> | Lakota Language and Emacs | Grant Shangreaux | done | Central time, 10am EST-5pm EST |
+| <2020-11-29 Sun 15:17-15:41> | Object Oriented Code in the Gnus Newsreader | Eric Abrahamsen | planned | ok |
+| <2020-11-29 Sun 15:44-16:04> | Maxima a computer algebra system in Emacs | Fermin MF | | afternoon if possible |
+| <2020-11-29 Sun 16:07-16:30> | Extend Emacs to Modern GUI Applications with EAF | Matthew Zeng | | after 12pm EST both days; confirmed available November 29, 1pm-4:30pm EST. |
+| <2020-11-29 Sun 16:33-16:43> | WAVEing at Repetitive Repetitive Repetitive Music | Zachary Kanfer | done | ok |
#+END:
**** in-progress Emacs as a Highschooler: How It Changed My Life :standard:user:community:timing:nudge:
@@ -3070,328 +3072,6 @@ the target time.
(org-entry-get (point) "TARGET_TIME")))
#+end_src
-Some conference-related functions
-
-#+begin_src emacs-lisp :exports code :results none :tangle "conf.el"
- (defun conf/find-talk (filter &optional info)
- (setq info (or info (conf/filter-talks conf/info)))
- (when (stringp filter) (setq filter (list filter)))
- (or (seq-find (lambda (o) (string= (plist-get o :talk-id) (car filter))) info)
- (seq-find (lambda (o)
- (let ((case-fold-search t)
- (all (mapconcat (lambda (f) (plist-get o f)) '(:title :speakers :talk-id) " ")))
- (null (seq-contains-p
- (mapcar (lambda (condition) (string-match condition all)) filter)
- nil))))
- info)))
-
-(defun conf/goto-talk-id (id)
- (goto-char (org-find-property "TALK_ID" id)))
-
-(defun conf/assign-ids ()
- "Assign numeric talk IDs."
- (interactive)
- (goto-char (point-min))
- ;; Determine the maximum ID assigned so far
- (let ((id
- (1+
- (apply 'max
- (or (mapcar
- 'string-to-number
- (org-map-entries
- (lambda ()
- (let ((org-trust-scanner-tags t))
- (org-entry-get (point) "TALK_ID"))) "TALK_ID>0" 'file))
- '(0))))))
- (goto-char (point-min))
- (while (re-search-forward "^ *:NAME: " nil t)
- (unless (org-entry-get (point) "TALK_ID")
- (org-set-property "TALK_ID" (format "%02d" id))
- (org-set-property "CUSTOM_ID" (format "talk%02d" id))
- (setq id (1+ id))))))
-
-(defun conf/update-talks ()
- (interactive)
- (save-excursion
- (conf/update-times)
- (conf/update-tables)
- (conf/update-schedules)))
-
-(defun conf/update-times ()
- (goto-char (point-min))
- (org-map-entries
- (lambda ()
- (when (org-entry-get (point) "TARGET_TIME")
- (conf/org-sum-min-time-in-subtree)
- (org-entry-put
- (point)
- "DIFFERENCE"
- (let ((diff
- (-
- (string-to-number (org-entry-get (point) "TARGET_TIME"))
- (string-to-number (org-entry-get (point) "MIN_TIME_SUM")))))
- (cond
- ((> diff 0) (format "Extra: %d" diff))
- ((< diff 0) (format "Needs: %d" (- diff)))
- (t "")))))) nil 'file))
-(defun conf/update-tables ()
- (goto-char (point-min))
- (while (re-search-forward "#\\+CALL: check_time()" nil t)
- (org-ctrl-c-ctrl-c))
- (goto-char (point-min))
- (while (re-search-forward "#\\+BEGIN: columnview" nil t)
- (org-ctrl-c-ctrl-c)))
-(defun conf/update-schedules ()
- (interactive)
- (goto-char (org-find-exact-headline-in-buffer "Talks"))
- (let (current-time scheduled end-time duration (buffer (seconds-to-time (* 3 60)))) ;; assumption: 3 minutes between talks
- (org-map-entries (lambda ()
- (if (org-entry-get (point) "FIXED_TIME")
- (setq current-time (org-get-scheduled-time (point))))
- (when (org-entry-get (point) "MIN_TIME")
- (setq duration (* (string-to-number (org-entry-get (point) "MIN_TIME")) 60)
- end-time (time-add current-time (seconds-to-time duration)))
- (org-set-property "SCHEDULED" (format "%s-%s" (org-format-time-string "%Y-%m-%d %H:%M" current-time)
- (org-format-time-string "%H:%M" end-time)))
- (setq current-time (time-add end-time buffer))))
- nil 'tree)))
-
-(defun conf/org-sum-min-time-in-subtree ()
- "Add up all the MIN_TIME properties of headings underneath the current one
-The total is written to the MIN_TIME_SUM property of this heading"
- (interactive)
- (org-entry-put
- (point)
- "MIN_TIME_SUM"
- (save-excursion
- (format "%d"
- (apply
- '+
- (mapcar 'string-to-number
- (delq nil
- (org-map-entries
- (lambda () (org-entry-get (point) "MIN_TIME")) nil 'tree))))))))
-
-#+end_src
-** Generate schedule file
-
-#+begin_src emacs-lisp :results none :eval yes :exports code :tangle "conf.el"
-
-(defvar conf/timezones '("EST" "America/Los_Angeles" "UTC" "CET" "Asia/Singapore") "List of timezones")
-
-(defun conf/get-talk-info ()
- (let (talk results)
- (org-map-entries (lambda ()
- (let ((heading (org-heading-components)))
- (cond
- ((and (elt heading 2) (or (null talk)
- (<= (car heading)
- (plist-get talk :level)))) ;; has a todo, therefore is a talk
- (when talk (setq results (cons talk results)))
- (setq talk (list
- :type 'talk
- :title (elt heading 4)
- :talk-id (org-entry-get (point) "TALK_ID")
- :status (elt heading 2)
- :level (car heading)
- :scheduled (org-entry-get (point) "SCHEDULED")
- :duration (org-entry-get (point) "DURATION")
- :time (org-entry-get (point) "MIN_TIME")
- :speakers (org-entry-get (point) "NAME"))))
- ((string-match "^ *Talk information *$" (elt heading 4))
- (plist-put talk :info
- (org-export-as 'md t nil t)))
- ((or (null talk) (< (car heading) (plist-get talk :level))) ;; heading above
- (when talk
- (setq results (cons talk results))
- (setq talk nil))
- (setq results (cons
- (list :type 'headline
- :level (car heading)
- :speakers (org-entry-get (point) "NAME")
- :duration (org-entry-get (point) "DURATION")
- :talk-id (org-entry-get (point) "TALK_ID")
- :title (elt heading 4)
- :scheduled (org-entry-get (point) "SCHEDULED"))
- results))))))
- nil 'tree)
- (when talk (setq results (cons talk results)))
- (reverse results)))
-
-(defun conf/filter-talks (list)
- "Return only talk info in LIST."
- (seq-filter
- (lambda (talk) (eq (plist-get talk :type) 'talk))
- list))
-
-(defun conf/format-talk-link (talk)
- (and talk (if (plist-get talk :talk-id)
- (format "<a href=\"/2020/talks/%s\">%s</a>"
- (plist-get talk :talk-id)
- (plist-get talk :title))
- (plist-get talk :title))))
-
-(defun conf/format-talk-info-as-schedule (info)
- (format "<table width=\"100%%\">%s</table>"
- (mapconcat
- (lambda (o)
- (let* ((time-fmt "%l:%M %p")
- (timestamp (org-timestamp-from-string (plist-get o :scheduled)))
- (start (if timestamp (format-time-string time-fmt (org-timestamp-to-time (org-timestamp-split-range timestamp))) ""))
- (end (if timestamp (format-time-string time-fmt (org-timestamp-to-time (org-timestamp-split-range timestamp t))) ""))
- (title (plist-get o :title))
- (speakers (plist-get o :speakers)))
- (if (eq (plist-get o :type) 'headline)
- (format "<tr><td colspan=\"4\"><strong>%s<strong></td></tr>"
- (if (plist-get o :talk-id)
- (conf/format-talk-link o)
- title))
- (format "<tr><td width=100>~%s</td><td width=100>~%s</td><td>%s</td><td>%s</td></tr>"
- start end (conf/format-talk-link o) speakers))))
- (cdr info) "\n")))
-
-(defun conf/filter-talks (info)
- (seq-filter (lambda (o) (plist-get o :talk-id)) info))
-
-(defun conf/split-out-talk-information ()
- (interactive)
- (let ((talks (conf/filter-talks (conf/get-talk-info-from-file))))
- (mapc (lambda (o)
- (with-temp-buffer
- (insert
- (format "# %s\n%s\n\n%s"
- (plist-get o :title)
- (plist-get o :speakers)
- (plist-get o :info)))
- (write-file (expand-file-name (format "%s.md" (plist-get o :talk-id)) "info"))))
- talks)))
-
-(defun conf/format-talk-pages (info)
- (let* ((talks (conf/filter-talks info))
- (next-talks (cdr talks))
- (prev-talks (cons nil talks)))
- (mapc (lambda (o)
- (with-temp-buffer
- (let* ((timestamp (org-timestamp-from-string (plist-get o :scheduled)))
- (next-talk (conf/format-talk-link (pop next-talks)))
- (prev-talk (conf/format-talk-link (pop prev-talks)))
- (schedule (mapconcat
- (lambda (tz)
- (format "%s - %s"
- (format-time-string "%A, %b %e %Y, ~%l:%M %p"
- (org-timestamp-to-time (org-timestamp-split-range timestamp)) tz)
- (format-time-string "%l:%M %p %Z"
- (org-timestamp-to-time (org-timestamp-split-range timestamp t)) tz)))
- conf/timezones
- " \n"))
- (nav-links (format "Back to the [[schedule]] \n%s%s"
- (if prev-talk (format "Previous: %s \n" prev-talk) "")
- (if next-talk (format "Next: %s \n" next-talk) ""))))
- (insert (format "[[%s title=\"%s\"]]
-[[%s copyright=\"Copyright &copy; 2020 %s\"]]
-
-<!-- To edit the talk information, change /2020/info/TALKID.md. Boilerplate automatically generated from submissions.org using conf/generate-schedule-files --->\n
-
-%s
-
-[[!inline pages=\"internal(2020/info/%s)\" raw=\"yes\"]]
-
-%s
-
-%s
-
-"
- "!meta"
- (replace-regexp-in-string "\"" "\\\\\"" (plist-get o :title))
- "!meta"
- (plist-get o :speakers)
- nav-links
- (plist-get o :talk-id)
- schedule
- nav-links)))
- (write-file (format "talks/%s.md" (plist-get o :talk-id)))))
- talks)))
-
-(defun conf/get-talk-info-from-file (&optional filename)
- (with-temp-buffer
- (insert-file-contents (or filename "submissions.org"))
- (org-mode)
- (org-show-all)
- (goto-char (point-min))
- (goto-char (org-find-property "ID" "talks"))
- (conf/get-talk-info)))
- (defvar conf/info nil)
- (setq conf/info (conf/get-talk-info-from-file))
-
-(defun conf/generate-pad-template ()
- (interactive)
- (let ((talks (conf/filter-talks (conf/get-talk-info-from-file filename))))
- (with-current-buffer (find-file "pad-template.md")
- (erase-buffer)
- (insert
- (concat
- "Conference info, how to watch/participate: <https://emacsconf.org/2020/>
-Code of conduct: <https://emacsconf.org/conduct/>
-
-"
- (mapconcat
- (lambda (o)
- (format "**%s**
-Speaker(s): %s
-Talk page: <https://emacsconf.org/2020/schedule/%s>
-
-,*Questions:*
-
-,* Put your questions here, most recent on top
-,* sample text
-
-,*Links:*
-
-,* sample text
-,* sample text
-
-,*Other notes:*
-
-,* sample text
-,* sample text
-<br>
-<br>
-" (plist-get o :title) (plist-get o :speakers) (plist-get o :talk-id))) talks " \n \n")))
- (save-buffer))))
-
-(defun conf/generate-talks-page ()
- (let ((info conf/info))
- (with-temp-buffer
- (find-file "talk-details.md")
- (erase-buffer)
- (insert (format "<table><thead><th>Duration</th><th>Title</th><th>Speakers</th></thead><tbody>%s</tbody></table>"
- (mapconcat
- (lambda (o)
- (let* ((title (plist-get o :title))
- (speakers (plist-get o :speakers)))
- (if (null (plist-get o :talk-id))
- (format "<tr><td colspan=\"3\">%s</td></tr>" (conf/format-talk-link o))
- (format "<tr><td>%s</td><td>%s</td><td>%s</td><tr>"
- (plist-get o :duration)
- (conf/format-talk-link o)
- (plist-get o :speakers)))))
- info "\n")))
- (save-buffer))))
-
-(defun conf/generate-schedule-files (&optional filename)
- (interactive)
- (let ((info (conf/get-talk-info-from-file filename)))
- ;(conf/generate-talks-page)
- (with-temp-buffer
- (insert (conf/format-talk-info-as-schedule info))
- (write-file "schedule-details.md"))
- (conf/format-talk-pages info)))
-#+end_src
-
-#+RESULTS:
-
-** Copy the pad
-
** Yasnippet for adding video links to the individual talk page
#+begin_example
@@ -3431,7 +3111,7 @@ or with the source code from the directory listing:
Copyright (C) 2020 Sacha Chua, and authors of submitted proposals
-The EmacsConf 2020 submissions is part of the EmacsConf wiki, and is
+The EmacsConf 2020 submissions are part of the EmacsConf wiki, and is
dual-licensed under the terms of the Creative Commons
Attribution-ShareAlike 4.0 International Public License; and the GNU
General Public License as published by the Free Software Foundation,