git.iko.soy/typeable/pandoc
on master help sign in
Improved building of data URIs in SelfContained.

Now base64 is used except for 'text/*' mime types. Closes #1940.

commitd5469b30fe9903a37a4966df75609e88aad9ef55 authorJohn MacFarlane <jgm@berkeley.edu> dateFri 13 Feb 2015, 21:37 (12 years ago) parent616e211
1 file changed+15−8
src/Text/Pandoc/SelfContained.hs+15−8
src/Text/Pandoc/SelfContained.hs+15−8
@@ -45,10 +45,21 @@ import Text.Pandoc.MediaBag (MediaBag)
4545import Text.Pandoc.MIME (MimeType)
4646import Text.Pandoc.UTF8 (toString, fromString)
4747import Text.Pandoc.Options (WriterOptions(..))
48+import Data.List (isPrefixOf)
4849
4950isOk :: Char -> Bool
5051isOk c = isAscii c && isAlphaNum c
5152
53+makeDataURI :: String -> ByteString -> String
54+makeDataURI mime raw =
55+ if textual
56+ then "data:" ++ mime' ++ "," ++ escapeURIString isOk (toString raw)
57+ else "data:" ++ mime' ++ ";base64," ++ toString (encode raw)
58+ where textual = "text/" `Data.List.isPrefixOf` mime
59+ mime' = if textual && ';' `notElem` mime
60+ then mime ++ ";charset=utf-8"
61+ else mime -- mime type already has charset
62+
5263convertTag :: MediaBag -> Maybe String -> Tag String -> IO (Tag String)
5364convertTag media sourceURL t@(TagOpen tagname as)
5465 | tagname `elem`
@@ -59,7 +70,7 @@ convertTag media sourceURL t@(TagOpen tagname as)
5970 if x == "src" || x == "href" || x == "poster"
6071 then do
6172 (raw, mime) <- getRaw media sourceURL (fromAttrib "type" t) y
62− let enc = "data:" ++ mime ++ ";base64," ++ toString (encode raw)
73+ let enc = makeDataURI mime raw
6374 return (x, enc)
6475 else return (x,y)
6576convertTag media sourceURL t@(TagOpen "script" as) =
@@ -67,17 +78,14 @@ convertTag media sourceURL t@(TagOpen "script" as) =
6778 [] -> return t
6879 src -> do
6980 (raw, mime) <- getRaw media sourceURL (fromAttrib "type" t) src
70− let mime' = if ';' `elem` mime
71− then mime -- mime type already has charset
72− else mime ++ ";charset=utf-8"
73− let enc = "data:" ++ mime' ++ "," ++ escapeURIString isOk (toString raw)
81+ let enc = makeDataURI mime raw
7482 return $ TagOpen "script" (("src",enc) : [(x,y) | (x,y) <- as, x /= "src"])
7583convertTag media sourceURL t@(TagOpen "link" as) =
7684 case fromAttrib "href" t of
7785 [] -> return t
7886 src -> do
7987 (raw, mime) <- getRaw media sourceURL (fromAttrib "type" t) src
80− let enc = "data:" ++ mime ++ "," ++ escapeURIString isOk (toString raw)
88+ let enc = makeDataURI mime raw
8189 return $ TagOpen "link" (("href",enc) : [(x,y) | (x,y) <- as, x /= "href"])
8290convertTag _ _ t = return t
8391
@@ -99,8 +107,7 @@ cssURLs media sourceURL d orig =
99107 else d </> url
100108 (raw, mime) <- getRaw media sourceURL "" url'
101109 rest <- cssURLs media sourceURL d v
102− let enc = "data:" `B.append` fromString mime `B.append`
103− ";base64," `B.append` (encode raw)
110+ let enc = fromString $ makeDataURI mime raw
104111 return $ x `B.append` "url(" `B.append` enc `B.append` rest
105112
106113getRaw :: MediaBag -> Maybe String -> MimeType -> String