{-# LANGUAGE TemplateHaskell #-} module Hakyll.TeX.TikZ ( TikzTemplate , tikzFilter , tikzBlockFilter -- * Using the default TikZ template , tikzTemplate , tikzFilter_ , tikzBlockFilter_ ) where import Network.URI.Encode qualified as URI import Text.Pandoc.Definition import Text.Pandoc.Walk (walkM) import Hakyll import Prolog import Hakyll.TeX.LaTeX (rubberPipe) type TikzTemplate = Template tikzFilter :: TikzTemplate -> Pandoc -> Compiler Pandoc tikzFilter = walkM . tikzBlockFilter -- | Requires `rubber` and `poppler_utils` tikzBlockFilter :: TikzTemplate -> Block -> Compiler Block tikzBlockFilter tmpl (CodeBlock info@(_, "tikzpicture":_, _) contents) = do let imageBlock fname = Para [ Image info [] (toSL fname, "") ] makeItem (toSL contents) >>= applyTemplate tmpl (bodyField "body") >>= traverse (convSL $ rubberPipe [ "--pdf" ] >=> unixFilterLBS "pdftocairo" [ "-svg", "-", "-" ]) >>= \(Item _ b) -> pure $ imageBlock $ ("data:image/svg+sml;utf8," <>) $ URI.encode $ filter (/= '\n') b tikzBlockFilter _ x = pure x tikzTemplate :: TikzTemplate tikzTemplate = $(embedTemplate "templates/tikz.tex") tikzBlockFilter_ :: Block -> Compiler Block tikzBlockFilter_ = tikzBlockFilter tikzTemplate tikzFilter_ :: Pandoc -> Compiler Pandoc tikzFilter_ = tikzFilter tikzTemplate