;; -*- lexical-binding: t -*- (require 'ox) (require 'subr-x) (require 'xmlgen) (defun expand-file-name* (name default-directory) (expand-file-name name (concat "/" default-directory))) (org-export-define-derived-backend 'ennu-html 'html :translate-alist '((inner-template . ennu-html-inner-template)) :options-alist '((:html-inline-image-rules nil nil '(("image" . "\\.\\(jpeg\\|jpg\\|png\\|gif\\|svg\\)\\'")) t) (:summary "SUMMARY" nil nil parse) (:thumbnail "THUMBNAIL" nil nil t) (:translation-group "TRANSLATION_GROUP" nil nil t))) (defun ennu-html-inner-template (contents info) (concat ;; Table of contents (let ((depth (plist-get info :with-toc))) (when depth (org-html-toc depth info))) ;; Beginning of h-entry "
" ;; Title (format "

%s

\n" (org-export-data (plist-get info :title) info)) ;; Author and date (let ((author (when (plist-get info :with-author) (plist-get info :author))) (date (when (plist-get info :with-date) (org-export-get-date info)))) (when (or author date) (xmlgen `(p "Published" ,@(when author `(" by " (a :class "p-author h-card" :href ,(ennu--absolute-uri "") ,(car (plist-get info :author))))) ,@(when date `(" on " (time :class "dt-published" :datetime ,(org-export-get-date info "%Y-%m-%d 12:00:00") ,(org-export-get-date info "%B %d, %Y")))))))) ;; Interlanguage language links (format "

In other languages: %s

" (mapconcat (lambda (translation) (let ((lang (ennu-post-language translation)) (slug (ennu-post-slug translation))) (replace-regexp-in-string "Tags: %s

" (mapconcat (lambda (tag) (replace-regexp-in-string "
%s" (org-export-data (plist-get info :summary) info)) ;; Document contents (format "
%s
" contents) ;; Footnotes section (org-html-footnote-section info) "
")) ;; TODO: Pass title through org-export-data-with-backend or something ;; similar in order to export org syntax in title (defun ennu-export-post (path desc backend) (let ((filename (concat (expand-file-name path (ennu-setting :posts-directory)) ".org"))) (xmlgen `(a :href ,(expand-file-name* path (ennu-setting :posts-directory)) ,(or desc (ennu-post-title (ennu-read-post filename))))))) (org-link-set-parameters "post" :export 'ennu-export-post) (defun ennu-export-image (path desc backend) (let ((img `(img :src ,(expand-file-name* (ennu-image-output-filename path (ennu-setting :default-image-width)) (ennu-setting :images-directory))))) (xmlgen (if (ennu-setting :image-link-width) `(a :href ,(expand-file-name* (ennu-image-output-filename path (ennu-setting :image-link-width)) (ennu-setting :images-directory)) ,img) img)))) (org-link-set-parameters "image" :export 'ennu-export-image) (defun ennu-export-thumbnail (path desc backend) (xmlgen `(img :src ,(expand-file-name* (ennu-image-output-filename path (ennu-setting :thumbnail-image-width)) (ennu-setting :images-directory))))) (org-link-set-parameters "thumbnail" :export 'ennu-export-thumbnail) (defun ennu-export-video (path desc backend) (let ((video-directory (ennu-setting :video-directory))) (xmlgen `(video :src ,(expand-file-name* path video-directory) :poster ,(expand-file-name* (ennu-video-poster path) video-directory) :preload "none" :controls "")))) (org-link-set-parameters "video" :export 'ennu-export-video) (defun ennu-export-static (path desc backend) (xmlgen `(a :href ,(expand-file-name* path (ennu-setting :static-directory)) ,desc))) (org-link-set-parameters "static" :export 'ennu-export-static) (org-link-set-parameters "tangle" :export 'ennu-export-static) (defun ennu-export-tag (tag desc backend) (xmlgen `(a :href ,(expand-file-name* tag (ennu-setting :tag-directory)) ,(or desc tag)))) (org-link-set-parameters "tag" :export 'ennu-export-tag) (provide 'ennu-html)