summaryrefslogtreecommitdiff
path: root/src/Hakyll/Core/Resource/Provider
diff options
context:
space:
mode:
authorJasper Van der Jeugt <m@jaspervdj.be>2012-11-08 12:45:26 +0100
committerJasper Van der Jeugt <m@jaspervdj.be>2012-11-08 12:45:26 +0100
commit89f324f81b40d6818e6307794fe06b60053adbc0 (patch)
treee8c4f7fb869597ede5f283913cd0633be6830af6 /src/Hakyll/Core/Resource/Provider
parente5c97d978bf34bdc98d97bf42ee2be29a5af4242 (diff)
downloadhakyll-89f324f81b40d6818e6307794fe06b60053adbc0.tar.gz
Pick metadata parsing from old develop
Diffstat (limited to 'src/Hakyll/Core/Resource/Provider')
-rw-r--r--src/Hakyll/Core/Resource/Provider/Dummy.hs25
-rw-r--r--src/Hakyll/Core/Resource/Provider/File.hs39
-rw-r--r--src/Hakyll/Core/Resource/Provider/Internal.hs84
3 files changed, 84 insertions, 64 deletions
diff --git a/src/Hakyll/Core/Resource/Provider/Dummy.hs b/src/Hakyll/Core/Resource/Provider/Dummy.hs
deleted file mode 100644
index 548f845..0000000
--- a/src/Hakyll/Core/Resource/Provider/Dummy.hs
+++ /dev/null
@@ -1,25 +0,0 @@
--- | Dummy resource provider for testing purposes
---
-module Hakyll.Core.Resource.Provider.Dummy
- ( dummyResourceProvider
- ) where
-
-import Data.Map (Map)
-import qualified Data.Map as M
-
-import Data.Time (getCurrentTime)
-import Data.ByteString.Lazy (ByteString)
-import qualified Data.Text.Lazy as TL
-import qualified Data.Text.Lazy.Encoding as TL
-
-import Hakyll.Core.Resource
-import Hakyll.Core.Resource.Provider
-
--- | Create a dummy 'ResourceProvider'
---
-dummyResourceProvider :: Map String ByteString -> IO ResourceProvider
-dummyResourceProvider vfs = makeResourceProvider
- (map resource (M.keys vfs))
- (return . TL.unpack . TL.decodeUtf8 . (vfs M.!) . unResource)
- (return . (vfs M.!) . unResource)
- (const getCurrentTime)
diff --git a/src/Hakyll/Core/Resource/Provider/File.hs b/src/Hakyll/Core/Resource/Provider/File.hs
deleted file mode 100644
index 3a67817..0000000
--- a/src/Hakyll/Core/Resource/Provider/File.hs
+++ /dev/null
@@ -1,39 +0,0 @@
--- | A concrete 'ResourceProvider' that gets it's resources from the filesystem
---
-{-# LANGUAGE CPP #-}
-module Hakyll.Core.Resource.Provider.File
- ( fileResourceProvider
- ) where
-
-import Control.Applicative ((<$>))
-
-import Data.Time (readTime)
-import System.Directory (getModificationTime)
-import System.Locale (defaultTimeLocale)
-import System.Time (formatCalendarTime, toCalendarTime)
-import qualified Data.ByteString.Lazy as LB
-
-import Hakyll.Core.Resource
-import Hakyll.Core.Resource.Provider
-import Hakyll.Core.Util.File
-import Hakyll.Core.Configuration
-
--- | Create a filesystem-based 'ResourceProvider'
---
-fileResourceProvider :: HakyllConfiguration -> IO ResourceProvider
-fileResourceProvider configuration = do
- -- Retrieve a list of paths
- list <- map resource . filter (not . shouldIgnoreFile configuration) <$>
- getRecursiveContents False "."
- makeResourceProvider list (readFile . unResource)
- (LB.readFile . unResource)
- (mtime . unResource)
- where
- mtime r = do
-#if MIN_VERSION_directory(1,2,0)
- getModificationTime r
-#else
- ct <- toCalendarTime =<< getModificationTime r
- let str = formatCalendarTime defaultTimeLocale "%s" ct
- return $ readTime defaultTimeLocale "%s" str
-#endif
diff --git a/src/Hakyll/Core/Resource/Provider/Internal.hs b/src/Hakyll/Core/Resource/Provider/Internal.hs
new file mode 100644
index 0000000..fb93fcc
--- /dev/null
+++ b/src/Hakyll/Core/Resource/Provider/Internal.hs
@@ -0,0 +1,84 @@
+--------------------------------------------------------------------------------
+module Hakyll.Core.Resource.Provider.Internal
+ ( ResourceProvider (..)
+ , newResourceProvider
+
+ , resourceList
+ , resourceExists
+ , resourceMetadataResource
+
+ , resourceString
+ , resourceLBS
+ ) where
+
+
+--------------------------------------------------------------------------------
+import Control.Applicative ((<$>))
+import qualified Data.ByteString.Lazy as BL
+import Data.IORef
+import Data.Map (Map)
+import qualified Data.Map as M
+import Data.Set (Set)
+import qualified Data.Set as S
+import System.FilePath (addExtension)
+
+
+--------------------------------------------------------------------------------
+import Hakyll.Core.Resource
+import Hakyll.Core.Store
+import Hakyll.Core.Util.File
+
+
+--------------------------------------------------------------------------------
+-- | Responsible for retrieving and listing resources
+data ResourceProvider = ResourceProvider
+ { -- | A list of all files found
+ resourceSet :: Set Resource
+ , -- | Cache keeping track of modified files
+ resourceModifiedCache :: IORef (Map Resource Bool)
+ , -- | Underlying persistent store for caching
+ resourceStore :: Store
+ }
+
+
+--------------------------------------------------------------------------------
+-- | Create a resource provider
+newResourceProvider :: Store -- ^ Store to use
+ -> (FilePath -> Bool) -- ^ Should we ignore this file?
+ -> FilePath -- ^ Search directory
+ -> IO ResourceProvider -- ^ Resulting provider
+newResourceProvider store ignore directory = do
+ list <- map resource . filter (not . ignore) <$>
+ getRecursiveContents False directory
+ cache <- newIORef M.empty
+ return $ ResourceProvider (S.fromList list) cache store
+
+
+--------------------------------------------------------------------------------
+resourceList :: ResourceProvider -> [Resource]
+resourceList = S.toList . resourceSet
+
+
+--------------------------------------------------------------------------------
+-- | Check if a given resiyrce exists
+resourceExists :: ResourceProvider -> Resource -> Bool
+resourceExists provider = (`S.member` resourceSet provider)
+
+
+--------------------------------------------------------------------------------
+-- | Each resource may have an associated metadata resource (with a @.metadata@
+-- filename)
+resourceMetadataResource :: Resource -> Resource
+resourceMetadataResource = resource . flip addExtension "metadata" . unResource
+
+
+--------------------------------------------------------------------------------
+-- | Get the raw body of a resource as string
+resourceString :: Resource -> IO String
+resourceString = readFile . unResource
+
+
+--------------------------------------------------------------------------------
+-- | Get the raw body of a resource of a lazy bytestring
+resourceLBS :: Resource -> IO BL.ByteString
+resourceLBS = BL.readFile . unResource