Want to contribute? Fork me on Codeberg.org!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
3.3 KiB

;; Only for running rebuild from within Emacs
(setq original-buffer (current-buffer))
;; Set working directory to the directory of this script
(setq working-directory (file-name-directory load-file-name))
(setq default-directory working-directory)
;; Set ~/.emacs.d/elpa path. ./.packages is relative to default-directory
(require 'package)
(setq package-user-dir (expand-file-name "./.packages"))
(setq package-archives '(("melpa" . "https://melpa.org/packages/")
("elpa" . "https://elpa.gnu.org/packages/")))
;; Initialize the package system
(package-initialize)
(unless package-archive-contents
(package-refresh-contents))
;; Install dependencies
(package-install 'ox-hugo)
(package-install 'citeproc)
(require 'oc-csl)
;; Set ieee-with-url as default export citation preprocessor
;; https://kristofferbalintona.me/posts/202206141852/
(setq org-cite-global-bibliography '("~/Projects/blog.elnu.com/bibliography.bib"))
(setq org-cite-export-processors
'((t . (csl "~/Projects/blog.elnu.com/ieee-with-url.csl"))))
;; Set Hugo directory
;; we can't use the content directory here because we'll need to rename files
;; When running hugo server, this would cause unnecessary rebuilds
(setq org-hugo-base-dir "/tmp/ox-hugo/")
;; Make sure ~key-binding~ is rendered as <kbd>key-binding</kbd> not `key-binding`
(setq org-hugo-use-code-for-kbd t)
;; Create required static folder
(make-directory (concat org-hugo-base-dir "static") :parents)
;; Delete old markdown files
(dolist (file (directory-files-recursively "content" "\\.md$"))
(unless (file-exists-p (concat (file-name-sans-extension file) ".org"))
(delete-file file)))
;; Generate
(dolist (file (directory-files-recursively "content" "\\.org$"))
;; Open file
(find-file file)
;; Convert to markdown
(org-hugo-export-wim-to-md)
;; Store markdown file name: path/to/file.org -> file.md
(setq file-name (concat (file-name-sans-extension (file-name-nondirectory file)) ".md"))
;; Reset default-directory, it becomes the parent of the file
(setq default-directory working-directory)
;; Target markdown file
(setq target (concat (file-name-directory file) file-name))
;; Check if creating new file
(setq new (not (file-exists-p target)))
;; Make file writable
(unless new (set-file-modes target #o644))
;; Open temporary buffer
(with-temp-buffer
;; Load generated markdown
(insert-file-contents (concat org-hugo-base-dir "content/posts/" file-name))
;; Fix image paths: /ox-hugo/image.png -> image.png
(while (re-search-forward "/ox-hugo/\\(.*\\)" nil t)
(replace-match "\\1"))
;; Fix image formatting
;; Write to target unless generated markdown matches old content
;; It would be simpler to run file-equal-p,
;; but since we already have one of the files loaded that would be inefficient
(unless (and (not new) (equal (buffer-string) (with-temp-buffer
(insert-file-contents target)
(buffer-string))))
(write-region (point-min) (point-max) target nil)
))
;; Make file read-only
(set-file-modes target #o444)
;; Close file unless original buffer
(unless (eq (current-buffer) original-buffer)
(kill-buffer)))
;; Clean up temporary directory
(delete-directory org-hugo-base-dir t)
;; Switch back to original buffer
(switch-to-buffer original-buffer)