github.com/kotovmak/go-admin@v1.1.1/adm/minify.go (about) 1 package main 2 3 import ( 4 "bytes" 5 "crypto/md5" 6 "encoding/hex" 7 "fmt" 8 "io/ioutil" 9 "log" 10 "os" 11 "path" 12 "path/filepath" 13 "sort" 14 "strings" 15 16 "github.com/tdewolff/minify/v2" 17 "github.com/tdewolff/minify/v2/css" 18 "github.com/tdewolff/minify/v2/js" 19 ) 20 21 func cssMinifier(inputDir, outputFile string, hash bool) { 22 err := removeOutputFile(outputFile) 23 if err != nil { 24 log.Panicln("removeOutputFileError", err) 25 } 26 27 files, err := getInputFiles(inputDir) 28 if err != nil { 29 log.Panicln("getInputFilesError", err) 30 } 31 32 notMinifiedString, err := combineFiles(files, inputDir) 33 if err != nil { 34 log.Panicln("combineFilesError", err) 35 } 36 37 minifiedString, err := makeMini(notMinifiedString, "text/css") 38 if err != nil { 39 log.Panicln("doTheMinifyingError", err) 40 } 41 42 if hash && filepath.Ext(outputFile) == ".css" { 43 m5 := md5.New() 44 _, err := m5.Write([]byte(minifiedString)) 45 if err != nil { 46 log.Panicln("combineFilesError", err) 47 } 48 m5res := hex.EncodeToString(m5.Sum(nil)) 49 outputFile = strings.ReplaceAll(outputFile, ".css", "."+m5res[len(m5res)-10:]+".css") 50 } 51 52 err = writeOutputFile(minifiedString, outputFile) 53 if err != nil { 54 log.Panicln("writeOutputFileError", err) 55 } 56 } 57 58 func jsMinifier(inputDir, outputFile string, hash bool) { 59 err := removeOutputFile(outputFile) 60 if err != nil { 61 log.Panicln("removeOutputFileError", err) 62 } 63 64 files, err := getInputFiles(inputDir) 65 if err != nil { 66 log.Panicln("getInputFilesError", err) 67 } 68 69 var b bytes.Buffer 70 71 for _, name := range files { 72 73 if path.Ext(name) != ".js" { 74 continue 75 } 76 77 filePath := inputDir + name 78 fileTxt, err := ioutil.ReadFile(filePath) 79 if err != nil { 80 checkError(err) 81 } 82 83 fmt.Println("file path", filePath) 84 85 m := minify.New() 86 m.AddFunc("text/javascript", js.Minify) 87 88 minifiedString, err := m.Bytes("text/javascript", fileTxt) 89 if err != nil { 90 checkError(err) 91 } 92 93 _, err = b.Write(minifiedString) 94 if err != nil { 95 checkError(err) 96 } 97 } 98 99 if hash && filepath.Ext(outputFile) == ".js" { 100 m5 := md5.New() 101 _, err := m5.Write(b.Bytes()) 102 if err != nil { 103 checkError(err) 104 } 105 m5res := hex.EncodeToString(m5.Sum(nil)) 106 outputFile = strings.ReplaceAll(outputFile, ".js", "."+m5res[len(m5res)-10:]+".js") 107 } 108 109 err = writeOutputFile(b.String(), outputFile) 110 if err != nil { 111 checkError(err) 112 } 113 } 114 115 func removeOutputFile(outputFile string) error { 116 if _, err := os.Stat(outputFile); err == nil { 117 118 if err := os.Remove(outputFile); err != nil { 119 return err 120 } 121 122 return nil 123 } 124 125 return nil 126 } 127 128 func getInputFiles(inputDir string) ([]string, error) { 129 filenames := make([]string, 0, 1) 130 131 files, err := ioutil.ReadDir(inputDir) 132 if err != nil { 133 log.Panicln("readInputDirError", err) 134 return filenames, err 135 } 136 137 for _, f := range files { 138 if f.IsDir() { 139 continue 140 } 141 142 filenames = append(filenames, f.Name()) 143 } 144 145 sort.Strings(filenames) 146 147 return filenames, nil 148 } 149 150 func combineFiles(filenames []string, inputDir string) (string, error) { 151 var b bytes.Buffer 152 153 for _, name := range filenames { 154 155 if path.Ext(name) != ".css" { 156 continue 157 } 158 159 filePath := inputDir + name 160 fileTxt, err := ioutil.ReadFile(filePath) 161 if err != nil { 162 return "", err 163 } 164 165 fmt.Println("file path", filePath) 166 167 _, err = b.Write(fileTxt) 168 if err != nil { 169 return "", nil 170 } 171 } 172 173 combinedFiles := b.String() 174 175 return combinedFiles, nil 176 } 177 178 func makeMini(notMinifiedString, fileType string) (string, error) { 179 m := minify.New() 180 m.AddFunc("text/css", css.Minify) 181 m.AddFunc("text/javascript", js.Minify) 182 183 minifiedString, err := m.String(fileType, notMinifiedString) 184 if err != nil { 185 return "", err 186 } 187 188 return minifiedString, nil 189 } 190 191 func writeOutputFile(outputText, outputFile string) error { 192 err := ioutil.WriteFile(outputFile, []byte(outputText), 0644) 193 if err != nil { 194 return err 195 } 196 197 return nil 198 }