@@ -26,13 +26,14 @@ module Text.Pandoc.MediaBag (
2626import qualified Data.ByteString.Lazy as BL
2727import Data.Data (Data)
2828import qualified Data.Map as M
29−import Data.Maybe (fromMaybe)
29+import Data.Maybe (fromMaybe, isNothing)
3030import Data.Typeable (Typeable)
3131import System.FilePath
3232import Text.Pandoc.MIME (MimeType, getMimeTypeDef, extensionFromMimeType)
3333import Data.Text (Text)
3434import qualified Data.Text as T
3535import Data.Digest.Pure.SHA (sha1, showDigest)
36+import Network.URI (URI (..), parseURI)
3637
3738data MediaItem =
3839 MediaItem
@@ -76,16 +77,20 @@ insertMedia fp mbMime contents (MediaBag mediamap) =
7677 , mediaContents = contents
7778 , mediaMimeType = mt }
7879 fp' = canonicalize fp
79− newpath = if isRelative fp && ".." `notElem` splitPath fp
80+ uri = parseURI fp
81+ newpath = if isRelative fp
82+ && isNothing uri
83+ && ".." `notElem` splitPath fp
8084 then T.unpack fp'
8185 else showDigest (sha1 contents) <> "." <> ext
8286 fallback = case takeExtension fp of
8387 ".gz" -> getMimeTypeDef $ dropExtension fp
8488 _ -> getMimeTypeDef fp
8589 mt = fromMaybe fallback mbMime
86− ext = case takeExtension fp of
87− '.':e -> e
88− _ -> maybe "" T.unpack $ extensionFromMimeType mt
90+ path = maybe fp uriPath uri
91+ ext = case takeExtension path of
92+ '.':e -> e
93+ _ -> maybe "" T.unpack $ extensionFromMimeType mt
8994
9095
9196-- | Lookup a media item in a 'MediaBag', returning mime type and contents.