Add resource provider modules

This commit is contained in:
Jasper Van der Jeugt 2010-12-24 08:42:05 +01:00
parent 4bdd93b331
commit 4b7c42d644
2 changed files with 62 additions and 0 deletions

View file

@ -0,0 +1,18 @@
-- | This module provides an API for resource providers. Resource providers
-- allow Hakyll to get content from resources; the type of resource depends on
-- the concrete instance.
--
module Hakyll.Core.ResourceProvider
( ResourceProvider (..)
) where
import Hakyll.Core.Identifier
-- | A value responsible for retrieving and listing resources
--
data ResourceProvider = ResourceProvider
{ -- | A list of all resources this provider is able to provide
resourceList :: [Identifier]
, -- | Retrieve a certain resource as string
resourceString :: Identifier -> IO String
}

View file

@ -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