config.go (3011B)
1 // Copyright 2019 The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package minifiers 15 16 import ( 17 "github.com/gohugoio/hugo/common/maps" 18 "github.com/gohugoio/hugo/config" 19 "github.com/gohugoio/hugo/docshelper" 20 "github.com/gohugoio/hugo/parser" 21 "github.com/spf13/cast" 22 23 "github.com/mitchellh/mapstructure" 24 "github.com/tdewolff/minify/v2/css" 25 "github.com/tdewolff/minify/v2/html" 26 "github.com/tdewolff/minify/v2/js" 27 "github.com/tdewolff/minify/v2/json" 28 "github.com/tdewolff/minify/v2/svg" 29 "github.com/tdewolff/minify/v2/xml" 30 ) 31 32 var defaultTdewolffConfig = tdewolffConfig{ 33 HTML: html.Minifier{ 34 KeepDocumentTags: true, 35 KeepConditionalComments: true, 36 KeepEndTags: true, 37 KeepDefaultAttrVals: true, 38 KeepWhitespace: false, 39 }, 40 CSS: css.Minifier{ 41 Precision: 0, 42 KeepCSS2: true, 43 }, 44 JS: js.Minifier{}, 45 JSON: json.Minifier{}, 46 SVG: svg.Minifier{ 47 KeepComments: false, 48 Precision: 0, 49 }, 50 XML: xml.Minifier{ 51 KeepWhitespace: false, 52 }, 53 } 54 55 type tdewolffConfig struct { 56 HTML html.Minifier 57 CSS css.Minifier 58 JS js.Minifier 59 JSON json.Minifier 60 SVG svg.Minifier 61 XML xml.Minifier 62 } 63 64 type minifyConfig struct { 65 // Whether to minify the published output (the HTML written to /public). 66 MinifyOutput bool 67 68 DisableHTML bool 69 DisableCSS bool 70 DisableJS bool 71 DisableJSON bool 72 DisableSVG bool 73 DisableXML bool 74 75 Tdewolff tdewolffConfig 76 } 77 78 var defaultConfig = minifyConfig{ 79 Tdewolff: defaultTdewolffConfig, 80 } 81 82 func decodeConfig(cfg config.Provider) (conf minifyConfig, err error) { 83 conf = defaultConfig 84 85 // May be set by CLI. 86 conf.MinifyOutput = cfg.GetBool("minifyOutput") 87 88 v := cfg.Get("minify") 89 if v == nil { 90 return 91 } 92 93 // Legacy. 94 if b, ok := v.(bool); ok { 95 conf.MinifyOutput = b 96 return 97 } 98 99 m := maps.ToStringMap(v) 100 101 // Handle upstream renames. 102 if td, found := m["tdewolff"]; found { 103 tdm := maps.ToStringMap(td) 104 for _, key := range []string{"css", "svg"} { 105 if v, found := tdm[key]; found { 106 vm := maps.ToStringMap(v) 107 if vv, found := vm["decimal"]; found { 108 vvi := cast.ToInt(vv) 109 if vvi > 0 { 110 vm["precision"] = vvi 111 } 112 } 113 } 114 } 115 } 116 117 err = mapstructure.WeakDecode(m, &conf) 118 119 if err != nil { 120 return 121 } 122 123 return 124 } 125 126 func init() { 127 docsProvider := func() docshelper.DocProvider { 128 return docshelper.DocProvider{"config": map[string]any{"minify": parser.LowerCaseCamelJSONMarshaller{Value: defaultConfig}}} 129 } 130 docshelper.AddDocProviderFunc(docsProvider) 131 }