From ab9ccdae54352a0390f1a6d6d395a1bd428cd697 Mon Sep 17 00:00:00 2001 From: KITAGAWA Yasutaka Date: Thu, 12 Oct 2023 18:55:48 +0900 Subject: [PATCH] Prevent html escaping (#6) Signed-off-by: KITAGAWA Yasutaka --- jp.go | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/jp.go b/jp.go index e60e7b8..c17ce30 100644 --- a/jp.go +++ b/jp.go @@ -1,6 +1,7 @@ package main import ( + "bytes" "encoding/json" "fmt" "io" @@ -143,12 +144,11 @@ func runMain(c *cli.Context) int { if c.Bool("unquoted") && isString { os.Stdout.WriteString(converted) } else { - var toJSON []byte - if c.Bool("compact") { - toJSON, err = json.Marshal(result) - } else { - toJSON, err = json.MarshalIndent(result, "", " ") + enc := newEncorder() + if !c.Bool("compact") { + enc.SetIndent("", " ") } + toJSON, err := enc.marshal(result) if err != nil { errMsg("Error marshalling result to JSON: %s\n", err) return 3 @@ -196,3 +196,27 @@ func enableColor(enabled bool) { jsoncolor.DefaultTrueColor.DisableColor() } } + +type encoder struct { + *json.Encoder + buf *bytes.Buffer +} + +func newEncorder() *encoder { + buf := &bytes.Buffer{} + e := &encoder{Encoder: json.NewEncoder(buf), buf: buf} + e.SetEscapeHTML(false) + return e +} + +func (e *encoder) marshal(t interface{}) ([]byte, error) { + // Encode() always append a newline. + err := e.Encode(t) + if err != nil { + return nil, err + } + + // Trim the newline appended by Encode(). + b := bytes.TrimSuffix(e.buf.Bytes(), []byte("\n")) + return append([]byte(nil), b...), nil +}