git.iko.soy/typeable/pandoc
on master help sign in
SelfContained: don't use data URIs for script or style.

Instead, just use script or style tags with the content inside. The old method with data URIs prevents certain optimizations outside pandoc. Exception: data URIs are still used when a script contains `</script>` or a style contains `</`. Closes #3423. Also, in MIME, use application/javascript (not application/x-javascript).

commit7c0a80c323f81e6262848bfcfc922301e3f406e0 authorJohn MacFarlane <jgm@berkeley.edu> dateFri 24 Feb 2017, 11:55 (10 years ago) parent0e8b19e
2 files changed+37−11
src/Text/Pandoc/MIME.hs+1−1 src/Text/Pandoc/SelfContained.hs+36−10
src/Text/Pandoc/MIME.hs+1−1
@@ -244,7 +244,7 @@ mimeTypesList = -- List borrowed from happstack-server.
244244 ,("jpeg","image/jpeg")
245245 ,("jfif","image/jpeg")
246246 ,("jpg","image/jpeg")
247− ,("js","application/x-javascript")
247+ ,("js","application/javascript")
248248 ,("kar","audio/midi")
249249 ,("key","application/pgp-keys")
250250 ,("kil","application/x-killustrator")
src/Text/Pandoc/SelfContained.hs+36−10
@@ -67,12 +67,12 @@ makeDataURI (mime, raw) =
6767 then mime ++ ";charset=utf-8"
6868 else mime -- mime type already has charset
6969
70−convertTag :: PandocMonad m => Maybe String -> Tag String -> m (Tag String)
70+convertTag :: PandocMonad m => Maybe String -> Tag String -> m [Tag String]
7171convertTag sourceURL t@(TagOpen tagname as)
7272 | tagname `elem`
7373 ["img", "embed", "video", "input", "audio", "source", "track"] = do
7474 as' <- mapM processAttribute as
75− return $ TagOpen tagname as'
75+ return [TagOpen tagname as']
7676 where processAttribute (x,y) =
7777 if x == "src" || x == "data-src" || x == "href" || x == "poster"
7878 then do
@@ -81,17 +81,43 @@ convertTag sourceURL t@(TagOpen tagname as)
8181 else return (x,y)
8282convertTag sourceURL t@(TagOpen "script" as) =
8383 case fromAttrib "src" t of
84− [] -> return t
84+ [] -> return [t]
8585 src -> do
86− enc <- getDataURI sourceURL (fromAttrib "type" t) src
87− return $ TagOpen "script" (("src",enc) : [(x,y) | (x,y) <- as, x /= "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)) :
102+ [(x,y) | (x,y) <- as, x /= "src"])]
88103convertTag sourceURL t@(TagOpen "link" as) =
89104 case fromAttrib "href" t of
90− [] -> return t
105+ [] -> return [t]
91106 src -> do
92− enc <- getDataURI sourceURL (fromAttrib "type" t) src
93− return $ TagOpen "link" (("href",enc) : [(x,y) | (x,y) <- as, x /= "href"])
94−convertTag _ t = return t
107+ res <- getData sourceURL (fromAttrib "type" t) src
108+ case res of
109+ Left dataUri -> return [TagOpen "link"
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"])]
120+convertTag _ t = return [t]
95121
96122cssURLs :: PandocMonad m
97123 => Maybe String -> FilePath -> ByteString -> m ByteString
@@ -184,5 +210,5 @@ getData sourceURL mimetype src = do
184210makeSelfContained :: PandocMonad m => WriterOptions -> String -> m String
185211makeSelfContained opts inp = do
186212 let tags = parseTags inp
187− out' <- mapM (convertTag (writerSourceURL opts)) tags
213+ out' <- concat <$> mapM (convertTag (writerSourceURL opts)) tags
188214 return $ renderTags' out'