77 "strings"
88)
99
10+ // compare dir func
11+
1012type fnCompareDir func (i , j os.FileInfo ) (less , ok bool )
1113
1214var cmpDirFirst fnCompareDir = func (prev , next os.FileInfo ) (less , ok bool ) {
@@ -31,21 +33,14 @@ var cmpDirMixed fnCompareDir = func(prev, next os.FileInfo) (less, ok bool) {
3133 return true , false
3234}
3335
36+ // sort name asc
37+
3438type sortNameAscInfos struct {
3539 infos []os.FileInfo
3640 names [][]byte
3741 compareDir fnCompareDir
3842}
3943
40- func newSortNameAscInfos (infos []os.FileInfo , compareDir fnCompareDir ) sortNameAscInfos {
41- names := make ([][]byte , len (infos ))
42- for i := range infos {
43- names [i ] = []byte (infos [i ].Name ())
44- }
45-
46- return sortNameAscInfos {infos , names , compareDir }
47- }
48-
4944func (sInfos sortNameAscInfos ) Len () int {
5045 return len (sInfos .names )
5146}
@@ -69,12 +64,24 @@ func (sInfos sortNameAscInfos) Swap(i, j int) {
6964 sInfos .names [i ], sInfos .names [j ] = sInfos .names [j ], sInfos .names [i ]
7065}
7166
72- type sortNameDescInfos struct {
73- sortNameAscInfos
67+ func newSortNameAscInfos (infos []os.FileInfo , compareDir fnCompareDir ) sortNameAscInfos {
68+ names := make ([][]byte , len (infos ))
69+ for i := range infos {
70+ names [i ] = []byte (infos [i ].Name ())
71+ }
72+
73+ return sortNameAscInfos {infos , names , compareDir }
7474}
7575
76- func newSortNameDescInfos (infos []os.FileInfo , compareDir fnCompareDir ) sortNameDescInfos {
77- return sortNameDescInfos {newSortNameAscInfos (infos , compareDir )}
76+ func sortInfoNamesAsc (infos []os.FileInfo , compareDir fnCompareDir ) {
77+ nameCachedInfos := newSortNameAscInfos (infos , compareDir )
78+ sort .Sort (nameCachedInfos )
79+ }
80+
81+ // sort name desc
82+
83+ type sortNameDescInfos struct {
84+ sortNameAscInfos
7885}
7986
8087func (sInfos sortNameDescInfos ) Less (i , j int ) bool {
@@ -91,28 +98,29 @@ func (sInfos sortNameDescInfos) Less(i, j int) bool {
9198 return j < i
9299}
93100
94- func sortSubItemNamesAsc (subInfos []os.FileInfo , compareDir fnCompareDir ) {
95- nameCachedSubInfos := newSortNameAscInfos (subInfos , compareDir )
96- sort .Sort (nameCachedSubInfos )
101+ func newSortNameDescInfos (infos []os.FileInfo , compareDir fnCompareDir ) sortNameDescInfos {
102+ return sortNameDescInfos {newSortNameAscInfos (infos , compareDir )}
97103}
98104
99- func sortSubItemNamesDesc ( subInfos []os.FileInfo , compareDir fnCompareDir ) {
100- nameCachedSubInfos := newSortNameDescInfos (subInfos , compareDir )
101- sort .Sort (nameCachedSubInfos )
105+ func sortInfoNamesDesc ( infos []os.FileInfo , compareDir fnCompareDir ) {
106+ nameCachedInfos := newSortNameDescInfos (infos , compareDir )
107+ sort .Sort (nameCachedInfos )
102108}
103109
104- func sortSubItemSizesAsc (subInfos []os.FileInfo , compareDir fnCompareDir ) {
105- sort .Slice (subInfos , func (i , j int ) bool {
106- less , ok := compareDir (subInfos [i ], subInfos [j ])
110+ // sort size asc
111+
112+ func sortInfoSizesAsc (infos []os.FileInfo , compareDir fnCompareDir ) {
113+ sort .Slice (infos , func (i , j int ) bool {
114+ less , ok := compareDir (infos [i ], infos [j ])
107115 if ok {
108116 return less
109117 }
110118
111- if subInfos [i ].Size () != subInfos [j ].Size () {
112- return subInfos [i ].Size () < subInfos [j ].Size ()
119+ if infos [i ].Size () != infos [j ].Size () {
120+ return infos [i ].Size () < infos [j ].Size ()
113121 }
114122
115- cmpResult := strings .Compare (subInfos [i ].Name (), subInfos [j ].Name ())
123+ cmpResult := strings .Compare (infos [i ].Name (), infos [j ].Name ())
116124 if cmpResult != 0 {
117125 return cmpResult < 0
118126 }
@@ -121,18 +129,20 @@ func sortSubItemSizesAsc(subInfos []os.FileInfo, compareDir fnCompareDir) {
121129 })
122130}
123131
124- func sortSubItemSizesDesc (subInfos []os.FileInfo , compareDir fnCompareDir ) {
125- sort .Slice (subInfos , func (i , j int ) bool {
126- less , ok := compareDir (subInfos [i ], subInfos [j ])
132+ // sort size desc
133+
134+ func sortInfoSizesDesc (infos []os.FileInfo , compareDir fnCompareDir ) {
135+ sort .Slice (infos , func (i , j int ) bool {
136+ less , ok := compareDir (infos [i ], infos [j ])
127137 if ok {
128138 return less
129139 }
130140
131- if subInfos [j ].Size () != subInfos [i ].Size () {
132- return subInfos [j ].Size () < subInfos [i ].Size ()
141+ if infos [j ].Size () != infos [i ].Size () {
142+ return infos [j ].Size () < infos [i ].Size ()
133143 }
134144
135- cmpResult := strings .Compare (subInfos [j ].Name (), subInfos [i ].Name ())
145+ cmpResult := strings .Compare (infos [j ].Name (), infos [i ].Name ())
136146 if cmpResult != 0 {
137147 return cmpResult < 0
138148 }
@@ -141,18 +151,20 @@ func sortSubItemSizesDesc(subInfos []os.FileInfo, compareDir fnCompareDir) {
141151 })
142152}
143153
144- func sortSubItemTimesAsc (subInfos []os.FileInfo , compareDir fnCompareDir ) {
145- sort .Slice (subInfos , func (i , j int ) bool {
146- less , ok := compareDir (subInfos [i ], subInfos [j ])
154+ // sort time asc
155+
156+ func sortInfoTimesAsc (infos []os.FileInfo , compareDir fnCompareDir ) {
157+ sort .Slice (infos , func (i , j int ) bool {
158+ less , ok := compareDir (infos [i ], infos [j ])
147159 if ok {
148160 return less
149161 }
150162
151- if ! subInfos [i ].ModTime ().Equal (subInfos [j ].ModTime ()) {
152- return subInfos [i ].ModTime ().Before (subInfos [j ].ModTime ())
163+ if ! infos [i ].ModTime ().Equal (infos [j ].ModTime ()) {
164+ return infos [i ].ModTime ().Before (infos [j ].ModTime ())
153165 }
154166
155- cmpResult := strings .Compare (subInfos [i ].Name (), subInfos [j ].Name ())
167+ cmpResult := strings .Compare (infos [i ].Name (), infos [j ].Name ())
156168 if cmpResult != 0 {
157169 return cmpResult < 0
158170 }
@@ -161,18 +173,20 @@ func sortSubItemTimesAsc(subInfos []os.FileInfo, compareDir fnCompareDir) {
161173 })
162174}
163175
164- func sortSubItemTimesDesc (subInfos []os.FileInfo , compareDir fnCompareDir ) {
165- sort .Slice (subInfos , func (i , j int ) bool {
166- less , ok := compareDir (subInfos [i ], subInfos [j ])
176+ // sort time desc
177+
178+ func sortInfoTimesDesc (infos []os.FileInfo , compareDir fnCompareDir ) {
179+ sort .Slice (infos , func (i , j int ) bool {
180+ less , ok := compareDir (infos [i ], infos [j ])
167181 if ok {
168182 return less
169183 }
170184
171- if ! subInfos [j ].ModTime ().Equal (subInfos [i ].ModTime ()) {
172- return subInfos [j ].ModTime ().Before (subInfos [i ].ModTime ())
185+ if ! infos [j ].ModTime ().Equal (infos [i ].ModTime ()) {
186+ return infos [j ].ModTime ().Before (infos [i ].ModTime ())
173187 }
174188
175- cmpResult := strings .Compare (subInfos [j ].Name (), subInfos [i ].Name ())
189+ cmpResult := strings .Compare (infos [j ].Name (), infos [i ].Name ())
176190 if cmpResult != 0 {
177191 return cmpResult < 0
178192 }
@@ -181,17 +195,22 @@ func sortSubItemTimesDesc(subInfos []os.FileInfo, compareDir fnCompareDir) {
181195 })
182196}
183197
184- func sortSubItemOriginal (subInfos []os.FileInfo , compareDir fnCompareDir ) {
185- sort .Slice (subInfos , func (i , j int ) bool {
186- less , ok := compareDir (subInfos [i ], subInfos [j ])
198+ // sort original
199+
200+ func sortInfoOriginal (infos []os.FileInfo , compareDir fnCompareDir ) {
201+ sort .Slice (infos , func (i , j int ) bool {
202+ less , ok := compareDir (infos [i ], infos [j ])
187203 if ok {
188204 return less
189205 }
190206
191207 return i < j
192208 })
193209}
194- func sortSubItems (subInfos []os.FileInfo , rawQuery string , defaultSortBy string ) (rawSortBy * string , sortInfo SortState ) {
210+
211+ // sort
212+
213+ func sortInfos (infos []os.FileInfo , rawQuery string , defaultSortBy string ) (rawSortBy * string , sortInfo SortState ) {
195214 const sortPrefix = "sort="
196215 var sortBy string
197216
@@ -238,20 +257,20 @@ func sortSubItems(subInfos []os.FileInfo, rawQuery string, defaultSortBy string)
238257 // do sort
239258 switch sortKey {
240259 case 'n' :
241- sortSubItemNamesAsc ( subInfos , compareDir )
260+ sortInfoNamesAsc ( infos , compareDir )
242261 case 'N' :
243- sortSubItemNamesDesc ( subInfos , compareDir )
262+ sortInfoNamesDesc ( infos , compareDir )
244263 case 's' :
245- sortSubItemSizesAsc ( subInfos , compareDir )
264+ sortInfoSizesAsc ( infos , compareDir )
246265 case 'S' :
247- sortSubItemSizesDesc ( subInfos , compareDir )
266+ sortInfoSizesDesc ( infos , compareDir )
248267 case 't' :
249- sortSubItemTimesAsc ( subInfos , compareDir )
268+ sortInfoTimesAsc ( infos , compareDir )
250269 case 'T' :
251- sortSubItemTimesDesc ( subInfos , compareDir )
270+ sortInfoTimesDesc ( infos , compareDir )
252271 default :
253272 if dirSort != dirSortMixed {
254- sortSubItemOriginal ( subInfos , compareDir )
273+ sortInfoOriginal ( infos , compareDir )
255274 }
256275 }
257276
0 commit comments