summaryrefslogtreecommitdiffstats
path: root/src/MdBlocks/Metadata.hs
blob: 607fa3f03aa6155a35ca8f6d916452dbb6c17ed6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{-# 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)