Skip to content

Commit 2860b63

Browse files
committed
feat: register: Implement --drop flag mirroring functionality
This implements the same --drop functionality as balance command for register subcommand, allowing users to trim leading account name components from register output.
1 parent 0ff149b commit 2860b63

File tree

2 files changed

+42
-15
lines changed

2 files changed

+42
-15
lines changed

hledger/Hledger/Cli/Commands/Register.hs

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import Data.Text qualified as T
2626
import Data.Text.Lazy qualified as TL
2727
import Data.Text.Lazy.IO qualified as TL
2828
import Data.Text.Lazy.Builder qualified as TB
29+
import Safe (readMay)
2930
import System.Console.CmdArgs.Explicit (flagNone, flagReq)
3031

3132
import Hledger hiding (per)
@@ -36,6 +37,8 @@ import Hledger.Write.Spreadsheet qualified as Spr
3637
import Hledger.Cli.CliOptions
3738
import Hledger.Cli.Utils
3839
import Hledger.Cli.Anchor (setAccountAnchor, dateCell)
40+
import Hledger.Data (accountNameDrop)
41+
import Hledger.Data.AccountName (clipAccountName)
3942
import Text.Tabular.AsciiWide (Cell(..), Align(..), Properties(..), Header(Header, Group), renderRowB, textCell, tableBorders, borderSpaces)
4043
import Lucid qualified
4144
import Data.List (sortBy)
@@ -56,6 +59,7 @@ registermode = hledgerCommandMode
5659
("fuzzy search for one recent posting with description closest to "++arg)
5760
,flagNone ["related","r"] (setboolopt "related") "show postings' siblings instead"
5861
,flagNone ["invert"] (setboolopt "invert") "display all amounts with reversed sign"
62+
,flagReq ["drop"] (\s opts -> Right $ setopt "drop" s opts) "N" "omit N leading account name parts"
5963
,flagReq ["sort"] (\s opts -> Right $ setopt "sort" s opts) "FIELDS"
6064
("sort by: " <> sortKeysDescription
6165
<> ", or a comma-separated combination of these. For a descending sort, prefix with -. (Default: date)")
@@ -101,46 +105,46 @@ register opts@CliOpts{rawopts_=rawopts, reportspec_=rspec} j
101105
rpt = postingsReport rspec j
102106
render | fmt=="txt" = postingsReportAsText opts
103107
| fmt=="json" = toJsonText
104-
| fmt=="csv" = printCSV . postingsReportAsCsv
105-
| fmt=="tsv" = printTSV . postingsReportAsCsv
108+
| fmt=="csv" = printCSV . postingsReportAsCsv opts
109+
| fmt=="tsv" = printTSV . postingsReportAsCsv opts
106110
| fmt=="html" =
107111
(<>"\n") . Lucid.renderText . styledTableHtml .
108112
map (map (fmap Lucid.toHtml)) .
109-
postingsReportAsSpreadsheet oneLineNoCostFmt baseUrl query
113+
postingsReportAsSpreadsheet opts oneLineNoCostFmt baseUrl query
110114
| fmt=="fods" =
111115
printFods IO.localeEncoding . Map.singleton "Register" .
112116
(,) (1,0) .
113-
postingsReportAsSpreadsheet oneLineNoCostFmt baseUrl query
117+
postingsReportAsSpreadsheet opts oneLineNoCostFmt baseUrl query
114118
| otherwise = error' $ unsupportedOutputFormatError fmt -- PARTIAL:
115119
where fmt = outputFormatFromOpts opts
116120
baseUrl = balance_base_url_ $ _rsReportOpts rspec
117121
query = querystring_ $ _rsReportOpts rspec
118122

119-
postingsReportAsCsv :: PostingsReport -> CSV
120-
postingsReportAsCsv =
121-
Spr.rawTableContent . postingsReportAsSpreadsheet machineFmt Nothing []
123+
postingsReportAsCsv :: CliOpts -> PostingsReport -> CSV
124+
postingsReportAsCsv opts =
125+
Spr.rawTableContent . postingsReportAsSpreadsheet opts machineFmt Nothing []
122126

123127
-- ToDo: --layout=bare etc.
124128
-- ToDo: Text output does not show headers, but Spreadsheet does
125129
postingsReportAsSpreadsheet ::
126-
AmountFormat -> Maybe Text -> [Text] ->
130+
CliOpts -> AmountFormat -> Maybe Text -> [Text] ->
127131
PostingsReport -> [[Spr.Cell Spr.NumLines Text]]
128-
postingsReportAsSpreadsheet fmt baseUrl query is =
132+
postingsReportAsSpreadsheet opts fmt baseUrl query is =
129133
Spr.addHeaderBorders
130134
(map Spr.headerCell
131135
["txnidx","date","code","description","account","amount","total"])
132136
:
133-
map (postingsReportItemAsRecord fmt baseUrl query) is
137+
map (postingsReportItemAsRecord opts fmt baseUrl query) is
134138

