pandoc-crossref-0.1.5.1: src/Text/Pandoc/CrossRef.hs
module Text.Pandoc.CrossRef (
getSettings
, crossRefBlocks
, crossRefMeta
, runCrossRef
, runCrossRefIO
, module SG
) where
import Control.Monad.State
import qualified Control.Monad.Reader as R
import Text.Pandoc
import Text.Pandoc.Walk
import Data.Monoid ((<>))
import Text.Pandoc.CrossRef.References
import Text.Pandoc.CrossRef.Util.Settings
import Text.Pandoc.CrossRef.Util.Options
import Text.Pandoc.CrossRef.Util.CodeBlockCaptions
import Text.Pandoc.CrossRef.Util.ModifyMeta
import Text.Pandoc.CrossRef.Util.Settings.Gen as SG
data CrossRefEnv = CrossRefEnv {
creSettings :: Meta
, creOptions :: Options
}
type CrossRefM a = R.Reader CrossRefEnv a
crossRefBlocks :: [Block] -> CrossRefM [Block]
crossRefBlocks blocks = do
opts <- R.asks creOptions
let
doWalk =
bottomUpM (codeBlockCaptions opts) (walk divBlocks blocks)
>>= walkM (replaceBlocks opts)
>>= bottomUpM (replaceRefs opts)
>>= bottomUpM (listOf opts)
return $ evalState doWalk def
crossRefMeta :: CrossRefM Meta
crossRefMeta = do
opts <- R.asks creOptions
dtv <- R.asks creSettings
return $ modifyMeta opts dtv
runCrossRef :: (Walkable a b) => Meta -> Maybe Format -> (a -> CrossRefM b) -> a -> b
runCrossRef meta fmt action arg = R.runReader (action arg) env
where
settings = meta <> defaultMeta
env = CrossRefEnv {
creSettings = settings
, creOptions = getOptions settings fmt
}
runCrossRefIO :: (Walkable a b) => Meta -> Maybe Format -> (a -> CrossRefM b) -> a -> IO b
runCrossRefIO meta fmt action arg = do
settings <- getSettings meta
let
env = CrossRefEnv {
creSettings = settings
, creOptions = getOptions settings fmt
}
return $ R.runReader (action arg) env