git.iko.soy/typeable/pandoc
on master help sign in
Added userdata directory parameter to fns in Offline.
commit1cd928b591caee344e0b5a654a71fae7c352b1b8 authorJohn MacFarlane <fiddlosopher@gmail.com> dateMon 21 Nov 2011, 00:41 (15 years ago) parent99f2ae2
1 file changed+32−31
src/Text/Pandoc/Offline.hs+32−31
src/Text/Pandoc/Offline.hs+32−31
@@ -45,17 +45,16 @@ import qualified Data.ByteString.Lazy as L
4545import Text.Pandoc.Shared (findDataFile)
4646import System.Directory (doesFileExist)
4747
48−getItem :: String -> IO ByteString
49−getItem f =
48+getItem :: Maybe FilePath -> String -> IO ByteString
49+getItem userdata f =
5050 if isAbsoluteURI f
5151 then openURL f
5252 else do
53− let userDataDir = "." -- TODO writeUserDataDir
5453 exists <- doesFileExist f
5554 if exists
5655 then B.readFile f
5756 else do
58− res <- findDataFile (Just userDataDir) f
57+ res <- findDataFile userdata f
5958 exists' <- doesFileExist res
6059 if exists'
6160 then B.readFile res
@@ -202,53 +201,55 @@ mimeTypeFor s = case lookup s mimetypes of
202201isOk :: Char -> Bool
203202isOk c = isAscii c && isAlphaNum c
204203
205−convertTag :: Tag String -> IO (Tag String)
206−convertTag t@(TagOpen "img" as) =
204+convertTag :: Maybe FilePath -> Tag String -> IO (Tag String)
205+convertTag userdata t@(TagOpen "img" as) =
207206 case fromAttrib "src" t of
208207 [] -> return t
209208 src -> do
210− (raw, mime) <- getRaw t src
209+ (raw, mime) <- getRaw userdata t src
211210 let enc = "data:" ++ mime ++ ";base64," ++ toString (encode raw)
212211 return $ TagOpen "img" (("src",enc) : [(x,y) | (x,y) <- as, x /= "src"])
213−convertTag t@(TagOpen "script" as) =
212+convertTag userdata t@(TagOpen "script" as) =
214213 case fromAttrib "src" t of
215214 [] -> return t
216215 src -> do
217− (raw, mime) <- getRaw t src
216+ (raw, mime) <- getRaw userdata t src
218217 let enc = "data:" ++ mime ++ "," ++ escapeURIString isOk (toString raw)
219218 return $ TagOpen "script" (("src",enc) : [(x,y) | (x,y) <- as, x /= "src"])
220−convertTag t@(TagOpen "link" as) =
219+convertTag userdata t@(TagOpen "link" as) =
221220 case fromAttrib "href" t of
222221 [] -> return t
223222 src -> do
224− (raw, mime) <- getRaw t src
223+ (raw, mime) <- getRaw userdata t src
225224 let enc = "data:" ++ mime ++ "," ++ escapeURIString isOk (toString raw)
226225 return $ TagOpen "link" (("href",enc) : [(x,y) | (x,y) <- as, x /= "href"])
227−convertTag t = return t
226+convertTag _ t = return t
228227
229−cssImports :: FilePath -> ByteString -> IO ByteString
230−cssImports d orig =
228+cssImports :: Maybe FilePath -> FilePath -> ByteString -> IO ByteString
229+cssImports userdata d orig =
231230 case B.breakSubstring "@import" orig of
232231 (x,y) | B.null y -> return orig
233232 | otherwise -> do
234− rest <- handleImport d (B.drop 7 y) >>= cssImports d
233+ rest <- handleImport userdata d (B.drop 7 y)
234+ >>= cssImports userdata d
235235 return $ x `B.append` rest
236236
237237-- @import url("blah");
238238-- @import url(blah);
239239-- @import "blah";
240−handleImport :: FilePath -> ByteString -> IO ByteString
241−handleImport d x = fmap (`B.append` rest) (getItem $ d </> url)
242− where lparenOrQuote c = c == '(' || c == '"'
243− rparenOrQuote c = c == ')' || c == '"'
244− url = toString
245− $ B.takeWhile (not . rparenOrQuote)
246− $ B.dropWhile lparenOrQuote
247− $ B.dropWhile (not . lparenOrQuote) x
248− rest = B.drop 1 $ B.dropWhile (/= ';') x
240+handleImport :: Maybe FilePath -> FilePath -> ByteString -> IO ByteString
241+handleImport userdata d x =
242+ fmap (`B.append` rest) (getItem userdata $ d </> url)
243+ where lparenOrQuote c = c == '(' || c == '"'
244+ rparenOrQuote c = c == ')' || c == '"'
245+ url = toString
246+ $ B.takeWhile (not . rparenOrQuote)
247+ $ B.dropWhile lparenOrQuote
248+ $ B.dropWhile (not . lparenOrQuote) x
249+ rest = B.drop 1 $ B.dropWhile (/= ';') x
249250
250−getRaw :: Tag String -> String -> IO (ByteString, String)
251−getRaw t src = do
251+getRaw :: Maybe FilePath -> Tag String -> String -> IO (ByteString, String)
252+getRaw userdata t src = do
252253 let ext = map toLower $ takeExtension src
253254 let (ext',decomp) = if ext == ".gz"
254255 then (takeExtension $ dropExtension src, B.concat . L.toChunks . Gzip.decompress . L.fromChunks . (:[]))
@@ -256,16 +257,16 @@ getRaw t src = do
256257 let mime = case fromAttrib "type" t of
257258 [] -> mimeTypeFor ext'
258259 x -> x
259− raw <- getItem src
260+ raw <- getItem userdata src
260261 result <- if mime == "text/css"
261− then cssImports (takeDirectory src) $ decomp raw
262+ then cssImports userdata (takeDirectory src) $ decomp raw
262263 else return $ decomp raw
263264 return (result, mime)
264265
265−offline :: String -> IO String
266−offline inp = do
266+offline :: Maybe FilePath -> String -> IO String
267+offline userdata inp = do
267268 let tags = parseTags inp
268− out' <- mapM convertTag tags
269+ out' <- mapM (convertTag userdata) tags
269270 return $ renderTagsOptions renderOptions{ optMinimize = (\t -> t == "br"
270271 || t == "img" || t == "meta" || t == "link" ) } out'
271272