{-# LANGUAGE CPP, ScopedTypeVariables, NoImplicitPrelude #-} -- | Compatibility module to work around differences in the -- types of functions between pandoc < 2.0 and pandoc >= 2.0. module Text.CSL.Compat.Pandoc ( writeMarkdown, writePlain, writeNative, writeHtmlString, readNative, readHtml, readMarkdown, readLaTeX, fetchItem, pipeProcess ) where import Prelude import qualified Control.Exception as E import System.Exit (ExitCode) import Data.ByteString.Lazy as BL import Data.ByteString as B import Data.Text (Text) import Text.Pandoc (Extension (..), Pandoc, ReaderOptions(..), WrapOption(..), WriterOptions(..), def, pandocExtensions) import qualified Text.Pandoc as Pandoc import qualified Text.Pandoc.Process import qualified Data.Text as T import Text.Pandoc.MIME (MimeType) import Text.Pandoc.Error (PandocError) import Text.Pandoc.Class (runPure, runIO) import qualified Text.Pandoc.Class (fetchItem) import Control.Monad.Except (runExceptT, lift) import Text.Pandoc.Extensions (extensionsFromList, disableExtension) readHtml :: Text -> Pandoc readHtml = either mempty id . runPure . Pandoc.readHtml def{ readerExtensions = extensionsFromList [Ext_native_divs, Ext_native_spans, Ext_raw_html, Ext_smart] } readMarkdown :: Text -> Pandoc readMarkdown = either mempty id . runPure . Pandoc.readMarkdown def{ readerExtensions = pandocExtensions, readerStandalone = True } readLaTeX :: Text -> Pandoc readLaTeX = either mempty id . runPure . Pandoc.readLaTeX def{ readerExtensions = extensionsFromList [Ext_raw_tex, Ext_smart] } readNative :: Text -> Pandoc readNative = either mempty id . runPure . Pandoc.readNative def writeMarkdown, writePlain, writeNative, writeHtmlString :: Pandoc -> Text writeMarkdown = either mempty id . runPure . Pandoc.writeMarkdown def{ writerExtensions = disableExtension Ext_smart $ disableExtension Ext_bracketed_spans $ disableExtension Ext_raw_attribute $ pandocExtensions, writerWrapText = WrapNone } writePlain = either mempty id . runPure . Pandoc.writePlain def writeNative = either mempty id . runPure . Pandoc.writeNative def{ writerTemplate = Just mempty } writeHtmlString = either mempty id . runPure . Pandoc.writeHtml4String def{ writerExtensions = extensionsFromList [Ext_native_divs, Ext_native_spans, Ext_raw_html], writerWrapText = WrapPreserve } pipeProcess :: Maybe [(String, String)] -> FilePath -> [String] -> BL.ByteString -> IO (ExitCode,BL.ByteString) pipeProcess = Text.Pandoc.Process.pipeProcess fetchItem :: String -> IO (Either E.SomeException (B.ByteString, Maybe MimeType)) fetchItem s = do res <- runIO $ runExceptT $ lift $ Text.Pandoc.Class.fetchItem $ T.pack s return $ case res of Left e -> Left (E.toException e) Right (Left (e :: PandocError)) -> Left (E.toException e) Right (Right r) -> Right r