on master help sign in
Add resource provider modules
commit4b7c42d644a1fb2242ad79a2193edad4ba6b2b7e authorJasper Van der Jeugt <jaspervdj@gmail.com> dateFri 24 Dec 2010, 08:42 (16 years ago) parent4bdd93b
2 files changed+62
src/Hakyll/Core/ResourceProvider.hs+18 src/Hakyll/Core/ResourceProvider/FileResourceProvider.hs+44
src/Hakyll/Core/ResourceProvider.hsnew file+18
@@ -0,0 +1,18 @@
1+-- | This module provides an API for resource providers. Resource providers
2+-- allow Hakyll to get content from resources; the type of resource depends on
3+-- the concrete instance.
4+--
5+module Hakyll.Core.ResourceProvider
6+ ( ResourceProvider (..)
7+ ) where
8+
9+import Hakyll.Core.Identifier
10+
11+-- | A value responsible for retrieving and listing resources
12+--
13+data ResourceProvider = ResourceProvider
14+ { -- | A list of all resources this provider is able to provide
15+ resourceList :: [Identifier]
16+ , -- | Retrieve a certain resource as string
17+ resourceString :: Identifier -> IO String
18+ }
src/Hakyll/Core/ResourceProvider/FileResourceProvider.hsnew file+44
@@ -0,0 +1,44 @@
1+-- | A concrete 'ResourceProvider' that gets it's resources from the filesystem
2+--
3+module Hakyll.Core.ResourceProvider.FileResourceProvider
4+ ( fileResourceProvider
5+ ) where
6+
7+import Control.Applicative ((<$>))
8+import Control.Monad (forM)
9+
10+import System.Directory (doesDirectoryExist, getDirectoryContents)
11+import System.FilePath ((</>), normalise)
12+
13+import Hakyll.Core.ResourceProvider
14+import Hakyll.Core.Identifier
15+
16+-- | Create a filesystem-based 'ResourceProvider'
17+--
18+fileResourceProvider :: IO ResourceProvider
19+fileResourceProvider = do
20+ list <- map parseIdentifier <$> getRecursiveContents "."
21+ return $ ResourceProvider
22+ { resourceList = list
23+ , resourceString = readFile . toFilePath
24+ }
25+
26+-- | Get all contents of a directory. Note that files starting with a dot (.)
27+-- will be ignored.
28+--
29+getRecursiveContents :: FilePath -> IO [FilePath]
30+getRecursiveContents topdir = do
31+ topdirExists <- doesDirectoryExist topdir
32+ if topdirExists
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
38+ if isDirectory
39+ then getRecursiveContents path
40+ else return [normalise path]
41+ return (concat paths)
42+ else return []
43+ where
44+ isProper = not . (== '.') . head