module Hakyll.Web.Page.Read
( readPage
) where
import Control.Applicative ((<$>), (<*>))
import Control.Arrow (second, (***))
import Control.Monad.State (State, get, put, evalState)
import Data.List (isPrefixOf)
import Data.Map (Map)
import qualified Data.Map as M
import Hakyll.Web.Page.Internal
import Hakyll.Core.Util.String
type LineParser = State [String]
parseMetadata :: LineParser (Map String String)
parseMetadata = get >>= \content -> case content of
[] -> return M.empty
(l : ls) -> if not (isPossibleDelimiter l)
then
return M.empty
else do
let (metadata, rest) = second (drop 1) $ break (== l) ls
put rest
return $ M.fromList $ map parseMetadata' metadata
where
isPossibleDelimiter = isPrefixOf "---"
parseMetadata' = (trim *** trim . drop 1) . break (== ':')
parseBody :: LineParser String
parseBody = do
body <- get
put []
return $ unlines body
parsePage :: LineParser (Page String)
parsePage = Page <$> parseMetadata <*> parseBody
readPage :: String -> Page String
readPage = evalState parsePage . lines