git.iko.soy/typeable/pandoc
on master help sign in
MediaBag: ensure that / is always used as path separator.
6532950John MacFarlane
src/Text/Pandoc/MediaBag.hs+6−4
@@ -37,9 +37,11 @@ module Text.Pandoc.MediaBag (
37 extractMediaBag
37 extractMediaBag
38 ) where
38 ) where
39import System.FilePath
39import System.FilePath
40+import qualified System.FilePath.Posix as Posix
40import System.Directory (createDirectoryIfMissing)
41import System.Directory (createDirectoryIfMissing)
41import qualified Data.Map as M
42import qualified Data.Map as M
42import qualified Data.ByteString.Lazy as BL
43import qualified Data.ByteString.Lazy as BL
44+import Data.List (intercalate)
43import Data.Monoid (Monoid)
45import Data.Monoid (Monoid)
44import Control.Monad (when)
46import Control.Monad (when)
45import Text.Pandoc.MIME (MimeType, getMimeTypeDef)
47import Text.Pandoc.MIME (MimeType, getMimeTypeDef)
@@ -67,7 +69,7 @@ insertMedia :: FilePath -- ^ relative path and canonical name of resource
67 -> MediaBag
69 -> MediaBag
68 -> MediaBag
70 -> MediaBag
69insertMedia fp mbMime contents (MediaBag mediamap) =
71insertMedia fp mbMime contents (MediaBag mediamap) =
70− MediaBag (M.insert (splitPath fp) (mime, contents) mediamap)
72+ MediaBag (M.insert (splitDirectories fp) (mime, contents) mediamap)
71 where mime = fromMaybe fallback mbMime
73 where mime = fromMaybe fallback mbMime
72 fallback = case takeExtension fp of
74 fallback = case takeExtension fp of
73 ".gz" -> getMimeTypeDef $ dropExtension fp
75 ".gz" -> getMimeTypeDef $ dropExtension fp
@@ -77,14 +79,14 @@ insertMedia fp mbMime contents (MediaBag mediamap) =
77lookupMedia :: FilePath
79lookupMedia :: FilePath
78 -> MediaBag
80 -> MediaBag
79 -> Maybe (MimeType, BL.ByteString)
81 -> Maybe (MimeType, BL.ByteString)
80−lookupMedia fp (MediaBag mediamap) = M.lookup (splitPath fp) mediamap
82+lookupMedia fp (MediaBag mediamap) = M.lookup (splitDirectories fp) mediamap
81
83
82-- | Get a list of the file paths stored in a 'MediaBag', with
84-- | Get a list of the file paths stored in a 'MediaBag', with
83-- their corresponding mime types and the lengths in bytes of the contents.
85-- their corresponding mime types and the lengths in bytes of the contents.
84mediaDirectory :: MediaBag -> [(String, MimeType, Int)]
86mediaDirectory :: MediaBag -> [(String, MimeType, Int)]
85mediaDirectory (MediaBag mediamap) =
87mediaDirectory (MediaBag mediamap) =
86 M.foldWithKey (\fp (mime,contents) ->
88 M.foldWithKey (\fp (mime,contents) ->
87− (((joinPath fp), mime, fromIntegral $ BL.length contents):)) [] mediamap
89+ (((Posix.joinPath fp), mime, fromIntegral $ BL.length contents):)) [] mediamap
88
90
89-- | Extract contents of MediaBag to a given directory. Print informational
91-- | Extract contents of MediaBag to a given directory. Print informational
90-- messages if 'verbose' is true.
92-- messages if 'verbose' is true.
@@ -95,7 +97,7 @@ extractMediaBag :: Bool
95extractMediaBag verbose dir (MediaBag mediamap) = do
97extractMediaBag verbose dir (MediaBag mediamap) = do
96 sequence_ $ M.foldWithKey
98 sequence_ $ M.foldWithKey
97 (\fp (_ ,contents) ->
99 (\fp (_ ,contents) ->
98− ((writeMedia verbose dir (joinPath fp, contents)):)) [] mediamap
100+ ((writeMedia verbose dir (Posix.joinPath fp, contents)):)) [] mediamap
99
101
100writeMedia :: Bool -> FilePath -> (FilePath, BL.ByteString) -> IO ()
102writeMedia :: Bool -> FilePath -> (FilePath, BL.ByteString) -> IO ()
101writeMedia verbose dir (subpath, bs) = do
103writeMedia verbose dir (subpath, bs) = do
src/Text/Pandoc/Shared.hs+4−3
@@ -111,7 +111,8 @@ import Network.URI ( escapeURIString, isURI, nonStrictRelativeTo,
111 unEscapeString, parseURIReference, isAllowedInURI )
111 unEscapeString, parseURIReference, isAllowedInURI )
112import qualified Data.Set as Set
112import qualified Data.Set as Set
113import System.Directory
113import System.Directory
114−import System.FilePath (joinPath, splitDirectories, pathSeparator, isPathSeparator)
114+import System.FilePath (joinPath, splitDirectories, isPathSeparator)
115+import qualified System.FilePath.Posix as Posix
115import Text.Pandoc.MIME (MimeType, getMimeType)
116import Text.Pandoc.MIME (MimeType, getMimeType)
116import System.FilePath ( (</>), takeExtension, dropExtension)
117import System.FilePath ( (</>), takeExtension, dropExtension)
117import Data.Generics (Typeable, Data)
118import Data.Generics (Typeable, Data)
@@ -967,14 +968,14 @@ hush (Right x) = Just x
967-- > collapseFilePath "parent/foo/.." == "parent"
968-- > collapseFilePath "parent/foo/.." == "parent"
968-- > collapseFilePath "/parent/foo/../../bar" == "/bar"
969-- > collapseFilePath "/parent/foo/../../bar" == "/bar"
969collapseFilePath :: FilePath -> FilePath
970collapseFilePath :: FilePath -> FilePath
970−collapseFilePath = joinPath . reverse . foldl go [] . splitDirectories
971+collapseFilePath = Posix.joinPath . reverse . foldl go [] . splitDirectories
971 where
972 where
972 go rs "." = rs
973 go rs "." = rs
973 go r@(p:rs) ".." = case p of
974 go r@(p:rs) ".." = case p of
974 ".." -> ("..":r)
975 ".." -> ("..":r)
975 (checkPathSeperator -> Just True) -> ("..":r)
976 (checkPathSeperator -> Just True) -> ("..":r)
976 _ -> rs
977 _ -> rs
977− go _ (checkPathSeperator -> Just True) = [[pathSeparator]]
978+ go _ (checkPathSeperator -> Just True) = [[Posix.pathSeparator]]
978 go rs x = x:rs
979 go rs x = x:rs
979 isSingleton [] = Nothing
980 isSingleton [] = Nothing
980 isSingleton [x] = Just x
981 isSingleton [x] = Just x
tests/Tests/Shared.hs+1−1
@@ -9,7 +9,7 @@ import Test.Framework.Providers.HUnit
9import Test.HUnit ( assertBool, (@?=) )
9import Test.HUnit ( assertBool, (@?=) )
10import Text.Pandoc.Builder
10import Text.Pandoc.Builder
11import Data.Monoid
11import Data.Monoid
12−import System.FilePath (joinPath)
12+import System.FilePath.Posix (joinPath)
13
13
14tests :: [Test]
14tests :: [Test]
15tests = [ testGroup "normalize"
15tests = [ testGroup "normalize"