From 78d5b45b0caa16fa98ccd61c3ecb364ceac0b0c6 Mon Sep 17 00:00:00 2001 From: Snider Date: Mon, 23 Feb 2026 05:11:04 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20modernise=20to=20Go=201.26=20=E2=80=94?= =?UTF-8?q?=20iterators,=20slices/maps,=20EachSeq?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add EachSeq[T](iter.Seq[T], fn) for iterator-based template rendering - Use slices.Collect(maps.Keys()) + slices.Sort for deterministic attr output - Use strings.SplitSeq in codegen TagToClassName and path parsing - Use range over int in layout and pipeline loops - Refresh go.sum Co-Authored-By: Gemini Co-Authored-By: Virgil --- codegen/codegen.go | 3 +-- go.sum | 15 +++++++++++++++ layout.go | 2 +- node.go | 27 ++++++++++++++------------- path.go | 9 +++++---- pipeline.go | 2 +- 6 files changed, 37 insertions(+), 21 deletions(-) diff --git a/codegen/codegen.go b/codegen/codegen.go index 6e60783..8c443cf 100644 --- a/codegen/codegen.go +++ b/codegen/codegen.go @@ -54,9 +54,8 @@ func GenerateRegistration(tag, className string) string { // TagToClassName converts a kebab-case tag to PascalCase class name. func TagToClassName(tag string) string { - parts := strings.Split(tag, "-") var b strings.Builder - for _, p := range parts { + for p := range strings.SplitSeq(tag, "-") { if len(p) > 0 { b.WriteString(strings.ToUpper(p[:1])) b.WriteString(p[1:]) diff --git a/go.sum b/go.sum index 9ebd72f..53e527f 100644 --- a/go.sum +++ b/go.sum @@ -1,14 +1,29 @@ forge.lthn.ai/core/go-i18n v0.0.1 h1:7I2cOv3GCc7MssLny/CAnwz3L7/Y4iqwzrCRQMQ+teA= +forge.lthn.ai/core/go-i18n v0.0.1/go.mod h1:nyiGwZ3jV4h9Yge6mSrKVTo7CI1LI/p3ydI+9jUnMtk= forge.lthn.ai/core/go-inference v0.0.1 h1:hf5eOzm5sNDifhb0BscMTyKEkB44r2Tv58wakHGvtz4= +forge.lthn.ai/core/go-inference v0.0.1/go.mod h1:pq2JCmbWLHgik0QdAflGb3raJcCGC44xt8rCUtDjFys= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= +golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/layout.go b/layout.go index 3a3426c..00890d1 100644 --- a/layout.go +++ b/layout.go @@ -74,7 +74,7 @@ func (l *Layout) blockID(slot byte) string { func (l *Layout) Render(ctx *Context) string { var b strings.Builder - for i := 0; i < len(l.variant); i++ { + for i := range len(l.variant) { slot := l.variant[i] children := l.slots[slot] if len(children) == 0 { diff --git a/node.go b/node.go index ee72d9a..71823c3 100644 --- a/node.go +++ b/node.go @@ -1,7 +1,9 @@ package html import ( - "sort" + "iter" + "maps" + "slices" "strings" i18n "forge.lthn.ai/core/go-i18n" @@ -87,11 +89,8 @@ func (n *elNode) Render(ctx *Context) string { b.WriteString(n.tag) // Sort attribute keys for deterministic output. - keys := make([]string, 0, len(n.attrs)) - for k := range n.attrs { - keys = append(keys, k) - } - sort.Strings(keys) + keys := slices.Collect(maps.Keys(n.attrs)) + slices.Sort(keys) for _, key := range keys { b.WriteByte(' ') b.WriteString(key) @@ -106,8 +105,8 @@ func (n *elNode) Render(ctx *Context) string { return b.String() } - for _, child := range n.children { - b.WriteString(child.Render(ctx)) + for i := range len(n.children) { + b.WriteString(n.children[i].Render(ctx)) } b.WriteString("