summaryrefslogtreecommitdiffstats
path: root/src/Zettel/Render.hs
blob: 27e8664679eac0a6419a0760e3bfa33688cba964 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{-# 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 -> Zettel -> 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.zettelBody

renderZettelFile :: FilePath -> ZettelId -> Zettel -> 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)