您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // Copyright (c) 2020 Shivaram Lingamneni
  2. // released under the MIT license
  3. package sno
  4. import (
  5. "sort"
  6. "strings"
  7. )
  8. func IsValidMask(r rune) bool {
  9. for _, m := range ValidMasks {
  10. if m == Mask(r) {
  11. return true
  12. }
  13. }
  14. return false
  15. }
  16. func (masks Masks) String() string {
  17. var buf strings.Builder
  18. buf.Grow(len(masks))
  19. for _, m := range masks {
  20. buf.WriteRune(rune(m))
  21. }
  22. return buf.String()
  23. }
  24. func (masks Masks) Contains(mask Mask) bool {
  25. for _, m := range masks {
  26. if mask == m {
  27. return true
  28. }
  29. }
  30. return false
  31. }
  32. func (masks Masks) Sort() {
  33. sort.Slice(masks, func(i, j int) bool { return masks[i] < masks[j] })
  34. }
  35. // Evaluate changes to snomasks made with MODE. There are several cases:
  36. // adding snomasks with `/mode +s a` or `/mode +s +a`, removing them with `/mode +s -a`,
  37. // adding all with `/mode +s *` or `/mode +s +*`, removing all with `/mode +s -*` or `/mode -s`
  38. func EvaluateSnomaskChanges(add bool, arg string, currentMasks Masks) (addMasks, removeMasks Masks, newArg string) {
  39. if add {
  40. if len(arg) == 0 {
  41. return
  42. }
  43. add := true
  44. switch arg[0] {
  45. case '+':
  46. arg = arg[1:]
  47. case '-':
  48. add = false
  49. arg = arg[1:]
  50. default:
  51. // add
  52. }
  53. if strings.IndexByte(arg, '*') != -1 {
  54. if add {
  55. for _, mask := range ValidMasks {
  56. if !currentMasks.Contains(mask) {
  57. addMasks = append(addMasks, mask)
  58. }
  59. }
  60. } else {
  61. removeMasks = currentMasks
  62. }
  63. } else {
  64. for _, r := range arg {
  65. if IsValidMask(r) {
  66. m := Mask(r)
  67. if add && !currentMasks.Contains(m) {
  68. addMasks = append(addMasks, m)
  69. } else if !add && currentMasks.Contains(m) {
  70. removeMasks = append(removeMasks, m)
  71. }
  72. }
  73. }
  74. }
  75. if len(addMasks) != 0 {
  76. newArg = "+" + addMasks.String()
  77. } else if len(removeMasks) != 0 {
  78. newArg = "-" + removeMasks.String()
  79. }
  80. } else {
  81. removeMasks = currentMasks
  82. newArg = ""
  83. }
  84. return
  85. }