{-# LANGUAGE FlexibleInstances, FlexibleContexts, MultiParamTypeClasses #-}
module Text.Pandoc.JSON ( module Text.Pandoc.Definition
, ToJSONFilter(..)
)
where
import Text.Pandoc.Definition
import Text.Pandoc.Walk
import Control.Monad.IO.Class(MonadIO(liftIO))
import Data.Maybe (listToMaybe)
import qualified Data.ByteString.Lazy as BL
import qualified Data.Text as T
import Data.Aeson
import System.Environment (getArgs)
class ToJSONFilter m a where
toJSONFilter :: a -> m ()
instance (Walkable a Pandoc, MonadIO m) => ToJSONFilter m (a -> a) where
toJSONFilter :: (a -> a) -> m ()
toJSONFilter a -> a
f = IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ IO ByteString
BL.getContents IO ByteString -> (ByteString -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
ByteString -> IO ()
BL.putStr (ByteString -> IO ())
-> (ByteString -> ByteString) -> ByteString -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Pandoc -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Pandoc -> ByteString)
-> (ByteString -> Pandoc) -> ByteString -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a -> a) -> Pandoc -> Pandoc
forall a b. Walkable a b => (a -> a) -> b -> b
walk a -> a
f :: Pandoc -> Pandoc) (Pandoc -> Pandoc)
-> (ByteString -> Pandoc) -> ByteString -> Pandoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Char] -> Pandoc)
-> (Pandoc -> Pandoc) -> Either [Char] Pandoc -> Pandoc
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either [Char] -> Pandoc
forall a. HasCallStack => [Char] -> a
error Pandoc -> Pandoc
forall a. a -> a
id (Either [Char] Pandoc -> Pandoc)
-> (ByteString -> Either [Char] Pandoc) -> ByteString -> Pandoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
ByteString -> Either [Char] Pandoc
forall a. FromJSON a => ByteString -> Either [Char] a
eitherDecode'
instance (Walkable [a] Pandoc, MonadIO m) => ToJSONFilter m (a -> [a]) where
toJSONFilter :: (a -> [a]) -> m ()
toJSONFilter a -> [a]
f = IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ IO ByteString
BL.getContents IO ByteString -> (ByteString -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
ByteString -> IO ()
BL.putStr (ByteString -> IO ())
-> (ByteString -> ByteString) -> ByteString -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Pandoc -> ByteString
forall a. ToJSON a => a -> ByteString
encode (Pandoc -> ByteString)
-> (ByteString -> Pandoc) -> ByteString -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (([a] -> [a]) -> Pandoc -> Pandoc
forall a b. Walkable a b => (a -> a) -> b -> b
walk ((a -> [a]) -> [a] -> [a]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap a -> [a]
f) :: Pandoc -> Pandoc) (Pandoc -> Pandoc)
-> (ByteString -> Pandoc) -> ByteString -> Pandoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
([Char] -> Pandoc)
-> (Pandoc -> Pandoc) -> Either [Char] Pandoc -> Pandoc
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either [Char] -> Pandoc
forall a. HasCallStack => [Char] -> a
error Pandoc -> Pandoc
forall a. a -> a
id (Either [Char] Pandoc -> Pandoc)
-> (ByteString -> Either [Char] Pandoc) -> ByteString -> Pandoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
ByteString -> Either [Char] Pandoc
forall a. FromJSON a => ByteString -> Either [Char] a
eitherDecode'
instance (Walkable a Pandoc, MonadIO m) => ToJSONFilter m (a -> m a) where
toJSONFilter :: (a -> m a) -> m ()
toJSONFilter a -> m a
f = do
c <- IO ByteString -> m ByteString
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO ByteString
BL.getContents
r <- walkM f (either error id (eitherDecode' c) :: Pandoc)
liftIO (BL.putStr (encode (r :: Pandoc)))
instance (Walkable [a] Pandoc, MonadIO m) => ToJSONFilter m (a -> m [a]) where
toJSONFilter :: (a -> m [a]) -> m ()
toJSONFilter a -> m [a]
f = do
c <- IO ByteString -> m ByteString
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO ByteString
BL.getContents
r <- (walkM (fmap concat . mapM f)) (either error id (eitherDecode' c) :: Pandoc)
liftIO (BL.putStr (encode (r :: Pandoc)))
instance (ToJSONFilter m a, MonadIO m) => ToJSONFilter m ([String] -> a) where
toJSONFilter :: ([[Char]] -> a) -> m ()
toJSONFilter [[Char]] -> a
f = IO [[Char]] -> m [[Char]]
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO [[Char]]
getArgs m [[Char]] -> ([[Char]] -> m ()) -> m ()
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= a -> m ()
forall (m :: * -> *) a. ToJSONFilter m a => a -> m ()
toJSONFilter (a -> m ()) -> ([[Char]] -> a) -> [[Char]] -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[Char]] -> a
f
instance (ToJSONFilter m a, MonadIO m) => ToJSONFilter m (Maybe Format -> a) where
toJSONFilter :: (Maybe Format -> a) -> m ()
toJSONFilter Maybe Format -> a
f = IO [[Char]] -> m [[Char]]
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO [[Char]]
getArgs m [[Char]] -> ([[Char]] -> m ()) -> m ()
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= a -> m ()
forall (m :: * -> *) a. ToJSONFilter m a => a -> m ()
toJSONFilter (a -> m ()) -> ([[Char]] -> a) -> [[Char]] -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe Format -> a
f (Maybe Format -> a) -> ([[Char]] -> Maybe Format) -> [[Char]] -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Char] -> Format) -> Maybe [Char] -> Maybe Format
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text -> Format
Format (Text -> Format) -> ([Char] -> Text) -> [Char] -> Format
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
T.pack) (Maybe [Char] -> Maybe Format)
-> ([[Char]] -> Maybe [Char]) -> [[Char]] -> Maybe Format
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[Char]] -> Maybe [Char]
forall a. [a] -> Maybe a
listToMaybe