diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/MdBlocks/Metadata.hs | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/src/MdBlocks/Metadata.hs b/src/MdBlocks/Metadata.hs index c0b1777..607fa3f 100644 --- a/src/MdBlocks/Metadata.hs +++ b/src/MdBlocks/Metadata.hs @@ -1,6 +1,10 @@ {-# LANGUAGE OverloadedStrings #-} -module MdBlocks.Metadata where +module MdBlocks.Metadata + ( emptyMetadata + , parseMetadataLine + ) +where import qualified Data.Map.Strict as M import Data.Text (Text) @@ -10,7 +14,11 @@ import MdBlocks.Types emptyMetadata :: Metadata emptyMetadata = - Metadata Nothing Nothing M.empty + Metadata + { mdLanguage = Nothing + , mdId = Nothing + , mdAttrs = M.empty + } parseMetadataLine :: Text -> Metadata parseMetadataLine line = @@ -18,21 +26,25 @@ parseMetadataLine line = [] -> emptyMetadata - (langTok:rest) - | T.isPrefixOf "@" langTok -> - Metadata - (Just $ T.drop 1 langTok) - (lookupKey "id") - attrs - | otherwise -> + langTok : rest + | not ("@" `T.isPrefixOf` langTok) -> emptyMetadata - where - attrs = - M.fromList - [ let (k,v) = T.breakOn "=" x - in (k, T.drop 1 v) - | x <- rest - , "=" `T.isInfixOf` x - ] - lookupKey k = M.lookup k attrs + | otherwise -> + Metadata + { mdLanguage = Just (T.drop 1 langTok) + , mdId = M.lookup "id" attrs + , mdAttrs = attrs + } + where + attrs = + M.fromList + [ parseKV tok + | tok <- rest + , "=" `T.isInfixOf` tok + ] + +parseKV :: Text -> (Text, Text) +parseKV t = + let (k,v) = T.breakOn "=" t + in (k, T.drop 1 v) |
