From d40236805d287003d49fedce1475ac4dd83e575d Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Fri, 4 Feb 2022 09:47:07 -0800
Subject: [PATCH] MediaBag: improve detection of absolute paths.

Previously we used System.FilePath's isRelative to
determine when paths are relative (since absolute
paths need to get a new name based on the sha1 hash).
But this has an OS-specific behavior and actually
returns True on Windows for paths like `/media/file.png`.
This ought to fix #7881.
---
 src/Text/Pandoc/Class/IO.hs | 3 ++-
 src/Text/Pandoc/MediaBag.hs | 5 ++++-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/Text/Pandoc/Class/IO.hs b/src/Text/Pandoc/Class/IO.hs
index 5d4dbc715..816d71048 100644
--- a/src/Text/Pandoc/Class/IO.hs
+++ b/src/Text/Pandoc/Class/IO.hs
@@ -53,6 +53,7 @@ import Network.URI (unEscapeString)
 import System.Directory (createDirectoryIfMissing)
 import System.Environment (getEnv)
 import System.FilePath ((</>), takeDirectory, normalise)
+import qualified System.FilePath.Posix as Posix
 import System.IO (stderr)
 import System.IO.Error
 import System.Random (StdGen)
@@ -234,6 +235,6 @@ adjustImagePath dir mediabag (Image attr lab (src, tit)) =
   case lookupMedia (T.unpack src) mediabag of
     Nothing -> Image attr lab (src, tit)
     Just item ->
-      let fullpath = dir <> "/" <> mediaPath item
+      let fullpath = dir Posix.</> mediaPath item
       in  Image attr lab (T.pack fullpath, tit)
 adjustImagePath _ _ x = x
diff --git a/src/Text/Pandoc/MediaBag.hs b/src/Text/Pandoc/MediaBag.hs
index df71ff813..e10124664 100644
--- a/src/Text/Pandoc/MediaBag.hs
+++ b/src/Text/Pandoc/MediaBag.hs
@@ -29,6 +29,8 @@ import qualified Data.Map as M
 import Data.Maybe (fromMaybe, isNothing)
 import Data.Typeable (Typeable)
 import System.FilePath
+import qualified System.FilePath.Posix as Posix
+import qualified System.FilePath.Windows as Windows
 import Text.Pandoc.MIME (MimeType, getMimeTypeDef, extensionFromMimeType)
 import Data.Text (Text)
 import qualified Data.Text as T
@@ -78,7 +80,8 @@ insertMedia fp mbMime contents (MediaBag mediamap) =
                              , mediaMimeType = mt }
         fp' = canonicalize fp
         uri = parseURI fp
-        newpath = if isRelative fp
+        newpath = if Posix.isRelative fp
+                       && Windows.isRelative fp
                        && isNothing uri
                        && ".." `notElem` splitDirectories fp
                      then T.unpack fp'