sitepipe-0.4.0.2: src/SitePipe/Readers.hs
{-# LANGUAGE FlexibleContexts #-}
module SitePipe.Readers
(
-- * Built-in readers
markdownReader
, textReader
-- * Reader Generators
, mkPandocReader
, mkPandocReaderWith
, readMarkdown
-- * Pandoc Writers
, pandocToHTML
) where
import Control.Monad.Trans.Except
import Control.Monad.Trans.State
import Control.Monad.Catch
import Text.Pandoc
import Text.Pandoc.Options
import Text.Pandoc.Highlighting
import Data.Text (pack, unpack)
-- | Given any standard pandoc reader (see "Text.Pandoc"; e.g. 'readMarkdown', 'readDocX')
-- makes a resource reader compatible with 'SitePipe.Files.resourceLoader'.
--
-- > docs <- resourceLoader (mkPandocReader readDocX) ["docs/*.docx"]
mkPandocReader :: (ReaderOptions -> String -> PandocIO Pandoc) -> String -> IO String
mkPandocReader pReader = mkPandocReaderWith pReader pure pandocToHTML
-- | Like `mkPandocReader`, but allows you to provide both a @'Pandoc' -> 'Pandoc'@ transformation,
-- which is great for things like relativizing links or running transforms over specific document elements.
-- See https://hackage.haskell.org/package/pandoc-lens for some useful tranformation helpers. You also specify
-- the tranformation from @Pandoc -> String@ which allows you to pick the output format of the reader.
-- If you're unsure what to use in this slot, the pandocToHTML function is a good choice.
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
-- | A simple helper which renders pandoc to HTML; good for use with 'mkPandocReaderWith'
pandocToHTML :: Pandoc -> PandocIO String
pandocToHTML p = fmap unpack $ writeHtml5String def{writerHighlightStyle = Just pygments} p
-- | Runs the Pandoc reader handling errors.
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
-- | Reads markdown files into html
markdownReader :: String -> IO String
markdownReader = mkPandocReader $ \ro s -> readMarkdown ro $ pack s
-- | Reads text files without processing
textReader :: String -> PandocIO String
textReader = pure