@@ -13,16 +13,19 @@ module Text.Hakyll
13 , hakyllWithConfiguration
13 , hakyllWithConfiguration
16+import Control.Concurrent (forkIO, threadDelay)
16import Control.Monad.Reader (runReaderT, liftIO, ask)
17import Control.Monad.Reader (runReaderT, liftIO, ask)
17import Control.Monad (when)
18import Control.Monad (when)
18import Data.Monoid (mempty)
19import Data.Monoid (mempty)
19import System.Environment (getArgs, getProgName)
20import System.Environment (getArgs, getProgName)
20import System.Directory (doesDirectoryExist, removeDirectoryRecursive)
21import System.Directory (doesDirectoryExist, removeDirectoryRecursive)
22+import System.Time (getClockTime)
22import Text.Pandoc
24import Text.Pandoc
24import Network.Hakyll.SimpleServer (simpleServer)
26import Network.Hakyll.SimpleServer (simpleServer)
25import Text.Hakyll.HakyllMonad
27import Text.Hakyll.HakyllMonad
28+import Text.Hakyll.File
27-- | The default reader options for pandoc parsing.
30-- | The default reader options for pandoc parsing.
@@ -52,6 +55,7 @@ defaultHakyllConfiguration absoluteUrl' = HakyllConfiguration
52 , siteDirectory = "_site"
55 , siteDirectory = "_site"
53 , cacheDirectory = "_cache"
56 , cacheDirectory = "_cache"
54 , enableIndexUrl = False
57 , enableIndexUrl = False
58+ , previewMode = BuildOnRequest
55 , pandocParserState = defaultPandocParserState
59 , pandocParserState = defaultPandocParserState
56 , pandocWriterOptions = defaultPandocWriterOptions
60 , pandocWriterOptions = defaultPandocWriterOptions
@@ -74,13 +78,35 @@ hakyllWithConfiguration configuration buildFunction = do
74 args <- getArgs
78 args <- getArgs
75 let f = case args of ["build"] -> buildFunction
79 let f = case args of ["build"] -> buildFunction
76 ["clean"] -> clean
80 ["clean"] -> clean
77− ["preview", p] -> server (read p) buildFunction
81+ ["preview", p] -> preview (read p)
78− ["preview"] -> server 8000 buildFunction
82+ ["preview"] -> preview defaultPort
79 ["rebuild"] -> clean >> buildFunction
83 ["rebuild"] -> clean >> buildFunction
80 ["server", p] -> server (read p) (return ())
84 ["server", p] -> server (read p) (return ())
81− ["server"] -> server 8000 (return ())
85+ ["server"] -> server defaultPort (return ())
83 runReaderT f configuration
87 runReaderT f configuration
89+ preview port = case previewMode configuration of
90+ BuildOnRequest -> server port buildFunction
91+ BuildOnInterval -> do
92+ let pIO = runReaderT (previewThread buildFunction) configuration
93+ _ <- liftIO $ forkIO pIO
94+ server port (return ())
98+-- | A preview thread that periodically recompiles the site.
100+previewThread :: Hakyll () -- ^ Build function
101+ -> Hakyll () -- ^ Result
102+previewThread buildFunction = run =<< liftIO getClockTime
105+ run time = do liftIO $ threadDelay delay
106+ contents <- getRecursiveContents "."
107+ valid <- isMoreRecent time contents
108+ when valid buildFunction
109+ run =<< liftIO getClockTime
85-- | Clean up directories.
111-- | Clean up directories.