git.iko.soy/typeable/pandoc
on master help sign in
MediaBag: ensure that / is always used as path separator.
commit6532950b26a7dfc61818c73376a14d90ba79a631 authorJohn MacFarlane <jgm@berkeley.edu> dateSat 26 Sep 2015, 22:40 (11 years ago) parent90914d2
3 files changed+11−8
src/Text/Pandoc/MediaBag.hs+6−4 src/Text/Pandoc/Shared.hs+4−3 tests/Tests/Shared.hs+1−1
src/Text/Pandoc/MediaBag.hs+6−4
@@ -37,9 +37,11 @@ module Text.Pandoc.MediaBag (
3737 extractMediaBag
3838 ) where
3939import System.FilePath
40+import qualified System.FilePath.Posix as Posix
4041import System.Directory (createDirectoryIfMissing)
4142import qualified Data.Map as M
4243import qualified Data.ByteString.Lazy as BL
44+import Data.List (intercalate)
4345import Data.Monoid (Monoid)
4446import Control.Monad (when)
4547import Text.Pandoc.MIME (MimeType, getMimeTypeDef)
@@ -67,7 +69,7 @@ insertMedia :: FilePath -- ^ relative path and canonical name of resource
6769 -> MediaBag
6870 -> MediaBag
6971insertMedia fp mbMime contents (MediaBag mediamap) =
70− MediaBag (M.insert (splitPath fp) (mime, contents) mediamap)
72+ MediaBag (M.insert (splitDirectories fp) (mime, contents) mediamap)
7173 where mime = fromMaybe fallback mbMime
7274 fallback = case takeExtension fp of
7375 ".gz" -> getMimeTypeDef $ dropExtension fp
@@ -77,14 +79,14 @@ insertMedia fp mbMime contents (MediaBag mediamap) =
7779lookupMedia :: FilePath
7880 -> MediaBag
7981 -> Maybe (MimeType, BL.ByteString)
80−lookupMedia fp (MediaBag mediamap) = M.lookup (splitPath fp) mediamap
82+lookupMedia fp (MediaBag mediamap) = M.lookup (splitDirectories fp) mediamap
8183
8284-- | Get a list of the file paths stored in a 'MediaBag', with
8385-- their corresponding mime types and the lengths in bytes of the contents.
8486mediaDirectory :: MediaBag -> [(String, MimeType, Int)]
8587mediaDirectory (MediaBag mediamap) =
8688 M.foldWithKey (\fp (mime,contents) ->
87− (((joinPath fp), mime, fromIntegral $ BL.length contents):)) [] mediamap
89+ (((Posix.joinPath fp), mime, fromIntegral $ BL.length contents):)) [] mediamap
8890
8991-- | Extract contents of MediaBag to a given directory. Print informational
9092-- messages if 'verbose' is true.
@@ -95,7 +97,7 @@ extractMediaBag :: Bool
9597extractMediaBag verbose dir (MediaBag mediamap) = do
9698 sequence_ $ M.foldWithKey
9799 (\fp (_ ,contents) ->
98− ((writeMedia verbose dir (joinPath fp, contents)):)) [] mediamap
100+ ((writeMedia verbose dir (Posix.joinPath fp, contents)):)) [] mediamap
99101
100102writeMedia :: Bool -> FilePath -> (FilePath, BL.ByteString) -> IO ()
101103writeMedia verbose dir (subpath, bs) = do
src/Text/Pandoc/Shared.hs+4−3
@@ -111,7 +111,8 @@ import Network.URI ( escapeURIString, isURI, nonStrictRelativeTo,
111111 unEscapeString, parseURIReference, isAllowedInURI )
112112import qualified Data.Set as Set
113113import 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
115116import Text.Pandoc.MIME (MimeType, getMimeType)
116117import System.FilePath ( (</>), takeExtension, dropExtension)
117118import Data.Generics (Typeable, Data)
@@ -967,14 +968,14 @@ hush (Right x) = Just x
967968-- > collapseFilePath "parent/foo/.." == "parent"
968969-- > collapseFilePath "/parent/foo/../../bar" == "/bar"
969970collapseFilePath :: FilePath -> FilePath
970−collapseFilePath = joinPath . reverse . foldl go [] . splitDirectories
971+collapseFilePath = Posix.joinPath . reverse . foldl go [] . splitDirectories
971972 where
972973 go rs "." = rs
973974 go r@(p:rs) ".." = case p of
974975 ".." -> ("..":r)
975976 (checkPathSeperator -> Just True) -> ("..":r)
976977 _ -> rs
977− go _ (checkPathSeperator -> Just True) = [[pathSeparator]]
978+ go _ (checkPathSeperator -> Just True) = [[Posix.pathSeparator]]
978979 go rs x = x:rs
979980 isSingleton [] = Nothing
980981 isSingleton [x] = Just x
tests/Tests/Shared.hs+1−1
@@ -9,7 +9,7 @@ import Test.Framework.Providers.HUnit
99import Test.HUnit ( assertBool, (@?=) )
1010import Text.Pandoc.Builder
1111import Data.Monoid
12−import System.FilePath (joinPath)
12+import System.FilePath.Posix (joinPath)
1313
1414tests :: [Test]
1515tests = [ testGroup "normalize"