module Data.OrgMode.Parse.Attoparsec.PropertyDrawer
( parseDrawer
, property
)
where
import Control.Applicative ((*>), (<*))
import Data.Attoparsec.Text as T
import Data.Attoparsec.Types as TP
import Data.HashMap.Strict (fromList)
import Data.Text as Text (Text, strip)
import Prelude hiding (concat, null, takeWhile)
import Data.OrgMode.Parse.Types
type PropertyKey = Text
type PropertyVal = Text
parseDrawer :: TP.Parser Text Properties
parseDrawer = return . fromList =<< begin *> manyTill property end
where
begin = ident "PROPERTIES"
end = ident "END"
ident v = skipSpace *> skip (== ':') *>
asciiCI v <*
skip (== ':') <* skipSpace
property :: TP.Parser Text (PropertyKey, PropertyVal)
property = do
key <- skipSpace *> skip (== ':') *> takeWhile1 (/= ':') <* skip (== ':')
val <- skipSpace *> takeValue
return (key, strip val)
where
takeValue = takeWhile1 (not . isEndOfLine)