aboutsummaryrefslogtreecommitdiffhomepage
path: root/vendor/github.com/tdewolff/minify/json/json.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/tdewolff/minify/json/json.go')
-rw-r--r--vendor/github.com/tdewolff/minify/json/json.go63
1 files changed, 63 insertions, 0 deletions
diff --git a/vendor/github.com/tdewolff/minify/json/json.go b/vendor/github.com/tdewolff/minify/json/json.go
new file mode 100644
index 0000000..ffe4b68
--- /dev/null
+++ b/vendor/github.com/tdewolff/minify/json/json.go
@@ -0,0 +1,63 @@
+// Package json minifies JSON following the specifications at http://json.org/.
+package json // import "github.com/tdewolff/minify/json"
+
+import (
+ "io"
+
+ "github.com/tdewolff/minify"
+ "github.com/tdewolff/parse/json"
+)
+
+var (
+ commaBytes = []byte(",")
+ colonBytes = []byte(":")
+)
+
+////////////////////////////////////////////////////////////////
+
+// DefaultMinifier is the default minifier.
+var DefaultMinifier = &Minifier{}
+
+// Minifier is a JSON minifier.
+type Minifier struct{}
+
+// Minify minifies JSON data, it reads from r and writes to w.
+func Minify(m *minify.M, w io.Writer, r io.Reader, params map[string]string) error {
+ return DefaultMinifier.Minify(m, w, r, params)
+}
+
+// Minify minifies JSON data, it reads from r and writes to w.
+func (o *Minifier) Minify(_ *minify.M, w io.Writer, r io.Reader, _ map[string]string) error {
+ skipComma := true
+
+ p := json.NewParser(r)
+ defer p.Restore()
+
+ for {
+ state := p.State()
+ gt, text := p.Next()
+ if gt == json.ErrorGrammar {
+ if p.Err() != io.EOF {
+ return p.Err()
+ }
+ return nil
+ }
+
+ if !skipComma && gt != json.EndObjectGrammar && gt != json.EndArrayGrammar {
+ if state == json.ObjectKeyState || state == json.ArrayState {
+ if _, err := w.Write(commaBytes); err != nil {
+ return err
+ }
+ } else if state == json.ObjectValueState {
+ if _, err := w.Write(colonBytes); err != nil {
+ return err
+ }
+ }
+ }
+ skipComma = gt == json.StartObjectGrammar || gt == json.StartArrayGrammar
+
+ if _, err := w.Write(text); err != nil {
+ return err
+ }
+ }
+}