{-# LANGUAGE FlexibleContexts #-}
module SitePipe.Readers
(
markdownReader
, textReader
, mkPandocReader
, mkPandocReaderWith
, readMarkdown
, pandocToHTML
) where
import Control.Monad.Trans.Except
import Control.Monad.Trans.State.Strict
import Control.Monad.Catch
import Text.Pandoc
import Text.Pandoc.Options
import Text.Pandoc.Highlighting
import Data.Text (pack, unpack)
mkPandocReader :: (ReaderOptions -> String -> PandocIO Pandoc) -> String -> IO String
mkPandocReader pReader = mkPandocReaderWith pReader pure pandocToHTML
mkPandocReaderWith :: (ReaderOptions -> String -> PandocIO Pandoc) -> (Pandoc -> PandocIO Pandoc) -> (Pandoc -> PandocIO String) -> String -> IO String
mkPandocReaderWith pReader transformer writer content =
runPandoc $ writer
=<< transformer
=<< pReader def{readerExtensions = githubMarkdownExtensions}
content
pandocToHTML :: Pandoc -> PandocIO String
pandocToHTML p = fmap unpack $ writeHtml5String def{writerHighlightStyle = Just pygments} p
runPandoc :: PandocIO a -> IO a
runPandoc m = do
z <- flip evalStateT def $ runExceptT $ unPandocIO m
case z of
Left e -> throwM e
Right a -> pure a
markdownReader :: String -> IO String
markdownReader = mkPandocReader $ \ro s -> readMarkdown ro $ pack s
textReader :: String -> PandocIO String
textReader = pure