From 1880d75e7cb5a43436703d2b75992efd71df2f66 Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Fri, 17 Nov 2023 10:11:09 -0800 Subject: T.P.Class.IO.openURL improvements for data uris. - Only treat as base64 if ';base64' is present. - Otherwise treat as UTF-8 (not 100% reliable but should cover most other cases). - Strip off ';base64' (or ';charset=...' or whatever) from mime type. This last change addresses #9195 (problems with data URIs in conversion to docx). --- src/Text/Pandoc/Class/IO.hs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src/Text') diff --git a/src/Text/Pandoc/Class/IO.hs b/src/Text/Pandoc/Class/IO.hs index 2ae3b5cee..760990129 100644 --- a/src/Text/Pandoc/Class/IO.hs +++ b/src/Text/Pandoc/Class/IO.hs @@ -124,9 +124,13 @@ openURL :: (PandocMonad m, MonadIO m) => Text -> m (B.ByteString, Maybe MimeType openURL u | Just (URI{ uriScheme = "data:", uriPath = upath }) <- parseURI (T.unpack u) = do - let (mime, rest) = break (== ',') $ unEscapeString upath + let (mimespec, rest) = break (== ',') $ unEscapeString upath let contents = UTF8.fromString $ drop 1 rest - return (decodeBase64Lenient contents, Just (T.pack mime)) + case break (== ';') (filter (/= ' ') mimespec) of + (mime, ";base64") -> + return (decodeBase64Lenient contents, Just (T.pack mime)) + (mime, _) -> + return (contents, Just (T.pack mime)) | otherwise = do let toReqHeader (n, v) = (CI.mk (UTF8.fromText n), UTF8.fromText v) customHeaders <- map toReqHeader <$> getsCommonState stRequestHeaders -- cgit v1.2.3