From 3dafe206e31bb92f27802a04bf9159cbc20af234 Mon Sep 17 00:00:00 2001 From: James Kiefer Date: Wed, 12 Sep 2018 11:33:14 -0600 Subject: [PATCH] minifiers: Make JSON minification more generic 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 | 1 + minifiers/minifiers_test.go | 46 +++++++++++++++++++++++++++++++------ 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/minifiers/minifiers.go b/minifiers/minifiers.go index 07389881..07eec34c 100644 --- a/minifiers/minifiers.go +++ b/minifiers/minifiers.go @@ -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) diff --git a/minifiers/minifiers_test.go b/minifiers/minifiers_test.go index a0f0f97b..6500aa2c 100644 --- a/minifiers/minifiers_test.go +++ b/minifiers/minifiers_test.go @@ -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, " Hugo! ", "Hugo!"}, // 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(" Hugo! "))) - assert.Equal("Hugo!", b.String()) } -- 2.30.2