on master help sign in
Preview/INotify now works
f04efbaJasper Van der Jeugt
src/Hakyll/Core/Configuration.hs+24−1
@@ -5,12 +5,26 @@ module Hakyll.Core.Configuration
5 , defaultHakyllConfiguration
5 , defaultHakyllConfiguration
6 ) where
6 ) where
7
7
8+import System.FilePath (takeFileName)
9+import Data.List (isPrefixOf, isSuffixOf)
10+
8data HakyllConfiguration = HakyllConfiguration
11data HakyllConfiguration = HakyllConfiguration
9 { -- | Directory in which the output written
12 { -- | Directory in which the output written
10 destinationDirectory :: FilePath
13 destinationDirectory :: FilePath
11 , -- | Directory where hakyll's internal store is kept
14 , -- | Directory where hakyll's internal store is kept
12 storeDirectory :: FilePath
15 storeDirectory :: FilePath
13− } deriving (Show)
16+ , -- | Function to determine ignored files
17+ --
18+ -- In 'defaultHakyllConfiguration', the following files are ignored:
19+ --
20+ -- * files starting with a @.@
21+ --
22+ -- * files ending with a @~@
23+ --
24+ -- * files ending with @.swp@
25+ --
26+ ignoreFile :: FilePath -> Bool
27+ }
14
28
15-- | Default configuration for a hakyll application
29-- | Default configuration for a hakyll application
16--
30--
@@ -18,4 +32,13 @@ defaultHakyllConfiguration :: HakyllConfiguration
18defaultHakyllConfiguration = HakyllConfiguration
32defaultHakyllConfiguration = HakyllConfiguration
19 { destinationDirectory = "_site"
33 { destinationDirectory = "_site"
20 , storeDirectory = "_cache"
34 , storeDirectory = "_cache"
35+ , ignoreFile = ignoreFile'
21 }
36 }
37+ where
38+ ignoreFile' path
39+ | "." `isPrefixOf` fileName = True
40+ | "~" `isSuffixOf` fileName = True
41+ | ".swp" `isSuffixOf` fileName = True
42+ | otherwise = False
43+ where
44+ fileName = takeFileName path
src/Hakyll/Core/ResourceProvider/FileResourceProvider.hs+5−3
@@ -11,13 +11,15 @@ import qualified Data.ByteString.Lazy as LB
11import Hakyll.Core.ResourceProvider
11import Hakyll.Core.ResourceProvider
12import Hakyll.Core.Identifier
12import Hakyll.Core.Identifier
13import Hakyll.Core.Util.File
13import Hakyll.Core.Util.File
14+import Hakyll.Core.Configuration
14
15
15-- | Create a filesystem-based 'ResourceProvider'
16-- | Create a filesystem-based 'ResourceProvider'
16--
17--
17−fileResourceProvider :: IO ResourceProvider
18+fileResourceProvider :: HakyllConfiguration -> IO ResourceProvider
18−fileResourceProvider = do
19+fileResourceProvider configuration = do
19 -- Retrieve a list of identifiers
20 -- Retrieve a list of identifiers
21+ list <- map parseIdentifier . filter (not . ignoreFile configuration) <$>
20− list <- map parseIdentifier <$> getRecursiveContents False "."
22+ getRecursiveContents False "."
21
23
22 -- Construct a resource provider
24 -- Construct a resource provider
23 return ResourceProvider
25 return ResourceProvider
src/Hakyll/Core/Run.hs+1−1
@@ -37,7 +37,7 @@ import Hakyll.Core.Configuration
37run :: HakyllConfiguration -> Rules -> IO RuleSet
37run :: HakyllConfiguration -> Rules -> IO RuleSet
38run configuration rules = do
38run configuration rules = do
39 store <- makeStore $ storeDirectory configuration
39 store <- makeStore $ storeDirectory configuration
40− provider <- fileResourceProvider
40+ provider <- fileResourceProvider configuration
41 let ruleSet = runRules rules provider
41 let ruleSet = runRules rules provider
42 compilers = rulesCompilers ruleSet
42 compilers = rulesCompilers ruleSet
43
43
src/Hakyll/Main.hs+3−1
@@ -88,7 +88,9 @@ preview configuration rules port = do
88
88
89 -- Get the resource list and a callback for the preview poll
89 -- Get the resource list and a callback for the preview poll
90 let resources = rulesResources ruleSet
90 let resources = rulesResources ruleSet
91+ callback = do
92+ putStrLn "In TL callback"
91− callback = build configuration rules
93+ build configuration rules
92
94
93 -- Fork a thread polling for changes
95 -- Fork a thread polling for changes
94 _ <- forkIO $ previewPoll configuration resources callback
96 _ <- forkIO $ previewPoll configuration resources callback
src/Hakyll/Web/Preview/INotify.hs+4−3
@@ -8,6 +8,7 @@ import Control.Monad (forM_, when)
8import Data.Set (Set)
8import Data.Set (Set)
9import qualified Data.Set as S
9import qualified Data.Set as S
10import System.FilePath (takeDirectory, (</>))
10import System.FilePath (takeDirectory, (</>))
11+import Data.List (isPrefixOf)
11
12
12import System.INotify
13import System.INotify
13
14
@@ -38,9 +39,9 @@ previewPoll _ resources callback = do
38 notEmpty x = x
39 notEmpty x = x
39
40
40 -- Execute the callback when path is known
41 -- Execute the callback when path is known
42+ ifResource path =
43+ let path' = if "./" `isPrefixOf` path then drop 2 path else path
41− ifResource path = when (path `S.member` paths) $ do
44+ in when (path' `S.member` paths) callback
42− putStrLn $ "Changed: " ++ path
43− callback
44
45
45 -- Add a watcher for every directory
46 -- Add a watcher for every directory
46 forM_ directories $ \directory -> do
47 forM_ directories $ \directory -> do