From 99189e4b51487a88c257baf861f4cd01fc89d6f8 Mon Sep 17 00:00:00 2001 From: sainw Date: Thu, 4 Jun 2026 00:10:32 +0630 Subject: [PATCH] add working dir --- build_lib.sh | 2 +- cmd/logo.png | Bin 18500 -> 0 bytes cmd/main.go | 4 ++-- img.go | 35 ++++++++++++++++++++++++----------- 4 files changed, 27 insertions(+), 14 deletions(-) delete mode 100644 cmd/logo.png diff --git a/build_lib.sh b/build_lib.sh index fc737d8..0610081 100755 --- a/build_lib.sh +++ b/build_lib.sh @@ -1,7 +1,7 @@ #!/bin/bash APP_NAME="libgofunc" -VERSION="${1:-v0.1.5}" +VERSION="${1:-v0.1.7}" OUTPUT_DIR="../assets" BUILD_DIR="../build" diff --git a/cmd/logo.png b/cmd/logo.png deleted file mode 100644 index 0568ee9203279ecf246ada2fd433ba67d833bd9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18500 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 diff --git a/cmd/main.go b/cmd/main.go index cd27e83..b151738 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -20,7 +20,7 @@ func Sum(a, b int) int { func main() { payload := `{ "sales": [ { "shiftId": "1001", "tran_seq": 1, "salePerson": "John Doe", "timeSec": "1717243200", "timeValue": "2026-06-01 14:30:00", "fpId": 3, "productId": 101, "product": "Diesel Premium", "price": "2500", "volume": "40", "amount": "100000", "discount_amount": "5000", "discount_percent": 5.0, "discount_money": 5000, "rule_types": "LOYALTY,FLEET", "promotion_status": true, "custom_promotion_status": false, "discount_volume": "2", "customerId": 5001, "customer_name": "ABC Logistics Pte Ltd", "vehicle_type": "Truck", "vehicle_type_extension": "10-Wheeler", "carNumber": "SGX1234A", "status": "COMPLETED", "receiptNumber": "RCP-20260601-0001", "receiptCount": 1, "mop": "CARD", "local_used_credit": 100.50, "local_credit_limit": 5000.00, "local_credit_balance": 4899.50, "local_debit_balance": 250.75, "loyalty_type": "GOLD", "points_balance": 12500, "reward_amount": 50.25, "reward_points": 500, "redeem_amount": 25.00, "redeem_points": 250, "redeem_exchange_rate": 0.1, "point_exchange_rate": 10.0, "used_credit": 100.50, "credit_limit": 10000.00, "credit_amount": 100.50, "credit_balance": 9899.50, "debit_amount": 50.25, "debit_balance": 449.75, "payment_customer_id": "PAYCUST001", "payment_customer_name": "ABC Logistics", "payment_customer_number": "+6591234567", "corp_id": "CORP001", "corp_name": "ABC Logistics Group", "card_number": "411111******1111", "upload": true, "upload_status": "SUCCESS", "send_sale_data_confirm": true, "loan_amount": 1000, "tax_percent": 9.0, "tax_status": true, "tier": 2, "dealNumber": "DL-20260601-001", "bank_name": "DBS", "bank_payment_type": "VISA", "session_id": "sess_abc123xyz", "tran_id": "txn_987654321", "qrcode_data": "SGQR|PAYNOW|ABCLOGISTICS", "fp_total": 8, "missed_sale_status": false, "opo_status": true, "ip_printer_status": true, "sale_type": "NORMAL" }, { "shiftId": "1001", "tran_seq": 1, "salePerson": "John Doe", "timeSec": "1717243200", "timeValue": "2026-06-01 14:30:00", "fpId": 3, "productId": 101, "product": "Diesel Premium", "price": "2500", "volume": "40", "amount": "100000", "discount_amount": "5000", "discount_percent": 5.0, "discount_money": 5000, "rule_types": "LOYALTY,FLEET", "promotion_status": true, "custom_promotion_status": false, "discount_volume": "2", "customerId": 5001, "customer_name": "ABC Logistics Pte Ltd", "vehicle_type": "Truck", "vehicle_type_extension": "10-Wheeler", "carNumber": "SGX1234A", "status": "COMPLETED", "receiptNumber": "RCP-20260601-0001", "receiptCount": 1, "mop": "CARD", "local_used_credit": 100.50, "local_credit_limit": 5000.00, "local_credit_balance": 4899.50, "local_debit_balance": 250.75, "loyalty_type": "GOLD", "points_balance": 12500, "reward_amount": 50.25, "reward_points": 500, "redeem_amount": 25.00, "redeem_points": 250, "redeem_exchange_rate": 0.1, "point_exchange_rate": 10.0, "used_credit": 100.50, "credit_limit": 10000.00, "credit_amount": 100.50, "credit_balance": 9899.50, "debit_amount": 50.25, "debit_balance": 449.75, "payment_customer_id": "PAYCUST001", "payment_customer_name": "ABC Logistics", "payment_customer_number": "+6591234567", "corp_id": "CORP001", "corp_name": "ABC Logistics Group", "card_number": "411111******1111", "upload": true, "upload_status": "SUCCESS", "send_sale_data_confirm": true, "loan_amount": 1000, "tax_percent": 9.0, "tax_status": true, "tier": 2, "dealNumber": "DL-20260601-001", "bank_name": "DBS", "bank_payment_type": "VISA", "session_id": "sess_abc123xyz", "tran_id": "txn_987654321", "qrcode_data": "SGQR|PAYNOW|ABCLOGISTICS", "fp_total": 8, "missed_sale_status": false, "opo_status": true, "ip_printer_status": true, "sale_type": "NORMAL" } ], "station": { "id": "1", "name": "Jurong Fuel Station", "address": "123 Boon Lay Way, Singapore 640123", "phones": "+65 6123 4567,+65 6987 6543", "code": "STN001", "money_divider": 100, "volume_divider": 1000, "check_tran_duration": 60, "fho_server_offline_duration": 300, "loyalty_backlog_duration": 1440, "token": "station-secret-token-123", "monthly_view": true, "pump_status": true, "currency": "SGD", "tank_manual_status": false, "update_price_type": "AUTO", "show_price_history": true, "old_receipt_status": false, "car_number_modification_status": true, "car_number_entry_status": 2, "shop_code": "SHOP001" }}` const temp = ` - +

