Merge pull request #561 from jvoisin/noclosure

perf: speed up Selection.Text by outlining recursion
This commit is contained in:
Martin Angers
2026-05-28 10:19:23 -04:00
committed by GitHub
+13 -15
View File
@@ -59,27 +59,25 @@ func (s *Selection) SetAttr(attrName, val string) *Selection {
// elements, including their descendants.
func (s *Selection) Text() string {
var builder strings.Builder
// Slightly optimized vs calling Each: no single selection object created
var f func(*html.Node)
f = func(n *html.Node) {
if n.Type == html.TextNode {
// Keep newlines and spaces, like jQuery
builder.WriteString(n.Data)
}
if n.FirstChild != nil {
for c := n.FirstChild; c != nil; c = c.NextSibling {
f(c)
}
}
}
for _, n := range s.Nodes {
f(n)
s.textHelper(n, &builder)
}
return builder.String()
}
func (s *Selection) textHelper(n *html.Node, builder *strings.Builder) {
if n.Type == html.TextNode {
// Keep newlines and spaces, like jQuery
builder.WriteString(n.Data)
}
if n.FirstChild != nil {
for c := n.FirstChild; c != nil; c = c.NextSibling {
s.textHelper(c, builder)
}
}
}
// Size is an alias for Length.
func (s *Selection) Size() int {
return s.Length()