about summary refs log tree commit diff
path: root/ennum-link.el
diff options
context:
space:
mode:
Diffstat (limited to 'ennum-link.el')
-rw-r--r--ennum-link.el148
1 files changed, 148 insertions, 0 deletions
diff --git a/ennum-link.el b/ennum-link.el
new file mode 100644
index 0000000..4c514b5
--- /dev/null
+++ b/ennum-link.el
@@ -0,0 +1,148 @@
+;; -*- 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)