diff options
Diffstat (limited to 'src/Text')
-rw-r--r-- | src/Text/Hakyll/CustomPage.hs | 29 | ||||
-rw-r--r-- | src/Text/Hakyll/Render.hs | 11 |
2 files changed, 34 insertions, 6 deletions
diff --git a/src/Text/Hakyll/CustomPage.hs b/src/Text/Hakyll/CustomPage.hs new file mode 100644 index 0000000..c18bb2d --- /dev/null +++ b/src/Text/Hakyll/CustomPage.hs @@ -0,0 +1,29 @@ +module Text.Hakyll.CustomPage + ( CustomPage, + createCustomPage + ) where + +import System.FilePath +import qualified Data.ByteString.Lazy.Char8 as B +import qualified Data.Map as M +import Control.Monad +import Text.Hakyll.Renderable + +data CustomPage = CustomPage { url :: String, + dependencies :: [FilePath], + mapping :: [(String, Either String (IO B.ByteString))] + } + +createCustomPage :: String + -> [FilePath] + -> [(String, Either String (IO B.ByteString))] + -> CustomPage +createCustomPage = CustomPage + +instance Renderable CustomPage where + getDependencies = dependencies + getURL = url + toContext page = do + values <- mapM (either (return . B.pack) (>>= return) . snd) (mapping page) + let keys = map (B.pack . fst) (mapping page) + return $ M.fromList $ (B.pack "url", B.pack $ url page) : zip keys values diff --git a/src/Text/Hakyll/Render.hs b/src/Text/Hakyll/Render.hs index 8449180..ed888ed 100644 --- a/src/Text/Hakyll/Render.hs +++ b/src/Text/Hakyll/Render.hs @@ -40,12 +40,11 @@ writePage page = do makeDirectories destination B.writeFile destination (getBody page) -renderAndConcat :: FilePath -> [FilePath] -> IO B.ByteString -renderAndConcat templatePath paths = foldM concatRender' B.empty paths - where concatRender' :: B.ByteString -> FilePath -> IO B.ByteString - concatRender' chunk path = do - page <- readPage path - rendered <- render templatePath page +renderAndConcat :: Renderable a => FilePath -> [a] -> IO B.ByteString +renderAndConcat templatePath renderables = foldM concatRender' B.empty renderables + where concatRender' :: Renderable a => B.ByteString -> a -> IO B.ByteString + concatRender' chunk renderable = do + rendered <- render templatePath renderable let body = getBody rendered return $ B.append chunk $ body |