;; -*- lexical-binding: t -*- (defun ennum-link-find (type path info) "Find link of TYPE and PATH in post object stored in :ennum-posts of property list INFO." (seq-find (lambda (link) (and (eq (ennum-link-type link) type) (string= (ennum-link-path link) path))) (ennum-post-links (plist-get info :ennum-post)))) (defmacro ennum-link-follow (path) `(ennum-with-current-directory (ennum-setting :working-directory) (find-file ,path))) ;; TODO: Pass title through org-export-data-with-backend or something ;; similar in order to export org syntax in title ;; See fist-2017 post (defun ennum-link-export-post (path desc backend info) (let ((post-url (url-encode-url (expand-file-name* path (ennum-setting :posts-directory))))) (pcase backend ((or 'ennum-html 'html) (xmlgen `(a :href ,post-url ,desc))) ((or 'ennum-gemini 'gemini) (format "=> %s.gmi %s" post-url desc))))) (defun ennum-link-follow-post (path) (ennum-link-follow (expand-file-name (concat path ".org") (ennum-setting :posts-directory)))) (defun ennum-link-export-image (path desc backend info) (let ((image-url (url-encode-url (expand-file-name* (ennum-image-output-filename path (ennum-setting :image-width)) (ennum-setting :images-directory)))) (image-link-url (expand-file-name* (ennum-image-output-filename path (ennum-setting :image-link-width)) (ennum-setting :images-directory)))) (pcase backend ((or 'ennum-html 'html) (xmlgen `(a :href ,image-link-url (img :src ,image-url)))) ((or 'ennum-gemini 'gemini) (format "=> %s" image-link-url))))) (defun ennum-link-follow-image (path) (ennum-link-follow (expand-file-name path (ennum-setting :images-directory)))) (defun ennum-link-export-thumbnail (path _desc backend info) (let ((image-url (url-encode-url (expand-file-name* (ennum-image-output-filename path (ennum-setting :image-thumbnail-width)) (ennum-setting :images-directory))))) (pcase backend ((or 'ennum-html 'html) (xmlgen `(img :src ,image-url))) ((or 'ennum-gemini 'gemini) (format "=> %s" image-url))))) (defun ennum-link-export-video (path desc backend info) (let ((video-url (url-encode-url (expand-file-name* path (ennum-setting :videos-directory))))) (pcase backend ((or 'ennum-html 'html) (xmlgen `(video :src ,video-url :poster ,(url-encode-url (expand-file-name* (ennum-video-link-poster (ennum-link-find 'video path info)) (ennum-setting :images-directory))) :preload "none" :controls ""))) ((or 'ennum-gemini 'gemini) (format "=> %s" video-url))))) (defun ennum-link-follow-video (path) (ennum-link-follow (expand-file-name path (ennum-setting :videos-directory)))) (defun ennum-link-export-pdf (path desc backend info) (let ((link-path (url-encode-url (expand-file-name* path (ennum-setting :static-directory))))) (pcase backend ((or 'ennum-html 'html) (xmlgen `(object :data ,link-path :type "application/pdf" :width ,(ennum-setting :pdf-width) :height ,(ennum-setting :pdf-height) "Download " (a :href ,link-path ,path)))) ((or 'ennum-gemini 'gemini) (format "=> %s" link-path))))) (defun ennum-link-export-static (path desc backend info) (let ((file-url (url-encode-url (expand-file-name* path (ennum-setting :static-directory))))) (pcase backend ((or 'ennum-html 'html) (xmlgen `(a :href ,file-url ,desc))) ((or 'ennum-gemini 'gemini) (format "=> %s %s" file-url desc))))) (defun ennum-link-export-tag (tag desc backend info) (let ((tag-url (url-encode-url (expand-file-name* tag (ennum-setting :tag-directory))))) (pcase backend ((or 'ennum-html 'html) (xmlgen `(a :href ,tag-url ,(or desc tag)))) ((or 'ennum-gemini 'gemini) (format "=> %s.gmi %s" tag-url (or desc tag)))))) (org-link-set-parameters "post" :export 'ennum-link-export-post :follow 'ennum-link-follow-post) (org-link-set-parameters "image" :export 'ennum-link-export-image :follow 'ennum-link-follow-image) (org-link-set-parameters "thumbnail" :export 'ennum-link-export-thumbnail :follow 'ennum-link-follow-image) (org-link-set-parameters "video" :export 'ennum-link-export-video :follow 'ennum-link-follow-video) (org-link-set-parameters "pdf" :export 'ennum-link-export-pdf) (org-link-set-parameters "static" :export 'ennum-link-export-static) (org-link-set-parameters "tangle" :export 'ennum-link-export-static) (org-link-set-parameters "tag" :export 'ennum-link-export-tag) (provide 'ennum-link)