From fb04af3bf81711f4844de2901dbc1113ba060e81 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Wed, 10 May 2023 17:02:26 +0100 Subject: Add generation for hugo --- src/Zettel/Render.hs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/Zettel/Render.hs (limited to 'src/Zettel/Render.hs') diff --git a/src/Zettel/Render.hs b/src/Zettel/Render.hs new file mode 100644 index 0000000..c64a910 --- /dev/null +++ b/src/Zettel/Render.hs @@ -0,0 +1,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 -> 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) -- cgit