@@ -45,10 +45,21 @@ import Text.Pandoc.MediaBag (MediaBag)
45import Text.Pandoc.MIME (MimeType)
45import Text.Pandoc.MIME (MimeType)
46import Text.Pandoc.UTF8 (toString, fromString)
46import Text.Pandoc.UTF8 (toString, fromString)
47import Text.Pandoc.Options (WriterOptions(..))
47import Text.Pandoc.Options (WriterOptions(..))
48+import Data.List (isPrefixOf)
49isOk :: Char -> Bool
50isOk :: Char -> Bool
50isOk c = isAscii c && isAlphaNum c
51isOk c = isAscii c && isAlphaNum c
53+makeDataURI :: String -> ByteString -> String
54+makeDataURI mime raw =
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
52convertTag :: MediaBag -> Maybe String -> Tag String -> IO (Tag String)
63convertTag :: MediaBag -> Maybe String -> Tag String -> IO (Tag String)
53convertTag media sourceURL t@(TagOpen tagname as)
64convertTag media sourceURL t@(TagOpen tagname as)
54 | tagname `elem`
65 | tagname `elem`
@@ -59,7 +70,7 @@ convertTag media sourceURL t@(TagOpen tagname as)
59 if x == "src" || x == "href" || x == "poster"
70 if x == "src" || x == "href" || x == "poster"
61 (raw, mime) <- getRaw media sourceURL (fromAttrib "type" t) y
72 (raw, mime) <- getRaw media sourceURL (fromAttrib "type" t) y
62− let enc = "data:" ++ mime ++ ";base64," ++ toString (encode raw)
73+ let enc = makeDataURI mime raw
63 return (x, enc)
74 return (x, enc)
64 else return (x,y)
75 else return (x,y)
65convertTag media sourceURL t@(TagOpen "script" as) =
76convertTag media sourceURL t@(TagOpen "script" as) =
@@ -67,17 +78,14 @@ convertTag media sourceURL t@(TagOpen "script" as) =
67 [] -> return t
78 [] -> return t
69 (raw, mime) <- getRaw media sourceURL (fromAttrib "type" t) src
80 (raw, mime) <- getRaw media sourceURL (fromAttrib "type" t) src
70− let mime' = if ';' `elem` mime
81+ let enc = makeDataURI mime raw
71− then mime -- mime type already has charset
72− else mime ++ ";charset=utf-8"
73− let enc = "data:" ++ mime' ++ "," ++ escapeURIString isOk (toString raw)
74 return $ TagOpen "script" (("src",enc) : [(x,y) | (x,y) <- as, x /= "src"])
82 return $ TagOpen "script" (("src",enc) : [(x,y) | (x,y) <- as, x /= "src"])
75convertTag media sourceURL t@(TagOpen "link" as) =
83convertTag media sourceURL t@(TagOpen "link" as) =
76 case fromAttrib "href" t of
84 case fromAttrib "href" t of
77 [] -> return t
85 [] -> return t
79 (raw, mime) <- getRaw media sourceURL (fromAttrib "type" t) src
87 (raw, mime) <- getRaw media sourceURL (fromAttrib "type" t) src
80− let enc = "data:" ++ mime ++ "," ++ escapeURIString isOk (toString raw)
88+ let enc = makeDataURI mime raw
81 return $ TagOpen "link" (("href",enc) : [(x,y) | (x,y) <- as, x /= "href"])
89 return $ TagOpen "link" (("href",enc) : [(x,y) | (x,y) <- as, x /= "href"])
82convertTag _ _ t = return t
90convertTag _ _ t = return t
@@ -99,8 +107,7 @@ cssURLs media sourceURL d orig =
99 else d </> url
107 else d </> url
100 (raw, mime) <- getRaw media sourceURL "" url'
108 (raw, mime) <- getRaw media sourceURL "" url'
101 rest <- cssURLs media sourceURL d v
109 rest <- cssURLs media sourceURL d v
102− let enc = "data:" `B.append` fromString mime `B.append`
110+ let enc = fromString $ makeDataURI mime raw
103− ";base64," `B.append` (encode raw)
104 return $ x `B.append` "url(" `B.append` enc `B.append` rest
111 return $ x `B.append` "url(" `B.append` enc `B.append` rest
106getRaw :: MediaBag -> Maybe String -> MimeType -> String
113getRaw :: MediaBag -> Maybe String -> MimeType -> String