{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE DeriveDataTypeable #-} module Page where import qualified Data.Text as T import Site import Text.StringTemplate import Text.StringTemplate.GenericStandard import System.Directory import Control.Monad import Constant pageTemplate = do templates <- directoryGroup "templates" :: IO (STGroup T.Text) let Just t = getStringTemplate "generic" templates return t onlyFiles :: [FilePath] -> IO [FilePath] onlyFiles fs = filterM doesFileExist fs pageNames :: IO [String] pageNames = do cs <- getDirectoryContents "pages" let fs = map (\x -> "pages/" ++ x) cs fmap ( map (drop 6) ) (onlyFiles fs) renderPage :: Site -> StringTemplate T.Text -> T.Text -> T.Text renderPage s t c = render $ setAttribute "site" s $ setAttribute "content" c t renderPageFile :: String -> IO T.Text renderPageFile p = do c <- readFile $ "pages/" ++ p t <- pageTemplate s <- readSite return $ renderPage s t (T.pack c) writePage :: String -> T.Text -> IO () writePage p c = do mkdir $ sitePath ++ p writeFile (sitePath ++ p ++ "/index.html") (T.unpack c) generatePage p = do c <- renderPageFile p writePage p c putStrLn $ "Generated " ++ p generatePages = pageNames >>= mapM_ generatePage