diff options
Diffstat (limited to 'src/Text/Hakyll')
-rw-r--r-- | src/Text/Hakyll/File.hs | 55 | ||||
-rw-r--r-- | src/Text/Hakyll/Page.hs | 1 | ||||
-rw-r--r-- | src/Text/Hakyll/Render.hs | 2 | ||||
-rw-r--r-- | src/Text/Hakyll/Renderables.hs | 2 | ||||
-rw-r--r-- | src/Text/Hakyll/Util.hs | 62 |
5 files changed, 64 insertions, 58 deletions
diff --git a/src/Text/Hakyll/File.hs b/src/Text/Hakyll/File.hs new file mode 100644 index 0000000..07464ac --- /dev/null +++ b/src/Text/Hakyll/File.hs @@ -0,0 +1,55 @@ +-- | A module containing various function for manipulating and examinating +-- files and directories. +module Text.Hakyll.File + ( toDestination, + toCache, + toURL, + makeDirectories, + getRecursiveContents, + isCacheValid + ) where + +import System.Directory +import System.FilePath +import Control.Monad + +-- | Convert a relative filepath to a filepath in the destination (_site). +toDestination :: FilePath -> FilePath +toDestination path = "_site" </> path + +-- | Convert a relative filepath to a filepath in the cache (_cache). +toCache :: FilePath -> FilePath +toCache path = "_cache" </> path + +-- | Get the url for a given page. +toURL :: FilePath -> FilePath +toURL = flip addExtension ".html" . dropExtension + +-- | Given a path to a file, try to make the path writable by making +-- all directories on the path. +makeDirectories :: FilePath -> IO () +makeDirectories path = createDirectoryIfMissing True dir + where dir = takeDirectory path + +-- | Get all contents of a directory. Note that files starting with a dot (.) +-- will be ignored. +getRecursiveContents :: FilePath -> IO [FilePath] +getRecursiveContents topdir = 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 [path] + return (concat paths) + where isProper = not . (== '.') . head + +-- | Check is a cache file is still valid. +isCacheValid :: FilePath -> [FilePath] -> IO Bool +isCacheValid cache depends = doesFileExist cache >>= \exists -> + if not exists then return False + else do dependsModified <- (mapM getModificationTime depends) >>= return . maximum + cacheModified <- getModificationTime cache + return (cacheModified >= dependsModified) diff --git a/src/Text/Hakyll/Page.hs b/src/Text/Hakyll/Page.hs index 1590de2..ae1a2ea 100644 --- a/src/Text/Hakyll/Page.hs +++ b/src/Text/Hakyll/Page.hs @@ -15,6 +15,7 @@ import Control.Monad import System.FilePath import System.IO +import Text.Hakyll.File import Text.Hakyll.Util import Text.Hakyll.Renderable import Text.Pandoc diff --git a/src/Text/Hakyll/Render.hs b/src/Text/Hakyll/Render.hs index a94ac2d..87467f7 100644 --- a/src/Text/Hakyll/Render.hs +++ b/src/Text/Hakyll/Render.hs @@ -17,7 +17,7 @@ import System.IO import Text.Hakyll.Page import Text.Hakyll.Renderable -import Text.Hakyll.Util +import Text.Hakyll.File -- | Execute an IO action only when the cache is invalid. depends :: FilePath -- ^ File to be rendered or created. diff --git a/src/Text/Hakyll/Renderables.hs b/src/Text/Hakyll/Renderables.hs index 47ef5db..c79df76 100644 --- a/src/Text/Hakyll/Renderables.hs +++ b/src/Text/Hakyll/Renderables.hs @@ -9,9 +9,9 @@ import System.FilePath import qualified Data.ByteString.Lazy.Char8 as B import qualified Data.Map as M import Control.Monad -import Text.Hakyll.Util import Text.Hakyll.Page import Text.Hakyll.Renderable +import Text.Hakyll.File -- | A custom page. data CustomPage = CustomPage diff --git a/src/Text/Hakyll/Util.hs b/src/Text/Hakyll/Util.hs index 35f7b33..aaa2952 100644 --- a/src/Text/Hakyll/Util.hs +++ b/src/Text/Hakyll/Util.hs @@ -1,65 +1,23 @@ module Text.Hakyll.Util - ( toDestination, - toCache, - toURL, - makeDirectories, - getRecursiveContents, - trim, + ( trim, split, - stripHtml, - isCacheValid + stripHTML ) where -import System.Directory -import System.FilePath -import Control.Monad import Data.Char import Data.List --- | Convert a relative filepath to a filepath in the destination (_site). -toDestination :: FilePath -> FilePath -toDestination path = "_site" </> path - --- | Convert a relative filepath to a filepath in the cache (_cache). -toCache :: FilePath -> FilePath -toCache path = "_cache" </> path - --- | Get the url for a given page. -toURL :: FilePath -> FilePath -toURL = flip addExtension ".html" . dropExtension - --- | Given a path to a file, try to make the path writable by making --- all directories on the path. -makeDirectories :: FilePath -> IO () -makeDirectories path = createDirectoryIfMissing True dir - where dir = takeDirectory path - --- | Get all contents of a directory. Note that files starting with a dot (.) --- will be ignored. -getRecursiveContents :: FilePath -> IO [FilePath] -getRecursiveContents topdir = 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 [path] - return (concat paths) - where isProper = not . (== '.') . head - -- | Trim a string (drop spaces and tabs at both sides). trim :: String -> String trim = reverse . trim' . reverse . trim' where trim' = dropWhile isSpace -- | Strip html tags. -stripHtml :: String -> String -stripHtml [] = [] -stripHtml str = let (beforeTag, rest) = break (== '<') str +stripHTML :: String -> String +stripHTML [] = [] +stripHTML str = let (beforeTag, rest) = break (== '<') str (_, afterTag) = break (== '>') rest - in beforeTag ++ (stripHtml $ tail' afterTag) + in beforeTag ++ (stripHTML $ tail' afterTag) -- We need a failsafe tail function. where tail' [] = [] tail' xs = tail xs @@ -72,11 +30,3 @@ split element = unfoldr splitOnce (x, xs) -> if null xs then Just (x, []) else Just (x, tail xs) - --- | Check is a cache file is still valid. -isCacheValid :: FilePath -> [FilePath] -> IO Bool -isCacheValid cache depends = doesFileExist cache >>= \exists -> - if not exists then return False - else do dependsModified <- (mapM getModificationTime depends) >>= return . maximum - cacheModified <- getModificationTime cache - return (cacheModified >= dependsModified) |