]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
tpl: Fix strings/truncate CJK handling
authorKazuo Oishi <oishi@giraffy.jp>
Fri, 10 Oct 2025 04:05:07 +0000 (13:05 +0900)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 15 Oct 2025 11:00:10 +0000 (13:00 +0200)
Fix truncate position for mix of CJK and non-CJK text.

Fixes #14039

tpl/strings/truncate.go
tpl/strings/truncate_test.go

index 727f57a0f7275f20385a0a6e1e4296fb806c0922..0a9f5c2621f5c370aa3fea9effca0964c3593f40 100644 (file)
@@ -111,7 +111,11 @@ func (ns *Namespace) Truncate(s any, options ...any) (template.HTML, error) {
                if unicode.IsSpace(r) {
                        lastWordIndex = lastNonSpace
                } else if unicode.In(r, unicode.Han, unicode.Hangul, unicode.Hiragana, unicode.Katakana) {
-                       lastWordIndex = i
+                       lastWordIndex = lastNonSpace
+                       lastNonSpace = i + utf8.RuneLen(r)
+                       if currentLen <= length {
+                               lastWordIndex = lastNonSpace
+                       }
                } else {
                        lastNonSpace = i + utf8.RuneLen(r)
                }
index d307d786d08380c8753aeee627ee521d3a189e6e..633257456ed319e2d68d4be6ee7d24ac0128efb7 100644 (file)
@@ -41,6 +41,19 @@ func TestTruncate(t *testing.T) {
                {10, template.HTML("<p>IamanextremelylongwordthatjustgoesonandonandonjusttoannoyyoualmostasifIwaswritteninGermanActuallyIbettheresagermanwordforthis</p>"), nil, template.HTML("<p>Iamanextre …</p>"), false},
                {13, template.HTML("With <a href=\"/markdown\">Markdown</a> inside."), nil, template.HTML("With <a href=\"/markdown\">Markdown …</a>"), false},
                {14, "Hello中国 Good 好的", nil, template.HTML("Hello中国 Good 好 …"), false},
+               {12, "", "日本語でHugoを使います", template.HTML("日本語でHugoを使いま"), false},
+               {12, "", "日本語で Hugo を使います", template.HTML("日本語で Hugo を使"), false},
+               {8, "", "日本語でHugoを使います", template.HTML("日本語でHugo"), false},
+               {10, "", "日本語で Hugo を使います", template.HTML("日本語で Hugo"), false},
+               {9, "", "日本語で Hugo を使います", template.HTML("日本語で Hugo"), false},
+               {7, "", "日本語でHugoを使います", template.HTML("日本語で"), false},
+               {7, "", "日本語で Hugo を使います", template.HTML("日本語で"), false},
+               {6, "", "日本語でHugoを使います", template.HTML("日本語で"), false},
+               {6, "", "日本語で Hugo を使います", template.HTML("日本語で"), false},
+               {5, "", "日本語でHugoを使います", template.HTML("日本語で"), false},
+               {5, "", "日本語で Hugo を使います", template.HTML("日本語で"), false},
+               {4, "", "日本語でHugoを使います", template.HTML("日本語で"), false},
+               {4, "", "日本語で Hugo を使います", template.HTML("日本語で"), false},
                {15, "", template.HTML("A <br> tag that's not closed"), template.HTML("A <br> tag that's"), false},
                {14, template.HTML("<p>Hello中国 Good 好的</p>"), nil, template.HTML("<p>Hello中国 Good 好 …</p>"), false},
                {2, template.HTML("<p>P1</p><p>P2</p>"), nil, template.HTML("<p>P1 …</p>"), false},