修复: 技能面板视口按行收口与截断尾部乱码

- 技能列表视口改按行数切片(含描述行),修复变长条目撑爆面板
- 大文件截断改按 rune 边界回退,修复中文内容尾部乱码
- 补视口与截断边界测试
This commit is contained in:
lxy
2026-10-03 10:13:35 +08:00
parent d54d0c4c63
commit 558b676eea
4 changed files with 128 additions and 13 deletions
+18 -6
View File
@@ -5,6 +5,7 @@ import (
"path/filepath"
"sort"
"strings"
"unicode/utf8"
tea "charm.land/bubbletea/v2"
)
@@ -215,16 +216,27 @@ func (m *Model) loadSkillContent(path string) {
m.Skills.ContentPath = path
return
}
content := string(data)
// 限制内容大小,避免大文件卡顿
if len(content) > 100*1024 {
content = content[:100*1024] + "\n\n... (文件过大,截断显示)"
}
m.Skills.Content = content
m.Skills.Content = truncateSkillContent(string(data), 100*1024)
m.Skills.ContentPath = path
m.Skills.ContentScroll = 0
}
// truncateSkillContent 限制内容大小避免大文件卡顿;截断点可能落在
// UTF-8 多字节序列中间,逐字节回退到合法边界,避免尾部出现乱码
func truncateSkillContent(content string, limit int) string {
if len(content) <= limit {
return content
}
content = content[:limit]
for len(content) > 0 {
if r, size := utf8.DecodeLastRuneInString(content); r != utf8.RuneError || size > 1 {
break
}
content = content[:len(content)-1]
}
return content + "\n\n... (文件过大,截断显示)"
}
// IsSkillsTab 判断当前是否在技能 tab
func (m *Model) IsSkillsTab() bool {
return m.activeGroup == len(Groups)+1