From 359ce0a3104d6407372e0dd3ba86bca71617b9a5 Mon Sep 17 00:00:00 2001 From: tv Date: Wed, 30 Sep 2026 03:38:59 +0200 Subject: refactor MdBlocks.Metadata --- src/MdBlocks/Metadata.hs | 50 ++++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 19 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) -- cgit v1.3.1