shithub: hugo

Download patch

ref: 3dafe206e31bb92f27802a04bf9159cbc20af234
parent: 37d6463479952f7dfba59d899eed38b41e223283
author: James Kiefer <[email protected]>
date: Wed Sep 12 07:33:14 EDT 2018

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.

--- a/minifiers/minifiers.go
+++ b/minifiers/minifiers.go
@@ -74,6 +74,7 @@
 	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)
--- a/minifiers/minifiers_test.go
+++ b/minifiers/minifiers_test.go
@@ -28,14 +28,46 @@
 	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
 
-	// 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())
+		assert.NoError(m.Minify(test.tp, &b, strings.NewReader(test.rawString)))
+		assert.Equal(test.expectedMinString, b.String())
+	}
+
 }