@@ -67,57 +67,72 @@ 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]
71−convertTag sourceURL t@(TagOpen tagname as)
70+convertTags :: PandocMonad m => Maybe String -> [Tag String] -> m [Tag String]
71+convertTags _ [] = return []
72+convertTags sourceURL (t@(TagOpen tagname as):ts)
7273 | tagname `elem`
7374 ["img", "embed", "video", "input", "audio", "source", "track"] = do
7475 as' <- mapM processAttribute as
75− return [TagOpen tagname as']
76+ rest <- convertTags sourceURL ts
77+ return $ TagOpen tagname as' : rest
7678 where processAttribute (x,y) =
7779 if x == "src" || x == "data-src" || x == "href" || x == "poster"
7880 then do
7981 enc <- getDataURI sourceURL (fromAttrib "type" t) y
8082 return (x, enc)
8183 else return (x,y)
82−convertTag sourceURL t@(TagOpen "script" as) =
84+convertTags sourceURL (t@(TagOpen "script" as):TagClose "script":ts) =
8385 case fromAttrib "src" t of
84− [] -> return [t]
86+ [] -> (t:) <$> convertTags sourceURL ts
8587 src -> do
8688 let typeAttr = fromAttrib "type" t
8789 res <- getData sourceURL typeAttr src
90+ rest <- convertTags sourceURL ts
8891 case res of
89− Left dataUri -> return [TagOpen "script"
90− (("src",dataUri) : [(x,y) | (x,y) <- as, x /= "src"])]
92+ Left dataUri -> return $ TagOpen "script"
93+ (("src",dataUri) : [(x,y) | (x,y) <- as, x /= "src"]) :
94+ TagClose "script" : rest
9195 Right (mime, bs)
9296 | (mime == "text/javascript" ||
9397 mime == "application/javascript" ||
9498 mime == "application/x-javascript") &&
95− not ("</" `B.isInfixOf` bs) ->
96− return [
99+ not ("</script" `B.isInfixOf` bs) ->
100+ return $
97101 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"])]
103−convertTag sourceURL t@(TagOpen "link" as) =
102+ : TagText (toString bs)
103+ : TagClose "script"
104+ : rest
105+ | otherwise ->
106+ return $ TagOpen "script"
107+ (("src",makeDataURI (mime, bs)) :
108+ [(x,y) | (x,y) <- as, x /= "src"]) :
109+ TagClose "script" : rest
110+convertTags sourceURL (t@(TagOpen "link" as):ts) =
104111 case fromAttrib "href" t of
105− [] -> return [t]
112+ [] -> (t:) <$> convertTags sourceURL ts
106113 src -> do
107114 res <- getData sourceURL (fromAttrib "type" t) src
108115 case res of
109− Left dataUri -> return [TagOpen "link"
110− (("href",dataUri) : [(x,y) | (x,y) <- as, x /= "href"])]
116+ Left dataUri -> do
117+ rest <- convertTags sourceURL ts
118+ return $ TagOpen "link"
119+ (("href",dataUri) : [(x,y) | (x,y) <- as, x /= "href"]) :
120+ rest
111121 Right (mime, bs)
112− | mime == "text/css" && not ("</" `B.isInfixOf` bs) ->
113− return [
122+ | mime == "text/css" && not ("</" `B.isInfixOf` bs) -> do
123+ rest <- convertTags sourceURL $
124+ dropWhile (==TagClose "link") ts
125+ return $
114126 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]
127+ : TagText (toString bs)
128+ : TagClose "style"
129+ : rest
130+ | otherwise -> do
131+ rest <- convertTags sourceURL ts
132+ return $ TagOpen "link"
133+ (("href",makeDataURI (mime, bs)) :
134+ [(x,y) | (x,y) <- as, x /= "href"]) : rest
135+convertTags sourceURL (t:ts) = (t:) <$> convertTags sourceURL ts
121136
122137cssURLs :: PandocMonad m
123138 => Maybe String -> FilePath -> ByteString -> m ByteString
@@ -210,5 +225,5 @@ getData sourceURL mimetype src = do
210225makeSelfContained :: PandocMonad m => WriterOptions -> String -> m String
211226makeSelfContained opts inp = do
212227 let tags = parseTags inp
213− out' <- concat <$> mapM (convertTag (writerSourceURL opts)) tags
228+ out' <- convertTags (writerSourceURL opts) tags
214229 return $ renderTags' out'