summaryrefslogtreecommitdiff
path: root/src/Hakyll/Core/ResourceProvider
diff options
context:
space:
mode:
Diffstat (limited to 'src/Hakyll/Core/ResourceProvider')
-rw-r--r--src/Hakyll/Core/ResourceProvider/FileResourceProvider.hs44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/Hakyll/Core/ResourceProvider/FileResourceProvider.hs b/src/Hakyll/Core/ResourceProvider/FileResourceProvider.hs
new file mode 100644
index 0000000..b682634
--- /dev/null
+++ b/src/Hakyll/Core/ResourceProvider/FileResourceProvider.hs
@@ -0,0 +1,44 @@
+-- | A concrete 'ResourceProvider' that gets it's resources from the filesystem
+--
+module Hakyll.Core.ResourceProvider.FileResourceProvider
+ ( fileResourceProvider
+ ) where
+
+import Control.Applicative ((<$>))
+import Control.Monad (forM)
+
+import System.Directory (doesDirectoryExist, getDirectoryContents)
+import System.FilePath ((</>), normalise)
+
+import Hakyll.Core.ResourceProvider
+import Hakyll.Core.Identifier
+
+-- | Create a filesystem-based 'ResourceProvider'
+--
+fileResourceProvider :: IO ResourceProvider
+fileResourceProvider = do
+ list <- map parseIdentifier <$> getRecursiveContents "."
+ return $ ResourceProvider
+ { resourceList = list
+ , resourceString = readFile . toFilePath
+ }
+
+-- | Get all contents of a directory. Note that files starting with a dot (.)
+-- will be ignored.
+--
+getRecursiveContents :: FilePath -> IO [FilePath]
+getRecursiveContents topdir = do
+ topdirExists <- doesDirectoryExist topdir
+ if topdirExists
+ then do names <- getDirectoryContents topdir
+ let properNames = filter isProper names
+ paths <- forM properNames $ \name -> do
+ let path = topdir </> name
+ isDirectory <- doesDirectoryExist path
+ if isDirectory
+ then getRecursiveContents path
+ else return [normalise path]
+ return (concat paths)
+ else return []
+ where
+ isProper = not . (== '.') . head