packages feed

hakyll-convert-0.3.0.5: src/Hakyll/Convert/IO.hs

{-# LANGUAGE OverloadedStrings #-}

module Hakyll.Convert.IO where

import qualified Data.ByteString as B
import Data.Maybe (fromJust)
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import Data.Time.Format (defaultTimeLocale, formatTime)
import Hakyll.Convert.Common (DistilledPost (..))
import Hakyll.Convert.OutputFormat (formatPath)
import System.Directory (createDirectoryIfMissing)
import System.FilePath (takeDirectory, takeFileName, (<.>), (</>))

-- | Save a post along with its comments in a format that Hakyll understands.
--
-- Returns the filename of the file that was written.
savePost :: FilePath -> T.Text -> T.Text -> DistilledPost -> IO FilePath
savePost odir oformat ext post = do
  createDirectoryIfMissing True (takeDirectory fname)
  B.writeFile fname . T.encodeUtf8 $
    T.unlines
      [ "---",
        metadata "title" (formatTitle (dpTitle post)),
        metadata "published" (formatDate (dpDate post)),
        metadata "categories" (formatTags (dpCategories post)),
        metadata "tags" (formatTags (dpTags post)),
        "---",
        "",
        formatBody (dpBody post)
      ]

  return fname
  where
    metadata k v = k <> ": " <> v
    --
    fname = odir </> postPath <.> (T.unpack ext)
    postPath = T.unpack $ fromJust $ formatPath oformat post
    --
    formatTitle (Just t) = t
    formatTitle Nothing =
      "untitled (" <> T.unwords firstFewWords <> "…)"
      where
        firstFewWords = T.splitOn "-" . T.pack $ takeFileName postPath
    formatDate = T.pack . formatTime defaultTimeLocale "%FT%TZ" -- for hakyll
    formatTags = T.intercalate ","
    formatBody = id