// Package internal 包含 hxclaw 的内部工具模块 // 提供配置管理、Markdown 渲染、输入读取等功能 package internal import ( "os" "strconv" "strings" "charm.land/glamour/v2" "github.com/charmbracelet/x/term" ) // RenderMarkdown 将 Markdown 文本渲染为终端友好的格式 // 支持通过配置或环境变量指定渲染主题和换行宽度 func RenderMarkdown(md string) string { if md == "" { return "" } style := getStyle() wrapWidth := getWrapWidth() r, err := glamour.NewTermRenderer( glamour.WithStandardStyle(style), glamour.WithWordWrap(wrapWidth), ) if err != nil { return md } defer r.Close() out, err := r.Render(md) if err != nil { return md } return out } func RenderParagraph(text string) string { if text == "" { return "" } text = strings.TrimRight(text, "\n") if text == "" { return "" } style := getStyle() wrapWidth := getWrapWidth() r, err := glamour.NewTermRenderer( glamour.WithStandardStyle(style), glamour.WithWordWrap(wrapWidth), ) if err != nil { return text } defer r.Close() out, err := r.Render(text) if err != nil { return text } return out } func getStyle() string { if cfg := GetProjectConfig(); cfg != nil { if cfg.Markdown.Theme != "" { return cfg.Markdown.Theme } } if s := os.Getenv("GLAMOUR_STYLE"); s != "" { return s } return "dark" } func getWrapWidth() int { if cfg := GetProjectConfig(); cfg != nil { if cfg.Markdown.LineWidth > 0 { return cfg.Markdown.LineWidth } if cfg.Markdown.LineWidth < 0 { return 0 } } if cols := os.Getenv("COLUMNS"); cols != "" { if w, err := strconv.Atoi(cols); err == nil && w > 0 { return w } } if cols := os.Getenv("LINES"); cols != "" { if w, err := strconv.Atoi(cols); err == nil && w > 0 { return w } } width, _, err := term.GetSize(0) if err != nil || width <= 0 { return 0 } return width }