;; -*- lexical-binding: t -*-
(require 'ox)
(require 'ox-gemini)
(require 'subr-x)
(require 'xmlgen)
(require 'ennum-lang)
(defun expand-file-name* (name base-directory)
(expand-file-name name (concat "/" base-directory)))
(org-export-define-derived-backend 'ennum-gemini 'gemini
:translate-alist
'((inner-template . ennum-gemini-inner-template)
(section . ennum-gemini-section)
(paragraph . ennum-gemini-paragraph)
(link . ennum-gemini-link))
:options-alist
'((:summary "SUMMARY" nil nil parse)
(:thumbnail "THUMBNAIL" nil nil t)
(:translation-group "TRANSLATION_GROUP" nil nil t)))
(defun ennum-gemini-inner-template (contents info)
(concat
;; Date
(org-export-get-date info "%B %d, %Y\n\n")
;; Interlanguage language links
(mapconcat (pcase-lambda (`(,lang . ,slug))
(ennum-link-export-post
slug
(map-elt ennum--iso-639-1-alist lang)
(org-export-backend-name (plist-get info :back-end))
info))
(ennum-post-translations (plist-get info :ennum-post))
"\n")
"\n\n"
;; Body
contents
;; Tags
"\nTags:\n"
(mapconcat (lambda (tag)
(ennum-link-export-tag
(ennum-add-tongue-suffix tag (plist-get info :language))
tag
(org-export-backend-name (plist-get info :back-end))
info))
(plist-get info :filetags)
"\n")))
(defun ennum-gemini-section (section contents info)
;; Render links at the end of the section, but only if they are not
;; image, video or pdf links.
(pcase (seq-remove (lambda (link)
(member (org-element-property :type link)
(list "image" "video" "pdf")))
(org-ascii--unique-links section info))
('()
contents)
(links
(org-remove-indentation
(concat (org-element-normalize-string contents)
"\n\n"
(org-gemini--describe-links
links
(org-ascii--current-text-width section info)
info))))))
(defun ennum-gemini-paragraph (paragraph contents info)
;; If the paragraph contains an image or video link, then it is an
;; image paragraph; tag on the caption.
(if (= (length (org-element-map paragraph '(link)
(lambda (link)
(and (member (org-element-property :type link)
(list "image" "video"))
link))))
1)
(concat (string-trim contents)
" "
(org-export-data (org-export-get-caption paragraph)
info))
;; Else, fall back to the gemini backend.
(org-gemini-paragraph paragraph contents info)))
(defun ennum-gemini-link (link desc info)
;; Try a custom link type before falling back to the gemini backend.
(or (org-export-custom-protocol-maybe link desc 'ennum-gemini info)
(org-gemini-link link desc info)))
(provide 'ennum-gemini)