Optimisation

This commit is contained in:
Alexei Anoshenko 2026-06-15 18:02:23 +03:00
parent 91860d799d
commit 69a4d1e712
12 changed files with 92 additions and 78 deletions

View File

@ -866,8 +866,8 @@ func isTimingFunctionValid(timingFunction string) bool {
} }
case "cubic-bezier": case "cubic-bezier":
if params := strings.Split(args, ","); len(params) == 4 { if strings.Count(args, ",") == 3 {
for _, param := range params { for param := range strings.SplitSeq(args, ",") {
if _, err := strconv.ParseFloat(strings.Trim(param, " \t\n"), 64); err != nil { if _, err := strconv.ParseFloat(strings.Trim(param, " \t\n"), 64); err != nil {
return false return false
} }

View File

@ -630,9 +630,8 @@ func (canvas *canvasData) fontWithParams(name string, size SizeUnit, params Font
buffer.WriteString(params.LineHeight.cssString("", canvas.View().Session())) buffer.WriteString(params.LineHeight.cssString("", canvas.View().Session()))
} }
names := strings.Split(name, ",")
lead := " " lead := " "
for _, font := range names { for font := range strings.SplitSeq(name, ",") {
font = strings.Trim(font, " \n\"'") font = strings.Trim(font, " \n\"'")
buffer.WriteString(lead) buffer.WriteString(lead)
lead = "," lead = ","

View File

@ -480,14 +480,13 @@ func polygonClipDataSet(properties Properties, tag PropertyName, value any) []Pr
return []PropertyName{tag} return []PropertyName{tag}
case string: case string:
values := strings.Split(value, ",") points := make([]any, 0, strings.Count(value, ",")+1)
points := make([]any, len(values)) for val := range strings.SplitSeq(value, ",") {
for i, val := range values {
val = strings.Trim(val, " \t\n\r") val = strings.Trim(val, " \t\n\r")
if ok, _ := isConstantName(val); ok { if ok, _ := isConstantName(val); ok {
points[i] = val points = append(points, val)
} else if size, ok := StringToSizeUnit(val); ok { } else if size, ok := StringToSizeUnit(val); ok {
points[i] = size points = append(points, size)
} else { } else {
notCompatibleType(tag, val) notCompatibleType(tag, val)
return nil return nil

View File

@ -229,15 +229,13 @@ func (event *DragAndDropEvent) init(session Session, data DataObject) {
event.Data = map[string]string{} event.Data = map[string]string{}
if value, ok := data.PropertyValue("data"); ok { if value, ok := data.PropertyValue("data"); ok {
data := strings.Split(value, ";") for line := range strings.SplitSeq(value, ";") {
for _, line := range data { if mimeData, data, ok := strings.Cut(line, ":"); ok {
pair := strings.Split(line, ":") mime, err := base64.StdEncoding.DecodeString(mimeData)
if len(pair) == 2 {
mime, err := base64.StdEncoding.DecodeString(pair[0])
if err != nil { if err != nil {
ErrorLog(err.Error()) ErrorLog(err.Error())
} else { } else {
val, err := base64.StdEncoding.DecodeString(pair[1]) val, err := base64.StdEncoding.DecodeString(data)
if err == nil { if err == nil {
event.Data[string(mime)] = string(val) event.Data[string(mime)] = string(val)
} else { } else {
@ -322,9 +320,8 @@ func (view *viewData) setDropEffect(value any) []PropertyName {
func stringToDropEffectAllowed(text string) (int, bool) { func stringToDropEffectAllowed(text string) (int, bool) {
if strings.ContainsRune(text, '|') { if strings.ContainsRune(text, '|') {
elements := strings.Split(text, "|")
result := 0 result := 0
for _, element := range elements { for element := range strings.SplitSeq(text, "|") {
if n, ok := stringToDropEffect(element); ok && n != DropEffectUndefined { if n, ok := stringToDropEffect(element); ok && n != DropEffectUndefined {
result |= n result |= n
} else { } else {

View File

@ -489,10 +489,13 @@ func gridCellSizes(properties Properties, tag PropertyName, session Session) []S
case string: case string:
if text, ok := session.resolveConstants(value); ok { if text, ok := session.resolveConstants(value); ok {
values := strings.Split(text, ",") result := make([]SizeUnit, 0, strings.Count(text, ",")+1)
result := make([]SizeUnit, len(values)) for val := range strings.SplitSeq(text, ",") {
for i, val := range values { size, err := stringToSizeUnit(val)
result[i], _ = stringToSizeUnit(val) if err != nil {
ErrorLog(err.Error())
}
result = append(result, size)
} }
return result return result
} }

View File

@ -187,12 +187,15 @@ func (imageView *imageViewData) propertyChanged(tag PropertyName) {
func imageViewSrcSet(view View, path string) string { func imageViewSrcSet(view View, path string) string {
if value := view.getRaw(SrcSet); value != nil { if value := view.getRaw(SrcSet); value != nil {
if text, ok := value.(string); ok { if text, ok := value.(string); ok {
srcset := strings.Split(text, ",")
buffer := allocStringBuilder() buffer := allocStringBuilder()
defer freeStringBuilder(buffer) defer freeStringBuilder(buffer)
for i, src := range srcset {
if i > 0 { comma := false
for src := range strings.SplitSeq(text, ",") {
if comma {
buffer.WriteString(", ") buffer.WriteString(", ")
} else {
comma = true
} }
src = strings.Trim(src, " \t\n") src = strings.Trim(src, " \t\n")
buffer.WriteString(src) buffer.WriteString(src)

View File

@ -220,9 +220,8 @@ func (listView *listViewData) setFunc(tag PropertyName, value any) []PropertyNam
var checked []int var checked []int
switch value := value.(type) { switch value := value.(type) {
case string: case string:
elements := strings.Split(value, ",") checked = make([]int, 0, strings.Count(value, ",")+1)
checked = make([]int, 0, len(elements)) for val := range strings.SplitSeq(value, ",") {
for _, val := range elements {
if val = strings.Trim(val, " \t"); val != "" { if val = strings.Trim(val, " \t"); val != "" {
n, err := strconv.Atoi(val) n, err := strconv.Atoi(val)
if err != nil { if err != nil {

View File

@ -649,22 +649,25 @@ func radiusPropertySet(radius Properties, tag PropertyName, value any) []Propert
deleteRadiusUnusedTags(radius, result) deleteRadiusUnusedTags(radius, result)
case string: case string:
if strings.ContainsRune(value, '/') { switch strings.Count(value, "/") {
if values := strings.Split(value, "/"); len(values) == 2 { case 0:
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 {
if result = setSizeProperty(radius, tag, value); result != nil { if result = setSizeProperty(radius, tag, value); result != nil {
deleteTags([]PropertyName{tag + "-x", tag + "-y"}) deleteTags([]PropertyName{tag + "-x", tag + "-y"})
deleteRadiusUnusedTags(radius, result) 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)
} }
} }

View File

@ -20,30 +20,34 @@ func (r Range) String() string {
} }
func (r *Range) setValue(value string) bool { func (r *Range) setValue(value string) bool {
var err error var err error
if strings.ContainsRune(value, ':') {
values := strings.Split(value, ":") switch strings.Count(value, ":") {
if len(values) != 2 { case 0:
ErrorLog("Invalid range value: " + value) if r.First, err = strconv.Atoi(value); err != nil {
return false ErrorLog(`Invalid range value "` + value + `" (` + err.Error() + ")")
}
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() + ")")
return false return false
} }
r.Last = r.First
return true 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)
ErrorLog(`Invalid range value "` + value + `" (` + err.Error() + ")") return false
return false
}
r.Last = r.First
return true
} }
func setRangeProperty(properties Properties, tag PropertyName, value any) []PropertyName { func setRangeProperty(properties Properties, tag PropertyName, value any) []PropertyName {

View File

@ -175,9 +175,8 @@ func resizableSide(view View) int {
} }
if strings.ContainsRune(value, '|') { if strings.ContainsRune(value, '|') {
values := strings.Split(value, "|")
sides := 0 sides := 0
for _, val := range values { for val := range strings.SplitSeq(value, "|") {
if n, err := strconv.Atoi(val); err == nil { if n, err := strconv.Atoi(val); err == nil {
if n < 1 || n > AllSides { if n < 1 || n > AllSides {
return AllSides return AllSides

View File

@ -804,29 +804,37 @@ func (table *tableViewData) setFunc(tag PropertyName, value any) []PropertyName
} }
case string: case string:
if strings.ContainsRune(value, ',') { switch strings.Count(value, ",") {
if values := strings.Split(value, ","); len(values) == 2 { case 0:
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 {
n, err := strconv.Atoi(value) n, err := strconv.Atoi(value)
if err != nil { if err != nil {
ErrorLog(err.Error()) ErrorLog(err.Error())
return nil return nil
} }
current.Row = n 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: default:

View File

@ -143,8 +143,8 @@ func stringToTime(value string) (time.Time, bool) {
pm := strings.HasSuffix(lowText, "PM") || strings.HasSuffix(lowText, "AM") pm := strings.HasSuffix(lowText, "PM") || strings.HasSuffix(lowText, "AM")
var format string var format string
switch len(strings.Split(value, ":")) { switch strings.Count(value, ":") {
case 2: case 1:
if pm { if pm {
format = "3:04 PM" format = "3:04 PM"
} else { } else {