diff --git a/hledger-lib/Hledger/Write/Spreadsheet.hs b/hledger-lib/Hledger/Write/Spreadsheet.hs index 392abd493..4aa3a5018 100644 --- a/hledger-lib/Hledger/Write/Spreadsheet.hs +++ b/hledger-lib/Hledger/Write/Spreadsheet.hs @@ -19,6 +19,7 @@ module Hledger.Write.Spreadsheet ( transposeCell, transpose, horizontalSpan, + addHeaderBorders, addRowSpanHeader, rawTableContent, ) where @@ -172,6 +173,10 @@ transpose :: [[Cell border text]] -> [[Cell border text]] transpose = List.transpose . map (map transposeCell) +addHeaderBorders :: [Cell () text] -> [Cell NumLines text] +addHeaderBorders = + map (\c -> c {cellBorder = noBorder {borderBottom = DoubleLine}}) + horizontalSpan :: (Lines border, Monoid text) => [a] -> Cell border text -> [Cell border text] diff --git a/hledger/Hledger/Cli/Commands/Balance.hs b/hledger/Hledger/Cli/Commands/Balance.hs index 7e746f950..41814a455 100644 --- a/hledger/Hledger/Cli/Commands/Balance.hs +++ b/hledger/Hledger/Cli/Commands/Balance.hs @@ -308,7 +308,7 @@ import Hledger.Cli.Utils import Hledger.Write.Csv (CSV, printCSV, printTSV) import Hledger.Write.Ods (printFods) import Hledger.Write.Html.Lucid (printHtml) -import Hledger.Write.Spreadsheet (rawTableContent, addRowSpanHeader, headerCell) +import Hledger.Write.Spreadsheet (rawTableContent, addHeaderBorders, addRowSpanHeader, headerCell) import qualified Hledger.Write.Spreadsheet as Ods @@ -641,11 +641,6 @@ headerDateSpanCell base query spn = Ods.cellAnchor = composeAnchor base $ replaceDate prd query } -addHeaderBorders :: [Ods.Cell () text] -> [Ods.Cell Ods.NumLines text] -addHeaderBorders = - map (\c -> c {Ods.cellBorder = - Ods.noBorder {Ods.borderBottom = Ods.DoubleLine}}) - simpleDateSpanCell :: DateSpan -> Ods.Cell Ods.NumLines Text simpleDateSpanCell = Ods.defaultCell . showDateSpan diff --git a/hledger/Hledger/Cli/Commands/Register.hs b/hledger/Hledger/Cli/Commands/Register.hs index 84d1ab9e4..0f89bc45e 100644 --- a/hledger/Hledger/Cli/Commands/Register.hs +++ b/hledger/Hledger/Cli/Commands/Register.hs @@ -20,6 +20,7 @@ module Hledger.Cli.Commands.Register ( import Data.Default (def) import Data.Maybe (fromMaybe, isJust) +import qualified Data.Map as Map import qualified Data.Text as T import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy.IO as TL @@ -27,14 +28,19 @@ import qualified Data.Text.Lazy.Builder as TB import System.Console.CmdArgs.Explicit (flagNone, flagReq) import Hledger hiding (per) -import Hledger.Write.Csv (CSV, CsvRecord, printCSV, printTSV) +import Hledger.Write.Csv (CSV, printCSV, printTSV) +import Hledger.Write.Ods (printFods) +import Hledger.Write.Html.Lucid (printHtml) +import qualified Hledger.Write.Spreadsheet as Spr import Hledger.Cli.CliOptions import Hledger.Cli.Utils -import Text.Tabular.AsciiWide hiding (render) +import Text.Tabular.AsciiWide (Cell(..), Align(..), Properties(..), Header(Header, Group), renderRowB, textCell, tableBorders, borderSpaces) +import qualified Lucid import Data.List (sortBy) import Data.Char (toUpper) import Data.List.Extra (intersect) import System.Exit (exitFailure) +import qualified System.IO as IO registermode = hledgerCommandMode $(embedFileRelative "Hledger/Cli/Commands/Register.txt") @@ -90,21 +96,38 @@ register opts@CliOpts{rawopts_=rawopts, reportspec_=rspec} j styles = journalCommodityStylesWith HardRounding j rpt = postingsReport rspec j render | fmt=="txt" = postingsReportAsText opts + | fmt=="json" = toJsonText | fmt=="csv" = printCSV . postingsReportAsCsv | fmt=="tsv" = printTSV . postingsReportAsCsv - | fmt=="json" = toJsonText + | fmt=="html" = + (<>"\n") . Lucid.renderText . printHtml . + map (map (fmap Lucid.toHtml)) . postingsReportAsSpreadsheet + | fmt=="fods" = + printFods IO.localeEncoding . Map.singleton "Register" . + (,) (Just 1, Nothing) . postingsReportAsSpreadsheet | otherwise = error' $ unsupportedOutputFormatError fmt -- PARTIAL: where fmt = outputFormatFromOpts opts postingsReportAsCsv :: PostingsReport -> CSV -postingsReportAsCsv is = - ["txnidx","date","code","description","account","amount","total"] - : - map postingsReportItemAsCsvRecord is +postingsReportAsCsv = Spr.rawTableContent . postingsReportAsSpreadsheet -postingsReportItemAsCsvRecord :: PostingsReportItem -> CsvRecord -postingsReportItemAsCsvRecord (_, _, _, p, b) = [idx,date,code,desc,acct,amt,bal] +postingsReportAsSpreadsheet :: + PostingsReport -> [[Spr.Cell Spr.NumLines T.Text]] +postingsReportAsSpreadsheet is = + Spr.addHeaderBorders + (map Spr.headerCell + ["txnidx","date","code","description","account","amount","total"]) + : + map postingsReportItemAsRecord is + +postingsReportItemAsRecord :: + (Spr.Lines border) => PostingsReportItem -> [Spr.Cell border T.Text] +postingsReportItemAsRecord (_, _, _, p, b) = + [cell idx, + (cell date) {Spr.cellType = Spr.TypeDate}, + cell code, cell desc, cell acct, cell amt, cell bal] where + cell = Spr.defaultCell idx = T.pack . show . maybe 0 tindex $ ptransaction p date = showDate $ postingDate p -- XXX csv should show date2 with --date2 code = maybe "" tcode $ ptransaction p