@@ -0,0 +1,44 @@
1+-- | A concrete 'ResourceProvider' that gets it's resources from the filesystem
3+module Hakyll.Core.ResourceProvider.FileResourceProvider
4+ ( fileResourceProvider
7+import Control.Applicative ((<$>))
8+import Control.Monad (forM)
10+import System.Directory (doesDirectoryExist, getDirectoryContents)
11+import System.FilePath ((</>), normalise)
13+import Hakyll.Core.ResourceProvider
14+import Hakyll.Core.Identifier
16+-- | Create a filesystem-based 'ResourceProvider'
18+fileResourceProvider :: IO ResourceProvider
19+fileResourceProvider = do
20+ list <- map parseIdentifier <$> getRecursiveContents "."
21+ return $ ResourceProvider
22+ { resourceList = list
23+ , resourceString = readFile . toFilePath
26+-- | Get all contents of a directory. Note that files starting with a dot (.)
29+getRecursiveContents :: FilePath -> IO [FilePath]
30+getRecursiveContents topdir = do
31+ topdirExists <- doesDirectoryExist topdir
33+ then do names <- getDirectoryContents topdir
34+ let properNames = filter isProper names
35+ paths <- forM properNames $ \name -> do
36+ let path = topdir </> name
37+ isDirectory <- doesDirectoryExist path
39+ then getRecursiveContents path
40+ else return [normalise path]
41+ return (concat paths)
44+ isProper = not . (== '.') . head