112 lines
1.9 KiB
Go
112 lines
1.9 KiB
Go
// 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
|
|
}
|