-----------------------------------------------------------------------------
-- |
-- Module      :  Data.OrgMode.Parse.Attoparsec.Section
-- Copyright   :  © 2015 Parnell Springmeyer
-- License     :  All Rights Reserved
-- Maintainer  :  Parnell Springmeyer <parnell@digitalmentat.com>
-- 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
    nonHeaderLine = pack <$> manyTill (notChar '*') endOfLine