git.iko.soy/typeable/pandoc
on master help sign in
Remove openURL from Shared (API change).
2f66d57John MacFarlane
pandoc.cabal+1
@@ -336,6 +336,7 @@ library
336 http-client >= 0.4.30 && < 0.6,
336 http-client >= 0.4.30 && < 0.6,
337 http-client-tls >= 0.2.4 && < 0.4,
337 http-client-tls >= 0.2.4 && < 0.4,
338 http-types >= 0.8 && < 0.10,
338 http-types >= 0.8 && < 0.10,
339+ case-insensitive >= 1.2 && < 1.3,
339 csv-conduit >= 0.6 && < 0.7
340 csv-conduit >= 0.6 && < 0.7
340 if os(windows)
341 if os(windows)
341 cpp-options: -D_WINDOWS
342 cpp-options: -D_WINDOWS
src/Text/Pandoc/Class.hs+44−7
@@ -1,10 +1,12 @@
1{-# LANGUAGE CPP #-}
1{-# LANGUAGE CPP #-}
2+{-# LANGUAGE PatternGuards #-}
2{-# LANGUAGE DeriveFunctor #-}
3{-# LANGUAGE DeriveFunctor #-}
3{-# LANGUAGE TypeSynonymInstances #-}
4{-# LANGUAGE TypeSynonymInstances #-}
4{-# LANGUAGE FlexibleInstances #-}
5{-# LANGUAGE FlexibleInstances #-}
5{-# LANGUAGE GeneralizedNewtypeDeriving #-}
6{-# LANGUAGE GeneralizedNewtypeDeriving #-}
6{-# LANGUAGE FlexibleContexts #-}
7{-# LANGUAGE FlexibleContexts #-}
7{-# LANGUAGE UndecidableInstances #-}
8{-# LANGUAGE UndecidableInstances #-}
9+{-# LANGUAGE ScopedTypeVariables #-}
8#if MIN_VERSION_base(4,8,0)
10#if MIN_VERSION_base(4,8,0)
9#else
11#else
10{-# LANGUAGE OverlappingInstances #-}
12{-# LANGUAGE OverlappingInstances #-}
@@ -97,9 +99,10 @@ import Prelude hiding (readFile)
97import System.Random (StdGen, next, mkStdGen)
99import System.Random (StdGen, next, mkStdGen)
98import qualified System.Random as IO (newStdGen)
100import qualified System.Random as IO (newStdGen)
99import Codec.Archive.Zip
101import Codec.Archive.Zip
102+import qualified Data.CaseInsensitive as CI
100import Data.Unique (hashUnique)
103import Data.Unique (hashUnique)
104+import Data.List (stripPrefix)
101import qualified Data.Unique as IO (newUnique)
105import qualified Data.Unique as IO (newUnique)
102−import qualified Text.Pandoc.Shared as Shared
103import qualified Text.Pandoc.UTF8 as UTF8
106import qualified Text.Pandoc.UTF8 as UTF8
104import qualified System.Directory as Directory
107import qualified System.Directory as Directory
105import Text.Pandoc.Compat.Time (UTCTime)
108import Text.Pandoc.Compat.Time (UTCTime)
@@ -115,9 +118,21 @@ import Data.Time.Clock.POSIX ( utcTimeToPOSIXSeconds
115 , posixSecondsToUTCTime
118 , posixSecondsToUTCTime
116 , POSIXTime )
119 , POSIXTime )
117import Data.Time.LocalTime (TimeZone, ZonedTime, utcToZonedTime, utc)
120import Data.Time.LocalTime (TimeZone, ZonedTime, utcToZonedTime, utc)
121+import Data.ByteString.Base64 (decodeLenient)
118import Network.URI ( escapeURIString, nonStrictRelativeTo,
122import Network.URI ( escapeURIString, nonStrictRelativeTo,
119 unEscapeString, parseURIReference, isAllowedInURI,
123 unEscapeString, parseURIReference, isAllowedInURI,
120 parseURI, URI(..) )
124 parseURI, URI(..) )
125+import Network.HTTP.Client (httpLbs, responseBody, responseHeaders,
126+ Request(port,host,requestHeaders))
127+import Network.HTTP.Client (parseRequest)
128+import Network.HTTP.Client (newManager)
129+import Network.HTTP.Client.Internal (addProxy)
130+import Network.HTTP.Client.TLS (tlsManagerSettings)
131+import System.Environment (getEnv)
132+import Network.HTTP.Types.Header ( hContentType )
133+import Network (withSocketsDo)
134+import Data.ByteString.Lazy (toChunks)
135+import qualified Control.Exception as E
121import qualified Data.Time.LocalTime as IO (getCurrentTimeZone)
136import qualified Data.Time.LocalTime as IO (getCurrentTimeZone)
122import Text.Pandoc.MediaBag (MediaBag, lookupMedia, mediaDirectory)
137import Text.Pandoc.MediaBag (MediaBag, lookupMedia, mediaDirectory)
123import Text.Pandoc.Walk (walkM, walk)
138import Text.Pandoc.Walk (walkM, walk)
@@ -456,12 +471,34 @@ instance PandocMonad PandocIO where
456 getCurrentTimeZone = liftIO IO.getCurrentTimeZone
471 getCurrentTimeZone = liftIO IO.getCurrentTimeZone
457 newStdGen = liftIO IO.newStdGen
472 newStdGen = liftIO IO.newStdGen
458 newUniqueHash = hashUnique <$> liftIO IO.newUnique
473 newUniqueHash = hashUnique <$> liftIO IO.newUnique
474+
459− openURL u = do
475+ openURL u
476+ | Just u'' <- stripPrefix "data:" u = do
477+ let mime = takeWhile (/=',') u''
478+ let contents = UTF8.fromString $
479+ unEscapeString $ drop 1 $ dropWhile (/=',') u''
480+ return (decodeLenient contents, Just mime)
481+ | otherwise = do
482+ let toReqHeader (n, v) = (CI.mk (UTF8.fromString n), UTF8.fromString v)
483+ customHeaders <- map toReqHeader <$> getsCommonState stRequestHeaders
460− report $ Fetching u
484+ report $ Fetching u
461− res <- liftIOError Shared.openURL u
485+ res <- liftIO $ E.try $ withSocketsDo $ do
486+ let parseReq = parseRequest
487+ proxy <- tryIOError (getEnv "http_proxy")
488+ let addProxy' x = case proxy of
489+ Left _ -> return x
490+ Right pr -> parseReq pr >>= \r ->
491+ return (addProxy (host r) (port r) x)
492+ req <- parseReq u >>= addProxy'
493+ let req' = req{requestHeaders = customHeaders ++ requestHeaders req}
494+ resp <- newManager tlsManagerSettings >>= httpLbs req'
495+ return (B.concat $ toChunks $ responseBody resp,
496+ UTF8.toString `fmap` lookup hContentType (responseHeaders resp))
497+
462− case res of
498+ case res of
463− Right r -> return r
499+ Right r -> return r
464− Left e -> throwError $ PandocHttpError u e
500+ Left e -> throwError $ PandocHttpError u e
501+
465 readFileLazy s = liftIOError BL.readFile s
502 readFileLazy s = liftIOError BL.readFile s
466 readFileStrict s = liftIOError B.readFile s
503 readFileStrict s = liftIOError B.readFile s
467
504
src/Text/Pandoc/Shared.hs+1−51
@@ -76,7 +76,6 @@ module Text.Pandoc.Shared (
76 renderTags',
76 renderTags',
77 -- * File handling
77 -- * File handling
78 inDirectory,
78 inDirectory,
79− openURL,
80 collapseFilePath,
79 collapseFilePath,
81 filteredFilesFromArchive,
80 filteredFilesFromArchive,
82 -- * URI handling
81 -- * URI handling
@@ -98,19 +97,17 @@ import Text.Pandoc.Definition
98import Text.Pandoc.Walk
97import Text.Pandoc.Walk
99import Text.Pandoc.Builder (Inlines, Blocks, ToMetaValue(..))
98import Text.Pandoc.Builder (Inlines, Blocks, ToMetaValue(..))
100import qualified Text.Pandoc.Builder as B
99import qualified Text.Pandoc.Builder as B
101−import qualified Text.Pandoc.UTF8 as UTF8
102import Data.Char ( toLower, isLower, isUpper, isAlpha,
100import Data.Char ( toLower, isLower, isUpper, isAlpha,
103 isLetter, isDigit, isSpace )
101 isLetter, isDigit, isSpace )
104import Data.List ( find, stripPrefix, intercalate )
102import Data.List ( find, stripPrefix, intercalate )
105import Data.Maybe (mapMaybe)
103import Data.Maybe (mapMaybe)
106import Data.Version ( showVersion )
104import Data.Version ( showVersion )
107import qualified Data.Map as M
105import qualified Data.Map as M
108−import Network.URI ( URI(uriScheme), escapeURIString, unEscapeString, parseURI )
106+import Network.URI ( URI(uriScheme), escapeURIString, parseURI )
109import qualified Data.Set as Set
107import qualified Data.Set as Set
110import System.Directory
108import System.Directory
111import System.FilePath (splitDirectories, isPathSeparator)
109import System.FilePath (splitDirectories, isPathSeparator)
112import qualified System.FilePath.Posix as Posix
110import qualified System.FilePath.Posix as Posix
113−import Text.Pandoc.MIME (MimeType)
114import Data.Generics (Typeable, Data)
111import Data.Generics (Typeable, Data)
115import qualified Control.Monad.State.Strict as S
112import qualified Control.Monad.State.Strict as S
116import qualified Control.Exception as E
113import qualified Control.Exception as E
@@ -118,33 +115,16 @@ import Control.Monad (msum, unless, MonadPlus(..))
118import Text.Pandoc.Pretty (charWidth)
115import Text.Pandoc.Pretty (charWidth)
119import Text.Pandoc.Generic (bottomUp)
116import Text.Pandoc.Generic (bottomUp)
120import Text.Pandoc.Compat.Time
117import Text.Pandoc.Compat.Time
121−import System.IO.Error
122import System.IO.Temp
118import System.IO.Temp
123import Text.HTML.TagSoup (renderTagsOptions, RenderOptions(..), Tag(..),
119import Text.HTML.TagSoup (renderTagsOptions, RenderOptions(..), Tag(..),
124 renderOptions)
120 renderOptions)
125import Data.Monoid ((<>))
121import Data.Monoid ((<>))
126−import qualified Data.ByteString as BS
127−import qualified Data.ByteString.Char8 as B8
128−import Data.ByteString.Base64 (decodeLenient)
129import Data.Sequence (ViewR(..), ViewL(..), viewl, viewr)
122import Data.Sequence (ViewR(..), ViewL(..), viewl, viewr)
130import qualified Data.Text as T
123import qualified Data.Text as T
131−import Data.ByteString.Lazy (toChunks)
132import qualified Data.ByteString.Lazy as BL
124import qualified Data.ByteString.Lazy as BL
133import Paths_pandoc (version)
125import Paths_pandoc (version)
134−
135import Codec.Archive.Zip
126import Codec.Archive.Zip
136
127
137−import Network.HTTP.Client (httpLbs, responseBody, responseHeaders,
138− Request(port,host,requestHeaders),
139− HttpException)
140−import Network.HTTP.Client (parseRequest)
141−import Network.HTTP.Client (newManager)
142−import Network.HTTP.Client.Internal (addProxy)
143−import Network.HTTP.Client.TLS (tlsManagerSettings)
144−import System.Environment (getEnv)
145−import Network.HTTP.Types.Header ( hContentType, hUserAgent)
146−import Network (withSocketsDo)
147−
148-- | Version number of pandoc library.
128-- | Version number of pandoc library.
149pandocVersion :: String
129pandocVersion :: String
150pandocVersion = showVersion version
130pandocVersion = showVersion version
@@ -606,36 +586,6 @@ inDirectory path action = E.bracket
606 setCurrentDirectory
586 setCurrentDirectory
607 (const $ setCurrentDirectory path >> action)
587 (const $ setCurrentDirectory path >> action)
608
588
609−-- | Read from a URL and return raw data and maybe mime type.
610−openURL :: String -> IO (Either HttpException (BS.ByteString, Maybe MimeType))
611−openURL u
612− | Just u'' <- stripPrefix "data:" u =
613− let mime = takeWhile (/=',') u''
614− contents = B8.pack $ unEscapeString $ drop 1 $ dropWhile (/=',') u''
615− in return $ Right (decodeLenient contents, Just mime)
616− | otherwise = E.try $ withSocketsDo $ do
617− let parseReq = parseRequest
618− (proxy :: Either IOError String) <-
619− tryIOError $ getEnv "http_proxy"
620− (useragent :: Either IOError String) <-
621− tryIOError $ getEnv "USER_AGENT"
622− req <- parseReq u
623− req' <- case proxy of
624− Left _ -> return req
625− Right pr -> (parseReq pr >>= \r ->
626− return $ addProxy (host r) (port r) req)
627− `mplus` return req
628− req'' <- case useragent of
629− Left _ -> return req'
630− Right ua -> do
631− let headers = requestHeaders req'
632− let useragentheader = (hUserAgent, B8.pack ua)
633− let headers' = useragentheader:headers
634− return $ req' {requestHeaders = headers'}
635− resp <- newManager tlsManagerSettings >>= httpLbs req''
636− return (BS.concat $ toChunks $ responseBody resp,
637− UTF8.toString `fmap` lookup hContentType (responseHeaders resp))
638−
639--
589--
640-- Error reporting
590-- Error reporting
641--
591--