on 712ffa3 help sign in
hakyll/src/Hakyll/Core/Metadata.hs
73 lines 2.8 kB history raw
1--------------------------------------------------------------------------------
2module Hakyll.Core.Metadata
3 ( Metadata
4 , MonadMetadata (..)
5 , getMetadataField
6 , getMetadataField'
7 , makePatternDependency
8 , metadataFiles
9 ) where
12--------------------------------------------------------------------------------
13import Control.Monad (forM)
14import Data.Map (Map)
15import qualified Data.Map as M
16import System.FilePath.Posix ((</>), takeDirectory)
19--------------------------------------------------------------------------------
20import Hakyll.Core.Dependencies
21import Hakyll.Core.Identifier
22import Hakyll.Core.Identifier.Pattern
25--------------------------------------------------------------------------------
26type Metadata = Map String String
29--------------------------------------------------------------------------------
30class Monad m => MonadMetadata m where
31 getMetadata :: Identifier -> m Metadata
32 getMatches :: Pattern -> m [Identifier]
34 getAllMetadata :: Pattern -> m [(Identifier, Metadata)]
35 getAllMetadata pattern = do
36 matches' <- getMatches pattern
37 forM matches' $ \id' -> do
38 metadata <- getMetadata id'
39 return (id', metadata)
42--------------------------------------------------------------------------------
43getMetadataField :: MonadMetadata m => Identifier -> String -> m (Maybe String)
44getMetadataField identifier key = do
45 metadata <- getMetadata identifier
46 return $ M.lookup key metadata
49--------------------------------------------------------------------------------
50-- | Version of 'getMetadataField' which throws an error if the field does not
51-- exist.
52getMetadataField' :: MonadMetadata m => Identifier -> String -> m String
53getMetadataField' identifier key = do
54 field <- getMetadataField identifier key
55 case field of
56 Just v -> return v
57 Nothing -> fail $ "Hakyll.Core.Metadata.getMetadataField': " ++
58 "Item " ++ show identifier ++ " has no metadata field " ++ show key
61--------------------------------------------------------------------------------
62makePatternDependency :: MonadMetadata m => Pattern -> m Dependency
63makePatternDependency pattern = do
64 matches' <- getMatches pattern
65 return $ PatternDependency pattern matches'
67--------------------------------------------------------------------------------
68-- | Returns a list of all directory-wise metadata files, subdir first, global last
69metadataFiles :: Identifier -> [Identifier]
70metadataFiles = go . takeDirectory . toFilePath where
71 go "." = [fromFilePath "metadata"]
72 go dir = fromFilePath (dir </> "metadata") : go (takeDirectory dir)