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)
|