git.iko.soy/typeable/pandoc
on master help sign in
SelfContained: don't use data URIs for script or style.
7c0a80cJohn MacFarlane
src/Text/Pandoc/MIME.hs+1−1
@@ -244,7 +244,7 @@ mimeTypesList = -- List borrowed from happstack-server.
244 ,("jpeg","image/jpeg")
244 ,("jpeg","image/jpeg")
245 ,("jfif","image/jpeg")
245 ,("jfif","image/jpeg")
246 ,("jpg","image/jpeg")
246 ,("jpg","image/jpeg")
247− ,("js","application/x-javascript")
247+ ,("js","application/javascript")
248 ,("kar","audio/midi")
248 ,("kar","audio/midi")
249 ,("key","application/pgp-keys")
249 ,("key","application/pgp-keys")
250 ,("kil","application/x-killustrator")
250 ,("kil","application/x-killustrator")
src/Text/Pandoc/SelfContained.hs+36−10
@@ -67,12 +67,12 @@ makeDataURI (mime, raw) =
67 then mime ++ ";charset=utf-8"
67 then mime ++ ";charset=utf-8"
68 else mime -- mime type already has charset
68 else mime -- mime type already has charset
69
69
70−convertTag :: PandocMonad m => Maybe String -> Tag String -> m (Tag String)
70+convertTag :: PandocMonad m => Maybe String -> Tag String -> m [Tag String]
71convertTag sourceURL t@(TagOpen tagname as)
71convertTag sourceURL t@(TagOpen tagname as)
72 | tagname `elem`
72 | tagname `elem`
73 ["img", "embed", "video", "input", "audio", "source", "track"] = do
73 ["img", "embed", "video", "input", "audio", "source", "track"] = do
74 as' <- mapM processAttribute as
74 as' <- mapM processAttribute as
75− return $ TagOpen tagname as'
75+ return [TagOpen tagname as']
76 where processAttribute (x,y) =
76 where processAttribute (x,y) =
77 if x == "src" || x == "data-src" || x == "href" || x == "poster"
77 if x == "src" || x == "data-src" || x == "href" || x == "poster"
78 then do
78 then do
@@ -81,17 +81,43 @@ convertTag sourceURL t@(TagOpen tagname as)
81 else return (x,y)
81 else return (x,y)
82convertTag sourceURL t@(TagOpen "script" as) =
82convertTag sourceURL t@(TagOpen "script" as) =
83 case fromAttrib "src" t of
83 case fromAttrib "src" t of
84− [] -> return t
84+ [] -> return [t]
85 src -> do
85 src -> do
86− enc <- getDataURI sourceURL (fromAttrib "type" t) src
86+ let typeAttr = fromAttrib "type" t
87+ res <- getData sourceURL typeAttr src
88+ case res of
89+ Left dataUri -> return [TagOpen "script"
90+ (("src",dataUri) : [(x,y) | (x,y) <- as, x /= "src"])]
91+ Right (mime, bs)
92+ | (mime == "text/javascript" ||
93+ mime == "application/javascript" ||
94+ mime == "application/x-javascript") &&
95+ not ("</" `B.isInfixOf` bs) ->
96+ return [
97+ TagOpen "script" [("type", typeAttr)|not (null typeAttr)]
98+ , TagText (toString bs)
99+ , TagClose "script" ]
100+ | otherwise -> return [TagOpen "script"
101+ (("src",makeDataURI (mime, bs)) :
87− return $ TagOpen "script" (("src",enc) : [(x,y) | (x,y) <- as, x /= "src"])
102+ [(x,y) | (x,y) <- as, x /= "src"])]
88convertTag sourceURL t@(TagOpen "link" as) =
103convertTag sourceURL t@(TagOpen "link" as) =
89 case fromAttrib "href" t of
104 case fromAttrib "href" t of
90− [] -> return t
105+ [] -> return [t]
91 src -> do
106 src -> do
92− enc <- getDataURI sourceURL (fromAttrib "type" t) src
107+ res <- getData sourceURL (fromAttrib "type" t) src
108+ case res of
109+ Left dataUri -> return [TagOpen "link"
93− return $ TagOpen "link" (("href",enc) : [(x,y) | (x,y) <- as, x /= "href"])
110+ (("href",dataUri) : [(x,y) | (x,y) <- as, x /= "href"])]
111+ Right (mime, bs)
112+ | mime == "text/css" && not ("</" `B.isInfixOf` bs) ->
113+ return [
114+ TagOpen "style" [("type", "text/css")]
115+ , TagText (toString bs)
116+ , TagClose "style" ]
117+ | otherwise -> return [TagOpen "link"
118+ (("href",makeDataURI (mime, bs)) :
119+ [(x,y) | (x,y) <- as, x /= "href"])]
94−convertTag _ t = return t
120+convertTag _ t = return [t]
95
121
96cssURLs :: PandocMonad m
122cssURLs :: PandocMonad m
97 => Maybe String -> FilePath -> ByteString -> m ByteString
123 => Maybe String -> FilePath -> ByteString -> m ByteString
@@ -184,5 +210,5 @@ getData sourceURL mimetype src = do
184makeSelfContained :: PandocMonad m => WriterOptions -> String -> m String
210makeSelfContained :: PandocMonad m => WriterOptions -> String -> m String
185makeSelfContained opts inp = do
211makeSelfContained opts inp = do
186 let tags = parseTags inp
212 let tags = parseTags inp
187− out' <- mapM (convertTag (writerSourceURL opts)) tags
213+ out' <- concat <$> mapM (convertTag (writerSourceURL opts)) tags
188 return $ renderTags' out'
214 return $ renderTags' out'