packages feed

pandoc-md-slides-1.0.0.0: app/Remarkjs-pandoc-filter.hs

{-# LANGUAGE OverloadedStrings #-}

import Text.Pandoc.JSON
import Data.Text (Text)

wrapEquation :: Text -> Text
wrapEquation eq = "$$" <> eq <> "$$"

-- converts math blocks to code for mathjax integration
codifiedMath :: Block -> Block
codifiedMath (Para [Math DisplayMath eq]) = Para [Code ("", [], []) (wrapEquation eq)]
codifiedMath block = block

centeredHeader :: Block -> [Block]
centeredHeader header@(Header _ _ _) = [RawBlock (Format "markdown") "class: center, middle", header]
centeredHeader block = [block]

centeredHeaderSlides :: [Block] -> [Block]
centeredHeaderSlides (header@(Header _ _ _) : (RawBlock (Format "markdown") "---") : rest) =
    (centeredHeader header) ++ [(RawBlock (Format "markdown") "---")] ++ (centeredHeaderSlides rest)
centeredHeaderSlides (header@(Header _ _ _) : block : (RawBlock (Format "markdown") "---") : rest) =
    [header, block, (RawBlock (Format "markdown") "---")] ++ (centeredHeaderSlides rest)
centeredHeaderSlides (block : rest) = block : (centeredHeaderSlides rest)
centeredHeaderSlides [] = []

topDownBlockFilter :: (Block -> Block) -> Pandoc -> Pandoc
topDownBlockFilter blockfilter (Pandoc meta blocks) = Pandoc meta (map blockfilter blocks)

topDownBlockListFilter :: ([Block] -> [Block]) -> Pandoc -> Pandoc
topDownBlockListFilter blocklistfilter (Pandoc meta blocks) = Pandoc meta (blocklistfilter blocks)

main :: IO ()
main = toJSONFilter $
    topDownBlockListFilter centeredHeaderSlides
    . topDownBlockFilter codifiedMath