obj.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package model
  2. import (
  3. "io"
  4. "regexp"
  5. "sort"
  6. "strings"
  7. "time"
  8. mapset "github.com/deckarep/golang-set/v2"
  9. "github.com/maruel/natural"
  10. )
  11. type UnwrapObj interface {
  12. Unwrap() Obj
  13. }
  14. type Obj interface {
  15. GetSize() int64
  16. GetName() string
  17. ModTime() time.Time
  18. IsDir() bool
  19. // The internal information of the driver.
  20. // If you want to use it, please understand what it means
  21. GetID() string
  22. GetPath() string
  23. }
  24. type FileStreamer interface {
  25. io.ReadCloser
  26. Obj
  27. GetMimetype() string
  28. SetReadCloser(io.ReadCloser)
  29. NeedStore() bool
  30. GetReadCloser() io.ReadCloser
  31. GetOld() Obj
  32. }
  33. type URL interface {
  34. URL() string
  35. }
  36. type Thumb interface {
  37. Thumb() string
  38. }
  39. type SetPath interface {
  40. SetPath(path string)
  41. }
  42. func SortFiles(objs []Obj, orderBy, orderDirection string) {
  43. if orderBy == "" {
  44. return
  45. }
  46. sort.Slice(objs, func(i, j int) bool {
  47. switch orderBy {
  48. case "name":
  49. {
  50. c := natural.Less(objs[i].GetName(), objs[j].GetName())
  51. if orderDirection == "desc" {
  52. return !c
  53. }
  54. return c
  55. }
  56. case "size":
  57. {
  58. if orderDirection == "desc" {
  59. return objs[i].GetSize() >= objs[j].GetSize()
  60. }
  61. return objs[i].GetSize() <= objs[j].GetSize()
  62. }
  63. case "modified":
  64. if orderDirection == "desc" {
  65. return objs[i].ModTime().After(objs[j].ModTime())
  66. }
  67. return objs[i].ModTime().Before(objs[j].ModTime())
  68. }
  69. return false
  70. })
  71. }
  72. func ExtractFolder(objs []Obj, extractFolder string) {
  73. if extractFolder == "" {
  74. return
  75. }
  76. front := extractFolder == "front"
  77. sort.SliceStable(objs, func(i, j int) bool {
  78. if objs[i].IsDir() || objs[j].IsDir() {
  79. if !objs[i].IsDir() {
  80. return !front
  81. }
  82. if !objs[j].IsDir() {
  83. return front
  84. }
  85. }
  86. return false
  87. })
  88. }
  89. // Wrap
  90. func WrapObjName(objs Obj) Obj {
  91. return &ObjWrapName{Obj: objs}
  92. }
  93. func WrapObjsName(objs []Obj) {
  94. for i := 0; i < len(objs); i++ {
  95. objs[i] = &ObjWrapName{Obj: objs[i]}
  96. }
  97. }
  98. func UnwrapObjs(obj Obj) Obj {
  99. if unwrap, ok := obj.(UnwrapObj); ok {
  100. obj = unwrap.Unwrap()
  101. }
  102. return obj
  103. }
  104. func GetThumb(obj Obj) (thumb string, ok bool) {
  105. if obj, ok := obj.(Thumb); ok {
  106. return obj.Thumb(), true
  107. }
  108. if unwrap, ok := obj.(UnwrapObj); ok {
  109. return GetThumb(unwrap.Unwrap())
  110. }
  111. return thumb, false
  112. }
  113. func GetUrl(obj Obj) (url string, ok bool) {
  114. if obj, ok := obj.(URL); ok {
  115. return obj.URL(), true
  116. }
  117. if unwrap, ok := obj.(UnwrapObj); ok {
  118. return GetUrl(unwrap.Unwrap())
  119. }
  120. return url, false
  121. }
  122. // Merge
  123. func NewObjMerge() *ObjMerge {
  124. return &ObjMerge{
  125. set: mapset.NewSet[string](),
  126. }
  127. }
  128. type ObjMerge struct {
  129. regs []*regexp.Regexp
  130. set mapset.Set[string]
  131. }
  132. func (om *ObjMerge) Merge(objs []Obj, objs_ ...Obj) []Obj {
  133. newObjs := make([]Obj, 0, len(objs)+len(objs_))
  134. newObjs = om.insertObjs(om.insertObjs(newObjs, objs...), objs_...)
  135. return newObjs
  136. }
  137. func (om *ObjMerge) insertObjs(objs []Obj, objs_ ...Obj) []Obj {
  138. for _, obj := range objs_ {
  139. if om.clickObj(obj) {
  140. objs = append(objs, obj)
  141. }
  142. }
  143. return objs
  144. }
  145. func (om *ObjMerge) clickObj(obj Obj) bool {
  146. for _, reg := range om.regs {
  147. if reg.MatchString(obj.GetName()) {
  148. return false
  149. }
  150. }
  151. return om.set.Add(obj.GetName())
  152. }
  153. func (om *ObjMerge) InitHideReg(hides string) {
  154. rs := strings.Split(hides, "\n")
  155. om.regs = make([]*regexp.Regexp, 0, len(rs))
  156. for _, r := range rs {
  157. om.regs = append(om.regs, regexp.MustCompile(r))
  158. }
  159. }
  160. func (om *ObjMerge) Reset() {
  161. om.set.Clear()
  162. }