module Mail.Hailgun.AttachmentsSearch
( findInlineImagesInHtmlEmail
, InlineImage(..)
) where
import Control.Monad (guard)
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as BC
import Data.List (find, nub)
import Data.Maybe (catMaybes)
import qualified Text.HTML.TagSoup as TS
findInlineImagesInHtmlEmail :: B.ByteString -> [InlineImage]
findInlineImagesInHtmlEmail = nub . catMaybes . fmap tagToInlineImage . TS.parseTags
data InlineImage = InlineImage
{ imageSrc :: B.ByteString
} deriving (Eq, Show)
imgTagName :: B.ByteString
imgTagName = BC.pack "img"
srcTagName :: B.ByteString
srcTagName = BC.pack "src"
inlineImageUrlPrefix :: B.ByteString
inlineImageUrlPrefix = BC.pack "cid:"
tagToInlineImage :: TS.Tag B.ByteString -> Maybe InlineImage
tagToInlineImage (TS.TagOpen name attrs) =
if name == imgTagName
then do
srcAttr <- find ((==) srcTagName . fst) attrs
guard (inlineImageUrlPrefix `B.isPrefixOf` snd srcAttr)
return . InlineImage . B.drop (B.length inlineImageUrlPrefix) . snd $ srcAttr
else Nothing
tagToInlineImage _ = Nothing