----------------------------------------------------------------------------- -- | -- Module : Data.OrgMode.Parse.Attoparsec.Section -- Copyright : © 2015 Parnell Springmeyer -- License : All Rights Reserved -- Maintainer : Parnell Springmeyer -- Stability : stable -- -- Parsing combinators for org-mode sections. ---------------------------------------------------------------------------- {-# LANGUAGE OverloadedStrings #-} module Data.OrgMode.Parse.Attoparsec.Section where import Control.Applicative ((<$>), (<*), (<*>), (<|>)) import Data.Attoparsec.Text as T import Data.Attoparsec.Types as TP import Data.Monoid (mempty) import Data.Text (Text, pack, unlines) import Prelude hiding (unlines) import Data.OrgMode.Parse.Attoparsec.PropertyDrawer import Data.OrgMode.Parse.Attoparsec.Time import Data.OrgMode.Parse.Types -- | Parse a heading section -- -- Heading sections contain optionally a property drawer, -- a list of clock entries, code blocks (not yet implemented), -- plain lists (not yet implemented), and unstructured text. parseSection :: TP.Parser Text Section parseSection = Section <$> (Plns <$> parsePlannings) <*> many' parseClock <*> option mempty parseDrawer <*> (unlines <$> many' nonHeaderLine) where -- | Parse a non-heading line of a section. nonHeaderLine :: TP.Parser Text Text nonHeaderLine = nonHeaderLine0 <|> nonHeaderLine1 where nonHeaderLine0 = endOfLine >> return (pack "") nonHeaderLine1 = pack <$> do h <- notChar '*' t <- manyTill anyChar endOfLine return (h:t)