74 lines
1.6 KiB
Go
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
|
|
}
|