on master help sign in
added gloabl metadata parsing
commite0f45b29b3f5e17c04ecd054b6c26c67d71e10e4 authorAlexey Kreshchuk <akrsch@gmail.com> dateFri 11 Oct 2013, 02:37 (13 years ago) parent7edbcd6
1 file changed+43−2
src/Hakyll/Core/Provider/Metadata.hs+43−2
src/Hakyll/Core/Provider/Metadata.hs+43−2
@@ -20,6 +20,8 @@ import System.IO as IO
2020import Text.Parsec ((<?>))
2121import qualified Text.Parsec as P
2222import Text.Parsec.String (Parser)
23+import System.FilePath.Posix
24+import Control.Monad (liftM)
2325
2426
2527--------------------------------------------------------------------------------
@@ -28,7 +30,7 @@ import Hakyll.Core.Metadata
2830import Hakyll.Core.Provider.Internal
2931import Hakyll.Core.Util.Parser
3032import Hakyll.Core.Util.String
31−
33+import Hakyll.Core.Identifier.Pattern
3234
3335--------------------------------------------------------------------------------
3436loadMetadata :: Provider -> Identifier -> IO (Metadata, Maybe String)
@@ -42,7 +44,9 @@ loadMetadata p identifier = do
4244 Nothing -> return M.empty
4345 Just mi' -> loadMetadataFile $ resourceFilePath p mi'
4446
45− return (M.union md emd, body)
47+ gmd <- loadGlobalMetadata p fp
48+
49+ return (M.unions [md, emd, gmd], body)
4650 where
4751 normal = setVersion Nothing identifier
4852 fp = resourceFilePath p identifier
@@ -133,3 +137,40 @@ page = do
133137 metadata' <- P.option [] metadataBlock
134138 body <- P.many P.anyChar
135139 return (metadata', body)
140+
141+
142+--------------------------------------------------------------------------------
143+-- | Load directory-wise metadata
144+loadGlobalMetadata :: Provider -> FilePath -> IO (M.Map String String)
145+loadGlobalMetadata p fp = do
146+ let dir = takeDirectory fp
147+ liftM M.fromList $ loadgm dir
148+ where
149+ loadgm :: FilePath -> IO [(String, String)]
150+ loadgm dir | dir == providerDirectory p = return []
151+ | otherwise = do
152+ let mfp = combine dir "metadata"
153+ md <- if M.member (fromFilePath $ normalise mfp) (providerFiles p)
154+ then loadOne mfp dir
155+ else return []
156+ others <- loadgm (takeDirectory dir)
157+ return $ others ++ md
158+ loadOne mfp dir = do
159+ contents <- IO.readFile mfp
160+ return $ case P.parse namedMetadata mfp contents of
161+ Left err -> error (show err)
162+ Right mds -> findMetadata mds dir
163+ findMetadata mds dir =
164+ concatMap snd $ filter (flip matches (fromFilePath fp) . fromGlob . combine dir . fst) mds
165+
166+namedMetadata :: Parser [(String, [(String, String)])]
167+namedMetadata = P.many namedMetadataBlock
168+
169+namedMetadataBlock :: Parser (String, [(String, String)])
170+namedMetadataBlock = do
171+ name <- P.many1 (P.char '-') *> P.many inlineSpace *> P.manyTill P.anyChar newline
172+ metadata' <- metadata
173+ P.skipMany P.space
174+ return (name, metadata')
175+
176+