heist-extra-0.1.0.0: src/Heist/Extra/Splices/Pandoc.hs
module Heist.Extra.Splices.Pandoc (
RenderCtx (..),
pandocSplice,
-- | To delegate rendering of blocks and inlines from a custom splice.
rpBlock,
rpInline,
) where
import Heist.Extra.Splices.Pandoc.Ctx (
RenderCtx (..),
concatSpliceFunc,
)
import Heist.Extra.Splices.Pandoc.Footnotes (
footnoteRefSplice,
gatherFootnotes,
renderFootnotesWith,
)
import Heist.Extra.Splices.Pandoc.Render (
renderPandocWith,
rpBlock,
rpInline,
)
import Heist.Interpreted qualified as HI
import Text.Pandoc.Definition (Pandoc (..))
-- | A splice to render a Pandoc AST
pandocSplice ::
RenderCtx ->
Pandoc ->
HI.Splice Identity
pandocSplice ctx doc = do
-- Create a new context to render footnote references
let footnotes = gatherFootnotes doc
docCtx =
ctx
{ inlineSplice = concatSpliceFunc (inlineSplice ctx) (footnoteRefSplice docCtx footnotes)
}
-- Render main document
docNodes <- renderPandocWith docCtx doc
-- Render footnotes themselves, but without recursing into inner footnotes.
footnotesNodes <- renderFootnotesWith ctx footnotes
pure $ docNodes <> footnotesNodes