@@ -67,57 +67,72 @@ 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
70−convertTag :: PandocMonad m => Maybe String -> Tag String -> m [Tag String]
70+convertTags :: PandocMonad m => Maybe String -> [Tag String] -> m [Tag String]
71+convertTags _ [] = return []
71−convertTag sourceURL t@(TagOpen tagname as)
72+convertTags sourceURL (t@(TagOpen tagname as):ts)
72 | tagname `elem`
73 | tagname `elem`
73 ["img", "embed", "video", "input", "audio", "source", "track"] = do
74 ["img", "embed", "video", "input", "audio", "source", "track"] = do
74 as' <- mapM processAttribute as
75 as' <- mapM processAttribute as
76+ rest <- convertTags sourceURL ts
75− return [TagOpen tagname as']
77+ return $ TagOpen tagname as' : rest
76 where processAttribute (x,y) =
78 where processAttribute (x,y) =
77 if x == "src" || x == "data-src" || x == "href" || x == "poster"
79 if x == "src" || x == "data-src" || x == "href" || x == "poster"
79 enc <- getDataURI sourceURL (fromAttrib "type" t) y
81 enc <- getDataURI sourceURL (fromAttrib "type" t) y
80 return (x, enc)
82 return (x, enc)
81 else return (x,y)
83 else return (x,y)
82−convertTag sourceURL t@(TagOpen "script" as) =
84+convertTags sourceURL (t@(TagOpen "script" as):TagClose "script":ts) =
83 case fromAttrib "src" t of
85 case fromAttrib "src" t of
84− [] -> return [t]
86+ [] -> (t:) <$> convertTags sourceURL ts
86 let typeAttr = fromAttrib "type" t
88 let typeAttr = fromAttrib "type" t
87 res <- getData sourceURL typeAttr src
89 res <- getData sourceURL typeAttr src
90+ rest <- convertTags sourceURL ts
88 case res of
91 case res of
89− Left dataUri -> return [TagOpen "script"
92+ Left dataUri -> return $ TagOpen "script"
90− (("src",dataUri) : [(x,y) | (x,y) <- as, x /= "src"])]
93+ (("src",dataUri) : [(x,y) | (x,y) <- as, x /= "src"]) :
94+ TagClose "script" : rest
91 Right (mime, bs)
95 Right (mime, bs)
92 | (mime == "text/javascript" ||
96 | (mime == "text/javascript" ||
93 mime == "application/javascript" ||
97 mime == "application/javascript" ||
94 mime == "application/x-javascript") &&
98 mime == "application/x-javascript") &&
95− not ("</" `B.isInfixOf` bs) ->
99+ not ("</script" `B.isInfixOf` bs) ->
96− return [
100+ return $
97 TagOpen "script" [("type", typeAttr)|not (null typeAttr)]
101 TagOpen "script" [("type", typeAttr)|not (null typeAttr)]
98− , TagText (toString bs)
102+ : TagText (toString bs)
99− , TagClose "script" ]
103+ : TagClose "script"
100− | otherwise -> return [TagOpen "script"
106+ return $ TagOpen "script"
101− (("src",makeDataURI (mime, bs)) :
107+ (("src",makeDataURI (mime, bs)) :
102− [(x,y) | (x,y) <- as, x /= "src"])]
108+ [(x,y) | (x,y) <- as, x /= "src"]) :
109+ TagClose "script" : rest
103−convertTag sourceURL t@(TagOpen "link" as) =
110+convertTags sourceURL (t@(TagOpen "link" as):ts) =
104 case fromAttrib "href" t of
111 case fromAttrib "href" t of
105− [] -> return [t]
112+ [] -> (t:) <$> convertTags sourceURL ts
106 src -> do
113 src -> do
107 res <- getData sourceURL (fromAttrib "type" t) src
114 res <- getData sourceURL (fromAttrib "type" t) src
108 case res of
115 case res of
117+ rest <- convertTags sourceURL ts
109− Left dataUri -> return [TagOpen "link"
118+ return $ TagOpen "link"
110− (("href",dataUri) : [(x,y) | (x,y) <- as, x /= "href"])]
119+ (("href",dataUri) : [(x,y) | (x,y) <- as, x /= "href"]) :
111 Right (mime, bs)
121 Right (mime, bs)
112− | mime == "text/css" && not ("</" `B.isInfixOf` bs) ->
122+ | mime == "text/css" && not ("</" `B.isInfixOf` bs) -> do
123+ rest <- convertTags sourceURL $
124+ dropWhile (==TagClose "link") ts
113− return [
125+ return $
114 TagOpen "style" [("type", "text/css")]
126 TagOpen "style" [("type", "text/css")]
115− , TagText (toString bs)
127+ : TagText (toString bs)
116− , TagClose "style" ]
128+ : TagClose "style"
131+ rest <- convertTags sourceURL ts
117− | otherwise -> return [TagOpen "link"
132+ return $ TagOpen "link"
118− (("href",makeDataURI (mime, bs)) :
133+ (("href",makeDataURI (mime, bs)) :
119− [(x,y) | (x,y) <- as, x /= "href"])]
134+ [(x,y) | (x,y) <- as, x /= "href"]) : rest
120−convertTag _ t = return [t]
135+convertTags sourceURL (t:ts) = (t:) <$> convertTags sourceURL ts
122cssURLs :: PandocMonad m
137cssURLs :: PandocMonad m
123 => Maybe String -> FilePath -> ByteString -> m ByteString
138 => Maybe String -> FilePath -> ByteString -> m ByteString
@@ -210,5 +225,5 @@ getData sourceURL mimetype src = do
210makeSelfContained :: PandocMonad m => WriterOptions -> String -> m String
225makeSelfContained :: PandocMonad m => WriterOptions -> String -> m String
211makeSelfContained opts inp = do
226makeSelfContained opts inp = do
212 let tags = parseTags inp
227 let tags = parseTags inp
213− out' <- concat <$> mapM (convertTag (writerSourceURL opts)) tags
228+ out' <- convertTags (writerSourceURL opts) tags
214 return $ renderTags' out'
229 return $ renderTags' out'