From d88427a30a52314e7c99282bd556ac35cfed6ddb Mon Sep 17 00:00:00 2001 From: Arun Isaac Date: Sun, 2 Aug 2020 04:41:56 +0530 Subject: Disentangle index page generation expressions. * ennum.el (ennum-publish-index): Publish each page as a separate ennum expression. Make them separate functions to avoid closure capture. (ennum-publish-index-page, ennum-publish-index-home): New functions. (ennum-publish): Concatenate return value of ennum-publish-index. --- ennum.el | 116 +++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 64 insertions(+), 52 deletions(-) diff --git a/ennum.el b/ennum.el index c9d78a9..86295f8 100644 --- a/ennum.el +++ b/ennum.el @@ -395,59 +395,71 @@ result as a string." (concat filename-prefix extension)) tongue))) +(defun ennum-publish-index-page (filename-prefix title last-page posts page-number output-file) + (ennum-exp + (let* ((tongue (ennum-post-language (first posts))) + (system-time-locale + (map-elt (ennum-setting :locale-alist) + tongue nil 'string=))) + (when (file-name-directory output-file) + (ennum-mkdir-p (file-name-directory output-file))) + (with-temp-buffer + (insert (format "#+TITLE: %s\n" title)) + (insert (format "#+LANGUAGE: %s\n" tongue)) + (insert "#+OPTIONS: num:nil toc:nil\n\n") + (seq-do (lambda (post) + (insert (format "* [[post:%s][%s]]\n" + (ennum-post-slug post) + (ennum-post-title post))) + (insert (format-time-string "/%b %e, %Y/\n\n" (ennum-post-date post))) + (when-let ((thumbnail (ennum-post-thumbnail post))) + (insert (format "[[thumbnail:%s]]\n\n" thumbnail))) + (when-let ((summary (ennum-post-summary post))) + (insert summary) + (insert "\n\n")) + (when-let ((tags (ennum-post-tags post))) + (insert "Tags: ") + (insert + (string-join + (seq-map (lambda (tag) + (format "[[tag:%s][%s]]" (ennum-add-tongue-suffix tag tongue) tag)) + tags) + ", ")) + (insert "\n\n"))) + posts) + (unless (= page-number 1) + (insert (format "[[./%s][Newer posts]]\n\n" + (ennum-index-filename (file-name-nondirectory filename-prefix) + tongue nil (1- page-number))))) + (unless last-page + (insert (format "[[./%s][Older posts]]\n" + (ennum-index-filename (file-name-nondirectory filename-prefix) + tongue nil (1+ page-number))))) + (org-export-to-file 'html output-file))))) + +(defun ennum-publish-index-home (first-index-page-output filename-prefix tongue) + (ennum-exp + (ennum-copy (ennum--file-join first-index-page-output + (ennum-index-filename filename-prefix tongue "html" 1)) + (ennum-add-tongue-suffix (format "%s.html" filename-prefix) tongue)))) + (defun ennum-publish-index (filename-prefix title posts-per-page posts) (let* ((tongue (ennum-post-language (first posts))) (number-of-pages (ceiling (length posts) posts-per-page)) - (page-numbers (number-sequence 1 number-of-pages))) - (ennum-exp - (ennum-input (seq-map (lambda (post) - (ennum-intern (ennum-post-filename post))) - posts)) - (let ((output-files (seq-map (apply-partially 'ennum-index-filename filename-prefix tongue "html") - page-numbers)) - (system-time-locale (map-elt (ennum-setting :locale-alist) tongue nil 'string=))) - (seq-mapn - (lambda (posts page-number output-file) - (when (file-name-directory output-file) - (ennum-mkdir-p (file-name-directory output-file))) - (with-temp-buffer - (insert (format "#+TITLE: %s\n" title)) - (insert (format "#+LANGUAGE: %s\n" tongue)) - (insert "#+OPTIONS: num:nil toc:nil\n\n") - (seq-do (lambda (post) - (insert (format "* [[post:%s][%s]]\n" - (ennum-post-slug post) - (ennum-post-title post))) - (insert (format-time-string "/%b %e, %Y/\n\n" (ennum-post-date post))) - (when-let ((thumbnail (ennum-post-thumbnail post))) - (insert (format "[[thumbnail:%s]]\n\n" thumbnail))) - (when-let ((summary (ennum-post-summary post))) - (insert summary) - (insert "\n\n")) - (when-let ((tags (ennum-post-tags post))) - (insert "Tags: ") - (insert - (string-join - (seq-map (lambda (tag) - (format "[[tag:%s][%s]]" (ennum-add-tongue-suffix tag tongue) tag)) - tags) - ", ")) - (insert "\n\n"))) - posts) - (unless (= page-number 1) - (insert (format "[[./%s][Newer posts]]\n\n" - (ennum-index-filename (file-name-nondirectory filename-prefix) - tongue nil (1- page-number))))) - (unless (= page-number number-of-pages) - (insert (format "[[./%s][Older posts]]\n" - (ennum-index-filename (file-name-nondirectory filename-prefix) - tongue nil (1+ page-number))))) - (org-export-to-file 'html output-file))) - (seq-partition posts posts-per-page) - page-numbers - output-files) - (copy-file (first output-files) - (ennum-add-tongue-suffix (format "%s.html" filename-prefix) tongue)))))) + (page-numbers (number-sequence 1 number-of-pages)) + (output-files (seq-map (apply-partially + 'ennum-index-filename filename-prefix tongue "html") + page-numbers)) + (outputs (seq-mapn (lambda (post page-number output-file) + (ennum-publish-index-page + filename-prefix title + (= page-number number-of-pages) + post page-number output-file)) + (seq-partition posts posts-per-page) + page-numbers + output-files))) + (cons (ennum-publish-index-home (first outputs) filename-prefix tongue) + outputs))) (defun ennum--absolute-uri (path) (format "%s://%s/%s" @@ -656,14 +668,14 @@ as keys. Keys are compared using `equal'." (ennum-setting :blog-license) (seq-take posts (ennum-setting :atom-feed-number-of-posts)))) ;; Publish indices - (seq-map + (seq-mapcat (pcase-lambda (`(,tongue . ,posts)) (ennum-publish-index "index" blog-title posts-per-page posts)) (seq-group-by 'ennum-post-language posts)) ;; Publish tag indices (seq-mapcat (pcase-lambda (`(,tag . ,posts)) - (seq-map + (seq-mapcat (pcase-lambda (`(,tongue . ,posts)) (ennum-publish-index (ennum--file-join (ennum-setting :tag-directory) tag) -- cgit v1.2.3