From 6cf0ca7f96a3fba72bf42dab0e1add1b62e3f580 Mon Sep 17 00:00:00 2001 From: Igor Pashev Date: Wed, 3 Jun 2020 22:14:24 +0200 Subject: 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 --- lib/Hakyll/Core/Provider/Internal.hs | 10 +++++++--- lib/Hakyll/Core/Provider/Metadata.hs | 5 +++-- 2 files changed, 10 insertions(+), 5 deletions(-) (limited to 'lib/Hakyll/Core/Provider') 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 -- cgit v1.2.3