diff options
| author | Jakob L. Kreuze <jakob.kreuze@us.af.mil> | 2022-11-06 17:08:09 -0500 |
|---|---|---|
| committer | Jakob L. Kreuze <zerodaysfordays@sdf.org> | 2022-11-15 18:58:04 -0500 |
| commit | 6da65fa6afcd8d11e8d1e352fa0a4acfcf39c49f (patch) | |
| tree | abbd49182a76c731bbb39a6e34b313d5e255502a /haunt/jakob/utils/comments.scm | |
| parent | d84e451c8cf3aa181867736acfa3d533302d0288 (diff) | |
[dynamic] Initital static builder for comments
Diffstat (limited to 'haunt/jakob/utils/comments.scm')
| -rw-r--r-- | haunt/jakob/utils/comments.scm | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/haunt/jakob/utils/comments.scm b/haunt/jakob/utils/comments.scm new file mode 100644 index 0000000..a1deea7 --- /dev/null +++ b/haunt/jakob/utils/comments.scm @@ -0,0 +1,98 @@ +;;; Copyright © 2019 - 2022 Jakob L. Kreuze <zerodaysfordays@sdf.org> +;;; +;;; This program is free software; you can redistribute it and/or +;;; modify it under the terms of the GNU General Public License as +;;; published by the Free Software Foundation; either version 3 of the +;;; License, or (at your option) any later version. +;;; +;;; This program is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;; General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with this program. If not, see +;;; <http://www.gnu.org/licenses/>. + +(define-module (jakob utils comments) + ;; #:use-module (dynamic capabilities comments) + #:use-module (dynamic util) + #:use-module (hashing md5) + #:use-module (ice-9 receive) + #:use-module (ice-9 iconv) + #:use-module (ice-9 match) + #:use-module (srfi srfi-19) + #:use-module (srfi srfi-43) + #:use-module (json) + #:use-module (web client) + #:use-module (web response) + #:export (render-comment-view fetch-comments)) + +(define (gravatar-url email) + (format #f "https://www.gravatar.com/avatar/~a" (md5->string (md5 (string->bytevector (string-trim-both (string-downcase email)) "utf8"))))) +;; (chain email +;; (string-downcase _) +;; (string-trim-both _) +;; (string->bytevector _ "utf8") +;; (md5 _)) + +(define (format-comment comment) + "Format `comment', an alist, as SXML for a comment-type interaction" + (define (strip uri) + "Attempt to remove any sort of protocol specification from `uri'" + (let* ((needle "://") + (index (string-contains uri needle))) + (if index + (strip (substring uri (+ index (string-length needle)))) + uri))) + (let* ((author-name (assoc-ref comment 'name)) + (author-url (assoc-ref comment 'url)) + (author-photo (gravatar-url (assoc-ref comment 'email))) + (publish-datetime (assoc-ref comment 'published)) + (content-text (assoc-ref comment 'comment)) + (content-reactions (assoc-ref comment 'reactions))) + `(li (@ (class "p-comment h-cite comment comment-source-internal")) + (img (@ (class "comment-source-identifier") + (alt "Icon for comments posted on jakob.space") + (src "/static/image/lambda.svg"))) + (div (@ (class "p-author h-card author")) + (img (@ (class "u-photo") (src ,author-photo))) + (span (@ (class author-name)) ,author-name) + ,@(if author-url + `((a (@ (class "author-url") + (href ,author-url)) + "(" ,(strip author-url) ")")) + `())) + (div (@ (class "e-content p-name comment-content")) + ,content-text) + (div (@ (class "metaline")) + (a (@ (class "u-url") + (href ,author-url)) + (time (@ (class "dt-published") + (datetime ,publish-datetime)) + ,(date->string + (string->date publish-datetime "~Y~m~d~H~M~S") + "~B ~e, ~Y at ~H:~M")))) + (ul (@ (class "comment-reactions")) + ,@(map (match-lambda + ((emote . count) + `(li ,(format "~a (~a)" emote count)))) + content-reactions))))) + +(define (render-comment-view response) + "Render `response', the output of `fetch-webmentions', as SXML" + (map format-comment response)) + +(define (fetch-comments slug) + "Blocking call to webmention.io to retrieve a vector of all Webmentions for `slug'" + (get-comments-by-slug slug) + ;; (list '((id . 1) + ;; (published . "20220514122120") + ;; (name . "Jakob") + ;; (subject . "Test") + ;; (email . "jakob@memeware.net") + ;; (comment . "Test") + ;; (url . "jakob.space") + ;; (reactions . (("🎖️" . 2))))) + ) +;; dynamic |