{{.station.name}}

Address: မင်္ဂလာပါ {{(index .sales 0).salePerson}}

@@ -58,7 +58,7 @@ func main() {

စက်သုံးဆီ အရေအတွက် နှင့် အရည်အသွေးစျေးနှုန်းများ အားသံသယရှိပါက ph 09450539099, 09765421033, 09765421029 သို့တိုင်ကြား နိုင်ပါသည်။

` - result := libgofunc.GenImg(550, "./out.png", payload, temp) + result := libgofunc.GenImg(550, "./out.png", payload, temp, "./") fmt.Println("Result:", result) // PrintImg(C.CString("usb:/dev/usb/lp1"), C.CString("build/out.png")) // libgofunc.Print("int:/dev/bus/usb/001/046", "./out.png") diff --git a/img.go b/img.go index d366bb5..40689a5 100644 --- a/img.go +++ b/img.go @@ -26,6 +26,7 @@ import ( ) import ( "log" + "path" "strconv" "golang.org/x/text/language" @@ -46,11 +47,12 @@ const ( var fontFs embed.FS //export GenPNG -func GenPNG(width C.int, outputPath *C.char, payload *C.char, tmpl *C.char) *C.char { +func GenPNG(width C.int, outputPath *C.char, payload *C.char, tmpl *C.char, workingDirC *C.char) *C.char { canvasWidth := int(width) goPath := C.GoString(outputPath) goPayload := C.GoString(payload) goTmpl := C.GoString(tmpl) + workingDir := C.GoString(workingDirC) data := make(map[string]interface{}) err := json.Unmarshal([]byte(goPayload), &data) @@ -91,7 +93,10 @@ func GenPNG(width C.int, outputPath *C.char, payload *C.char, tmpl *C.char) *C.c dc.SetFontFace(*face) y := 0 - renderNode(dc, canvasWidth, body, &y, *face) + err = renderNode(dc, canvasWidth, body, &y, *face, workingDir) + if err != nil { + return NewErr(err) + } err = dc.SavePNG(goPath) if err != nil { @@ -102,8 +107,8 @@ func GenPNG(width C.int, outputPath *C.char, payload *C.char, tmpl *C.char) *C.c return NewOk(nil) } -func GenImg(width int, outputPath, payload, tmpl string) string { - result := GenPNG(C.int(width), C.CString(outputPath), C.CString(payload), C.CString(tmpl)) +func GenImg(width int, outputPath, payload, tmpl, workingDir string) string { + result := GenPNG(C.int(width), C.CString(outputPath), C.CString(payload), C.CString(tmpl), C.CString(workingDir)) r := C.GoString(result) return r } @@ -125,7 +130,7 @@ func renderTemplate(tmp string, data map[string]interface{}) (string, error) { return buf.String(), nil } -func renderNode(dc *gg.Context, canvasWidth int, n *Node, y *int, face font.Face) { +func renderNode(dc *gg.Context, canvasWidth int, n *Node, y *int, face font.Face, workingDir string) error { before := *y if n.Style.PaddingTop > 0 { *y += int(n.Style.PaddingTop) @@ -146,7 +151,9 @@ func renderNode(dc *gg.Context, canvasWidth int, n *Node, y *int, face font.Face case "hr": renderLine(dc, n, canvasWidth, y) case "img": - drawImage(dc, n, y) + if err := drawImage(dc, n, y, workingDir); err != nil { + return err + } case "table": renderTable(dc, canvasWidth, n, y, face) } @@ -156,8 +163,9 @@ func renderNode(dc *gg.Context, canvasWidth int, n *Node, y *int, face font.Face log.Printf("render %s y, y', height: %d, %d, %d\n", n.Tag, before, *y, *y-before) for _, c := range n.Children { - renderNode(dc, canvasWidth, c, y, face) + renderNode(dc, canvasWidth, c, y, face, workingDir) } + return nil } func drawTextBlock(dc *gg.Context, n *Node, canvasWidth int, size float64, y *int, face font.Face) { @@ -194,14 +202,18 @@ func wordWrap(dc *gg.Context, text string, maxWidth int) []string { return lines } -func drawImage(dc *gg.Context, n *Node, y *int) { +func drawImage(dc *gg.Context, n *Node, y *int, workingDir string) error { src := n.getSrc() - file, err := os.Open(src) + s := path.Join(workingDir, src) + file, err := os.Open(s) if err != nil { - return + return fmt.Errorf("open file src: '%s', working directory: '%s', error : %s", src, workingDir, err.Error()) } defer file.Close() - img, _, _ := image.Decode(file) + img, _, err := image.Decode(file) + if err != nil { + return err + } padding := n.Style.PaddingLeft h := n.Style.Height if n.Style.Width > 0 { @@ -224,6 +236,7 @@ func drawImage(dc *gg.Context, n *Node, y *int) { dc.DrawImage(img, int(padding), *y) *y += img.Bounds().Dy() } + return nil } func renderTable(dc *gg.Context, canvasWidth int, table *Node, y *int, face font.Face) {