aboutsummaryrefslogtreecommitdiffstats
path: root/oni-org/oni-org.el
diff options
context:
space:
mode:
authorGravatar Tom Willemse2023-07-28 12:05:49 -0700
committerGravatar Tom Willemse2023-07-28 12:05:49 -0700
commit346f4598a57bafb65c29a002b20be0f3254db5e9 (patch)
treebe3741b3e61f70fdbc6ddd56944e1d98d05351e6 /oni-org/oni-org.el
parentff837f30df25df497987346e48890d910692e198 (diff)
downloademacs-config-346f4598a57bafb65c29a002b20be0f3254db5e9.tar.gz
emacs-config-346f4598a57bafb65c29a002b20be0f3254db5e9.zip
[oni-org] Add a dynamic block for showing a Mastodon post as a quote
Diffstat (limited to 'oni-org/oni-org.el')
-rw-r--r--oni-org/oni-org.el41
1 files changed, 40 insertions, 1 deletions
diff --git a/oni-org/oni-org.el b/oni-org/oni-org.el
index 9267d17..d6f0ffb 100644
--- a/oni-org/oni-org.el
+++ b/oni-org/oni-org.el
@@ -4,7 +4,7 @@
;; Author: Tom Willemse <tom@ryuslash.org>
;; Keywords: local
-;; Version: 2023.0716.233213
+;; Version: 2023.0728.120517
;; Package-Requires: (oni-yasnippet oni-alert oni-hydra org org-bullets org-edna diminish all-the-icons olivetti form-feed org-pretty-table ob-async)
;; This program is free software; you can redistribute it and/or modify
@@ -1285,5 +1285,44 @@ same code all the time."
%:link"
:immediate-finish t))
+;;; Mastodon post dynamic block
+
+(defun oni-org-dblock-write-mastodon-post (params)
+ (let* ((url (url-generic-parse-url (map-elt params :url)))
+ (status-id (car (last (split-string (url-filename url) "/")))))
+ (setf (url-filename url) (format "/api/v1/statuses/%s" status-id))
+ (let ((json (with-current-buffer (url-retrieve-synchronously url)
+ (goto-char (point-min))
+ (search-forward "\n\n")
+ (json-parse-buffer))))
+ (insert (with-temp-buffer
+ (insert (map-elt json "content"))
+ (let ((dom (libxml-parse-html-region (point-min) (point-max))))
+ (erase-buffer)
+ (insert "#+begin_quote")
+ (let ((start (point)))
+ (shr-insert-document dom)
+ (forward-char -1)
+ (insert " ---" (map-elt (map-elt json "account") "display_name"))
+ (org-escape-code-in-region start (point))
+ (save-excursion
+ (goto-char start)
+ (delete-all-space)
+ (insert "\n"))
+ (let ((fill-column (point-max)))
+ (fill-region start (point)))))
+ (forward-char)
+ (insert "#+end_quote")
+ (buffer-string))))))
+
+(defun oni-org-insert-mastodon-post (url)
+ "Create a dynamic block showing a Mastodon post from URL."
+ (interactive "MURL: ")
+ (org-create-dblock `(:name "oni-mastodon-post" :url ,url))
+ (org-update-dblock))
+
+(defalias 'org-dblock-write:oni-mastodon-post 'oni-org-dblock-write-mastodon-post)
+(org-dynamic-block-define "oni-mastodon-post" #'oni-org-insert-mastodon-post)
+
(provide 'oni-org)
;;; oni-org.el ends here