Add resource provider modules
This commit is contained in:
parent
4bdd93b331
commit
4b7c42d644
2 changed files with 62 additions and 0 deletions
18
src/Hakyll/Core/ResourceProvider.hs
Normal file
18
src/Hakyll/Core/ResourceProvider.hs
Normal 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
|
||||
}
|
44
src/Hakyll/Core/ResourceProvider/FileResourceProvider.hs
Normal file
44
src/Hakyll/Core/ResourceProvider/FileResourceProvider.hs
Normal 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
|
Loading…
Reference in a new issue