修复: 技能面板视口按行收口与截断尾部乱码
- 技能列表视口改按行数切片(含描述行),修复变长条目撑爆面板 - 大文件截断改按 rune 边界回退,修复中文内容尾部乱码 - 补视口与截断边界测试
This commit is contained in:
+18
-6
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user