@@ -20,6 +20,8 @@ import System.IO as IO
20import Text.Parsec ((<?>))
20import Text.Parsec ((<?>))
21import qualified Text.Parsec as P
21import qualified Text.Parsec as P
22import Text.Parsec.String (Parser)
22import Text.Parsec.String (Parser)
23+import System.FilePath.Posix
24+import Control.Monad (liftM)
25--------------------------------------------------------------------------------
27--------------------------------------------------------------------------------
@@ -28,7 +30,7 @@ import Hakyll.Core.Metadata
28import Hakyll.Core.Provider.Internal
30import Hakyll.Core.Provider.Internal
29import Hakyll.Core.Util.Parser
31import Hakyll.Core.Util.Parser
30import Hakyll.Core.Util.String
32import Hakyll.Core.Util.String
31−
33+import Hakyll.Core.Identifier.Pattern
33--------------------------------------------------------------------------------
35--------------------------------------------------------------------------------
34loadMetadata :: Provider -> Identifier -> IO (Metadata, Maybe String)
36loadMetadata :: Provider -> Identifier -> IO (Metadata, Maybe String)
@@ -42,7 +44,9 @@ loadMetadata p identifier = do
42 Nothing -> return M.empty
44 Nothing -> return M.empty
43 Just mi' -> loadMetadataFile $ resourceFilePath p mi'
45 Just mi' -> loadMetadataFile $ resourceFilePath p mi'
47+ gmd <- loadGlobalMetadata p identifier
45− return (M.union md emd, body)
49+ return (M.unions [md, gmd], body)
47 normal = setVersion Nothing identifier
51 normal = setVersion Nothing identifier
48 fp = resourceFilePath p identifier
52 fp = resourceFilePath p identifier
@@ -133,3 +137,32 @@ page = do
133 metadata' <- P.option [] metadataBlock
137 metadata' <- P.option [] metadataBlock
134 body <- P.many P.anyChar
138 body <- P.many P.anyChar
135 return (metadata', body)
139 return (metadata', body)
142+--------------------------------------------------------------------------------
143+-- | Load directory-wise metadata
144+loadGlobalMetadata :: Provider -> Identifier -> IO Metadata
145+loadGlobalMetadata p fp = liftM M.fromList $ loadgm fp where
146+ loadgm :: Identifier -> IO [(String, String)]
147+ loadgm = liftM concat . mapM loadOne . reverse . filter (resourceExists p) . metadataFiles
149+ let path = resourceFilePath p mfp
150+ dir = takeDirectory $ toFilePath mfp
151+ -- TODO: It might be better to print warning and continue
152+ in either (error.show) (findMetadata dir) . P.parse namedMetadata path <$> readFile path
154+ concatMap snd . filter (flip matches fp . fromGlob . normalise . combine dir . fst)
156+namedMetadata :: Parser [(String, [(String, String)])]
157+namedMetadata = liftA2 (:) (namedMetadataBlock False) $ P.many $ namedMetadataBlock True
159+namedMetadataBlock :: Bool -> Parser (String, [(String, String)])
160+namedMetadataBlock isNamed = do
162+ then P.many1 (P.char '-') *> P.many inlineSpace *> P.manyTill P.anyChar newline
164+ metadata' <- metadata
166+ return (name, metadata')