diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2020-06-03 22:14:24 +0200 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2020-06-04 11:05:30 +0200 |
commit | 6cf0ca7f96a3fba72bf42dab0e1add1b62e3f580 (patch) | |
tree | 3c5e87c301fb2fcd7c7d9adccfd0c00cb230aad1 /lib/Hakyll/Core/Provider | |
parent | 0a6e7a246b64d066ae75156d3adeaa49633c5ee6 (diff) | |
download | hakyll-6cf0ca7f96a3fba72bf42dab0e1add1b62e3f580.tar.gz |
Allow specifying a metadata provider
In addition to parsing metadata header & metadata files it will
allow any custom routine to extract metadata from the resource files,
for example with Pandoc
Diffstat (limited to 'lib/Hakyll/Core/Provider')
-rw-r--r-- | lib/Hakyll/Core/Provider/Internal.hs | 10 | ||||
-rw-r--r-- | lib/Hakyll/Core/Provider/Metadata.hs | 5 |
2 files changed, 10 insertions, 5 deletions
diff --git a/lib/Hakyll/Core/Provider/Internal.hs b/lib/Hakyll/Core/Provider/Internal.hs index c298653..777decb 100644 --- a/lib/Hakyll/Core/Provider/Internal.hs +++ b/lib/Hakyll/Core/Provider/Internal.hs @@ -45,6 +45,7 @@ import System.Time (formatCalendarTime, toCalendarTime) -------------------------------------------------------------------------------- import Hakyll.Core.Identifier +import Hakyll.Core.Metadata import Hakyll.Core.Store (Store) import qualified Hakyll.Core.Store as Store import Hakyll.Core.Util.File @@ -95,16 +96,19 @@ data Provider = Provider providerOldFiles :: Map Identifier ResourceInfo , -- | Underlying persistent store for caching providerStore :: Store - } deriving (Show) + -- | A custom function to extract metadata from files + , providerMetadata :: FilePath -> IO Metadata + } -------------------------------------------------------------------------------- -- | Create a resource provider newProvider :: Store -- ^ Store to use -> (FilePath -> IO Bool) -- ^ Should we ignore this file? + -> (FilePath -> IO Metadata) -- ^ Metadata provider -> FilePath -- ^ Search directory -> IO Provider -- ^ Resulting provider -newProvider store ignore directory = do +newProvider store ignore metadata directory = do list <- map fromFilePath <$> getRecursiveContents ignore directory let universe = S.fromList list files <- fmap (maxmtime . M.fromList) $ forM list $ \identifier -> do @@ -116,7 +120,7 @@ newProvider store ignore directory = do oldFiles <- fromMaybe mempty . Store.toMaybe <$> Store.get store oldKey oldFiles `deepseq` Store.set store oldKey files - return $ Provider directory files oldFiles store + return $ Provider directory files oldFiles store metadata where oldKey = ["Hakyll.Core.Provider.Internal.newProvider", "oldFiles"] diff --git a/lib/Hakyll/Core/Provider/Metadata.hs b/lib/Hakyll/Core/Provider/Metadata.hs index c74627b..1630b0c 100644 --- a/lib/Hakyll/Core/Provider/Metadata.hs +++ b/lib/Hakyll/Core/Provider/Metadata.hs @@ -27,7 +27,7 @@ import Hakyll.Core.Identifier import Hakyll.Core.Metadata import Hakyll.Core.Provider.Internal import System.IO as IO -import System.IO.Error (modifyIOError, ioeSetLocation) +import System.IO.Error (ioeSetLocation, modifyIOError) -------------------------------------------------------------------------------- @@ -42,7 +42,8 @@ loadMetadata p identifier = do Nothing -> return mempty Just mi' -> loadMetadataFile $ resourceFilePath p mi' - return (md <> emd, body) + mdp <- providerMetadata p fp + return (md <> emd <> mdp, body) where normal = setVersion Nothing identifier fp = resourceFilePath p identifier |