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  }