@@ -79,8 +79,6 @@ module Text.Pandoc.Shared (
79 getDefaultReferenceODT,
79 getDefaultReferenceODT,
80 readDataFile,
80 readDataFile,
81 readDataFileUTF8,
81 readDataFileUTF8,
85 collapseFilePath,
83 collapseFilePath,
86 filteredFilesFromArchive,
84 filteredFilesFromArchive,
@@ -100,7 +98,6 @@ module Text.Pandoc.Shared (
101import Text.Pandoc.Definition
99import Text.Pandoc.Definition
102import Text.Pandoc.Walk
100import Text.Pandoc.Walk
103−import Text.Pandoc.MediaBag (MediaBag, lookupMedia)
104import Text.Pandoc.Builder (Inlines, Blocks, ToMetaValue(..))
101import Text.Pandoc.Builder (Inlines, Blocks, ToMetaValue(..))
105import qualified Text.Pandoc.Builder as B
102import qualified Text.Pandoc.Builder as B
106import qualified Text.Pandoc.UTF8 as UTF8
103import qualified Text.Pandoc.UTF8 as UTF8
@@ -111,15 +108,13 @@ import Data.List ( find, stripPrefix, intercalate )
111import Data.Maybe (mapMaybe)
108import Data.Maybe (mapMaybe)
112import Data.Version ( showVersion )
109import Data.Version ( showVersion )
113import qualified Data.Map as M
110import qualified Data.Map as M
114−import Network.URI ( escapeURIString, nonStrictRelativeTo,
111+import Network.URI ( escapeURIString, unEscapeString )
115− unEscapeString, parseURIReference, isAllowedInURI,
117import qualified Data.Set as Set
112import qualified Data.Set as Set
118import System.Directory
113import System.Directory
119import System.FilePath (splitDirectories, isPathSeparator)
114import System.FilePath (splitDirectories, isPathSeparator)
120import qualified System.FilePath.Posix as Posix
115import qualified System.FilePath.Posix as Posix
121−import Text.Pandoc.MIME (MimeType, getMimeType)
116+import Text.Pandoc.MIME (MimeType)
122−import System.FilePath ( (</>), takeExtension, dropExtension)
117+import System.FilePath ( (</>) )
123import Data.Generics (Typeable, Data)
118import Data.Generics (Typeable, Data)
124import qualified Control.Monad.State as S
119import qualified Control.Monad.State as S
125import Control.Monad.Trans (MonadIO (..))
120import Control.Monad.Trans (MonadIO (..))
@@ -752,64 +747,6 @@ readDataFileUTF8 :: Maybe FilePath -> FilePath -> IO String
752readDataFileUTF8 userDir fname =
747readDataFileUTF8 userDir fname =
753 UTF8.toString `fmap` readDataFile userDir fname
748 UTF8.toString `fmap` readDataFile userDir fname
755−-- | Specialized version of parseURIReference that disallows
756−-- single-letter schemes. Reason: these are usually windows absolute
758−parseURIReference' :: String -> Maybe URI
759−parseURIReference' s =
760− case parseURIReference s of
762− | length (uriScheme u) > 2 -> Just u
763− | null (uriScheme u) -> Just u -- protocol-relative
766−-- | Fetch an image or other item from the local filesystem or the net.
767−-- Returns raw content and maybe mime type.
768−fetchItem :: Maybe String -> String
769− -> IO (Either E.SomeException (BS.ByteString, Maybe MimeType))
770−fetchItem sourceURL s =
771− case (sourceURL >>= parseURIReference' . ensureEscaped, ensureEscaped s) of
772− (Just u, s') -> -- try fetching from relative path at source
773− case parseURIReference' s' of
774− Just u' -> openURL $ show $ u' `nonStrictRelativeTo` u
775− Nothing -> openURL s' -- will throw error
776− (Nothing, s'@('/':'/':_)) -> -- protocol-relative URI
777− case parseURIReference' s' of
778− Just u' -> openURL $ show $ u' `nonStrictRelativeTo` httpcolon
779− Nothing -> openURL s' -- will throw error
781− case parseURI s' of -- requires absolute URI
782− -- We don't want to treat C:/ as a scheme:
783− Just u' | length (uriScheme u') > 2 -> openURL (show u')
784− Just u' | uriScheme u' == "file:" ->
785− E.try $ readLocalFile $ dropWhile (=='/') (uriPath u')
786− _ -> E.try $ readLocalFile fp -- get from local file system
787− where readLocalFile f = do
788− cont <- BS.readFile f
790− httpcolon = URI{ uriScheme = "http:",
791− uriAuthority = Nothing,
795− dropFragmentAndQuery = takeWhile (\c -> c /= '?' && c /= '#')
796− fp = unEscapeString $ dropFragmentAndQuery s
797− mime = case takeExtension fp of
798− ".gz" -> getMimeType $ dropExtension fp
799− ".svgz" -> getMimeType $ dropExtension fp ++ ".svg"
801− ensureEscaped = escapeURIString isAllowedInURI . map convertSlash
802− convertSlash '\\' = '/'
805−-- | Like 'fetchItem', but also looks for items in a 'MediaBag'.
806−fetchItem' :: MediaBag -> Maybe String -> String
807− -> IO (Either E.SomeException (BS.ByteString, Maybe MimeType))
808−fetchItem' media sourceURL s = do
809− case lookupMedia s media of
810− Nothing -> fetchItem sourceURL s
811− Just (mime, bs) -> return $ Right (BS.concat $ toChunks bs, Just mime)
813-- | Read from a URL and return raw data and maybe mime type.
750-- | Read from a URL and return raw data and maybe mime type.
814openURL :: String -> IO (Either E.SomeException (BS.ByteString, Maybe MimeType))
751openURL :: String -> IO (Either E.SomeException (BS.ByteString, Maybe MimeType))