diff options
| author | Sacha Chua <sacha@sachachua.com> | 2022-10-08 10:09:15 -0400 | 
|---|---|---|
| committer | Sacha Chua <sacha@sachachua.com> | 2022-10-08 10:09:15 -0400 | 
| commit | 5557664db700ff2d645f212c2c381780ab85dbcd (patch) | |
| tree | e825589f4422abb7c2f12b3aed5d849f3bb27067 | |
| parent | 4cc3841a07ba8843373c979b61c3ca31640284ac (diff) | |
| download | emacsconf-el-5557664db700ff2d645f212c2c381780ab85dbcd.tar.xz emacsconf-el-5557664db700ff2d645f212c2c381780ab85dbcd.zip  | |
Sort by track and then schedule
| -rw-r--r-- | emacsconf-publish.el | 204 | 
1 files changed, 113 insertions, 91 deletions
diff --git a/emacsconf-publish.el b/emacsconf-publish.el index 019cb91..cf73bf9 100644 --- a/emacsconf-publish.el +++ b/emacsconf-publish.el @@ -382,22 +382,23 @@ resources."              (emacsconf-format-email-questions-and-comments talk) "\n")      (insert "<!-- End of emacsconf-generate-after-page -->\n"))) +(defun emacsconf-sort-by-track-then-schedule (a b) +  ;; Gen,Dev; then by time +  (cond +   ((string< (plist-get a :track) +             (plist-get b :track)) nil) +   ((string< (plist-get a :track) +             (plist-get b :track)) t) +   ((time-less-p (plist-get a :start-time) +                 (plist-get b :start-time)) t) +   (t nil)))  (defun emacsconf-generate-nav-pages (&optional talks)    (interactive (list                  (emacsconf-active-talks                   (sort (emacsconf-filter-talks (emacsconf-get-talk-info))                         (if (eq emacsconf-publishing-phase 'schedule)                             #'emacsconf-sort-by-scheduled -                         (lambda (a b) -                           ;; Gen,Dev; then by time -                           (cond -                            ((string< (plist-get a :track) -                                      (plist-get b :track)) nil) -                            ((string< (plist-get a :track) -                                      (plist-get b :track)) t) -                            ((time-less-p (plist-get a :start-time) -                                          (plist-get b :start-time)) t) -                            (t nil)))))))) +                         #'emacsconf-sort-by-track-then-schedule)))))    (let* ((next-talks (cdr talks))           (prev-talks (cons nil talks))           (label (if (eq emacsconf-publishing-phase 'schedule) @@ -533,6 +534,80 @@ Back to the [[talks]]  \n"      (magit-commit-create (list "-m" (read-string "Commit message: ")))      (call-interactively #'magit-push-current-to-pushremote))) +(defun emacsconf-publish-format-interleaved-schedule (&optional info) +  "Return a list with the schedule for INFO. +Entries are sorted chronologically, with different tracks interleaved." +  (let* ((by-day (seq-group-by (lambda (o) +                                 (format-time-string "%Y-%m-%d" (plist-get o :start-time) emacsconf-timezone)) +                               (sort (seq-filter (lambda (o) +                                                   (or (plist-get o :slug) +                                                       (plist-get o :include-in-info))) +                                                 (or info (emacsconf-get-talk-info))) +                                     #'emacsconf-sort-by-scheduled))) +         (track-colors '(("General" . "#ffdab9") +                         ("Development" . "#87CEEB"))) +         (dates (seq-map (lambda (o) (plist-get (cadr o) :start-time)) +                         by-day)) +         (links (mapcar (lambda (o) +                          (format "<a href=\"#date-%s\">%s</a>" +                                  (format-time-string "%Y-%m-%d" o emacsconf-timezone) +                                  (format-time-string "%a %b %-e" o emacsconf-timezone))) +                        dates)) +         (height 150) +         (width 600)) +         (mapconcat (lambda (day) +                      (let ((day-start (date-to-time (format-time-string "%Y-%m-%d 9:00" (plist-get (cadr day) :start-time)))) +                            (day-end (date-to-time (format-time-string "%Y-%m-%d 17:00" (plist-get (cadr day) :start-time))))) +                        ;; (with-temp-file (expand-file-name (concat emacsconf-year "/talks/" +                        ;;                                           (format-time-string "schedule-%Y-%m-%d.svg"  +                        ;;                                                               (plist-get (cadr day) :start-time) +                        ;;                                                               emacsconf-timezone)) +                        ;;                                   emacsconf-directory) +                        ;;   (let ((height 200) (width 800)) +                        ;;(svg-print +                        ;;      (emacsconf-schedule-svg-day +                        ;;       (svg-create width height) +                        ;;       (format-time-string "%a" (plist-get (cadr day) :start-time) emacsconf-timezone) +                        ;;       width height +                        ;;       day-start +                        ;;       day-end +                        ;;       (list (seq-filter (lambda (o) (string= (plist-get o :track) "General")) (cdr day)) +                        ;;             (seq-filter (lambda (o) (string= (plist-get o :track) "Development")) (cdr day))) +                        ;;       )))) +                        (concat +                         (svg-print +                          (emacsconf-schedule-svg-day +                           (svg-create width height) +                           (format-time-string "%a" (plist-get (cadr day) :start-time) emacsconf-timezone) +                           width height +                           day-start +                           day-end +                           (list (seq-filter (lambda (o) (string= (plist-get o :track) "General")) (cdr day)) +                                 (seq-filter (lambda (o) (string= (plist-get o :track) "Development")) (cdr day))) +                           (lambda (o node) +                             (when (assoc-default (plist-get o :track) track-colors) +                               (dom-set-attribute node 'fill (assoc-default (plist-get o :track) track-colors))) +                             node))) +                         "\n\n" +                         (if (> (length links) 1) (concat "Jump to: " (string-join links " - ")) "") +                         (format "<a name=\"date-%s\"></a>\n" +                                 (format-time-string "%Y-%m-%d" +                                                     (plist-get (cadr day) :start-time) +                                                     emacsconf-timezone)) +                         (format-time-string "# %A %b %-e, %Y\n" (plist-get (cadr day) :start-time) emacsconf-timezone) +                         ;; (format "<img src=\"/%s/talks/schedule-%s.svg\" alt=\"Schedule\"/>  \n" +                         ;;         emacsconf-year +                         ;;         (format-time-string "%Y-%m-%d" +                         ;;                             (plist-get (cadr day) :start-time) +                         ;;                             emacsconf-timezone)) +                         (format "<div class=\"schedule\" data-start=\"%s\" data-end=\"%s\" data-tracks=\"General,Development\">\n" +                                 (format-time-string "%FT%T%z" day-start t) +                                 (format-time-string "%FT%T%z" day-end t)) +                         (emacsconf-format-main-schedule (cdr day)) +                         "</div>"))) +                    by-day +                    "\n\n"))) +  (defun emacsconf-generate-main-schedule (&optional info)    (interactive)    (with-temp-file (expand-file-name "schedule-details.md" (expand-file-name emacsconf-year emacsconf-directory)) @@ -543,60 +618,21 @@ Back to the [[talks]]  \n"                                 (or info (emacsconf-get-talk-info))))                               #'emacsconf-sort-by-scheduled)))             (concat -            "<a href=\"#development\">Jump to development talks</a>\n<a name=\"general\"></a>\n<div class=\"sched-track General\"><h1>General talks</h1></div>\n" +            "<a href=\"#development\">Jump to development talks</a>\n<a name=\"general\"></a>\n<h1><span class=\"sched-track General\">General talks</span></h1>\n"              (emacsconf-format-main-schedule               (seq-filter (lambda (o) (string= (plist-get o :track) "General")) sorted)) -            "\n<a name=\"development\"></a>\n<div class=\"sched-track Development\"> -<h1>Development talks</h1> -</div>\n" +            "\n<a name=\"development\"></a>\n +<h1><span class=\"sched-track Development\">Development talks</h1> +\n"              (emacsconf-format-main-schedule               (seq-filter (lambda (o) (string= (plist-get o :track) "Development")) sorted)))) -       (let* ((by-day (seq-group-by (lambda (o) -                                      (format-time-string "%Y-%m-%d" (plist-get o :start-time) emacsconf-timezone)) -                                    (sort (seq-filter (lambda (o) -                                                        (or (plist-get o :slug) -                                                            (plist-get o :include-in-info))) -                                                      (emacsconf-get-talk-info)) -                                          #'emacsconf-sort-by-scheduled))) -              (dates (seq-map (lambda (o) (plist-get (cadr o) :start-time)) -                              by-day)) -              (links (mapcar (lambda (o) -                               (format "<a href=\"#date-%s\">%s</a>" -                                       (format-time-string "%Y-%m-%d" o emacsconf-timezone) -                                       (format-time-string "%a %b %-e" o emacsconf-timezone))) -                             dates))) -         (mapconcat (lambda (day) -                      (with-temp-file (expand-file-name (concat emacsconf-year "/talks/" -                                                                (format-time-string "schedule-%Y-%m-%d.svg"  -                                                                                    (plist-get (cadr day) :start-time) -                                                                                    emacsconf-timezone)) -                                                        emacsconf-directory) -                        (let ((height 200) (width 800)) -                          (svg-print -                           (emacsconf-schedule-svg-day -                            (svg-create width height) -                            (format-time-string "%a" (plist-get (cadr day) :start-time) emacsconf-timezone) -                            width height -                            (date-to-time (format-time-string "%Y-%m-%d 9:00" (plist-get (cadr day) :start-time))) -                            (date-to-time (format-time-string "%Y-%m-%d 17:00" (plist-get (cadr day) :start-time))) -                            (list (seq-filter (lambda (o) (string= (plist-get o :track) "General")) (cdr day)) -                                  (seq-filter (lambda (o) (string= (plist-get o :track) "Development")) (cdr day))) -                            )))) -                      (concat -                       (if (> (length links) 1) (concat "Jump to: " (string-join links " - ")) "") -                       (format "<a name=\"date-%s\"></a>\n" -                               (format-time-string "%Y-%m-%d" -                                                   (plist-get (cadr day) :start-time) -                                                   emacsconf-timezone)) -                       (format-time-string "# %A %b %-e, %Y\n" (plist-get (cadr day) :start-time) emacsconf-timezone) -                       (format "<img src=\"/%s/talks/schedule-%s.svg\" alt=\"Schedule\"/>  \n" -                               emacsconf-year -                               (format-time-string "%Y-%m-%d" -                                                   (plist-get (cadr day) :start-time) -                                                   emacsconf-timezone)) -                       (emacsconf-format-main-schedule (cdr day)))) -                    by-day -                    "\n\n"))))) +       (emacsconf-publish-format-interleaved-schedule info)))) +  (when (eq emacsconf-publishing-phase 'program) +    (with-temp-file (expand-file-name "draft-schedule.md" (expand-file-name emacsconf-year emacsconf-directory)) +      (insert +       "This is a *DRAFT* schedule.\n" +       (let ((emacsconf-publishing-phase 'schedule)) +         (emacsconf-publish-format-interleaved-schedule info)))))    (magit-status-setup-buffer emacsconf-directory))  (defun emacsconf-format-talk-link (talk) @@ -628,7 +664,6 @@ Back to the [[talks]]  \n"  (defun emacsconf-format-main-schedule (info)    (let* ((cancelled (seq-filter (lambda (o) (string= (plist-get o :status) "CANCELLED")) info)))      (concat -     "<div class=\"schedule\">\n"       (mapconcat        (lambda (o)          (let* ((status (pcase (plist-get o :status) @@ -639,35 +674,22 @@ Back to the [[talks]]  \n"                           (_ nil))))            (format "[[!template id=sched%s%s]]"                    (let ((result "") -                        (attrs (list -                                :title (plist-get o :title) -                                :url (concat "/" (plist-get o :url)) -                                :speakers (plist-get o :speakers) -                                :track (if (eq emacsconf-publishing-phase 'program) -                                            nil -                                         (plist-get o :track)) -                                :slug (plist-get o :slug) -                                :status (if (eq emacsconf-publishing-phase 'program) -                                            nil -                                          status) -                                :time (if (eq emacsconf-publishing-phase 'program) -                                          nil -                                        (plist-get o :time)) -                                :startutc -                                (if (eq emacsconf-publishing-phase 'program) -                                    nil -                                  (format-time-string "%FT%T%z" (plist-get o :start-time) t)) -                                :start                                 -                                (if (eq emacsconf-publishing-phase 'program) -                                    nil -                                  (format-time-string "%-l:%M" (plist-get o :start-time))) -                                :end -                                (if (eq emacsconf-publishing-phase 'program) -                                    nil -                                  (format-time-string "%-l:%M" (plist-get o :end-time))) -                                :q-and-a -                                (plist-get o :q-and-a) -                                ))) +                        (attrs (append +                                (list +                                 :title (plist-get o :title) +                                 :url (concat "/" (plist-get o :url)) +                                 :speakers (plist-get o :speakers) +                                 :q-and-a (plist-get o :q-and-a)) +                                (unless (eq emacsconf-publishing-phase 'program) +                                  (list +                                   :track (plist-get o :track) +                                   :slug (plist-get o :slug) +                                   :status status +                                   :time (plist-get o :time) +                                   :startutc (format-time-string "%FT%T%z" (plist-get o :start-time) t) +                                   :endutc (format-time-string "%FT%T%z" (plist-get o :end-time) t) +                                   :start (format-time-string "%-l:%M" (plist-get o :start-time)) +                                   :end (format-time-string "%-l:%M" (plist-get o :end-time)))))))                      (while attrs                        (let ((field (pop attrs))                              (val (pop attrs))) @@ -685,7 +707,7 @@ Back to the [[talks]]  \n"                      ""))))        (emacsconf-active-talks info)        "\n") -     "\n</div>\n" +     "\n"       (if (> (length cancelled) 0)           (format "<div class=\"cancelled\">Cancelled:<ul>%s</ul></div>"                   (mapconcat (lambda (talk) (format "<li><a href=\"/%s/talks/%s\">%s</a> - %s</li>"  | 
