mirror of
https://github.com/simonmichael/hledger.git
synced 2024-09-19 10:17:35 +03:00
print: comment positions (same line or next line) are now preserved
This commit is contained in:
parent
7ed0705398
commit
f9656a21af
20
FAQ.md
20
FAQ.md
@ -141,17 +141,12 @@ and ledger if you avoid ledger's most advanced features.
|
||||
Some ledger features are parsed but ignored, eg:
|
||||
|
||||
- automated transactions ( = ... , ~ ... )
|
||||
- balance assertions ( AMT1=AMT2 )
|
||||
- fixed lot prices ( {...} )
|
||||
- historical prices ( P ... )
|
||||
|
||||
Some features are not currently parsed and will cause an error, eg:
|
||||
|
||||
- balance assignments
|
||||
- some top level directives like "account"
|
||||
|
||||
There can also be subtle differences in parser behaviour, eg
|
||||
comments may be permissible in different places.
|
||||
Some features are not currently parsed and will cause an error, eg
|
||||
ledger's more recent top-level directives. There can also be subtle
|
||||
differences in parser behaviour.
|
||||
|
||||
### What other functionality differences are there ?
|
||||
|
||||
@ -184,10 +179,11 @@ comments may be permissible in different places.
|
||||
ledger print shows only the secondary date with --aux-date, but not
|
||||
vice versa.
|
||||
|
||||
- hledger's default commodity directive (D) sets the commodity for
|
||||
subsequent commodityless amounts, and sets that commodity's display
|
||||
settings if such an amount is the first seen. ledger uses D only for
|
||||
commodity display settings and for the entry command.
|
||||
- hledger's default commodity directive (D) sets the commodity to be
|
||||
used for subsequent commodityless amounts, and also sets that
|
||||
commodity's display settings if such an amount is the first
|
||||
seen. ledger uses D only for commodity display settings and for the
|
||||
entry command.
|
||||
|
||||
- hledger generates a description for timelog sessions, instead of
|
||||
taking it from the clock-out entry
|
||||
|
@ -685,10 +685,10 @@ The most basic reporting commands are `print`, `register` and `balance`:
|
||||
|
||||
#### print
|
||||
|
||||
The print command displays full transactions from the journal file, tidily
|
||||
formatted and showing all amounts explicitly. The output of print is
|
||||
always a valid hledger journal, but it might not preserve the original
|
||||
content absolutely intact (eg comments.)
|
||||
The print command displays full transactions from the journal file,
|
||||
tidily formatted and showing all amounts explicitly. The output of
|
||||
print is always a valid hledger journal, but it does always not
|
||||
preserve all original content exactly (eg directives).
|
||||
|
||||
hledger's print command also shows all unit prices in effect, or (with
|
||||
-B/--cost) shows cost amounts.
|
||||
|
1
NEWS.md
1
NEWS.md
@ -6,6 +6,7 @@ title: hledger news
|
||||
|
||||
## unreleased
|
||||
|
||||
- print: comment positions (same line or next line) are now preserved
|
||||
- register: `--average/-A` shows a running average, like ledger
|
||||
- queries: `sym:REGEXP` matches (whole) commodity symbols
|
||||
- queries: `amt` now uses the = operator by default, eg amt:50 finds amounts equal to 50
|
||||
|
@ -106,20 +106,18 @@ tests_showTransactionUnelided = [
|
||||
pstatus=True,
|
||||
paccount="a",
|
||||
pamount=Mixed [usd 1, hrs 2],
|
||||
pcomment="pcomment1\npcomment2\n",
|
||||
pcomment="\npcomment2\n",
|
||||
ptype=RegularPosting,
|
||||
ptags=[("ptag1","val1"),("ptag2","val2")]
|
||||
}
|
||||
]
|
||||
}
|
||||
`gives` unlines [
|
||||
"2012/05/14=2012/05/15 (code) desc",
|
||||
" ;tcomment1",
|
||||
" ;tcomment2",
|
||||
"2012/05/14=2012/05/15 (code) desc ; tcomment1",
|
||||
" ; tcomment2",
|
||||
" $1.00",
|
||||
" * a 2.0h",
|
||||
" ;pcomment1",
|
||||
" ;pcomment2",
|
||||
" ; pcomment2",
|
||||
""
|
||||
]
|
||||
]
|
||||
@ -128,29 +126,38 @@ tests_showTransactionUnelided = [
|
||||
showTransaction' :: Bool -> Transaction -> String
|
||||
showTransaction' elide t =
|
||||
unlines $ [descriptionline]
|
||||
++ multilinecomment
|
||||
++ newlinecomments
|
||||
++ (postingsAsLines elide t (tpostings t))
|
||||
++ [""]
|
||||
where
|
||||
descriptionline = rstrip $ concat [date, status, code, desc, inlinecomment]
|
||||
descriptionline = rstrip $ concat [date, status, code, desc, samelinecomment]
|
||||
date = showdate (tdate t) ++ maybe "" showedate (tdate2 t)
|
||||
showdate = printf "%-10s" . showDate
|
||||
showedate = printf "=%s" . showdate
|
||||
status = if tstatus t then " *" else ""
|
||||
code = if length (tcode t) > 0 then printf " (%s)" $ tcode t else ""
|
||||
desc = if null d then "" else " " ++ d where d = tdescription t
|
||||
(inlinecomment, multilinecomment) = commentLines $ tcomment t
|
||||
(samelinecomment, newlinecomments) =
|
||||
case renderCommentLines (tcomment t) of [] -> ("",[])
|
||||
c:cs -> (c,cs)
|
||||
|
||||
-- Render a transaction or posting's comment as indented, semicolon-prefixed comment lines -
|
||||
-- an inline comment (when it's a single line) or multiple lines.
|
||||
commentLines :: String -> (String, [String])
|
||||
commentLines s
|
||||
| null s = ("", [])
|
||||
| length ls == 1 = (prefix $ head ls, [])
|
||||
| otherwise = ("", (prefix $ head ls):(map prefix $ tail ls))
|
||||
-- Render a transaction or posting's comment as indented, semicolon-prefixed comment lines.
|
||||
renderCommentLines :: String -> [String]
|
||||
renderCommentLines s = case lines s of ("":ls) -> "":map commentprefix ls
|
||||
ls -> map commentprefix ls
|
||||
where
|
||||
ls = lines s
|
||||
prefix = indent . (";"++)
|
||||
commentprefix = indent . ("; "++)
|
||||
|
||||
-- -- Render a transaction or posting's comment as semicolon-prefixed comment lines -
|
||||
-- -- an inline (same-line) comment if it's a single line, otherwise multiple indented lines.
|
||||
-- commentLines' :: String -> (String, [String])
|
||||
-- commentLines' s
|
||||
-- | null s = ("", [])
|
||||
-- | length ls == 1 = (prefix $ head ls, [])
|
||||
-- | otherwise = ("", (prefix $ head ls):(map prefix $ tail ls))
|
||||
-- where
|
||||
-- ls = lines s
|
||||
-- prefix = indent . (";"++)
|
||||
|
||||
postingsAsLines :: Bool -> Transaction -> [Posting] -> [String]
|
||||
postingsAsLines elide t ps
|
||||
@ -161,11 +168,13 @@ postingsAsLines elide t ps
|
||||
postingAsLines :: Bool -> [Posting] -> Posting -> [String]
|
||||
postingAsLines elideamount ps p =
|
||||
postinglines
|
||||
++ multilinecomment
|
||||
++ newlinecomments
|
||||
where
|
||||
postinglines = map rstrip $ lines $ concatTopPadded [showacct p, " ", amount, inlinecomment]
|
||||
postinglines = map rstrip $ lines $ concatTopPadded [showacct p, " ", amount, samelinecomment]
|
||||
amount = if elideamount then "" else showamt (pamount p)
|
||||
(inlinecomment, multilinecomment) = commentLines $ pcomment p
|
||||
(samelinecomment, newlinecomments) =
|
||||
case renderCommentLines (pcomment p) of [] -> ("",[])
|
||||
c:cs -> (c,cs)
|
||||
showacct p =
|
||||
indent $ showstatus p ++ printf (printf "%%-%ds" w) (showAccountName Nothing (ptype p) (paccount p))
|
||||
where
|
||||
@ -188,10 +197,9 @@ tests_postingAsLines = [
|
||||
}
|
||||
`gives` [
|
||||
" $1.00",
|
||||
" * a 2.0h",
|
||||
" ;pcomment1",
|
||||
" ;pcomment2",
|
||||
" ; tag3: val3 "
|
||||
" * a 2.0h ; pcomment1",
|
||||
" ; pcomment2",
|
||||
" ; tag3: val3 "
|
||||
]
|
||||
]
|
||||
|
||||
|
@ -73,7 +73,7 @@ newtype MixedAmount = Mixed [Amount] deriving (Eq,Ord)
|
||||
data PostingType = RegularPosting | VirtualPosting | BalancedVirtualPosting
|
||||
deriving (Eq,Show)
|
||||
|
||||
type Tag = (String, String)
|
||||
type Tag = (String, String) -- ^ A tag name and (possibly empty) value.
|
||||
|
||||
data Posting = Posting {
|
||||
pdate :: Maybe Day, -- ^ this posting's date, if different from the transaction's
|
||||
@ -81,9 +81,9 @@ data Posting = Posting {
|
||||
pstatus :: Bool,
|
||||
paccount :: AccountName,
|
||||
pamount :: MixedAmount,
|
||||
pcomment :: String, -- ^ this posting's non-tag comment lines, as a single non-indented string
|
||||
pcomment :: String, -- ^ this posting's comment lines, as a single non-indented multi-line string
|
||||
ptype :: PostingType,
|
||||
ptags :: [Tag],
|
||||
ptags :: [Tag], -- ^ tag names and values, extracted from the comment
|
||||
pbalanceassertion :: Maybe MixedAmount, -- ^ optional: the expected balance in the account after this posting
|
||||
ptransaction :: Maybe Transaction -- ^ this posting's parent transaction (co-recursive types).
|
||||
-- Tying this knot gets tedious, Maybe makes it easier/optional.
|
||||
@ -100,10 +100,10 @@ data Transaction = Transaction {
|
||||
tstatus :: Bool, -- XXX tcleared ?
|
||||
tcode :: String,
|
||||
tdescription :: String,
|
||||
tcomment :: String, -- ^ this transaction's non-tag comment lines, as a single non-indented string
|
||||
ttags :: [Tag],
|
||||
tcomment :: String, -- ^ this transaction's comment lines, as a single non-indented multi-line string
|
||||
ttags :: [Tag], -- ^ tag names and values, extracted from the comment
|
||||
tpostings :: [Posting], -- ^ this transaction's postings
|
||||
tpreceding_comment_lines :: String
|
||||
tpreceding_comment_lines :: String -- ^ any comment lines immediately preceding this transaction
|
||||
} deriving (Eq)
|
||||
|
||||
data ModifierTransaction = ModifierTransaction {
|
||||
|
@ -817,19 +817,15 @@ emptyline = do many spacenonewline
|
||||
followingcomment :: GenParser Char JournalContext String
|
||||
followingcomment =
|
||||
-- ptrace "followingcomment"
|
||||
(do first <- many spacenonewline >> followingcommentline
|
||||
rest <- many (try (many1 spacenonewline >> followingcommentline))
|
||||
return $ unlines $ first:rest
|
||||
) <|>
|
||||
do
|
||||
many spacenonewline >> newline
|
||||
rest <- many (try (many1 spacenonewline >> followingcommentline))
|
||||
return $ unlines rest
|
||||
do samelinecomment <- many spacenonewline >> (try commentline <|> (newline >> return ""))
|
||||
newlinecomments <- many (try (many1 spacenonewline >> commentline))
|
||||
return $ unlines $ samelinecomment:newlinecomments
|
||||
|
||||
followingcommentline :: GenParser Char JournalContext String
|
||||
followingcommentline = do
|
||||
-- ptrace "followingcommentline"
|
||||
commentline :: GenParser Char JournalContext String
|
||||
commentline = do
|
||||
-- ptrace "commentline"
|
||||
char ';'
|
||||
many spacenonewline
|
||||
l <- anyChar `manyTill` eolof
|
||||
optional newline
|
||||
return l
|
||||
|
@ -31,24 +31,28 @@ hledgerdev -f - print
|
||||
|
||||
>>>=0
|
||||
|
||||
# 3. print should preserve comments
|
||||
# 3. print should preserve transaction (entry) comments and which line they're on
|
||||
hledgerdev -f - print
|
||||
<<<
|
||||
; isolated journal comment
|
||||
; leading journal comment, not preserved
|
||||
|
||||
; pre-transaction journal comment
|
||||
2009/1/1 x ; transaction comment
|
||||
a 1 ; posting 1 comment
|
||||
; posting 1 comment 2
|
||||
; transaction preceding comment, not preserved
|
||||
2009/1/1 x ; transaction same line comment
|
||||
; transaction new line comment
|
||||
a 1 ; posting 1 same line comment
|
||||
; posting 1 new line comment
|
||||
b
|
||||
; posting 2 comment
|
||||
; post-transaction journal comment
|
||||
; posting 2 new line comment
|
||||
; journal comment right after the transaction, not preserved
|
||||
|
||||
; trailing journal comment, not preserved
|
||||
>>>
|
||||
2009/01/01 x ; transaction comment
|
||||
a 1
|
||||
; posting 1 comment
|
||||
; posting 1 comment 2
|
||||
b -1 ; posting 2 comment
|
||||
2009/01/01 x ; transaction same line comment
|
||||
; transaction new line comment
|
||||
a 1 ; posting 1 same line comment
|
||||
; posting 1 new line comment
|
||||
b -1
|
||||
; posting 2 new line comment
|
||||
|
||||
>>>2
|
||||
>>>=0
|
||||
|
@ -38,7 +38,7 @@
|
||||
# 4. handle conditions assigning multiple fields
|
||||
rm -rf t.rules$$; printf 'fields date, description, amount\ndate-format %%d/%%Y/%%m\ncurrency $\naccount1 assets:myacct\nif Flubber\n account2 acct\n comment cmt' >t.rules$$; echo '10/2009/09,Flubber Co,50' | hledgerdev -f- print --rules-file t.rules$$; rm -rf t.rules$$
|
||||
>>>
|
||||
2009/09/10 Flubber Co ;cmt
|
||||
2009/09/10 Flubber Co ; cmt
|
||||
acct $-50
|
||||
assets:myacct $50
|
||||
|
||||
|
@ -12,14 +12,12 @@ hledgerdev -f - print
|
||||
; posting-2-tag-2:
|
||||
; non-metadata:
|
||||
>>>
|
||||
2010/01/01
|
||||
; txntag1: txn val 1
|
||||
2010/01/01 ; txntag1: txn val 1
|
||||
; txntag2: txn val 2
|
||||
a 1
|
||||
; posting1tag1: posting 1 val 1
|
||||
; posting1tag2:
|
||||
b -1
|
||||
; posting-2-tag-1: posting 2 val 1
|
||||
b -1 ; posting-2-tag-1: posting 2 val 1
|
||||
; posting-2-tag-2:
|
||||
|
||||
>>>2
|
||||
|
Loading…
Reference in New Issue
Block a user