orgmode-parse 0.0.2.1 → 0.1.0
raw patch · 4 files changed
+255/−86 lines, 4 filesdep +aesondep +bytestringdep +containersdep ~tastyPVP ok
version bump matches the API change (PVP)
Dependencies added: aeson, bytestring, containers, hashable
Dependency ranges changed: tasty
API changes (from Hackage documentation)
- Data.OrgMode.Parse.Attoparsec.Headings: heading :: Parser Text Heading
- Data.OrgMode.Parse.Attoparsec.Headings: headingKeyword :: Parser Text (Maybe Keyword)
- Data.OrgMode.Parse.Attoparsec.Headings: headingTitle :: Parser Text (Text, Maybe Keyword)
- Data.OrgMode.Parse.Attoparsec.PropertyDrawer: drawer :: Parser Text (PropertyDrawer Text Text)
- Data.OrgMode.Parse.Attoparsec.Time: scheduleType :: Parser Text ScheduleType
- Data.OrgMode.Parse.Types: APPOINTMENT :: ScheduleType
- Data.OrgMode.Parse.Types: Active :: LocalTime -> Timestamp
- Data.OrgMode.Parse.Types: Close :: Char -> Close
- Data.OrgMode.Parse.Types: Inactive :: LocalTime -> Timestamp
- Data.OrgMode.Parse.Types: Keyword :: Text -> Keyword
- Data.OrgMode.Parse.Types: Open :: Char -> Open
- Data.OrgMode.Parse.Types: PropertyDrawer :: (HashMap k v) -> PropertyDrawer k v
- Data.OrgMode.Parse.Types: Schedule :: ScheduleType -> Maybe Timestamp -> Maybe Text -> Schedule
- Data.OrgMode.Parse.Types: State :: Text -> State
- Data.OrgMode.Parse.Types: Unknown :: Priority
- Data.OrgMode.Parse.Types: data Schedule
- Data.OrgMode.Parse.Types: data ScheduleType
- Data.OrgMode.Parse.Types: instance (Eq k, Eq v) => Eq (PropertyDrawer k v)
- Data.OrgMode.Parse.Types: instance (Show k, Show v) => Show (PropertyDrawer k v)
- Data.OrgMode.Parse.Types: instance Eq Keyword
- Data.OrgMode.Parse.Types: instance Eq Schedule
- Data.OrgMode.Parse.Types: instance Eq ScheduleType
- Data.OrgMode.Parse.Types: instance Eq State
- Data.OrgMode.Parse.Types: instance Ord Keyword
- Data.OrgMode.Parse.Types: instance Show Keyword
- Data.OrgMode.Parse.Types: instance Show Schedule
- Data.OrgMode.Parse.Types: instance Show ScheduleType
- Data.OrgMode.Parse.Types: instance Show State
- Data.OrgMode.Parse.Types: keywords :: Heading -> [Keyword]
- Data.OrgMode.Parse.Types: newtype Close
- Data.OrgMode.Parse.Types: newtype Keyword
- Data.OrgMode.Parse.Types: newtype Open
- Data.OrgMode.Parse.Types: newtype PropertyDrawer k v
- Data.OrgMode.Parse.Types: newtype State
- Data.OrgMode.Parse.Types: recurring :: Schedule -> Maybe Text
- Data.OrgMode.Parse.Types: schedule_type :: Schedule -> ScheduleType
- Data.OrgMode.Parse.Types: state :: Heading -> Maybe State
- Data.OrgMode.Parse.Types: timestamp :: Schedule -> Maybe Timestamp
- Data.OrgMode.Parse.Types: toPriority :: Text -> Priority
+ Data.OrgMode.Parse.Attoparsec.Document: parseDocument :: [Text] -> Parser Text Document
+ Data.OrgMode.Parse.Attoparsec.Headings: headingBelowLevel :: [Text] -> Int -> Parser Text Heading
+ Data.OrgMode.Parse.Attoparsec.Headings: parseStats :: Parser Text Stats
+ Data.OrgMode.Parse.Attoparsec.Headings: parseTags :: Parser Text [Tag]
+ Data.OrgMode.Parse.Attoparsec.PropertyDrawer: parseDrawer :: Parser Text Properties
+ Data.OrgMode.Parse.Attoparsec.Section: parseSection :: Parser Text Section
+ Data.OrgMode.Parse.Attoparsec.Time: parseBracketedDateTime :: Parser Text (DateTime, Maybe (Hours, Minutes), Bool)
+ Data.OrgMode.Parse.Attoparsec.Time: parseClock :: Parser Text (Maybe Timestamp, Maybe Duration)
+ Data.OrgMode.Parse.Attoparsec.Time: parseDate :: Parser Text YearMonthDay
+ Data.OrgMode.Parse.Attoparsec.Time: parseDay :: Parser Text Text
+ Data.OrgMode.Parse.Attoparsec.Time: parseDelay :: Parser Text Delay
+ Data.OrgMode.Parse.Attoparsec.Time: parseHM :: Parser Text (Hours, Minutes)
+ Data.OrgMode.Parse.Attoparsec.Time: parsePlannings :: Parser Text (HashMap PlanningKeyword Timestamp)
+ Data.OrgMode.Parse.Attoparsec.Time: parseRepeater :: Parser Text Repeater
+ Data.OrgMode.Parse.Attoparsec.Time: parseTime' :: Parser Text (Either (Hours, Minutes) ((Hours, Minutes), (Hours, Minutes)))
+ Data.OrgMode.Parse.Attoparsec.Time: parseTimeUnit :: Parser Text TimeUnit
+ Data.OrgMode.Parse.Types: CLOSED :: PlanningKeyword
+ Data.OrgMode.Parse.Types: DateTime :: YearMonthDay' -> Maybe Text -> Maybe (Hour, Minute) -> Maybe Repeater -> Maybe Delay -> DateTime
+ Data.OrgMode.Parse.Types: Delay :: DelayType -> Int -> TimeUnit -> Delay
+ Data.OrgMode.Parse.Types: DelayAll :: DelayType
+ Data.OrgMode.Parse.Types: DelayFirst :: DelayType
+ Data.OrgMode.Parse.Types: Document :: Text -> [Heading] -> Document
+ Data.OrgMode.Parse.Types: Plns :: (HashMap PlanningKeyword Timestamp) -> Plannings
+ Data.OrgMode.Parse.Types: RepeatCatchUp :: RepeaterType
+ Data.OrgMode.Parse.Types: RepeatCumulate :: RepeaterType
+ Data.OrgMode.Parse.Types: RepeatRestart :: RepeaterType
+ Data.OrgMode.Parse.Types: Repeater :: RepeaterType -> Int -> TimeUnit -> Repeater
+ Data.OrgMode.Parse.Types: Section :: Plannings -> [Clock] -> Properties -> Text -> Section
+ Data.OrgMode.Parse.Types: StateKeyword :: Text -> StateKeyword
+ Data.OrgMode.Parse.Types: StatsOf :: Int -> Int -> Stats
+ Data.OrgMode.Parse.Types: StatsPct :: Int -> Stats
+ Data.OrgMode.Parse.Types: Timestamp :: DateTime -> Bool -> Maybe DateTime -> Timestamp
+ Data.OrgMode.Parse.Types: UnitDay :: TimeUnit
+ Data.OrgMode.Parse.Types: UnitHour :: TimeUnit
+ Data.OrgMode.Parse.Types: UnitMonth :: TimeUnit
+ Data.OrgMode.Parse.Types: UnitWeek :: TimeUnit
+ Data.OrgMode.Parse.Types: UnitYear :: TimeUnit
+ Data.OrgMode.Parse.Types: YMD' :: YearMonthDay -> YearMonthDay'
+ Data.OrgMode.Parse.Types: YearMonthDay :: UnpkYear -> UnpkMonth -> UnpkDayOfMonth -> YearMonthDay
+ Data.OrgMode.Parse.Types: data DateTime
+ Data.OrgMode.Parse.Types: data Delay
+ Data.OrgMode.Parse.Types: data DelayType
+ Data.OrgMode.Parse.Types: data Document
+ Data.OrgMode.Parse.Types: data PlanningKeyword
+ Data.OrgMode.Parse.Types: data Repeater
+ Data.OrgMode.Parse.Types: data RepeaterType
+ Data.OrgMode.Parse.Types: data Section
+ Data.OrgMode.Parse.Types: data Stats
+ Data.OrgMode.Parse.Types: data TimeUnit
+ Data.OrgMode.Parse.Types: data YearMonthDay :: *
+ Data.OrgMode.Parse.Types: dayName :: DateTime -> Maybe Text
+ Data.OrgMode.Parse.Types: delay :: DateTime -> Maybe Delay
+ Data.OrgMode.Parse.Types: delayType :: Delay -> DelayType
+ Data.OrgMode.Parse.Types: delayUnit :: Delay -> TimeUnit
+ Data.OrgMode.Parse.Types: delayValue :: Delay -> Int
+ Data.OrgMode.Parse.Types: documentHeadings :: Document -> [Heading]
+ Data.OrgMode.Parse.Types: documentText :: Document -> Text
+ Data.OrgMode.Parse.Types: hourMinute :: DateTime -> Maybe (Hour, Minute)
+ Data.OrgMode.Parse.Types: instance Constructor C1_0DateTime
+ Data.OrgMode.Parse.Types: instance Constructor C1_0Delay
+ Data.OrgMode.Parse.Types: instance Constructor C1_0DelayType
+ Data.OrgMode.Parse.Types: instance Constructor C1_0Document
+ Data.OrgMode.Parse.Types: instance Constructor C1_0Heading
+ Data.OrgMode.Parse.Types: instance Constructor C1_0PlanningKeyword
+ Data.OrgMode.Parse.Types: instance Constructor C1_0Plannings
+ Data.OrgMode.Parse.Types: instance Constructor C1_0Priority
+ Data.OrgMode.Parse.Types: instance Constructor C1_0Repeater
+ Data.OrgMode.Parse.Types: instance Constructor C1_0RepeaterType
+ Data.OrgMode.Parse.Types: instance Constructor C1_0Section
+ Data.OrgMode.Parse.Types: instance Constructor C1_0StateKeyword
+ Data.OrgMode.Parse.Types: instance Constructor C1_0Stats
+ Data.OrgMode.Parse.Types: instance Constructor C1_0TimeUnit
+ Data.OrgMode.Parse.Types: instance Constructor C1_0Timestamp
+ Data.OrgMode.Parse.Types: instance Constructor C1_0YearMonthDay'
+ Data.OrgMode.Parse.Types: instance Constructor C1_1DelayType
+ Data.OrgMode.Parse.Types: instance Constructor C1_1PlanningKeyword
+ Data.OrgMode.Parse.Types: instance Constructor C1_1Priority
+ Data.OrgMode.Parse.Types: instance Constructor C1_1RepeaterType
+ Data.OrgMode.Parse.Types: instance Constructor C1_1Stats
+ Data.OrgMode.Parse.Types: instance Constructor C1_1TimeUnit
+ Data.OrgMode.Parse.Types: instance Constructor C1_2PlanningKeyword
+ Data.OrgMode.Parse.Types: instance Constructor C1_2Priority
+ Data.OrgMode.Parse.Types: instance Constructor C1_2RepeaterType
+ Data.OrgMode.Parse.Types: instance Constructor C1_2TimeUnit
+ Data.OrgMode.Parse.Types: instance Constructor C1_3TimeUnit
+ Data.OrgMode.Parse.Types: instance Constructor C1_4TimeUnit
+ Data.OrgMode.Parse.Types: instance Datatype D1DateTime
+ Data.OrgMode.Parse.Types: instance Datatype D1Delay
+ Data.OrgMode.Parse.Types: instance Datatype D1DelayType
+ Data.OrgMode.Parse.Types: instance Datatype D1Document
+ Data.OrgMode.Parse.Types: instance Datatype D1Heading
+ Data.OrgMode.Parse.Types: instance Datatype D1PlanningKeyword
+ Data.OrgMode.Parse.Types: instance Datatype D1Plannings
+ Data.OrgMode.Parse.Types: instance Datatype D1Priority
+ Data.OrgMode.Parse.Types: instance Datatype D1Repeater
+ Data.OrgMode.Parse.Types: instance Datatype D1RepeaterType
+ Data.OrgMode.Parse.Types: instance Datatype D1Section
+ Data.OrgMode.Parse.Types: instance Datatype D1StateKeyword
+ Data.OrgMode.Parse.Types: instance Datatype D1Stats
+ Data.OrgMode.Parse.Types: instance Datatype D1TimeUnit
+ Data.OrgMode.Parse.Types: instance Datatype D1Timestamp
+ Data.OrgMode.Parse.Types: instance Datatype D1YearMonthDay'
+ Data.OrgMode.Parse.Types: instance Enum PlanningKeyword
+ Data.OrgMode.Parse.Types: instance Eq DateTime
+ Data.OrgMode.Parse.Types: instance Eq Delay
+ Data.OrgMode.Parse.Types: instance Eq DelayType
+ Data.OrgMode.Parse.Types: instance Eq Document
+ Data.OrgMode.Parse.Types: instance Eq PlanningKeyword
+ Data.OrgMode.Parse.Types: instance Eq Plannings
+ Data.OrgMode.Parse.Types: instance Eq Repeater
+ Data.OrgMode.Parse.Types: instance Eq RepeaterType
+ Data.OrgMode.Parse.Types: instance Eq Section
+ Data.OrgMode.Parse.Types: instance Eq StateKeyword
+ Data.OrgMode.Parse.Types: instance Eq Stats
+ Data.OrgMode.Parse.Types: instance Eq TimeUnit
+ Data.OrgMode.Parse.Types: instance Eq YearMonthDay'
+ Data.OrgMode.Parse.Types: instance FromJSON DateTime
+ Data.OrgMode.Parse.Types: instance FromJSON Delay
+ Data.OrgMode.Parse.Types: instance FromJSON DelayType
+ Data.OrgMode.Parse.Types: instance FromJSON Document
+ Data.OrgMode.Parse.Types: instance FromJSON Heading
+ Data.OrgMode.Parse.Types: instance FromJSON PlanningKeyword
+ Data.OrgMode.Parse.Types: instance FromJSON Plannings
+ Data.OrgMode.Parse.Types: instance FromJSON Priority
+ Data.OrgMode.Parse.Types: instance FromJSON Repeater
+ Data.OrgMode.Parse.Types: instance FromJSON RepeaterType
+ Data.OrgMode.Parse.Types: instance FromJSON Section
+ Data.OrgMode.Parse.Types: instance FromJSON StateKeyword
+ Data.OrgMode.Parse.Types: instance FromJSON Stats
+ Data.OrgMode.Parse.Types: instance FromJSON TimeUnit
+ Data.OrgMode.Parse.Types: instance FromJSON Timestamp
+ Data.OrgMode.Parse.Types: instance FromJSON YearMonthDay'
+ Data.OrgMode.Parse.Types: instance Generic DateTime
+ Data.OrgMode.Parse.Types: instance Generic Delay
+ Data.OrgMode.Parse.Types: instance Generic DelayType
+ Data.OrgMode.Parse.Types: instance Generic Document
+ Data.OrgMode.Parse.Types: instance Generic Heading
+ Data.OrgMode.Parse.Types: instance Generic PlanningKeyword
+ Data.OrgMode.Parse.Types: instance Generic Plannings
+ Data.OrgMode.Parse.Types: instance Generic Priority
+ Data.OrgMode.Parse.Types: instance Generic Repeater
+ Data.OrgMode.Parse.Types: instance Generic RepeaterType
+ Data.OrgMode.Parse.Types: instance Generic Section
+ Data.OrgMode.Parse.Types: instance Generic StateKeyword
+ Data.OrgMode.Parse.Types: instance Generic Stats
+ Data.OrgMode.Parse.Types: instance Generic TimeUnit
+ Data.OrgMode.Parse.Types: instance Generic Timestamp
+ Data.OrgMode.Parse.Types: instance Generic YearMonthDay'
+ Data.OrgMode.Parse.Types: instance Hashable PlanningKeyword
+ Data.OrgMode.Parse.Types: instance Ord PlanningKeyword
+ Data.OrgMode.Parse.Types: instance Selector S1_0_0DateTime
+ Data.OrgMode.Parse.Types: instance Selector S1_0_0Delay
+ Data.OrgMode.Parse.Types: instance Selector S1_0_0Document
+ Data.OrgMode.Parse.Types: instance Selector S1_0_0Heading
+ Data.OrgMode.Parse.Types: instance Selector S1_0_0Repeater
+ Data.OrgMode.Parse.Types: instance Selector S1_0_0Section
+ Data.OrgMode.Parse.Types: instance Selector S1_0_0StateKeyword
+ Data.OrgMode.Parse.Types: instance Selector S1_0_0Timestamp
+ Data.OrgMode.Parse.Types: instance Selector S1_0_1DateTime
+ Data.OrgMode.Parse.Types: instance Selector S1_0_1Delay
+ Data.OrgMode.Parse.Types: instance Selector S1_0_1Document
+ Data.OrgMode.Parse.Types: instance Selector S1_0_1Heading
+ Data.OrgMode.Parse.Types: instance Selector S1_0_1Repeater
+ Data.OrgMode.Parse.Types: instance Selector S1_0_1Section
+ Data.OrgMode.Parse.Types: instance Selector S1_0_1Timestamp
+ Data.OrgMode.Parse.Types: instance Selector S1_0_2DateTime
+ Data.OrgMode.Parse.Types: instance Selector S1_0_2Delay
+ Data.OrgMode.Parse.Types: instance Selector S1_0_2Heading
+ Data.OrgMode.Parse.Types: instance Selector S1_0_2Repeater
+ Data.OrgMode.Parse.Types: instance Selector S1_0_2Section
+ Data.OrgMode.Parse.Types: instance Selector S1_0_2Timestamp
+ Data.OrgMode.Parse.Types: instance Selector S1_0_3DateTime
+ Data.OrgMode.Parse.Types: instance Selector S1_0_3Heading
+ Data.OrgMode.Parse.Types: instance Selector S1_0_3Section
+ Data.OrgMode.Parse.Types: instance Selector S1_0_4DateTime
+ Data.OrgMode.Parse.Types: instance Selector S1_0_4Heading
+ Data.OrgMode.Parse.Types: instance Selector S1_0_5Heading
+ Data.OrgMode.Parse.Types: instance Selector S1_0_6Heading
+ Data.OrgMode.Parse.Types: instance Selector S1_0_7Heading
+ Data.OrgMode.Parse.Types: instance Show DateTime
+ Data.OrgMode.Parse.Types: instance Show Delay
+ Data.OrgMode.Parse.Types: instance Show DelayType
+ Data.OrgMode.Parse.Types: instance Show Document
+ Data.OrgMode.Parse.Types: instance Show PlanningKeyword
+ Data.OrgMode.Parse.Types: instance Show Plannings
+ Data.OrgMode.Parse.Types: instance Show Repeater
+ Data.OrgMode.Parse.Types: instance Show RepeaterType
+ Data.OrgMode.Parse.Types: instance Show Section
+ Data.OrgMode.Parse.Types: instance Show StateKeyword
+ Data.OrgMode.Parse.Types: instance Show Stats
+ Data.OrgMode.Parse.Types: instance Show TimeUnit
+ Data.OrgMode.Parse.Types: instance Show YearMonthDay'
+ Data.OrgMode.Parse.Types: instance ToJSON DateTime
+ Data.OrgMode.Parse.Types: instance ToJSON Delay
+ Data.OrgMode.Parse.Types: instance ToJSON DelayType
+ Data.OrgMode.Parse.Types: instance ToJSON Document
+ Data.OrgMode.Parse.Types: instance ToJSON Heading
+ Data.OrgMode.Parse.Types: instance ToJSON PlanningKeyword
+ Data.OrgMode.Parse.Types: instance ToJSON Plannings
+ Data.OrgMode.Parse.Types: instance ToJSON Priority
+ Data.OrgMode.Parse.Types: instance ToJSON Repeater
+ Data.OrgMode.Parse.Types: instance ToJSON RepeaterType
+ Data.OrgMode.Parse.Types: instance ToJSON Section
+ Data.OrgMode.Parse.Types: instance ToJSON StateKeyword
+ Data.OrgMode.Parse.Types: instance ToJSON Stats
+ Data.OrgMode.Parse.Types: instance ToJSON TimeUnit
+ Data.OrgMode.Parse.Types: instance ToJSON Timestamp
+ Data.OrgMode.Parse.Types: instance ToJSON YearMonthDay'
+ Data.OrgMode.Parse.Types: keyword :: Heading -> Maybe StateKeyword
+ Data.OrgMode.Parse.Types: newtype Plannings
+ Data.OrgMode.Parse.Types: newtype StateKeyword
+ Data.OrgMode.Parse.Types: newtype YearMonthDay'
+ Data.OrgMode.Parse.Types: repeater :: DateTime -> Maybe Repeater
+ Data.OrgMode.Parse.Types: repeaterType :: Repeater -> RepeaterType
+ Data.OrgMode.Parse.Types: repeaterUnit :: Repeater -> TimeUnit
+ Data.OrgMode.Parse.Types: repeaterValue :: Repeater -> Int
+ Data.OrgMode.Parse.Types: section :: Heading -> Section
+ Data.OrgMode.Parse.Types: sectionClocks :: Section -> [Clock]
+ Data.OrgMode.Parse.Types: sectionParagraph :: Section -> Text
+ Data.OrgMode.Parse.Types: sectionPlannings :: Section -> Plannings
+ Data.OrgMode.Parse.Types: sectionProperties :: Section -> Properties
+ Data.OrgMode.Parse.Types: stats :: Heading -> Maybe Stats
+ Data.OrgMode.Parse.Types: subHeadings :: Heading -> [Heading]
+ Data.OrgMode.Parse.Types: tags :: Heading -> [Tag]
+ Data.OrgMode.Parse.Types: tsActive :: Timestamp -> Bool
+ Data.OrgMode.Parse.Types: tsEndTime :: Timestamp -> Maybe DateTime
+ Data.OrgMode.Parse.Types: tsTime :: Timestamp -> DateTime
+ Data.OrgMode.Parse.Types: type Duration = (Hour, Minute)
+ Data.OrgMode.Parse.Types: type Properties = HashMap Text Text
+ Data.OrgMode.Parse.Types: type Tag = Text
+ Data.OrgMode.Parse.Types: unStateKeyword :: StateKeyword -> Text
+ Data.OrgMode.Parse.Types: yearMonthDay :: DateTime -> YearMonthDay'
+ Data.OrgMode.Parse.Types: ymdDay :: YearMonthDay -> UnpkDayOfMonth
+ Data.OrgMode.Parse.Types: ymdMonth :: YearMonthDay -> UnpkMonth
+ Data.OrgMode.Parse.Types: ymdYear :: YearMonthDay -> UnpkYear
- Data.OrgMode.Parse.Attoparsec.Headings: headingLevel :: Parser Text Int
+ Data.OrgMode.Parse.Attoparsec.Headings: headingLevel :: Int -> Parser Text Int
- Data.OrgMode.Parse.Attoparsec.Headings: headingPriority :: Parser Text (Maybe Priority)
+ Data.OrgMode.Parse.Attoparsec.Headings: headingPriority :: Parser Text Priority
- Data.OrgMode.Parse.Attoparsec.Time: parseTimestamp :: Open -> Close -> Parser Text (Maybe Schedule)
+ Data.OrgMode.Parse.Attoparsec.Time: parseTimestamp :: Parser Text Timestamp
- Data.OrgMode.Parse.Types: DEADLINE :: ScheduleType
+ Data.OrgMode.Parse.Types: DEADLINE :: PlanningKeyword
- Data.OrgMode.Parse.Types: Heading :: Int -> Maybe Priority -> Maybe State -> Text -> [Keyword] -> Heading
+ Data.OrgMode.Parse.Types: Heading :: Int -> Maybe StateKeyword -> Maybe Priority -> Text -> Maybe Stats -> [Tag] -> Section -> [Heading] -> Heading
- Data.OrgMode.Parse.Types: SCHEDULED :: ScheduleType
+ Data.OrgMode.Parse.Types: SCHEDULED :: PlanningKeyword
Files
- orgmode-parse.cabal +18/−10
- src/Data/OrgMode/Parse.hs +37/−21
- src/Data/OrgMode/Parse/Types.hs +198/−55
- test/Test.hs +2/−0
orgmode-parse.cabal view
@@ -1,5 +1,5 @@ Name: orgmode-parse-Version: 0.0.2.1+Version: 0.1.0 Author: Parnell Springmeyer <parnell@digitalmentat.com> Maintainer: Parnell Springmeyer <parnell@digitalmentat.com> License: BSD3@@ -37,13 +37,17 @@ Data.OrgMode.Parse.Types Build-Depends:- base >= 4.4 && < 5,- attoparsec >= 0.12 && < 0.13,- unordered-containers >= 0.2 && < 0.3,- thyme >= 0.3 && < 0.4,- old-locale >= 1.0 && < 2.0,- free >= 4.9 && < 5,- text >= 1.0 && < 2.0+ aeson >= 0.8.0.2 && < 0.9+ , attoparsec >= 0.12 && < 0.13+ , base >= 4.4 && < 5+ , bytestring >= 0.10.4 && < 0.11+ , containers >= 0.5.5 && < 0.6+ , free >= 4.9 && < 5+ , hashable >= 1.2 && < 1.3+ , old-locale >= 1.0 && < 2.0+ , text >= 1.0 && < 2.0+ , thyme >= 0.3 && < 0.4+ , unordered-containers >= 0.2 && < 0.3 Test-Suite tests Type: exitcode-stdio-1.0@@ -56,14 +60,18 @@ Build-Depends: base >= 4.4 && < 5,+ aeson >= 0.8 && < 0.9,+ bytestring >= 0.10 && < 0.11, text >= 1.0 && < 2.0, attoparsec >= 0.12 && < 0.13,+ hashable >= 1.2 && < 1.3, unordered-containers >= 0.2 && < 0.3, thyme >= 0.3 && < 0.4, old-locale >= 1.0 && < 2.0, HUnit >= 1.2.5.2 && < 1.3,- tasty >= 0.8 && < 0.9,- tasty-hunit >= 0.8.0.1 && < 0.9+ tasty >= 0.8 && < 0.11,+ tasty-hunit >= 0.8.0.1 && < 0.9,+ containers Source-Repository head Type: git
src/Data/OrgMode/Parse.hs view
@@ -1,26 +1,42 @@--------------------------------------------------------------------------------- |--- Module : Data.OrgMode.Parse.Attoparsec.Headings--- Copyright : © 2014 Parnell Springmeyer--- License : All Rights Reserved--- Maintainer : Parnell Springmeyer <parnell@digitalmentat.com>--- Stability : stable------ Attoparsec combinators for orgmode documents.-----------------------------------------------------------------------------+{-|+Module : Data.OrgMode.Parse.Attoparsec.Headings+Copyright : © 2014 Parnell Springmeyer+License : All Rights Reserved+Maintainer : Parnell Springmeyer <parnell@digitalmentat.com>+Stability : stable -module Data.OrgMode.Parse-(--- * Parse Document+Attoparsec combinators for orgmode documents.+-} --- * Parse Headline- module Data.OrgMode.Parse.Attoparsec.Headings--- * Parse Headline Metadata (properties, timestamps, etc...)-, module Data.OrgMode.Parse.Attoparsec.Time+module Data.OrgMode.Parse (++-- * Parse OrgMode documents+ module Data.OrgMode.Parse.Attoparsec.Document++-- * OrgMode Document structure+, module Data.OrgMode.Parse.Types++-- * Parse headlines+, module Data.OrgMode.Parse.Attoparsec.Headings++-- * Parse headline metadata sections+, module Data.OrgMode.Parse.Attoparsec.Section++-- * Parse metadata property drawers , module Data.OrgMode.Parse.Attoparsec.PropertyDrawer--- * Parse Body++-- * Parse metadata timestamps and modifiers+, module Data.OrgMode.Parse.Attoparsec.Time ) where -import Data.OrgMode.Parse.Attoparsec.Headings-import Data.OrgMode.Parse.Attoparsec.PropertyDrawer-import Data.OrgMode.Parse.Attoparsec.Time+import Data.OrgMode.Parse.Attoparsec.Document++import Data.OrgMode.Parse.Attoparsec.Section++import Data.OrgMode.Parse.Attoparsec.Headings++import Data.OrgMode.Parse.Attoparsec.PropertyDrawer++import Data.OrgMode.Parse.Attoparsec.Time++import Data.OrgMode.Parse.Types
src/Data/OrgMode/Parse/Types.hs view
@@ -1,77 +1,220 @@--------------------------------------------------------------------------------- |--- Module : Data.OrgMode.Parse.Types--- Copyright : © 2014 Parnell Springmeyer--- License : All Rights Reserved--- Maintainer : Parnell Springmeyer <parnell@digitalmentat.com>--- Stability : stable------ Types and utility functions.-----------------------------------------------------------------------------+{-|+Module : Data.OrgMode.Parse.Types+Copyright : © 2014 Parnell Springmeyer+License : All Rights Reserved+Maintainer : Parnell Springmeyer <parnell@digitalmentat.com>+Stability : experimental +Types and utility functions.+-}+ {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE DeriveGeneric #-} module Data.OrgMode.Parse.Types-( Heading (..)+( Document (..)+, Section (..)+, Heading (..) , Priority (..)-, State (..)-, Keyword (..)-, PropertyDrawer (..)-, Schedule (..)-, ScheduleType (..)+, Plannings (..)+, StateKeyword (..)+, Duration+, PlanningKeyword (..)+, Properties , Timestamp (..)-, Open (..)-, Close (..)-, toPriority+, DateTime (..)+, Stats (..)+, Tag+, TimeUnit (..)+, RepeaterType (..)+, Repeater (..)+, DelayType (..)+, Delay (..)+, YearMonthDay(..)+, YearMonthDay'(..) ) where -import Data.HashMap.Strict (HashMap)-import Data.Text (Text)-import Data.Thyme.LocalTime (LocalTime (..))+import Control.Applicative+import Control.Monad (mzero)+import qualified Data.Aeson as A+import Data.Aeson ((.=),(.:))+import Data.Hashable (Hashable(..))+import Data.HashMap.Strict (HashMap, fromList, toList, keys)+import Data.Text (Text, pack)+import Data.Thyme.Calendar (YearMonthDay(..))+import Data.Thyme.LocalTime (Hour, Minute)+import Data.Traversable+import GHC.Generics -----------------------------------------------------------------------------+data Document = Document {+ documentText :: Text -- ^ Text occurring before any Org headlines+ , documentHeadings :: [Heading] -- ^ Toplevel Org headlines+ } deriving (Show, Eq, Generic) +instance A.ToJSON Document where+instance A.FromJSON Document where+ data Heading = Heading- { level :: Int- , priority :: Maybe Priority- , state :: Maybe State- , title :: Text- , keywords :: [Keyword]- } deriving (Show, Eq)+ { level :: Int -- ^ Org headline nesting level (1 is at the top)+ , keyword :: Maybe StateKeyword -- ^ State of the headline (e.g. TODO, DONE)+ , priority :: Maybe Priority --+ , title :: Text -- properties+ , stats :: Maybe Stats --+ , tags :: [Tag] --+ , section :: Section -- Next-line+ , subHeadings :: [Heading] -- elements+ } deriving (Show, Eq, Generic) +type Properties = HashMap Text Text+type Clock = (Maybe Timestamp, Maybe Duration) -data Priority = A | B | C | Unknown- deriving (Show, Read, Eq, Ord)+data Section = Section {+ sectionPlannings :: Plannings+ , sectionClocks :: [Clock]+ , sectionProperties :: Properties+ , sectionParagraph :: Text+ } deriving (Show, Eq, Generic) -newtype State = State Text- deriving (Show, Eq) -newtype Keyword = Keyword Text- deriving (Show, Eq, Ord)+data Timestamp = Timestamp {+ tsTime :: DateTime+ , tsActive :: Bool+ , tsEndTime :: Maybe DateTime+ } deriving (Show, Eq, Generic) -toPriority :: Text -> Priority-toPriority "A" = A-toPriority "B" = B-toPriority "C" = C-toPriority _ = Unknown+instance A.ToJSON Timestamp where+instance A.FromJSON Timestamp where ----------------------------------------------------------------------------- -newtype PropertyDrawer k v = PropertyDrawer (HashMap k v)- deriving (Show, Eq)+newtype YearMonthDay' = YMD' YearMonthDay+ deriving (Show, Eq, Generic) ------------------------------------------------------------------------------data Schedule = Schedule- { schedule_type :: ScheduleType- , timestamp :: Maybe Timestamp- , recurring :: Maybe Text- } deriving (Show, Eq)+instance A.ToJSON YearMonthDay' where+ toJSON (YMD' (YearMonthDay y m d)) =+ A.object ["ymdYear" .= y+ ,"ymdMonth" .= m+ ,"ymdDay" .= d] -data ScheduleType = SCHEDULED | DEADLINE | APPOINTMENT- deriving (Show, Eq)+instance A.FromJSON YearMonthDay' where+ parseJSON (A.Object v) = do+ y <- v .: "ymdYear"+ m <- v .: "ymdMonth"+ d <- v .: "ymdDay"+ return (YMD' (YearMonthDay y m d))+ parseJSON _ = mzero -data Timestamp = Active LocalTime | Inactive LocalTime- deriving (Show, Eq)+data DateTime = DateTime {+ yearMonthDay :: YearMonthDay'+ , dayName :: Maybe Text+ , hourMinute :: Maybe (Hour,Minute)+ , repeater :: Maybe Repeater+ , delay :: Maybe Delay+ } deriving (Show, Eq, Generic) -newtype Open = Open Char-newtype Close = Close Char+instance A.ToJSON DateTime where+instance A.FromJSON DateTime where++data RepeaterType = RepeatCumulate | RepeatCatchUp | RepeatRestart+ deriving (Show, Eq, Generic)++instance A.ToJSON RepeaterType+instance A.FromJSON RepeaterType++data Repeater = Repeater {+ repeaterType :: RepeaterType+ , repeaterValue :: Int+ , repeaterUnit :: TimeUnit+ } deriving (Show, Eq, Generic)++instance A.ToJSON Repeater where+instance A.FromJSON Repeater where++data DelayType = DelayAll | DelayFirst+ deriving (Show, Eq, Generic)++instance A.ToJSON DelayType where+instance A.FromJSON DelayType where++data Delay = Delay {+ delayType :: DelayType+ , delayValue :: Int+ , delayUnit :: TimeUnit+ } deriving (Show, Eq, Generic)++instance A.ToJSON Delay where+instance A.FromJSON Delay where++data TimeUnit = UnitYear+ | UnitWeek+ | UnitMonth+ | UnitDay+ | UnitHour+ deriving (Show, Eq, Generic)++instance A.ToJSON TimeUnit where+instance A.FromJSON TimeUnit where++---------------------------------------------------------------------------+--instance A.ToJSON Document where+--instance A.FromJSON Document where++newtype StateKeyword = StateKeyword {unStateKeyword :: Text}+ deriving (Show, Eq, Generic)++instance A.ToJSON StateKeyword where+instance A.FromJSON StateKeyword where+++data PlanningKeyword = SCHEDULED | DEADLINE | CLOSED+ deriving (Show, Eq, Enum, Ord, Generic)++instance A.ToJSON PlanningKeyword where+instance A.FromJSON PlanningKeyword where++--instance (A.ToJSON k, A.ToJSON v) => A.ToJSON (HashMap k v) where+-- toJSON hm = A.object hm++newtype Plannings = Plns (HashMap PlanningKeyword Timestamp)+ deriving (Show, Eq, Generic)++instance A.ToJSON Plannings where+ toJSON (Plns hm) = A.object $ map jPair (toList hm)+ where jPair (k, v) = pack (show k) .= A.toJSON v++instance A.FromJSON Plannings where+ parseJSON (A.Object v) = Plns . fromList <$> (traverse jPair (keys v))+ where jPair k = v .: k+ parseJSON _ = mzero++instance A.ToJSON Section where+instance A.FromJSON Section where++instance A.ToJSON Heading where+instance A.FromJSON Heading where++data Priority = A | B | C+ deriving (Show, Read, Eq, Ord, Generic)++instance A.ToJSON Priority where+instance A.FromJSON Priority where+type Tag = Text++data Stats = StatsPct Int+ | StatsOf Int Int+ deriving (Show, Eq, Generic)++instance A.ToJSON Stats where+instance A.FromJSON Stats where++type Duration = (Hour,Minute)++instance Hashable PlanningKeyword where+ hashWithSalt salt k = hashWithSalt salt (fromEnum k)++-- -- This might be the form to use if we were supporting <diary> timestamps+-- data Timestamp = Dairy Text+-- | Time TimestampTime+-- deriving (Show, Eq, Generic)+++
test/Test.hs view
@@ -7,6 +7,7 @@ import PropertyDrawer import Test.Tasty import Timestamps+import Document main :: IO () main = defaultMain tests@@ -17,4 +18,5 @@ [ parserHeadingTests , parserPropertyDrawerTests , parserTimestampTests+ , parserSmallDocumentTests ]