From 4b373b2e209feb60670f44be77d87a8bc4afe6d7 Mon Sep 17 00:00:00 2001 From: Arun Isaac Date: Mon, 26 Aug 2019 01:14:12 +0530 Subject: Abstract out temporary directory creation. * ennu.el (ennu-with-temporary-directory): New macro. (ennu-publish): Use ennu-with-temporary-directory to create temporary directory. --- ennu.el | 123 ++++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 65 insertions(+), 58 deletions(-) diff --git a/ennu.el b/ennu.el index d373d8c..8e02cea 100644 --- a/ennu.el +++ b/ennu.el @@ -348,69 +348,76 @@ last form in BODY." (defun ennu-post-tongue (post) (plist-get (ennu-post-metadata post) :language)) +(defmacro ennu-with-temporary-directory (temporary-directory &rest body) + "Create temporary directory, evaluate BODY with the absolute +path of that directory assigned to TEMPORARY-DIRECTORY and +finally delete the temporary directory. The value returned is the +value of the last form in BODY." + (declare (indent defun)) + `(let ((,temporary-directory (make-temp-file "ennu" t))) + (unwind-protect ,@body + (delete-directory ,temporary-directory t)))) + (defun ennu-publish () (interactive) (let ((make-backup-files nil) (blog-title (ennu-setting :blog-title)) (blog-subtitle (ennu-setting :blog-subtitle)) (posts-per-page (ennu-setting :index-posts-per-page))) - (let ((temporary-directory (make-temp-file "ennu" t))) - (unwind-protect - (progn - (seq-do - (apply-partially 'ennu--do-operation temporary-directory) - (append - (let* ((posts (ennu-posts (ennu-setting :posts-directory))) - (tags (seq-uniq (seq-mapcat 'ennu-post-tags posts))) - (tongues (seq-uniq (seq-map 'ennu-post-tongue posts)))) - (append - ;; Publish posts - (seq-map 'ennu-publish-post posts) - ;; Publish feed - (list (ennu-publish-feed (ennu-setting :atom-feed-file) - blog-title blog-subtitle - (ennu-setting :blog-license) - (seq-take posts (ennu-setting :atom-feed-number-of-posts)))) - ;; Publish indices - (seq-map - (lambda (tongue) - (ennu-publish-index - "index" tongue blog-title blog-subtitle posts-per-page - (seq-filter (lambda (post) - (string= tongue (ennu-post-tongue post))) - posts))) - tongues) - (seq-map - (lambda (tag) - (let ((posts (seq-filter (lambda (post) - (member tag (ennu-post-tags post))) - posts))) - (ennu-publish-index - (ennu--expand-relative tag (ennu-setting :tag-directory)) - (ennu-post-tongue (first posts)) tag "" posts-per-page posts))) - tags) - ;; Publish links - (seq-map 'ennu-publish-link - (seq-uniq (seq-mapcat 'ennu-post-links posts))) - ;; Publish thumbnails - (seq-map - (apply-partially 'ennu-publish-image (list (ennu-setting :thumbnail-image-width))) - (seq-map (lambda (image) - (ennu--expand-relative image (ennu-setting :images-directory))) - (seq-uniq (seq-filter 'identity (seq-map 'ennu-post-thumbnail posts))))))) - ;; Publish pages - (when-let ((pages-directory (ennu-setting :pages-directory))) - (seq-map (apply-partially 'ennu-publish-page pages-directory) - (seq-map (apply-partially 'string-remove-prefix - (file-name-as-directory (expand-file-name default-directory))) - (directory-files-recursively pages-directory "\\.org$")))) - ;; Publish unattached static files - (seq-map 'ennu-publish-static-file - (ennu-setting :unattached-static-files)))) - ;; Replace old output directory - (let ((output (ennu-setting :output-directory))) - (delete-directory output t) - (rename-file temporary-directory output t))) - (delete-directory temporary-directory t))))) + (ennu-with-temporary-directory temporary-directory + (seq-do + (apply-partially 'ennu--do-operation temporary-directory) + (append + (let* ((posts (ennu-posts (ennu-setting :posts-directory))) + (tags (seq-uniq (seq-mapcat 'ennu-post-tags posts))) + (tongues (seq-uniq (seq-map 'ennu-post-tongue posts)))) + (append + ;; Publish posts + (seq-map 'ennu-publish-post posts) + ;; Publish feed + (list (ennu-publish-feed (ennu-setting :atom-feed-file) + blog-title blog-subtitle + (ennu-setting :blog-license) + (seq-take posts (ennu-setting :atom-feed-number-of-posts)))) + ;; Publish indices + (seq-map + (lambda (tongue) + (ennu-publish-index + "index" tongue blog-title blog-subtitle posts-per-page + (seq-filter (lambda (post) + (string= tongue (ennu-post-tongue post))) + posts))) + tongues) + (seq-map + (lambda (tag) + (let ((posts (seq-filter (lambda (post) + (member tag (ennu-post-tags post))) + posts))) + (ennu-publish-index + (ennu--expand-relative tag (ennu-setting :tag-directory)) + (ennu-post-tongue (first posts)) tag "" posts-per-page posts))) + tags) + ;; Publish links + (seq-map 'ennu-publish-link + (seq-uniq (seq-mapcat 'ennu-post-links posts))) + ;; Publish thumbnails + (seq-map + (apply-partially 'ennu-publish-image (list (ennu-setting :thumbnail-image-width))) + (seq-map (lambda (image) + (ennu--expand-relative image (ennu-setting :images-directory))) + (seq-uniq (seq-filter 'identity (seq-map 'ennu-post-thumbnail posts))))))) + ;; Publish pages + (when-let ((pages-directory (ennu-setting :pages-directory))) + (seq-map (apply-partially 'ennu-publish-page pages-directory) + (seq-map (apply-partially 'string-remove-prefix + (file-name-as-directory (expand-file-name default-directory))) + (directory-files-recursively pages-directory "\\.org$")))) + ;; Publish unattached static files + (seq-map 'ennu-publish-static-file + (ennu-setting :unattached-static-files)))) + ;; Replace old output directory + (let ((output (ennu-setting :output-directory))) + (delete-directory output t) + (rename-file temporary-directory output t))))) (provide 'ennu) -- cgit v1.2.3