Skip to content

Commit b358980

Browse files
committed
fix kitty config format
1 parent fc7799c commit b358980

4 files changed

Lines changed: 56 additions & 14 deletions

File tree

internal/config/config.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package config
22

33
import (
4-
"encoding/json"
54
"fmt"
65
"os"
76
"path/filepath"
87

98
"github.com/ImSingee/go-ex/ee"
109
"github.com/ImSingee/go-ex/exjson"
1110
"github.com/ysmood/gson"
11+
12+
"github.com/ImSingee/kitty/internal/lib/jsonfmt"
1213
)
1314

1415
var ConfigFileNames = []string{
@@ -100,7 +101,12 @@ func PatchKittyConfig(dir string, patch func(map[string]gson.JSON) (save bool, e
100101
}
101102

102103
func saveKittyConfig(filename string, c map[string]gson.JSON) error {
103-
data, err := json.MarshalIndent(c, "", " ")
104+
raw := make(map[string]any, len(c))
105+
for key, value := range c {
106+
raw[key] = value.Val()
107+
}
108+
109+
data, err := jsonfmt.Marshal(raw, " ")
104110
if err != nil {
105111
return ee.Wrap(err, "cannot json encode config")
106112
}

internal/ext/format/json.go

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package format
22

33
import (
4-
"bytes"
54
"encoding/json"
65

76
"github.com/ImSingee/go-ex/ee"
7+
8+
"github.com/ImSingee/kitty/internal/lib/jsonfmt"
89
)
910

1011
type JsonFormatter struct {
@@ -18,17 +19,7 @@ func (f *JsonFormatter) Format(filename string, content []byte) ([]byte, error)
1819
return nil, ee.New("invalid json")
1920
}
2021

21-
var buf bytes.Buffer
22-
encoder := json.NewEncoder(&buf)
23-
encoder.SetEscapeHTML(false)
24-
encoder.SetIndent("", f.Indent)
25-
26-
err = encoder.Encode(v)
27-
if err != nil {
28-
return nil, err
29-
}
30-
31-
return bytes.TrimSuffix(buf.Bytes(), []byte("\n")), nil
22+
return jsonfmt.Marshal(v, f.Indent)
3223
}
3324

3425
func (o *options) jsonFormatter() *JsonFormatter {

internal/lib/jsonfmt/json.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package jsonfmt
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
)
7+
8+
func Marshal(v any, indent string) ([]byte, error) {
9+
var buf bytes.Buffer
10+
encoder := json.NewEncoder(&buf)
11+
encoder.SetEscapeHTML(false)
12+
encoder.SetIndent("", indent)
13+
14+
err := encoder.Encode(v)
15+
if err != nil {
16+
return nil, err
17+
}
18+
19+
return bytes.TrimSuffix(buf.Bytes(), []byte("\n")), nil
20+
}

internal/lib/jsonfmt/json_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package jsonfmt
2+
3+
import (
4+
"strings"
5+
"testing"
6+
)
7+
8+
func TestMarshalDoesNotEscapeHTML(t *testing.T) {
9+
data, err := Marshal(map[string]any{
10+
"html": "<div>&</div>",
11+
}, " ")
12+
if err != nil {
13+
t.Fatalf("Marshal returned error: %v", err)
14+
}
15+
16+
got := string(data)
17+
if strings.Contains(got, "\\u003c") || strings.Contains(got, "\\u003e") || strings.Contains(got, "\\u0026") {
18+
t.Fatalf("Marshal escaped html-sensitive characters: %s", got)
19+
}
20+
21+
want := "{\n \"html\": \"<div>&</div>\"\n}"
22+
if got != want {
23+
t.Fatalf("unexpected formatted json:\nwant:\n%s\ngot:\n%s", want, got)
24+
}
25+
}

0 commit comments

Comments
 (0)