module Noli
( buildProject,
buildSite,
compilePosts,
)
where
import Control.Monad
( unless,
when,
)
import Data.ByteString hiding (unpack)
import Data.Text (unpack)
import qualified Data.Text.IO as DT
import Data.Text.Internal (Text)
import Data.Text.Lazy (toStrict)
import Lucid.Base
( Html,
renderText,
)
import Noli.Types
import PostUtils
( compilePost,
copyFolder,
extname,
)
import System.Directory
( createDirectory,
doesDirectoryExist,
listDirectory,
removeDirectoryRecursive,
setCurrentDirectory,
)
compilePosts :: PostTemplate -> FilePath -> IO [Post]
compilePosts postCompiler fp = do
filePaths <- listDirectory fp
let markdownFilePaths =
Prelude.map (fp ++) $
Prelude.filter (\fn -> extname fn == "md") filePaths
mapM (compilePost postCompiler) markdownFilePaths
buildProject :: Settings -> [Page] -> PostTemplate -> IO Project
buildProject settings pages postCompiler = do
ps <- compilePosts postCompiler $ posts_location settings
return Project {posts = ps, pages = pages}
buildSite :: Settings -> Project -> IO ()
buildSite settings' project = do
distExists <- doesDirectoryExist $ dist_location settings'
when distExists $ removeDirectoryRecursive $ dist_location settings'
createDirectory $ dist_location settings'
copyFolder
(static_location settings')
(dist_location settings' ++ "static/")
setCurrentDirectory $ dist_location settings'
Prelude.mapM_
( \p ->
DT.writeFile
(Data.Text.unpack (pagename p) ++ ".html")
(toStrict $ renderText $ template p)
)
(pages project)
createDirectory "./posts"
setCurrentDirectory "./posts"
Prelude.mapM_
( \p ->
DT.writeFile
(Data.Text.unpack (filename p) ++ ".html")
(toStrict $ renderText $ compiled_html p)
)
(posts project)