{-# LANGUAGE RecordWildCards #-}
module Emanote.Pandoc.Renderer (
PandocRenderers (PandocRenderers),
PandocInlineRenderer,
PandocBlockRenderer,
mkRenderCtxWithPandocRenderers,
EmanotePandocRenderers (..),
) where
import Heist (HeistT)
import Heist.Extra.Splices.Pandoc qualified as Splices
import Heist.Extra.Splices.Pandoc.Ctx qualified as Splices
import Heist.Interpreted qualified as HI
import Relude
import Text.Pandoc.Definition qualified as B
type PandocRenderF model route astNode =
model ->
PandocRenderers model route ->
Splices.RenderCtx ->
route ->
astNode ->
Maybe (HI.Splice Identity)
type PandocInlineRenderer model route = PandocRenderF model route B.Inline
type PandocBlockRenderer model route = PandocRenderF model route B.Block
data PandocRenderers model route = PandocRenderers
{ forall model route.
PandocRenderers model route -> [PandocInlineRenderer model route]
pandocInlineRenderers :: [PandocInlineRenderer model route]
, forall model route.
PandocRenderers model route -> [PandocBlockRenderer model route]
pandocBlockRenderers :: [PandocBlockRenderer model route]
}
mkRenderCtxWithPandocRenderers ::
forall model route m.
(Monad m) =>
PandocRenderers model route ->
Map Text Text ->
model ->
route ->
HeistT Identity m Splices.RenderCtx
mkRenderCtxWithPandocRenderers :: forall model route (m :: Type -> Type).
Monad m =>
PandocRenderers model route
-> Map Text Text -> model -> route -> HeistT Identity m RenderCtx
mkRenderCtxWithPandocRenderers nr :: PandocRenderers model route
nr@PandocRenderers {[PandocBlockRenderer model route]
[PandocInlineRenderer model route]
pandocBlockRenderers :: [PandocBlockRenderer model route]
pandocInlineRenderers :: [PandocInlineRenderer model route]
pandocBlockRenderers :: forall model route.
PandocRenderers model route -> [PandocBlockRenderer model route]
pandocInlineRenderers :: forall model route.
PandocRenderers model route -> [PandocInlineRenderer model route]
..} Map Text Text
classRules model
model route
x =
forall (m :: Type -> Type).
Monad m =>
Map Text Text
-> (RenderCtx -> Block -> Maybe (Splice Identity))
-> (RenderCtx -> Inline -> Maybe (Splice Identity))
-> HeistT Identity m RenderCtx
Splices.mkRenderCtx
Map Text Text
classRules
( \RenderCtx
ctx Block
blk ->
forall (t :: Type -> Type) (f :: Type -> Type) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum forall a b. (a -> b) -> a -> b
$
[PandocBlockRenderer model route]
pandocBlockRenderers forall (f :: Type -> Type) a b. Functor f => f a -> (a -> b) -> f b
<&> \PandocBlockRenderer model route
f ->
PandocBlockRenderer model route
f model
model PandocRenderers model route
nr RenderCtx
ctx route
x Block
blk
)
( \RenderCtx
ctx Inline
blk ->
forall (t :: Type -> Type) (f :: Type -> Type) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum forall a b. (a -> b) -> a -> b
$
[PandocInlineRenderer model route]
pandocInlineRenderers forall (f :: Type -> Type) a b. Functor f => f a -> (a -> b) -> f b
<&> \PandocInlineRenderer model route
f ->
PandocInlineRenderer model route
f model
model PandocRenderers model route
nr RenderCtx
ctx route
x Inline
blk
)
data EmanotePandocRenderers a r = EmanotePandocRenderers
{ forall a r. EmanotePandocRenderers a r -> PandocRenderers a r
blockRenderers :: PandocRenderers a r
, forall a r. EmanotePandocRenderers a r -> PandocRenderers a r
inlineRenderers :: PandocRenderers a r
, forall a r. EmanotePandocRenderers a r -> PandocRenderers a r
linkInlineRenderers :: PandocRenderers a r
}