diff --git a/animation.go b/animation.go index bc86f87..6b0272f 100644 --- a/animation.go +++ b/animation.go @@ -866,8 +866,8 @@ func isTimingFunctionValid(timingFunction string) bool { } case "cubic-bezier": - if params := strings.Split(args, ","); len(params) == 4 { - for _, param := range params { + if strings.Count(args, ",") == 3 { + for param := range strings.SplitSeq(args, ",") { if _, err := strconv.ParseFloat(strings.Trim(param, " \t\n"), 64); err != nil { return false } diff --git a/canvas.go b/canvas.go index a97bdb9..1f4b0bd 100644 --- a/canvas.go +++ b/canvas.go @@ -630,9 +630,8 @@ func (canvas *canvasData) fontWithParams(name string, size SizeUnit, params Font buffer.WriteString(params.LineHeight.cssString("", canvas.View().Session())) } - names := strings.Split(name, ",") lead := " " - for _, font := range names { + for font := range strings.SplitSeq(name, ",") { font = strings.Trim(font, " \n\"'") buffer.WriteString(lead) lead = "," diff --git a/clipShape.go b/clipShape.go index ba18ae5..7d3beda 100644 --- a/clipShape.go +++ b/clipShape.go @@ -480,14 +480,13 @@ func polygonClipDataSet(properties Properties, tag PropertyName, value any) []Pr return []PropertyName{tag} case string: - values := strings.Split(value, ",") - points := make([]any, len(values)) - for i, val := range values { + points := make([]any, 0, strings.Count(value, ",")+1) + for val := range strings.SplitSeq(value, ",") { val = strings.Trim(val, " \t\n\r") if ok, _ := isConstantName(val); ok { - points[i] = val + points = append(points, val) } else if size, ok := StringToSizeUnit(val); ok { - points[i] = size + points = append(points, size) } else { notCompatibleType(tag, val) return nil diff --git a/dragAndDrop.go b/dragAndDrop.go index b261cf0..2409f1f 100644 --- a/dragAndDrop.go +++ b/dragAndDrop.go @@ -229,15 +229,13 @@ func (event *DragAndDropEvent) init(session Session, data DataObject) { event.Data = map[string]string{} if value, ok := data.PropertyValue("data"); ok { - data := strings.Split(value, ";") - for _, line := range data { - pair := strings.Split(line, ":") - if len(pair) == 2 { - mime, err := base64.StdEncoding.DecodeString(pair[0]) + for line := range strings.SplitSeq(value, ";") { + if mimeData, data, ok := strings.Cut(line, ":"); ok { + mime, err := base64.StdEncoding.DecodeString(mimeData) if err != nil { ErrorLog(err.Error()) } else { - val, err := base64.StdEncoding.DecodeString(pair[1]) + val, err := base64.StdEncoding.DecodeString(data) if err == nil { event.Data[string(mime)] = string(val) } else { @@ -322,9 +320,8 @@ func (view *viewData) setDropEffect(value any) []PropertyName { func stringToDropEffectAllowed(text string) (int, bool) { if strings.ContainsRune(text, '|') { - elements := strings.Split(text, "|") result := 0 - for _, element := range elements { + for element := range strings.SplitSeq(text, "|") { if n, ok := stringToDropEffect(element); ok && n != DropEffectUndefined { result |= n } else { diff --git a/gridLayout.go b/gridLayout.go index 3d5f403..45efee8 100644 --- a/gridLayout.go +++ b/gridLayout.go @@ -489,10 +489,13 @@ func gridCellSizes(properties Properties, tag PropertyName, session Session) []S case string: if text, ok := session.resolveConstants(value); ok { - values := strings.Split(text, ",") - result := make([]SizeUnit, len(values)) - for i, val := range values { - result[i], _ = stringToSizeUnit(val) + result := make([]SizeUnit, 0, strings.Count(text, ",")+1) + for val := range strings.SplitSeq(text, ",") { + size, err := stringToSizeUnit(val) + if err != nil { + ErrorLog(err.Error()) + } + result = append(result, size) } return result } diff --git a/imageView.go b/imageView.go index eda75a0..c4efe29 100644 --- a/imageView.go +++ b/imageView.go @@ -187,12 +187,15 @@ func (imageView *imageViewData) propertyChanged(tag PropertyName) { func imageViewSrcSet(view View, path string) string { if value := view.getRaw(SrcSet); value != nil { if text, ok := value.(string); ok { - srcset := strings.Split(text, ",") buffer := allocStringBuilder() defer freeStringBuilder(buffer) - for i, src := range srcset { - if i > 0 { + + comma := false + for src := range strings.SplitSeq(text, ",") { + if comma { buffer.WriteString(", ") + } else { + comma = true } src = strings.Trim(src, " \t\n") buffer.WriteString(src) diff --git a/listView.go b/listView.go index 8fbba19..edf0e2b 100644 --- a/listView.go +++ b/listView.go @@ -220,9 +220,8 @@ func (listView *listViewData) setFunc(tag PropertyName, value any) []PropertyNam var checked []int switch value := value.(type) { case string: - elements := strings.Split(value, ",") - checked = make([]int, 0, len(elements)) - for _, val := range elements { + checked = make([]int, 0, strings.Count(value, ",")+1) + for val := range strings.SplitSeq(value, ",") { if val = strings.Trim(val, " \t"); val != "" { n, err := strconv.Atoi(val) if err != nil { diff --git a/radius.go b/radius.go index 6e148e1..d5168d9 100644 --- a/radius.go +++ b/radius.go @@ -649,22 +649,25 @@ func radiusPropertySet(radius Properties, tag PropertyName, value any) []Propert deleteRadiusUnusedTags(radius, result) case string: - if strings.ContainsRune(value, '/') { - if values := strings.Split(value, "/"); len(values) == 2 { - if result = radiusPropertySet(radius, tag+"-x", values[0]); result != nil { - if resultY := radiusPropertySet(radius, tag+"-y", values[1]); resultY != nil { - result = append(result, resultY...) - } - - } - } else { - notCompatibleType(tag, value) - } - } else { + switch strings.Count(value, "/") { + case 0: if result = setSizeProperty(radius, tag, value); result != nil { deleteTags([]PropertyName{tag + "-x", tag + "-y"}) deleteRadiusUnusedTags(radius, result) } + + case 1: + if x, y, ok := strings.Cut(value, "/"); ok { + if result = radiusPropertySet(radius, tag+"-x", x); result != nil { + if resultY := radiusPropertySet(radius, tag+"-y", y); resultY != nil { + result = append(result, resultY...) + } + } + } else { + notCompatibleType(tag, value) + } + default: + notCompatibleType(tag, value) } } diff --git a/range.go b/range.go index 8aa7858..a4ff6ea 100644 --- a/range.go +++ b/range.go @@ -20,30 +20,34 @@ func (r Range) String() string { } func (r *Range) setValue(value string) bool { + var err error - if strings.ContainsRune(value, ':') { - values := strings.Split(value, ":") - if len(values) != 2 { - ErrorLog("Invalid range value: " + value) - return false - } - if r.First, err = strconv.Atoi(strings.Trim(values[0], " \t\n\r")); err != nil { - ErrorLog(`Invalid first range value "` + value + `" (` + err.Error() + ")") - return false - } - if r.Last, err = strconv.Atoi(strings.Trim(values[1], " \t\n\r")); err != nil { - ErrorLog(`Invalid last range value "` + value + `" (` + err.Error() + ")") + + switch strings.Count(value, ":") { + case 0: + if r.First, err = strconv.Atoi(value); err != nil { + ErrorLog(`Invalid range value "` + value + `" (` + err.Error() + ")") return false } + r.Last = r.First return true + + case 1: + if first, last, ok := strings.Cut(value, ":"); ok { + if r.First, err = strconv.Atoi(strings.Trim(first, " \t\n\r")); err != nil { + ErrorLog(`Invalid first range value "` + value + `" (` + err.Error() + ")") + return false + } + if r.Last, err = strconv.Atoi(strings.Trim(last, " \t\n\r")); err != nil { + ErrorLog(`Invalid last range value "` + value + `" (` + err.Error() + ")") + return false + } + return true + } } - if r.First, err = strconv.Atoi(value); err != nil { - ErrorLog(`Invalid range value "` + value + `" (` + err.Error() + ")") - return false - } - r.Last = r.First - return true + ErrorLog("Invalid range value: " + value) + return false } func setRangeProperty(properties Properties, tag PropertyName, value any) []PropertyName { diff --git a/resizable.go b/resizable.go index 6bd1dd1..84b44e8 100644 --- a/resizable.go +++ b/resizable.go @@ -175,9 +175,8 @@ func resizableSide(view View) int { } if strings.ContainsRune(value, '|') { - values := strings.Split(value, "|") sides := 0 - for _, val := range values { + for val := range strings.SplitSeq(value, "|") { if n, err := strconv.Atoi(val); err == nil { if n < 1 || n > AllSides { return AllSides diff --git a/tableView.go b/tableView.go index 931d7cb..01840c5 100644 --- a/tableView.go +++ b/tableView.go @@ -804,29 +804,37 @@ func (table *tableViewData) setFunc(tag PropertyName, value any) []PropertyName } case string: - if strings.ContainsRune(value, ',') { - if values := strings.Split(value, ","); len(values) == 2 { - var n = []int{0, 0} - for i := range 2 { - var err error - if n[i], err = strconv.Atoi(values[i]); err != nil { - ErrorLog(err.Error()) - return nil - } - } - current.Row = n[0] - current.Column = n[1] - } else { - notCompatibleType(tag, value) - return nil - } - } else { + switch strings.Count(value, ",") { + case 0: n, err := strconv.Atoi(value) if err != nil { ErrorLog(err.Error()) return nil } current.Row = n + + case 1: + n := make([]int, 0, 2) + for val := range strings.SplitSeq(value, ",") { + if i, err := strconv.Atoi(val); err != nil { + ErrorLog(err.Error()) + return nil + } else { + n = append(n, i) + } + } + + if len(n) == 2 { + current.Row = n[0] + current.Column = n[1] + } else { + notCompatibleType(tag, value) + return nil + } + + default: + notCompatibleType(tag, value) + return nil } default: diff --git a/timePicker.go b/timePicker.go index b3c0138..752cbb9 100644 --- a/timePicker.go +++ b/timePicker.go @@ -143,8 +143,8 @@ func stringToTime(value string) (time.Time, bool) { pm := strings.HasSuffix(lowText, "PM") || strings.HasSuffix(lowText, "AM") var format string - switch len(strings.Split(value, ":")) { - case 2: + switch strings.Count(value, ":") { + case 1: if pm { format = "3:04 PM" } else {