git.iko.soy/typeable/pandoc
on master help sign in
Shared.openURL: Properly handle data: URIs.
0a6e9f0John MacFarlane
src/Text/Pandoc/Shared.hs+8−2
@@ -86,7 +86,7 @@ import System.Exit (exitWith, ExitCode(..))
86import Data.Char ( toLower, isLower, isUpper, isAlpha,
86import Data.Char ( toLower, isLower, isUpper, isAlpha,
87 isLetter, isDigit, isSpace )
87 isLetter, isDigit, isSpace )
88import Data.List ( find, isPrefixOf, intercalate )
88import Data.List ( find, isPrefixOf, intercalate )
89−import Network.URI ( escapeURIString, isAbsoluteURI, parseURI )
89+import Network.URI ( escapeURIString, isAbsoluteURI, parseURI, unEscapeString )
90import System.Directory
90import System.Directory
91import Text.Pandoc.MIME (getMimeType)
91import Text.Pandoc.MIME (getMimeType)
92import System.FilePath ( (</>), takeExtension, dropExtension )
92import System.FilePath ( (</>), takeExtension, dropExtension )
@@ -100,6 +100,7 @@ import System.IO (stderr)
100import Text.HTML.TagSoup (renderTagsOptions, RenderOptions(..), Tag(..),
100import Text.HTML.TagSoup (renderTagsOptions, RenderOptions(..), Tag(..),
101 renderOptions)
101 renderOptions)
102import qualified Data.ByteString as B
102import qualified Data.ByteString as B
103+import qualified Data.ByteString.Char8 as B8
103import Network.HTTP (findHeader, rspBody,
104import Network.HTTP (findHeader, rspBody,
104 RequestMethod(..), HeaderName(..), mkRequest)
105 RequestMethod(..), HeaderName(..), mkRequest)
105import Network.Browser (browse, setAllowRedirects, setOutHandler, request)
106import Network.Browser (browse, setAllowRedirects, setOutHandler, request)
@@ -567,7 +568,12 @@ fetchItem sourceDir s =
567
568
568-- | Read from a URL and return raw data and maybe mime type.
569-- | Read from a URL and return raw data and maybe mime type.
569openURL :: String -> IO (B.ByteString, Maybe String)
570openURL :: String -> IO (B.ByteString, Maybe String)
571+openURL u
572+ | "data:" `isPrefixOf` u =
573+ let mime = takeWhile (/=',') $ drop 5 u
574+ contents = B8.pack $ unEscapeString $ drop 1 $ dropWhile (/=',') u
575+ in return (contents, Just mime)
570−openURL u = getBodyAndMimeType `fmap` browse
576+ | otherwise = getBodyAndMimeType `fmap` browse
571 (do S.liftIO $ UTF8.hPutStrLn stderr $ "Fetching " ++ u ++ "..."
577 (do S.liftIO $ UTF8.hPutStrLn stderr $ "Fetching " ++ u ++ "..."
572 setOutHandler $ const (return ())
578 setOutHandler $ const (return ())
573 setAllowRedirects True
579 setAllowRedirects True