135139
{- ToDo:
136140
link txnidx to journal URL,
137141
however, requires Web.Widget.Common.transactionFragment
138142
-}
139143
postingsReportItemAsRecord ::
140144
(Spr.Lines border) =>
141-
AmountFormat -> Maybe Text -> [Text] ->
145+
CliOpts -> AmountFormat -> Maybe Text -> [Text] ->
142146
PostingsReportItem -> [Spr.Cell border Text]
143-
postingsReportItemAsRecord fmt baseUrl query (_, _, _, p, b) =
147+
postingsReportItemAsRecord opts@CliOpts{reportspec_=rspec} fmt baseUrl query (_, _, _, p, b) =
144148
[idx,
145149
(dateCell baseUrl query (paccount p) date) {Spr.cellType = Spr.TypeDate},
146150
cell code, cell desc,
@@ -153,8 +157,10 @@ postingsReportItemAsRecord fmt baseUrl query (_, _, _, p, b) =
153157
date = postingDate p -- XXX csv should show date2 with --date2
154158
code = maybe "" tcode $ ptransaction p
155159
desc = maybe "" tdescription $ ptransaction p
156-
acct = bracket $ paccount p
160+
acct = bracket . accountNameDrop dropNum . clipAccountName depthSpec $ paccount p
157161
where
162+
depthSpec = depth_ $ _rsReportOpts rspec
163+
dropNum = fromMaybe 0 $ readMay =<< maybestringopt "drop" (rawopts_ opts)
158164
bracket = case ptype p of
159165
BalancedVirtualPosting -> wrap "[" "]"
160166
VirtualPosting -> wrap "(" ")"
@@ -199,7 +205,7 @@ postingsReportAsText opts = TB.toLazyText .
199205
postingsReportItemAsText :: CliOpts -> Int -> Int
200206
-> (PostingsReportItem, [WideBuilder], [WideBuilder])
201207
-> TB.Builder
202-
postingsReportItemAsText opts preferredamtwidth preferredbalwidth ((mdate, mperiod, mdesc, p, _), amt, bal) =
208+
postingsReportItemAsText opts@CliOpts{reportspec_=rspec} preferredamtwidth preferredbalwidth ((mdate, mperiod, mdesc, p, _), amt, bal) =
203209
table <> TB.singleton '\n'
204210
where
205211
table = renderRowB def{tableBorders=False, borderSpaces=False} . Group NoLine $ map Header
@@ -243,8 +249,10 @@ postingsReportItemAsText opts preferredamtwidth preferredbalwidth ((mdate, mperi
243249

244250
-- gather content
245251
desc = fromMaybe "" mdesc
246-
acct = parenthesise . elideAccountName awidth $ paccount p
252+
acct = parenthesise . elideAccountName awidth . dropAcct . clipAcct $ paccount p
247253
where
254+
clipAcct = clipAccountName (depth_ $ _rsReportOpts rspec)
255+
dropAcct = accountNameDrop (fromMaybe 0 $ readMay =<< maybestringopt "drop" (rawopts_ opts))
248256
(parenthesise, awidth) = case ptype p of
249257
BalancedVirtualPosting -> (wrap "[" "]", acctwidth-2)
250258
VirtualPosting -> (wrap "(" ")", acctwidth-2)

hledger/test/register/depth.test

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,22 @@ $ hledger -f - register --depth 0 --daily a b
7070
2010-01-01 ... 6 6
7171
2010-01-02 ... 3 9
7272

73+
# ** 6. --drop removes leading account name segments
74+
<
75+
2010/1/1 x
76+
assets:bank:checking 1
77+
expenses:food:groceries -1
78+
79+
$ hledger -f - register --drop 1
80+
2010-01-01 x bank:checking 1 1
81+
food:groceries -1 0
82+
83+
# ** 7. --drop and --depth together: depth clips first, then drop removes leading segments
84+
<
85+
2010/1/1 x
86+
assets:bank:checking:savings 1
87+
expenses:food:groceries:organic -1
88+
89+
$ hledger -f - register --drop 1 --depth 2
90+
2010-01-01 x bank 1 1
91+
food -1 0

0 commit comments

Comments
 (0)