From 7f31562acfc9a83e042a506bf7bdaca5de4e789a Mon Sep 17 00:00:00 2001 From: sterni Date: Sun, 22 Aug 2021 14:32:44 +0200 Subject: feat(3p/lisp/mime4cl): search for first (default) mime text part 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 --- third_party/lisp/mime4cl/mime.lisp | 24 ++++++++++++++++++++++++ third_party/lisp/mime4cl/package.lisp | 1 + 2 files changed, 25 insertions(+) (limited to 'third_party/lisp') diff --git a/third_party/lisp/mime4cl/mime.lisp b/third_party/lisp/mime4cl/mime.lisp index 25c972f086b3..e35ae6bea547 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 ;;; 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 c1b94f21d7f2..a6e7e7d8ef10 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 -- cgit 1.4.1