@@ -13,16 +13,19 @@ module Text.Hakyll
1313 , hakyllWithConfiguration
1414 ) where
1515
16+import Control.Concurrent (forkIO, threadDelay)
1617import Control.Monad.Reader (runReaderT, liftIO, ask)
1718import Control.Monad (when)
1819import Data.Monoid (mempty)
1920import System.Environment (getArgs, getProgName)
2021import System.Directory (doesDirectoryExist, removeDirectoryRecursive)
22+import System.Time (getClockTime)
2123
2224import Text.Pandoc
2325
2426import Network.Hakyll.SimpleServer (simpleServer)
2527import Text.Hakyll.HakyllMonad
28+import Text.Hakyll.File
2629
2730-- | The default reader options for pandoc parsing.
2831--
@@ -52,6 +55,7 @@ defaultHakyllConfiguration absoluteUrl' = HakyllConfiguration
5255 , siteDirectory = "_site"
5356 , cacheDirectory = "_cache"
5457 , enableIndexUrl = False
58+ , previewMode = BuildOnRequest
5559 , pandocParserState = defaultPandocParserState
5660 , pandocWriterOptions = defaultPandocWriterOptions
5761 }
@@ -74,13 +78,35 @@ hakyllWithConfiguration configuration buildFunction = do
7478 args <- getArgs
7579 let f = case args of ["build"] -> buildFunction
7680 ["clean"] -> clean
77− ["preview", p] -> server (read p) buildFunction
78− ["preview"] -> server 8000 buildFunction
81+ ["preview", p] -> preview (read p)
82+ ["preview"] -> preview defaultPort
7983 ["rebuild"] -> clean >> buildFunction
8084 ["server", p] -> server (read p) (return ())
81− ["server"] -> server 8000 (return ())
85+ ["server"] -> server defaultPort (return ())
8286 _ -> help
8387 runReaderT f configuration
88+ where
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 ())
95+
96+ defaultPort = 8000
97+
98+-- | A preview thread that periodically recompiles the site.
99+--
100+previewThread :: Hakyll () -- ^ Build function
101+ -> Hakyll () -- ^ Result
102+previewThread buildFunction = run =<< liftIO getClockTime
103+ where
104+ delay = 1000000
105+ run time = do liftIO $ threadDelay delay
106+ contents <- getRecursiveContents "."
107+ valid <- isMoreRecent time contents
108+ when valid buildFunction
109+ run =<< liftIO getClockTime
84110
85111-- | Clean up directories.
86112--