{-# LANGUAGE OverloadedStrings #-} module MdBlocks.Metadata ( emptyMetadata , parseMetadataLine ) where import qualified Data.Map.Strict as M import Data.Text (Text) import qualified Data.Text as T import MdBlocks.Types emptyMetadata :: Metadata emptyMetadata = Metadata { mdLanguage = Nothing , mdId = Nothing , mdAttrs = M.empty } parseMetadataLine :: Text -> Metadata parseMetadataLine line = case T.words line of [] -> emptyMetadata langTok : rest | not ("@" `T.isPrefixOf` langTok) -> emptyMetadata | 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)