minifiers: Make JSON minification more generic
authorJames Kiefer <zinefer@gmail.com>
Wed, 12 Sep 2018 17:33:14 +0000 (11:33 -0600)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 12 Sep 2018 17:33:14 +0000 (19:33 +0200)
Add a regex matcher for json types. Specifically support LD+JSON which
allows for google seo minification out of the box. Expanded JS/JSON
minification testing.

minifiers/minifiers.go
minifiers/minifiers_test.go

index 073898815fcc90dbecf9efe2f7b6201ca16e72e0..07eec34ce5d874f640cfb05d1f2efe90da74ead6 100644 (file)
@@ -74,6 +74,7 @@ func New(mediaTypes media.Types, outputFormats output.Formats) Client {
        addMinifierFunc(m, mediaTypes, "css", css.Minify)
        addMinifierFunc(m, mediaTypes, "js", js.Minify)
        m.AddFuncRegexp(regexp.MustCompile("^(application|text)/(x-)?(java|ecma)script$"), js.Minify)
+       m.AddFuncRegexp(regexp.MustCompile("^(application|text)/(x-|ld\\+)?json$"), json.Minify)
        addMinifierFunc(m, mediaTypes, "json", json.Minify)
        addMinifierFunc(m, mediaTypes, "svg", svg.Minify)
        addMinifierFunc(m, mediaTypes, "xml", xml.Minify)
index a0f0f97b4045f4ebc0d393dec6776837afaca5af..6500aa2c23e9d1eb238737d86b90ea07c1471c89 100644 (file)
@@ -28,14 +28,46 @@ func TestNew(t *testing.T) {
        assert := require.New(t)
        m := New(media.DefaultTypes, output.DefaultFormats)
 
-       var b bytes.Buffer
+       var rawJS string
+       var minJS string
+       rawJS = " var  foo =1 ;   foo ++  ;  "
+       minJS = "var foo=1;foo++;"
 
-       assert.NoError(m.Minify(media.CSSType, &b, strings.NewReader("body { color: blue; }")))
-       assert.Equal("body{color:blue}", b.String())
+       var rawJSON string
+       var minJSON string
+       rawJSON = "  { \"a\" : 123 , \"b\":2,  \"c\": 5 } "
+       minJSON = "{\"a\":123,\"b\":2,\"c\":5}"
 
-       b.Reset()
+       for _, test := range []struct {
+               tp                media.Type
+               rawString         string
+               expectedMinString string
+       }{
+               {media.CSSType, " body { color: blue; }  ", "body{color:blue}"},
+               {media.RSSType, " <hello>  Hugo!   </hello>  ", "<hello>Hugo!</hello>"}, // RSS should be handled as XML
+               {media.JSONType, rawJSON, minJSON},
+               {media.JavascriptType, rawJS, minJS},
+               // JS Regex minifiers
+               {media.Type{MainType: "application", SubType: "ecmascript"}, rawJS, minJS},
+               {media.Type{MainType: "application", SubType: "javascript"}, rawJS, minJS},
+               {media.Type{MainType: "application", SubType: "x-javascript"}, rawJS, minJS},
+               {media.Type{MainType: "application", SubType: "x-ecmascript"}, rawJS, minJS},
+               {media.Type{MainType: "text", SubType: "ecmascript"}, rawJS, minJS},
+               {media.Type{MainType: "text", SubType: "javascript"}, rawJS, minJS},
+               {media.Type{MainType: "text", SubType: "x-javascript"}, rawJS, minJS},
+               {media.Type{MainType: "text", SubType: "x-ecmascript"}, rawJS, minJS},
+               // JSON Regex minifiers
+               {media.Type{MainType: "application", SubType: "json"}, rawJSON, minJSON},
+               {media.Type{MainType: "application", SubType: "x-json"}, rawJSON, minJSON},
+               {media.Type{MainType: "application", SubType: "ld+json"}, rawJSON, minJSON},
+               {media.Type{MainType: "text", SubType: "json"}, rawJSON, minJSON},
+               {media.Type{MainType: "text", SubType: "x-json"}, rawJSON, minJSON},
+               {media.Type{MainType: "text", SubType: "ld+json"}, rawJSON, minJSON},
+       } {
+               var b bytes.Buffer
+
+               assert.NoError(m.Minify(test.tp, &b, strings.NewReader(test.rawString)))
+               assert.Equal(test.expectedMinString, b.String())
+       }
 
-       // RSS should be handled as XML
-       assert.NoError(m.Minify(media.RSSType, &b, strings.NewReader("<hello>  Hugo!   </hello>  ")))
-       assert.Equal("<hello>Hugo!</hello>", b.String())
 }