From 5789814dec3b1a7fe46902a8f477d585b36de6b4 Mon Sep 17 00:00:00 2001 From: sterni Date: Thu, 27 Jan 2022 16:06:28 +0100 Subject: fix(users/sterni/mblog): handle RFC2047 in subjects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Non ASCII Subjects will use RFC2047 to encode their content. Using mime4cl's parse-RFC2047-text we obtain a list of ASCII strings and byte vectors tagged with their encoding. Using babel we can then decode the byte sequence, assuming the encoding is named the same in babel and RFC2047 (which it is for UTF-8 at least…). Change-Id: I2840672409452bd194fb1635721e338364d9b484 Reviewed-on: https://cl.tvl.fyi/c/depot/+/5078 Reviewed-by: sterni Tested-by: BuildkiteCI --- users/sterni/mblog/default.nix | 1 + users/sterni/mblog/note.lisp | 18 +++++++++++++++++- users/sterni/mblog/packages.lisp | 2 ++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/users/sterni/mblog/default.nix b/users/sterni/mblog/default.nix index f8ba70b90bd1..cc605d7cd2ae 100644 --- a/users/sterni/mblog/default.nix +++ b/users/sterni/mblog/default.nix @@ -17,6 +17,7 @@ depot.nix.buildLisp.program { default = depot.nix.buildLisp.bundled "asdf"; } depot.third_party.lisp.alexandria + depot.third_party.lisp.babel depot.third_party.lisp.closure-html depot.third_party.lisp.cl-date-time-parser depot.third_party.lisp.cl-who diff --git a/users/sterni/mblog/note.lisp b/users/sterni/mblog/note.lisp index 0091e97b083f..93d9231aa293 100644 --- a/users/sterni/mblog/note.lisp +++ b/users/sterni/mblog/note.lisp @@ -66,6 +66,20 @@ :test #'string-equal)) (string-equal (cdr uniform-id) "com.apple.mail-note"))) +(defun decode-RFC2047-to-string (input) + (apply + #'concatenate + (cons 'string + (mapcar + (lambda (el) + (etypecase el + (cons (babel:octets-to-string + (car el) + :encoding (babel-encodings:get-character-encoding + (intern (string-upcase (cdr el)) 'keyword)))) + (string el))) + (mime:parse-RFC2047-text input))))) + (defun make-apple-note (msg) (check-type msg mime-message) @@ -73,7 +87,9 @@ (error "Passed message is not an Apple Note according to headers")) (let ((text-part (mime:find-mime-text-part msg)) - (subject (find-mime-message-header "Subject" msg)) + (subject (when-let ((val (find-mime-message-header "Subject" msg))) + ;; TODO(sterni): mime4cl should do this + (decode-RFC2047-to-string val))) (uuid (when-let ((val (find-mime-message-header "X-Universally-Unique-Identifier" msg))) diff --git a/users/sterni/mblog/packages.lisp b/users/sterni/mblog/packages.lisp index 1d5aa07313ca..7e357f89ffac 100644 --- a/users/sterni/mblog/packages.lisp +++ b/users/sterni/mblog/packages.lisp @@ -8,6 +8,8 @@ (defpackage :note (:use :common-lisp + :babel + :babel-encodings :closure-html :who :cl-date-time-parser -- cgit 1.4.1