@@ -86,7 +86,7 @@ import System.Exit (exitWith, ExitCode(..))
8686import Data.Char ( toLower, isLower, isUpper, isAlpha,
8787 isLetter, isDigit, isSpace )
8888import Data.List ( find, isPrefixOf, intercalate )
89−import Network.URI ( escapeURIString, isAbsoluteURI, parseURI )
89+import Network.URI ( escapeURIString, isAbsoluteURI, parseURI, unEscapeString )
9090import System.Directory
9191import Text.Pandoc.MIME (getMimeType)
9292import System.FilePath ( (</>), takeExtension, dropExtension )
@@ -100,6 +100,7 @@ import System.IO (stderr)
100100import Text.HTML.TagSoup (renderTagsOptions, RenderOptions(..), Tag(..),
101101 renderOptions)
102102import qualified Data.ByteString as B
103+import qualified Data.ByteString.Char8 as B8
103104import Network.HTTP (findHeader, rspBody,
104105 RequestMethod(..), HeaderName(..), mkRequest)
105106import Network.Browser (browse, setAllowRedirects, setOutHandler, request)
@@ -567,7 +568,12 @@ fetchItem sourceDir s =
567568
568569-- | Read from a URL and return raw data and maybe mime type.
569570openURL :: String -> IO (B.ByteString, Maybe String)
570−openURL u = getBodyAndMimeType `fmap` browse
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)
576+ | otherwise = getBodyAndMimeType `fmap` browse
571577 (do S.liftIO $ UTF8.hPutStrLn stderr $ "Fetching " ++ u ++ "..."
572578 setOutHandler $ const (return ())
573579 setAllowRedirects True