diff --git a/conf/wide.go b/conf/wide.go index ce361a8..a316f31 100644 --- a/conf/wide.go +++ b/conf/wide.go @@ -36,6 +36,7 @@ type User struct { Password string Workspace string // 该用户的工作空间 GOPATH 路径 Locale string + GoFormat string LatestSessionContent *LatestSessionContent } @@ -131,11 +132,23 @@ func (c *conf) GetWorkspace() string { return filepath.FromSlash(strings.Replace(c.Workspace, "{pwd}", c.Pwd, 1)) } -// 获取 user 的工作空间路径. -func (user *User) getWorkspace() string { - ret := strings.Replace(user.Workspace, "{pwd}", Wide.Pwd, 1) +// 获取 username 指定的用户的 Go 源码格式化工具路径,查找不到时返回 "gofmt". +func (c *conf) GetGoFmt(username string) string { + for _, user := range c.Users { + if user.Name == username { + switch user.GoFormat { + case "gofmt": + return "gofmt" + case "goimports": + return c.GetExecutableInGOBIN("goimports") + default: + glog.Errorf("Unsupported Go Format tool [%s]", user.GoFormat) + return "gofmt" + } + } + } - return filepath.FromSlash(ret) + return "gofmt" } // 获取 username 指定的用户配置. diff --git a/conf/wide.json b/conf/wide.json index 93697ff..b2563b6 100644 --- a/conf/wide.json +++ b/conf/wide.json @@ -18,6 +18,7 @@ "Password": "admin", "Workspace": "{pwd}/data/user_workspaces/admin", "Locale": "zh_CN", + "GoFormat": "gofmt", "LatestSessionContent": { "FileTree": [], "Files": [], diff --git a/editor/formatter.go b/editor/formatter.go index ab49bd2..cf4be1c 100644 --- a/editor/formatter.go +++ b/editor/formatter.go @@ -10,22 +10,25 @@ import ( "github.com/88250/gohtml" "github.com/b3log/wide/conf" + "github.com/b3log/wide/session" "github.com/b3log/wide/util" "github.com/golang/glog" ) -// TODO: 加入 goimports 格式化 Go 源码文件 - -// gofmt 格式化 Go 源码文件. +// 格式化 Go 源码文件. +// 根据用户的 GoFormat 配置选择格式化工具: +// 1. gofmt +// 2. goimports func GoFmtHandler(w http.ResponseWriter, r *http.Request) { data := map[string]interface{}{"succ": true} defer util.RetJSON(w, r, data) - decoder := json.NewDecoder(r.Body) + session, _ := session.HTTPSession.Get(r, "wide-session") + username := session.Values["username"].(string) var args map[string]interface{} - if err := decoder.Decode(&args); err != nil { + if err := json.NewDecoder(r.Body).Decode(&args); err != nil { glog.Error(err) data["succ"] = false @@ -59,8 +62,10 @@ func GoFmtHandler(w http.ResponseWriter, r *http.Request) { return } + fmt := conf.Wide.GetGoFmt(username) + argv := []string{filePath} - cmd := exec.Command("gofmt", argv...) + cmd := exec.Command(fmt, argv...) bytes, _ := cmd.Output() output := string(bytes)