From 6fa452b123f5be7f470c4fa52f02d2b1896cbf5b Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 31 Jul 2025 10:43:50 +1000 Subject: [PATCH] feat: add csvToTable function --- examples/hledger_monthly.md | 6 +++--- render.go | 27 ++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/examples/hledger_monthly.md b/examples/hledger_monthly.md index 1e4ebd5..5c3181a 100644 --- a/examples/hledger_monthly.md +++ b/examples/hledger_monthly.md @@ -34,12 +34,12 @@ params: ### Expense Summary by Category -{{ shell "hledger -f $f bal expenses -b $b -e $e --depth 3 --sort amount --budget" }} +{{ raw "hledger -f $f bal expenses -b $b -e $e --depth 3 --sort amount --budget -O csv" | csvToTable }} ## Net Income: -{{shell "hledger -f $f income -b $b -e $e --monthly"}} +{{ raw "hledger -f $f income -b $b -e $e --monthly -O csv" | csvToTable }} ## Ending balance: -{{shell "hledger -f $f balancesheet -e $e"}} +{{ raw "hledger -f $f balancesheet -e $e -O csv " | csvToTable }} diff --git a/render.go b/render.go index 85c82be..9d610c0 100644 --- a/render.go +++ b/render.go @@ -2,9 +2,11 @@ package main import ( "bytes" + "encoding/csv" "fmt" "io" "os" + "strings" "text/template" ) @@ -22,12 +24,31 @@ func (ctx TemplateContext) render(tmpl string, output io.Writer) error { func (ctx TemplateContext) funcMap() template.FuncMap { return template.FuncMap{ - "sh": ctx.inline, - "shell": ctx.codeBlock, - "raw": ctx.raw, + "sh": ctx.inline, + "shell": ctx.codeBlock, + "raw": ctx.raw, + "csvToTable": csvToTable, } } +func csvToTable(input string) string { + r := csv.NewReader(strings.NewReader(input)) + records, err := r.ReadAll() + if err != nil { + return fmt.Sprintf("> Failed to parse CSV: %s\n> Input: %s\n", err.Error(), input) + } + result := "" + if len(records) == 0 { + return fmt.Sprintf("Error: records is empty: %s\n", input) + } + result += "| " + strings.Join(records[0], " | ") + " |\n" + result += "|" + strings.Repeat(" --- |", len(records[0])) + "\n" + for _, row := range records[1:] { + result += "| " + strings.Join(row, " | ") + " |\n" + } + return result +} + func (ctx TemplateContext) OutputFile(meta TemplateMeta) (output io.WriteCloser, err error) { if meta.Output == "" { return os.Stdout, nil