diff options
Diffstat (limited to 'ennum.el')
-rw-r--r-- | ennum.el | 108 |
1 files changed, 62 insertions, 46 deletions
@@ -131,16 +131,39 @@ respectively by - and _, and the pad character = is optional." (ennum-input items)))) (cl-defstruct (ennum-post (:constructor ennum-make-post) - (:copier nil)) + (:copier ennum-copy-post)) filename slug author date language links tangle - summary tags thumbnail title translation-group video-posters) + summary tags thumbnail title translation-group translations + video-posters) (defun ennum-posts (posts-directory) - (sort (ennum--filter-map (lambda (file) - (when (string= (file-name-extension file) "org") - (ennum-read-post - (ennum--expand-relative file (ennum-setting :posts-directory))))) - (ennum-directory-files (ennum-setting :posts-directory))) + (sort (seq-mapcat + ;; Set translations slot of post objects. + (pcase-lambda (`(,_ . ,posts)) + (let ((translations + (seq-map (lambda (post) + (cons (ennum-post-language post) + (ennum-post-slug post))) + posts))) + (seq-map (lambda (post) + (let ((post-copy (ennum-post-copy post))) + (setf (ennum-post-translations post-copy) + (seq-remove (pcase-lambda (`(,_ . ,slug)) + (string= (ennum-post-slug post) + slug)) + translations)) + post-copy)) + posts))) + ;; Read posts from org files and group them by translation + ;; group. + (seq-group-by + 'ennum-post-translation-group + (ennum--filter-map + (lambda (file) + (when (string= (file-name-extension file) "org") + (ennum-read-post + (ennum--expand-relative file (ennum-setting :posts-directory))))) + (ennum-directory-files (ennum-setting :posts-directory))))) 'ennum-later-post-p)) (defun ennum-later-post-p (post1 post2) @@ -236,42 +259,37 @@ non-nil, include directories in the output." (defun ennum--org-output-filename (filename) (concat (file-name-sans-extension filename) ".html")) -(defun ennum-publish-post (posts) - (seq-mapcat (lambda (post) - (append - (list - (ennum-exp - (ennum-input (seq-map (lambda (post) - (ennum-intern (ennum-post-filename post))) - posts)) - (let ((input-org-file (ennum-input (ennum-intern (ennum-post-filename post)))) - (output-file - (ennum--org-output-filename (ennum-post-filename post)))) - (ennum-mkdir-p (file-name-directory output-file)) - (let ((system-time-locale (map-elt (ennum-setting :locale-alist) - (ennum-post-language post) nil 'string=))) - (ennum-with-file-contents input-org-file - ;; TODO: Centralize these with feed generation - (org-export-to-file - 'ennum-html output-file nil nil nil nil - (list :ennum-translations (seq-remove (apply-partially 'equal post) posts) - :ennum-video-posters (ennum-post-video-posters post)))))))) - (when (ennum-post-tangle post) - (list - (ennum-exp - ;; TODO: Handle tangle outputs that are nested - ;; into directories, and when each tangle output - ;; is nested into a different directory. - (let* ((input-org-file (ennum-input (ennum-intern (ennum-post-filename post)))) - (post-file-copy - (expand-file-name - (file-name-nondirectory input-org-file) - (ennum-setting :static-directory)))) - (ennum-copy input-org-file post-file-copy) - (org-babel-tangle-file post-file-copy) - (delete-file post-file-copy))))) - (seq-mapcat 'ennum-publish-link (ennum-post-links post)))) - posts)) +(defun ennum-publish-post (post) + (append + (list + (ennum-exp + (let ((input-org-file (ennum-input (ennum-intern (ennum-post-filename post)))) + (output-file + (ennum--org-output-filename (ennum-post-filename post)))) + (ennum-mkdir-p (file-name-directory output-file)) + (let ((system-time-locale (map-elt (ennum-setting :locale-alist) + (ennum-post-language post) nil 'string=))) + (ennum-with-file-contents input-org-file + ;; TODO: Centralize these with feed generation + (org-export-to-file + 'ennum-html output-file nil nil nil nil + (list :ennum-translations (ennum-post-translations post) + :ennum-video-posters (ennum-post-video-posters post)))))))) + (when (ennum-post-tangle post) + (list + (ennum-exp + ;; TODO: Handle tangle outputs that are nested + ;; into directories, and when each tangle output + ;; is nested into a different directory. + (let* ((input-org-file (ennum-input (ennum-intern (ennum-post-filename post)))) + (post-file-copy + (expand-file-name + (file-name-nondirectory input-org-file) + (ennum-setting :static-directory)))) + (ennum-copy input-org-file post-file-copy) + (org-babel-tangle-file post-file-copy) + (delete-file post-file-copy))))) + (seq-mapcat 'ennum-publish-link (ennum-post-links post)))) (defun ennum-publish-generic (other-files-directory file) (ennum-exp @@ -560,9 +578,7 @@ as keys. Keys are compared using `equal'." (ennum-store-item-union (append ;; Publish posts - (seq-mapcat (pcase-lambda (`(,translation-group . ,posts)) - (ennum-publish-post posts)) - (seq-group-by 'ennum-post-translation-group posts)) + (seq-mapcat 'ennum-publish-post posts) ;; Publish feed (list (ennum-publish-feed (ennum-setting :atom-feed-file) blog-title |