@@ -7,80 +7,80 @@ import (
77 stdpath "path"
88
99 "github.com/honmaple/snow/internal/core"
10- "github.com/tdewolff/minify/v2"
11- "github.com/tdewolff/minify/v2/css"
12- "github.com/tdewolff/minify/v2/js"
1310)
1411
15- type Asset struct {
16- Files []string
17- Filters []string
18- SassCompiler string
19- Output string
20- ShowVersion bool
21- }
22-
23- func (n * Asset ) filter (name string , buf []byte ) (result []byte , err error ) {
24- switch name {
25- case "cssmin" :
26- result , err = n .cssmin (buf )
27- case "jsmin" :
28- result , err = n .jsmin (buf )
12+ type (
13+ Asset struct {
14+ Files []string
15+ Filters []Filter
16+ SassCompiler SassCompiler
17+ Output string
18+ ShowVersion bool
2919 }
30- return result , err
31- }
32-
33- func (n * Asset ) cssmin (buf []byte ) ([]byte , error ) {
34- m := minify .New ()
35- m .AddFunc ("css" , css .Minify )
20+ Filter interface {
21+ Name () string
22+ Execute ([]byte ) ([]byte , error )
23+ }
24+ )
3625
37- return m .Bytes ("css" , buf )
26+ func (n * Asset ) matchedFiles (assetsFS fs.FS ) ([]string , error ) {
27+ var results []string
28+ for _ , file := range n .Files {
29+ matchedFiles , err := fs .Glob (assetsFS , file )
30+ if err != nil {
31+ return nil , err
32+ }
33+ results = append (results , matchedFiles ... )
34+ }
35+ return results , nil
3836}
3937
40- func (n * Asset ) jsmin (buf []byte ) ([]byte , error ) {
41- m := minify .New ()
42- m .AddFunc ("js" , js .Minify )
43-
44- return m .Bytes ("js" , buf )
38+ func (n * Asset ) compileSass (assetsFS fs.FS , file string , buf []byte ) ([]byte , error ) {
39+ return n .SassCompiler .Compile (assetsFS , file , buf )
4540}
4641
4742func (n * Asset ) Execute (ctx context.Context , assetsFS fs.FS , writer core.Writer ) error {
43+ if n .hasImageFilter () {
44+ buf , err := n .executeImage (assetsFS )
45+ if err != nil {
46+ return err
47+ }
48+ return writer .WriteFile (ctx , n .Output , bytes .NewReader (buf ))
49+ }
50+
4851 var (
4952 b bytes.Buffer
5053 )
5154 // 先合并再压缩
52- for _ , file := range n .Files {
53- matchedFiles , err := fs .Glob (assetsFS , file )
55+ matchedFiles , err := n .matchedFiles (assetsFS )
56+ if err != nil {
57+ return err
58+ }
59+ for _ , matchedFile := range matchedFiles {
60+ buf , err := fs .ReadFile (assetsFS , matchedFile )
5461 if err != nil {
5562 return err
5663 }
57-
58- for _ , matchedFile := range matchedFiles {
59- buf , err := fs . ReadFile (assetsFS , matchedFile )
64+ switch stdpath . Ext ( matchedFile ) {
65+ case ".scss" , ".sass" :
66+ result , err := n . compileSass (assetsFS , matchedFile , buf )
6067 if err != nil {
6168 return err
6269 }
63- switch stdpath .Ext (matchedFile ) {
64- case ".scss" , ".sass" :
65- result , err := n .compileSass (assetsFS , matchedFile , buf )
66- if err != nil {
67- return err
68- }
69- b .Write (result )
70- b .WriteString ("\n " )
71- case ".css" :
72- b .Write (buf )
73- b .WriteString ("\n " )
74- case ".js" :
75- b .Write (buf )
76- b .WriteString ("\n ;\n " )
77- }
70+ b .Write (result )
71+ b .WriteString ("\n " )
72+ case ".css" :
73+ b .Write (buf )
74+ b .WriteString ("\n " )
75+ case ".js" :
76+ b .Write (buf )
77+ b .WriteString ("\n ;\n " )
7878 }
7979 }
8080
8181 buf := b .Bytes ()
82- for _ , name := range n .Filters {
83- result , err := n . filter ( name , buf )
82+ for _ , filter := range n .Filters {
83+ result , err := filter . Execute ( buf )
8484 if err != nil {
8585 return err
8686 }
0 commit comments