timedot: more org support: dates/entries can be org headlines
Org headline prefixes (stars and space at beginning of line) are ignored.
This commit is contained in:
parent
50f8539911
commit
190233b576
@ -87,21 +87,26 @@ timedotfilep :: JournalParser m ParsedJournal
|
|||||||
timedotfilep = do many timedotfileitemp
|
timedotfilep = do many timedotfileitemp
|
||||||
eof
|
eof
|
||||||
get
|
get
|
||||||
where
|
|
||||||
timedotfileitemp :: JournalParser m ()
|
timedotfileitemp :: JournalParser m ()
|
||||||
timedotfileitemp = do
|
timedotfileitemp = do
|
||||||
traceparse "timedotfileitemp"
|
traceparse "timedotfileitemp"
|
||||||
choice [
|
choice [
|
||||||
void $ lift emptyorcommentlinep
|
try $ void $ lift emptyorcommentlinep'
|
||||||
,timedotdayp >>= \ts -> modify' (addTransactions ts)
|
,try timedotdayp >>= \ts -> modify' (addTransactions ts)
|
||||||
|
,lift $ skipSome anySingle >> eolof -- an initial line not beginning with a date, ignore
|
||||||
] <?> "timedot day entry, or default year or comment line or blank line"
|
] <?> "timedot day entry, or default year or comment line or blank line"
|
||||||
|
|
||||||
addTransactions :: [Transaction] -> Journal -> Journal
|
addTransactions :: [Transaction] -> Journal -> Journal
|
||||||
addTransactions ts j = foldl' (flip ($)) j (map addTransaction ts)
|
addTransactions ts j = foldl' (flip ($)) j (map addTransaction ts)
|
||||||
|
|
||||||
|
emptyorcommentlinep' = optional orgheadingprefixp >> emptyorcommentlinep
|
||||||
|
|
||||||
|
orgheadingprefixp = skipSome (char '*') >> skipSome spacenonewline
|
||||||
|
|
||||||
-- | Parse timedot day entries to zero or more time transactions for that day.
|
-- | Parse timedot day entries to zero or more time transactions for that day.
|
||||||
-- @
|
-- @
|
||||||
-- 2/1
|
-- 2020/2/1 optional day description
|
||||||
-- fos.haskell .... ..
|
-- fos.haskell .... ..
|
||||||
-- biz.research .
|
-- biz.research .
|
||||||
-- inc.client1 .... .... .... .... .... ....
|
-- inc.client1 .... .... .... .... .... ....
|
||||||
@ -109,8 +114,9 @@ addTransactions ts j = foldl' (flip ($)) j (map addTransaction ts)
|
|||||||
timedotdayp :: JournalParser m [Transaction]
|
timedotdayp :: JournalParser m [Transaction]
|
||||||
timedotdayp = do
|
timedotdayp = do
|
||||||
traceparse " timedotdayp"
|
traceparse " timedotdayp"
|
||||||
|
lift $ optional orgheadingprefixp
|
||||||
d <- datep <* lift eolof
|
d <- datep <* lift eolof
|
||||||
es <- catMaybes <$> many (const Nothing <$> try (lift emptyorcommentlinep) <|>
|
es <- catMaybes <$> many (const Nothing <$> try (lift emptyorcommentlinep') <|>
|
||||||
Just <$> (notFollowedBy datep >> timedotentryp))
|
Just <$> (notFollowedBy datep >> timedotentryp))
|
||||||
return $ map (\t -> t{tdate=d}) es -- <$> many timedotentryp
|
return $ map (\t -> t{tdate=d}) es -- <$> many timedotentryp
|
||||||
|
|
||||||
@ -122,7 +128,7 @@ timedotentryp :: JournalParser m Transaction
|
|||||||
timedotentryp = do
|
timedotentryp = do
|
||||||
traceparse " timedotentryp"
|
traceparse " timedotentryp"
|
||||||
pos <- genericSourcePos <$> getSourcePos
|
pos <- genericSourcePos <$> getSourcePos
|
||||||
lift (skipMany spacenonewline)
|
lift $ optional $ choice [orgheadingprefixp, skipSome spacenonewline]
|
||||||
a <- modifiedaccountnamep
|
a <- modifiedaccountnamep
|
||||||
lift (skipMany spacenonewline)
|
lift (skipMany spacenonewline)
|
||||||
hours <-
|
hours <-
|
||||||
|
|||||||
@ -22,15 +22,16 @@ so it could be used to represent dated quantities other than time.
|
|||||||
In the docs below we'll assume it's time.
|
In the docs below we'll assume it's time.
|
||||||
|
|
||||||
A timedot file contains a series of day entries.
|
A timedot file contains a series of day entries.
|
||||||
A day entry begins with a date, and is followed by category/quantity pairs, one per line.
|
A day entry begins with a non-indented hledger-style [simple date](journal.html#simple-dates) (see hledger_journal(5)).
|
||||||
Dates are hledger-style [simple dates](journal.html#simple-dates) (see hledger_journal(5)).
|
|
||||||
Categories are hledger-style account names, optionally indented.
|
This is followed by optionally-indented timelog items for that day, one per line.
|
||||||
As in a hledger journal, there must be at least two spaces between the category (account name) and the quantity.
|
Each timelog item is a note, usually a hledger:style:account:name representing a time category,
|
||||||
|
followed by two or more spaces, and a quantity.
|
||||||
|
|
||||||
Quantities can be written as:
|
Quantities can be written as:
|
||||||
|
|
||||||
- a sequence of dots (.) representing quarter hours.
|
- time dots: a sequence of dots (.) representing quarter hours.
|
||||||
Spaces may optionally be used for grouping and readability.
|
Spaces may optionally be used for grouping.
|
||||||
Eg: .... ..
|
Eg: .... ..
|
||||||
|
|
||||||
- an integral or decimal number, representing hours.
|
- an integral or decimal number, representing hours.
|
||||||
@ -43,8 +44,21 @@ Quantities can be written as:
|
|||||||
The following equivalencies are assumed, currently:
|
The following equivalencies are assumed, currently:
|
||||||
1m = 60s, 1h = 60m, 1d = 24h, 1w = 7d, 1mo = 30d, 1y=365d.
|
1m = 60s, 1h = 60m, 1d = 24h, 1w = 7d, 1mo = 30d, 1y=365d.
|
||||||
|
|
||||||
Blank lines and lines beginning with #, ; or * are ignored.
|
There is some flexibility allowing notes and todo lists to be kept
|
||||||
An example:
|
right in the time log, if needed:
|
||||||
|
|
||||||
|
- Blank lines and lines beginning with `#` or `;` are ignored.
|
||||||
|
|
||||||
|
- Lines not ending with a double-space and quantity are parsed as
|
||||||
|
items taking no time, which will not appear in balance reports by
|
||||||
|
default. (Add -E to see them.)
|
||||||
|
|
||||||
|
- Org headline prefixes (stars followed by at least one space, at the
|
||||||
|
start of a line) are ignored, so a timedot file can also be an org
|
||||||
|
outline. Emacs org mode users can use these to add structure and
|
||||||
|
control which parts of the file are visible.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
```timedot
|
```timedot
|
||||||
# on this day, 6h was spent on client work, 1.5h on haskell FOSS work, etc.
|
# on this day, 6h was spent on client work, 1.5h on haskell FOSS work, etc.
|
||||||
@ -58,8 +72,6 @@ inc:client1 .... ....
|
|||||||
biz:research .
|
biz:research .
|
||||||
```
|
```
|
||||||
|
|
||||||
Or with numbers:
|
|
||||||
|
|
||||||
```timedot
|
```timedot
|
||||||
2016/2/3
|
2016/2/3
|
||||||
inc:client1 4
|
inc:client1 4
|
||||||
@ -67,6 +79,30 @@ fos:hledger 3
|
|||||||
biz:research 1
|
biz:research 1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```timedot
|
||||||
|
* Time log
|
||||||
|
** 2020-01-01
|
||||||
|
*** adm:time .
|
||||||
|
*** adm:finance .
|
||||||
|
```
|
||||||
|
|
||||||
|
```timedot
|
||||||
|
** 2020-02-29
|
||||||
|
*** DONE
|
||||||
|
0700 yoga
|
||||||
|
*** UNPLANNED
|
||||||
|
*** BEGUN
|
||||||
|
hom:chores
|
||||||
|
cleaning ...
|
||||||
|
water plants
|
||||||
|
outdoor - one full watering can
|
||||||
|
indoor - light watering
|
||||||
|
*** TODO
|
||||||
|
adm:planning: trip
|
||||||
|
*** LATER
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
Reporting:
|
Reporting:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
|||||||
@ -16,3 +16,14 @@ $ hledger -f- print
|
|||||||
|
|
||||||
>=0
|
>=0
|
||||||
|
|
||||||
|
# 2. Org mode headline prefixes are ignored.
|
||||||
|
<
|
||||||
|
* 2020-01-01
|
||||||
|
** a:aa 1
|
||||||
|
|
||||||
|
$ hledger -f- print
|
||||||
|
2020-01-01 *
|
||||||
|
(a:aa) 1.00
|
||||||
|
|
||||||
|
>=0
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user