;; -*- 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)