package gourl import ( "fmt" "os" aw "github.com/deanishe/awgo" "gopkg.in/yaml.v3" "gitea.micah.wiki/pandora/alfred/model" "gitea.micah.wiki/pandora/alfred/pkg/logx" "gitea.micah.wiki/pandora/alfred/pkg/stringx" ) func getDefault() map[string][]*URLInfo { return map[string][]*URLInfo{ "github": {{ Key: "github", Title: "Github", URL: "https://github.com/", }}, "doubao": {{ Key: "doubao", Title: "豆包", URL: "https://www.doubao.com/chat", }}, } } func Do(args []string) []*model.Item { if len(args) == 0 { return nil } logx.Info("gourl: %s", args[0]) urlMap := GetConfig() if len(urlMap) == 0 { logx.Info("配置文件未找到") urlMap = getDefault() } if urls, ok := urlMap[args[0]]; ok { logx.Info("go value: %+v", urls) items := make([]*model.Item, 0) if len(urls) > 0 { for _, v := range urls { items = append(items, &model.Item{ Title: fmt.Sprintf("回车 → 在浏览器打开 %s", v.Title), Subtitle: stringx.NewStrPoint(v.URL), UID: stringx.NewStrPoint("gourl-open-url"), Arg: []string{"goto", v.URL}, Valid: true, Icon: aw.IconNetwork, }) } } return items } gotoConfigFile := os.Getenv("goto_config") return []*model.Item{ { Title: fmt.Sprintf("未找到 %s 相关跳转url配置", args[0]), Subtitle: stringx.NewStrPoint(fmt.Sprintf("配置地址: %s", gotoConfigFile)), UID: stringx.NewStrPoint("gourl-open-url"), Arg: []string{"copytext", gotoConfigFile}, Valid: true, Icon: aw.IconNetwork, }, } } type URLInfo struct { Key string `yaml:"key"` Title string `yaml:"title"` URL string `yaml:"url"` } type Config struct { GoToConfig map[string][]*URLInfo `yaml:"goto_config"` } func GetConfig() map[string][]*URLInfo { logx.Info("GetConfig start.") cfgFile := os.Getenv("goto_config") if cfgFile == "" { logx.Info("读取配置文件为空") return getDefault() } logx.Info(cfgFile) // 读取配置文件内容 data, err := os.ReadFile(cfgFile) if err != nil { logx.Info("读取配置文件失败: %v", err) return getDefault() } // 解析 YAML 到结构体 var cfg Config if err = yaml.Unmarshal(data, &cfg); err != nil { logx.Info("解析 YAML 失败: %v", err) return getDefault() } if len(cfg.GoToConfig) == 0 { logx.Info("读取配置文件未找到数据") return getDefault() } c := make(map[string][]*URLInfo) for _, list := range cfg.GoToConfig { for _, info := range list { for i := 1; i <= len(info.Key); i++ { key := info.Key[:i] v, ok := c[key] if !ok { v = make([]*URLInfo, 0) } v = append(v, info) c[key] = v } } } logx.Info("config size: ", len(c)) return c }