{-# LANGUAGE OverloadedRecordDot #-} module Zettel.Render where import Data.Default (def) import qualified Data.Map.Strict as Map import qualified Data.Text as T import Paths_org_zk (getDataFileName) import Text.Pandoc.Class (runIOorExplode) import Text.Pandoc.Definition (Block (..), Inline (..)) import Text.Pandoc.Options (WriterOptions (..), multimarkdownExtensions) import Text.Pandoc.Templates (WithDefaultPartials (..), compileTemplate) import Text.Pandoc.Writers (writeMarkdown) import Zettel.Types zettelIdToLink :: ZettelId -> Inline zettelIdToLink ident = Link mempty [Str $ "#" <> unZettelId ident] ("/" <> unZettelId ident, "") renderZettelLinks :: [ZettelId] -> Block renderZettelLinks = BulletList . map (\ident -> [Para [zettelIdToLink ident]]) toInlines :: Text -> [Inline] toInlines t = intersperse Space . map Str $ T.words t renderTitleLinks :: Int -> Text -> [ZettelId] -> [Block] renderTitleLinks level title ids = [Header level mempty (toInlines title), renderZettelLinks ids] renderZettel :: ZettelId -> ZettelNode -> IO Text renderZettel _ zettel = do templateFile <- getDataFileName "data/markdown.template" template <- decodeUtf8 <$> readFileBS templateFile Right templ <- runIOorExplode . runWithDefaultPartials $ compileTemplate "" template runIOorExplode $ writeMarkdown (def {writerTemplate = Just templ, writerExtensions = multimarkdownExtensions}) (zettel.zettelNodeZettel.zettelBody) renderZettelFile :: FilePath -> ZettelId -> ZettelNode -> IO () renderZettelFile dir ident zettel = do t <- renderZettel ident zettel writeFileText (dir <> "/" <> toString (unZettelId ident <> ".md")) t renderZettelGraphFile :: FilePath -> ZettelGraph -> IO () renderZettelGraphFile fp zg = forM_ (Map.assocs (unZettelGraph zg)) $ uncurry (renderZettelFile fp)