sdaduanbilei 8cb4e041c8 fix
2026-03-09 17:38:43 +08:00

74 lines
1.6 KiB
Go

package prompt
import (
"embed"
"os"
"path/filepath"
"strings"
)
//go:embed templates/*.md
var defaultTemplates embed.FS
// Engine 提示词模板引擎,支持变量替换
type Engine struct {
templates map[string]string // name -> template content
}
// New 从内嵌默认模板创建引擎
func New() *Engine {
e := &Engine{templates: make(map[string]string)}
entries, _ := defaultTemplates.ReadDir("templates")
for _, entry := range entries {
if entry.IsDir() {
continue
}
name := strings.TrimSuffix(entry.Name(), ".md")
data, _ := defaultTemplates.ReadFile("templates/" + entry.Name())
e.templates[name] = string(data)
}
return e
}
// LoadOverrides 从外部目录加载模板覆盖默认值
func (e *Engine) LoadOverrides(dir string) {
entries, err := os.ReadDir(dir)
if err != nil {
return
}
for _, entry := range entries {
if entry.IsDir() || !strings.HasSuffix(entry.Name(), ".md") {
continue
}
name := strings.TrimSuffix(entry.Name(), ".md")
data, err := os.ReadFile(filepath.Join(dir, entry.Name()))
if err == nil {
e.templates[name] = string(data)
}
}
}
// Render 渲染模板,用 vars 替换 {{.Key}} 占位符
func (e *Engine) Render(name string, vars map[string]string) string {
tmpl, ok := e.templates[name]
if !ok {
return ""
}
result := tmpl
for k, v := range vars {
result = strings.ReplaceAll(result, "{{."+k+"}}", v)
}
return result
}
// R 简写渲染,无变量
func (e *Engine) R(name string) string {
return e.Render(name, nil)
}
// Has 检查模板是否存在
func (e *Engine) Has(name string) bool {
_, ok := e.templates[name]
return ok
}