diff options
| author | tv <tv@krebsco.de> | 2026-09-30 03:38:59 +0200 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-09-30 03:38:59 +0200 |
| commit | 359ce0a3104d6407372e0dd3ba86bca71617b9a5 (patch) | |
| tree | 087389571413662d69c0781bfd9c95d4c157d9dc /src | |
| parent | b1db72a28b1bc983e4a11eb6c03830bf06dfad2c (diff) | |
refactor MdBlocks.Metadata
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) |
