packages feed

pandoc-crossref-0.1.0.0: src/Util/Template.hs

module Util.Template where

import Text.Pandoc.Definition
import Text.Pandoc.Generic
import References.Types

import Control.Monad.State
import Data.Maybe
import Util.Util
import Util.Meta

replaceTemplate :: [Inline] -> WS [Inline]
replaceTemplate = bottomUpM replace
  where
  replace (x@(Math DisplayMath var):xs) = (++xs) `fmap` getTemplateMetaVar var [x]
  replace x = return x

getTemplateMetaVar :: String -> [Inline] -> WS [Inline]
getTemplateMetaVar var def' = do
  meta <- gets stMeta
  tmplv <- gets stTmplV
  dtv <- gets stDTV
  return
    $ fromMaybe def'
    $ (tmplv var `mplus` lookupDefault var meta dtv) >>= toInlines

applyTemplate :: [Inline] -> [Inline] -> [Inline] -> WS [Inline]
applyTemplate i t tmpl = withTmplV internalVars $ replaceTemplate tmpl
  where
        withTmplV :: (String -> Maybe MetaValue) -> WS [Inline] -> WS [Inline]
        withTmplV f g = do
          modify $ \s -> s{stTmplV=f}
          res <- g
          modify $ \s -> s{stTmplV=const Nothing}
          return res
        internalVars "i" = Just $ MetaInlines i
        internalVars "t" = Just $ MetaInlines t
        internalVars _   = Nothing