diff --git a/lib/Hakyll/Core/Metadata.hs b/lib/Hakyll/Core/Metadata.hs index 1cf536efc..a75e45a34 100644 --- a/lib/Hakyll/Core/Metadata.hs +++ b/lib/Hakyll/Core/Metadata.hs @@ -16,16 +16,18 @@ module Hakyll.Core.Metadata -------------------------------------------------------------------------------- import Control.Arrow (second) import Control.Monad (forM) -import Data.Binary (Binary (..), getWord8, - putWord8, Get) +import Data.Binary (Binary (..), Get, getWord8, + putWord8) import qualified Data.HashMap.Strict as HMS +import Data.List (intercalate) import qualified Data.Set as S import qualified Data.Text as T import qualified Data.Vector as V -import qualified Data.Yaml.Extended as Yaml +import qualified Data.Yaml.Extended as Yaml import Hakyll.Core.Dependencies import Hakyll.Core.Identifier import Hakyll.Core.Identifier.Pattern +import Hakyll.Core.Util.String (splitAll) -------------------------------------------------------------------------------- @@ -34,15 +36,40 @@ type Metadata = Yaml.Object -------------------------------------------------------------------------------- lookupString :: String -> Metadata -> Maybe String -lookupString key meta = HMS.lookup (T.pack key) meta >>= Yaml.toString +lookupString = lookupA tryLookupString -------------------------------------------------------------------------------- lookupStringList :: String -> Metadata -> Maybe [String] -lookupStringList key meta = +lookupStringList = lookupA tryLookupStringList + + +-------------------------------------------------------------------------------- +lookupA :: (String -> Metadata -> Maybe a) -> String -> Metadata -> Maybe a +lookupA f key meta = case f key meta of + res@(Just _) -> res + Nothing -> case splitAll "\\." key of + (h:t) -> tryLookupMeta h meta >>= lookupA f (intercalate "." t) + _ -> Nothing + +-------------------------------------------------------------------------------- +tryLookupString :: String -> Metadata -> Maybe String +tryLookupString key meta = HMS.lookup (T.pack key) meta >>= Yaml.toString + + +-------------------------------------------------------------------------------- +tryLookupStringList :: String -> Metadata -> Maybe [String] +tryLookupStringList key meta = HMS.lookup (T.pack key) meta >>= Yaml.toList >>= mapM Yaml.toString +-------------------------------------------------------------------------------- +tryLookupMeta :: String -> Metadata -> Maybe Metadata +tryLookupMeta key meta = case HMS.lookup (T.pack key) meta of + Just (Yaml.Object o) -> Just o + _ -> Nothing + + -------------------------------------------------------------------------------- class Monad m => MonadMetadata m where getMetadata :: Identifier -> m Metadata diff --git a/tests/Hakyll/Core/Provider/Tests.hs b/tests/Hakyll/Core/Provider/Tests.hs index d1c542a4f..a96d2fa27 100644 --- a/tests/Hakyll/Core/Provider/Tests.hs +++ b/tests/Hakyll/Core/Provider/Tests.hs @@ -28,8 +28,10 @@ case01 = do assert $ resourceExists provider "example.md" metadata <- resourceMetadata provider "example.md" - Just "An example" @=? lookupString "title" metadata - Just "External data" @=? lookupString "external" metadata + Just "An example" @=? lookupString "title" metadata + Just "External data" @=? lookupString "external" metadata + Just "twitter" @=? lookupString "social.twitter" metadata + Just ["l1", "l2"] @=? lookupStringList "social.list" metadata doesntExist <- resourceMetadata provider "doesntexist.md" mempty @=? doesntExist diff --git a/tests/data/example.md b/tests/data/example.md index 6c51faa08..f7d833226 100644 --- a/tests/data/example.md +++ b/tests/data/example.md @@ -1,5 +1,10 @@ --- title: An example +social: + twitter: twitter + list: + - l1 + - l2 --- This is an example.