about summary refs log tree commit diff
path: root/third_party
diff options
context:
space:
mode:
authorsterni <sternenseemann@systemli.org>2021-08-22T12·32+0200
committersterni <sternenseemann@systemli.org>2021-09-12T21·39+0000
commit7f31562acfc9a83e042a506bf7bdaca5de4e789a (patch)
tree1918ec4cf9c396f16f26b3ef06f502c3bb4f02d5 /third_party
parent62fa36c9c2ef79b9b2aefaec8eac71665de45847 (diff)
feat(3p/lisp/mime4cl): search for first (default) mime text part r/2853
Adds a simple generic function find-mime-text-part which returns the
first suitable text/* part in any MIME part it is given.

Has no meaningful alternatives handling at the moment: It will pick the
first text part and doesn't allow specifying a preference.

Change-Id: Id9b113b3ef3ca1a575ce8f3582a4f85e30edfb43
Reviewed-on: https://cl.tvl.fyi/c/depot/+/3379
Tested-by: BuildkiteCI
Reviewed-by: sterni <sternenseemann@systemli.org>
Diffstat (limited to 'third_party')
-rw-r--r--third_party/lisp/mime4cl/mime.lisp24
-rw-r--r--third_party/lisp/mime4cl/package.lisp1
2 files changed, 25 insertions, 0 deletions
diff --git a/third_party/lisp/mime4cl/mime.lisp b/third_party/lisp/mime4cl/mime.lisp
index 25c972f086..e35ae6bea5 100644
--- a/third_party/lisp/mime4cl/mime.lisp
+++ b/third_party/lisp/mime4cl/mime.lisp
@@ -1,6 +1,7 @@
 ;;;  mime4cl.lisp --- MIME primitives for Common Lisp
 
 ;;;  Copyright (C) 2005-2008, 2010 by Walter C. Pelissero
+;;;  Copyright (C) 2021 by the TVL Authors
 
 ;;;  Author: Walter C. Pelissero <walter@pelissero.de>
 ;;;  Project: mime4cl
@@ -964,6 +965,29 @@ is a string."))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+(defmethod find-mime-text-part (msg)
+  (:documentation
+   "Return message if it is a text message or first text part.
+   If no suitable text part is found, return NIL."))
+
+(defmethod find-mime-text-part ((part mime-text))
+  part) ; found our target
+
+(defmethod find-mime-text-part ((msg mime-message))
+  ;; mime-body is either a mime-part or mime-multipart
+  (find-mime-text-part (mime-body msg)))
+
+(defmethod find-mime-text-part ((parts mime-multipart))
+  ;; multipart messages may have a body, otherwise we
+  ;; search for the first text part
+  (or (call-next-method)
+      (find-if #'find-mime-text-part (mime-parts parts))))
+
+(defmethod find-mime-text-part ((part mime-part))
+  nil) ; default case
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
 (defgeneric mime-type-string (mime-part)
   (:documentation
    "Return the string describing the MIME part."))
diff --git a/third_party/lisp/mime4cl/package.lisp b/third_party/lisp/mime4cl/package.lisp
index c1b94f21d7..a6e7e7d8ef 100644
--- a/third_party/lisp/mime4cl/package.lisp
+++ b/third_party/lisp/mime4cl/package.lisp
@@ -65,6 +65,7 @@
 	   #:mime=
 	   #:find-mime-part-by-path
 	   #:find-mime-part-by-id
+	   #:find-mime-text-part
 	   #:encode-mime-part
 	   #:encode-mime-body
 	   #:decode-quoted-printable-stream