`)
close, ok := boolProperty(view, TabCloseButton, tabsLayout.session)
if !ok {
close = closeButton
}
if close {
- buffer.WriteString(`
0 {
- buffer.WriteString(` step="`)
- buffer.WriteString(strconv.Itoa(step))
- buffer.WriteByte('"')
+ writeStrings(buffer, ` step="`, strconv.Itoa(step), `"`)
}
- buffer.WriteString(` value="`)
- buffer.WriteString(GetTimePickerValue(picker).Format(timeFormat))
- buffer.WriteByte('"')
+ writeStrings(buffer, ` value="`, GetTimePickerValue(picker).Format(timeFormat),
+ `" oninput="editViewInputEvent(this)"`)
- buffer.WriteString(` oninput="editViewInputEvent(this)"`)
if picker.getRaw(ClickEvent) == nil {
buffer.WriteString(` onclick="stopEventPropagation(this, event)"`)
}
diff --git a/transform.go b/transform.go
index d1b2ac0..df94657 100644
--- a/transform.go
+++ b/transform.go
@@ -467,38 +467,22 @@ func (transform *transformPropertyData) transformCSS(session Session) string {
defer freeStringBuilder(buffer)
if perspective, ok := sizeProperty(transform, Perspective, session); ok && perspective.Type != Auto && perspective.Value != 0 {
- buffer.WriteString(`perspective(`)
- buffer.WriteString(perspective.cssString("0", session))
- buffer.WriteString(") ")
+ writeStrings(buffer, `perspective(`, perspective.cssString("0", session), `) `)
}
skewX, skewY, skewOK := transform.getSkew(session)
if skewOK {
- buffer.WriteString(`skew(`)
- buffer.WriteString(skewX.cssString())
- buffer.WriteRune(',')
- buffer.WriteString(skewY.cssString())
- buffer.WriteString(") ")
+ writeStrings(buffer, `skew(`, skewX.cssString(), `,`, skewY.cssString(), `) `)
}
x, y, z := transform.getTranslate(session)
if z.Type != Auto && z.Value != 0 {
- buffer.WriteString(`translate3d(`)
- buffer.WriteString(x.cssString("0px", session))
- buffer.WriteRune(',')
- buffer.WriteString(y.cssString("0px", session))
- buffer.WriteRune(',')
- buffer.WriteString(z.cssString("0px", session))
- buffer.WriteString(") ")
+ writeStrings(buffer, `translate3d(`, x.cssString("0px", session), `,`, y.cssString("0px", session), `,`, z.cssString("0px", session), `) `)
} else if (x.Type != Auto && x.Value != 0) || (y.Type != Auto && y.Value != 0) {
- buffer.WriteString(`translate(`)
- buffer.WriteString(x.cssString("0px", session))
- buffer.WriteRune(',')
- buffer.WriteString(y.cssString("0px", session))
- buffer.WriteString(") ")
+ writeStrings(buffer, `translate(`, x.cssString("0px", session), `,`, y.cssString("0px", session), `) `)
}
scaleX, okScaleX := floatTextProperty(transform, ScaleX, session, 1)
@@ -506,21 +490,11 @@ func (transform *transformPropertyData) transformCSS(session Session) string {
scaleZ, okScaleZ := floatTextProperty(transform, ScaleZ, session, 1)
if okScaleZ {
- buffer.WriteString(`scale3d(`)
- buffer.WriteString(scaleX)
- buffer.WriteRune(',')
- buffer.WriteString(scaleY)
- buffer.WriteRune(',')
- buffer.WriteString(scaleZ)
- buffer.WriteString(") ")
+ writeStrings(buffer, `scale3d(`, scaleX, `,`, scaleY, `,`, scaleZ, `) `)
} else if okScaleX || okScaleY {
- buffer.WriteString(`scale(`)
- buffer.WriteString(scaleX)
- buffer.WriteRune(',')
- buffer.WriteString(scaleY)
- buffer.WriteString(") ")
+ writeStrings(buffer, `scale(`, scaleX, `,`, scaleY, `) `)
}
if angle, ok := angleProperty(transform, Rotate, session); ok {
@@ -530,21 +504,11 @@ func (transform *transformPropertyData) transformCSS(session Session) string {
if xOK || yOK || zOK {
- buffer.WriteString(`rotate3d(`)
- buffer.WriteString(rotateX)
- buffer.WriteRune(',')
- buffer.WriteString(rotateY)
- buffer.WriteRune(',')
- buffer.WriteString(rotateZ)
- buffer.WriteRune(',')
- buffer.WriteString(angle.cssString())
- buffer.WriteString(") ")
+ writeStrings(buffer, `rotate3d(`, rotateX, `,`, rotateY, `,`, rotateZ, `,`, angle.cssString(), `) `)
} else {
- buffer.WriteString(`rotate(`)
- buffer.WriteString(angle.cssString())
- buffer.WriteString(") ")
+ writeStrings(buffer, `rotate(`, angle.cssString(), `) `)
}
}
diff --git a/utils.go b/utils.go
index 238536b..afccea0 100644
--- a/utils.go
+++ b/utils.go
@@ -130,3 +130,9 @@ func textToHtml(text string) string {
return text
}
+
+func writeStrings(buffer *strings.Builder, strs ...string) {
+ for _, str := range strs {
+ buffer.WriteString(str)
+ }
+}
diff --git a/videoPlayer.go b/videoPlayer.go
index 1a4bb5f..992f502 100644
--- a/videoPlayer.go
+++ b/videoPlayer.go
@@ -106,20 +106,14 @@ func (player *videoPlayerData) htmlProperties(self View, buffer *strings.Builder
session := player.Session()
if size, ok := floatTextProperty(player, VideoWidth, session, 0); ok && size != "0" {
- buffer.WriteString(` width="`)
- buffer.WriteString(size)
- buffer.WriteString(`"`)
+ writeStrings(buffer, ` width="`, size, `"`)
}
if size, ok := floatTextProperty(player, VideoHeight, session, 0); ok && size != "0" {
- buffer.WriteString(` height="`)
- buffer.WriteString(size)
- buffer.WriteString(`"`)
+ writeStrings(buffer, ` height="`, size, `"`)
}
if url, ok := stringProperty(player, Poster, session); ok && url != "" {
- buffer.WriteString(` poster="`)
- buffer.WriteString(url)
- buffer.WriteString(`"`)
+ writeStrings(buffer, ` poster="`, url, `"`)
}
}
diff --git a/view.go b/view.go
index 3d6e5e5..fa7d052 100644
--- a/view.go
+++ b/view.go
@@ -1096,50 +1096,38 @@ func viewHTML(view View, buffer *strings.Builder, htmlTag string) {
if htmlTag == "" {
htmlTag = view.htmlTag()
}
- //viewHTMLTag := view.htmlTag()
- buffer.WriteRune('<')
- buffer.WriteString(htmlTag)
- buffer.WriteString(` id="`)
- buffer.WriteString(view.htmlID())
- buffer.WriteRune('"')
+
+ writeStrings(buffer, `<`, htmlTag, ` id="`, view.htmlID(), `"`)
if cls := view.htmlClass(); cls != "" {
- buffer.WriteString(` class="`)
- buffer.WriteString(cls)
- buffer.WriteRune('"')
+ writeStrings(buffer, ` class="`, cls, `"`)
}
cssBuilder := viewCSSBuilder{buffer: allocStringBuilder()}
view.cssStyle(view, &cssBuilder)
if style := cssBuilder.finish(); style != "" {
- buffer.WriteString(` style="`)
- buffer.WriteString(style)
- buffer.WriteRune('"')
- }
-
- buffer.WriteRune(' ')
- view.htmlProperties(view, buffer)
-
- if view.isNoResizeEvent() {
- buffer.WriteString(` data-noresize="1" `)
+ writeStrings(buffer, ` style="`, style, `" `)
} else {
buffer.WriteRune(' ')
}
+ view.htmlProperties(view, buffer)
+
+ if view.isNoResizeEvent() {
+ buffer.WriteString(` data-noresize="1"`)
+ }
+
if tabIndex := GetTabIndex(view); tabIndex >= 0 {
- buffer.WriteString(`tabindex="`)
- buffer.WriteString(strconv.Itoa(tabIndex))
- buffer.WriteString(`" `)
+ writeStrings(buffer, ` tabindex="`, strconv.Itoa(tabIndex), `"`)
}
if tooltip := GetTooltip(view); tooltip != "" {
- buffer.WriteString(`data-tooltip=" `)
- buffer.WriteString(tooltip)
- buffer.WriteString(`" onmouseenter="mouseEnterEvent(this, event)" onmouseleave="mouseLeaveEvent(this, event)" `)
+ writeStrings(buffer, ` data-tooltip=" `, tooltip,
+ `" onmouseenter="mouseEnterEvent(this, event)" onmouseleave="mouseLeaveEvent(this, event)"`)
}
- buffer.WriteString(`onscroll="scrollEvent(this, event)" `)
+ buffer.WriteString(` onscroll="scrollEvent(this, event)" `)
focusEventsHtml(view, buffer)
keyEventsHtml(view, buffer)
@@ -1155,9 +1143,7 @@ func viewHTML(view View, buffer *strings.Builder, htmlTag string) {
buffer.WriteRune('>')
view.htmlSubviews(view, buffer)
if view.closeHTMLTag() {
- buffer.WriteString(``)
- buffer.WriteString(htmlTag)
- buffer.WriteRune('>')
+ writeStrings(buffer, ``, htmlTag, `>`)
}
}
diff --git a/viewStyle.go b/viewStyle.go
index a4fe9da..b5121b2 100644
--- a/viewStyle.go
+++ b/viewStyle.go
@@ -611,9 +611,7 @@ func propertyValueToString(tag PropertyName, value any, indent string) string {
writeString := func(buffer *strings.Builder, text string) string {
if isQuotesNeeded(text) {
- buffer.WriteRune('"')
- buffer.WriteString(replaceEscapeSymbols(text))
- buffer.WriteRune('"')
+ writeStrings(buffer, `"`, replaceEscapeSymbols(text), `"`)
} else {
buffer.WriteString(text)
}
@@ -623,9 +621,7 @@ func propertyValueToString(tag PropertyName, value any, indent string) string {
writeObjectNameString := func(buffer *strings.Builder, text string) string {
textEscaped := replaceEscapeSymbols(text)
if isQuotesNeededForObjectName(textEscaped) {
- buffer.WriteRune('"')
- buffer.WriteString(textEscaped)
- buffer.WriteRune('"')
+ writeStrings(buffer, `"`, textEscaped, `"`)
} else {
buffer.WriteString(text)
}
@@ -1091,19 +1087,14 @@ func propertyValueToString(tag PropertyName, value any, indent string) string {
}
func writeViewStyle(name string, view Properties, buffer *strings.Builder, indent string, excludeTags []PropertyName) {
- buffer.WriteString(name)
- buffer.WriteString(" {\n")
+ writeStrings(buffer, name, " {\n")
indent += "\t"
writeProperty := func(tag PropertyName, value any) {
if !slices.Contains(excludeTags, tag) {
text := propertyValueToString(tag, value, indent)
if text != "" {
- buffer.WriteString(indent)
- buffer.WriteString(string(tag))
- buffer.WriteString(" = ")
- buffer.WriteString(text)
- buffer.WriteString(",\n")
+ writeStrings(buffer, indent, string(tag), " = ", text, ",\n")
}
}
}
@@ -1167,8 +1158,7 @@ func writeViewStyle(name string, view Properties, buffer *strings.Builder, inden
}
indent = indent[:len(indent)-1]
- buffer.WriteString(indent)
- buffer.WriteString("}")
+ writeStrings(buffer, indent, "}")
}
func runStringWriter(writer stringWriter) string {
diff --git a/webBridge.go b/webBridge.go
index 157db91..be9f147 100644
--- a/webBridge.go
+++ b/webBridge.go
@@ -120,9 +120,7 @@ func (bridge *webBridge) startUpdateScript(htmlID string) bool {
}
buffer := allocStringBuilder()
bridge.updateScripts[htmlID] = buffer
- buffer.WriteString("{\nlet element = document.getElementById('")
- buffer.WriteString(htmlID)
- buffer.WriteString("');\nif (element) {\n")
+ writeStrings(buffer, "{\nlet element = document.getElementById('", htmlID, "');\nif (element) {\n")
return true
}
@@ -267,11 +265,7 @@ func (bridge *webBridge) updateInnerHTML(htmlID, html string) {
func (bridge *webBridge) updateCSSProperty(htmlID, property, value string) {
if buffer, ok := bridge.updateScripts[htmlID]; ok {
- buffer.WriteString(`element.style['`)
- buffer.WriteString(property)
- buffer.WriteString(`'] = '`)
- buffer.WriteString(value)
- buffer.WriteString("';\n")
+ writeStrings(buffer, `element.style['`, property, `'] = '`, value, "';\n")
} else {
bridge.callFunc("updateCSSProperty", htmlID, property, value)
}
@@ -280,11 +274,7 @@ func (bridge *webBridge) updateCSSProperty(htmlID, property, value string) {
func (bridge *webBridge) updateProperty(htmlID, property string, value any) {
if buffer, ok := bridge.updateScripts[htmlID]; ok {
if val, ok := bridge.argToString(value); ok {
- buffer.WriteString(`element.setAttribute('`)
- buffer.WriteString(property)
- buffer.WriteString(`', `)
- buffer.WriteString(val)
- buffer.WriteString(");\n")
+ writeStrings(buffer, `element.setAttribute('`, property, `', `, val, ");\n")
}
} else {
bridge.callFunc("updateProperty", htmlID, property, value)
@@ -293,11 +283,7 @@ func (bridge *webBridge) updateProperty(htmlID, property string, value any) {
func (bridge *webBridge) removeProperty(htmlID, property string) {
if buffer, ok := bridge.updateScripts[htmlID]; ok {
- buffer.WriteString(`if (element.hasAttribute('`)
- buffer.WriteString(property)
- buffer.WriteString(`')) { element.removeAttribute('`)
- buffer.WriteString(property)
- buffer.WriteString("');}\n")
+ writeStrings(buffer, `if (element.hasAttribute('`, property, `')) { element.removeAttribute('`, property, "');}\n")
} else {
bridge.callFunc("removeProperty", htmlID, property)
}
@@ -323,15 +309,11 @@ func (bridge *webBridge) setAnimationCSS(css string) {
func (bridge *webBridge) canvasStart(htmlID string) {
bridge.canvasBuffer.Reset()
- bridge.canvasBuffer.WriteString("{\nconst ctx = getCanvasContext('")
- bridge.canvasBuffer.WriteString(htmlID)
- bridge.canvasBuffer.WriteString(`');`)
+ writeStrings(&bridge.canvasBuffer, "{\nconst ctx = getCanvasContext('", htmlID, `');`)
}
func (bridge *webBridge) callCanvasFunc(funcName string, args ...any) {
- bridge.canvasBuffer.WriteString("\nctx.")
- bridge.canvasBuffer.WriteString(funcName)
- bridge.canvasBuffer.WriteRune('(')
+ writeStrings(&bridge.canvasBuffer, "\nctx.", funcName, `(`)
for i, arg := range args {
if i > 0 {
bridge.canvasBuffer.WriteString(", ")
@@ -343,22 +325,14 @@ func (bridge *webBridge) callCanvasFunc(funcName string, args ...any) {
}
func (bridge *webBridge) updateCanvasProperty(property string, value any) {
- bridge.canvasBuffer.WriteString("\nctx.")
- bridge.canvasBuffer.WriteString(property)
- bridge.canvasBuffer.WriteString(" = ")
argText, _ := bridge.argToString(value)
- bridge.canvasBuffer.WriteString(argText)
- bridge.canvasBuffer.WriteString(";")
+ writeStrings(&bridge.canvasBuffer, "\nctx.", property, " = ", argText, ";")
}
func (bridge *webBridge) createCanvasVar(funcName string, args ...any) any {
bridge.canvasVarNumber++
result := canvasVar{name: fmt.Sprintf("v%d", bridge.canvasVarNumber)}
- bridge.canvasBuffer.WriteString("\nlet ")
- bridge.canvasBuffer.WriteString(result.name)
- bridge.canvasBuffer.WriteString(" = ctx.")
- bridge.canvasBuffer.WriteString(funcName)
- bridge.canvasBuffer.WriteRune('(')
+ writeStrings(&bridge.canvasBuffer, "\nlet ", result.name, " = ctx.", funcName, "(")
for i, arg := range args {
if i > 0 {
bridge.canvasBuffer.WriteString(", ")
@@ -373,9 +347,7 @@ func (bridge *webBridge) createCanvasVar(funcName string, args ...any) any {
func (bridge *webBridge) createPath2D(arg string) any {
bridge.canvasVarNumber++
result := canvasVar{name: fmt.Sprintf("v%d", bridge.canvasVarNumber)}
- bridge.canvasBuffer.WriteString("\nlet ")
- bridge.canvasBuffer.WriteString(result.name)
- bridge.canvasBuffer.WriteString(` = new Path2D(`)
+ writeStrings(&bridge.canvasBuffer, "\nlet ", result.name, ` = new Path2D(`)
if arg != "" {
argText, _ := bridge.argToString(arg)
bridge.canvasBuffer.WriteString(argText)
@@ -389,11 +361,7 @@ func (bridge *webBridge) callCanvasVarFunc(v any, funcName string, args ...any)
if !ok {
return
}
- bridge.canvasBuffer.WriteString("\n")
- bridge.canvasBuffer.WriteString(varName.name)
- bridge.canvasBuffer.WriteRune('.')
- bridge.canvasBuffer.WriteString(funcName)
- bridge.canvasBuffer.WriteRune('(')
+ writeStrings(&bridge.canvasBuffer, "\n", varName.name, ".", funcName, "(")
for i, arg := range args {
if i > 0 {
bridge.canvasBuffer.WriteString(", ")
@@ -406,17 +374,11 @@ func (bridge *webBridge) callCanvasVarFunc(v any, funcName string, args ...any)
func (bridge *webBridge) callCanvasImageFunc(url string, property string, funcName string, args ...any) {
- bridge.canvasBuffer.WriteString("\nimg = images.get('")
- bridge.canvasBuffer.WriteString(url)
- bridge.canvasBuffer.WriteString("');\nif (img) {\n")
+ writeStrings(&bridge.canvasBuffer, "\nimg = images.get('", url, "');\nif (img) {\n")
if property != "" {
- bridge.canvasBuffer.WriteString("ctx.")
- bridge.canvasBuffer.WriteString(property)
- bridge.canvasBuffer.WriteString(" = ")
+ writeStrings(&bridge.canvasBuffer, "ctx.", property, " = ")
}
- bridge.canvasBuffer.WriteString("ctx.")
- bridge.canvasBuffer.WriteString(funcName)
- bridge.canvasBuffer.WriteString("(img")
+ writeStrings(&bridge.canvasBuffer, "ctx.", funcName, "(img")
for _, arg := range args {
bridge.canvasBuffer.WriteString(", ")
argText, _ := bridge.argToString(arg)