diff --git a/kernel/api/router.go b/kernel/api/router.go index f71f1bb1c..5c7db0d5b 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -278,4 +278,6 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/notification/pushMsg", model.CheckAuth, pushMsg) ginServer.Handle("POST", "/api/notification/pushErrMsg", model.CheckAuth, pushErrMsg) + + ginServer.Handle("POST", "/api/snippet/getSnippet", model.CheckAuth, getSnippet) } diff --git a/kernel/api/snippet.go b/kernel/api/snippet.go new file mode 100644 index 000000000..315a1b39e --- /dev/null +++ b/kernel/api/snippet.go @@ -0,0 +1,55 @@ +// SiYuan - Build Your Eternal Digital Garden +// Copyright (c) 2020-present, b3log.org +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package api + +import ( + "net/http" + + "github.com/88250/gulu" + "github.com/gin-gonic/gin" + "github.com/siyuan-note/siyuan/kernel/conf" + "github.com/siyuan-note/siyuan/kernel/model" + "github.com/siyuan-note/siyuan/kernel/util" +) + +func getSnippet(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + typ := arg["type"].(string) + enabledArg := int(arg["enabled"].(float64)) // 0:禁用,1:启用,2:全部 + enabled := true + if 0 == enabledArg { + enabled = false + } + + var snippets []*conf.Snippet + for _, s := range model.Snippets { + if ("all" == typ || s.Type == typ) && (2 == enabledArg || s.Enabled == enabled) { + snippets = append(snippets, s) + } + } + + ret.Data = map[string]interface{}{ + "snippets": snippets, + } +} diff --git a/kernel/conf/snippet.go b/kernel/conf/snippet.go new file mode 100644 index 000000000..05295f5b4 --- /dev/null +++ b/kernel/conf/snippet.go @@ -0,0 +1,25 @@ +// SiYuan - Build Your Eternal Digital Garden +// Copyright (c) 2020-present, b3log.org +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package conf + +type Snippet struct { + Name string `json:"name"` + Memo string `json:"memo"` + Type string `json:"type"` // js/css + Enabled bool `json:"enabled"` + Content string `json:"content"` +} diff --git a/kernel/model/conf.go b/kernel/model/conf.go index cf6235d4d..b2f614785 100644 --- a/kernel/model/conf.go +++ b/kernel/model/conf.go @@ -58,11 +58,11 @@ type AppConf struct { UserData string `json:"userData"` // 社区用户信息,对 User 加密存储 User *conf.User `json:"-"` // 社区用户内存结构,不持久化 Account *conf.Account `json:"account"` // 帐号配置 - ReadOnly bool `json:"readonly"` // 是否是只读 + ReadOnly bool `json:"readonly"` // 是否是以只读模式运行 LocalIPs []string `json:"localIPs"` // 本地 IP 列表 AccessAuthCode string `json:"accessAuthCode"` // 访问授权码 - System *conf.System `json:"system"` // 系统 - Keymap *conf.Keymap `json:"keymap"` // 快捷键 + System *conf.System `json:"system"` // 系统配置 + Keymap *conf.Keymap `json:"keymap"` // 快捷键配置 Sync *conf.Sync `json:"sync"` // 同步配置 Search *conf.Search `json:"search"` // 搜索配置 Stat *conf.Stat `json:"stat"` // 统计 @@ -285,6 +285,7 @@ func InitConf() { } util.SetNetworkProxy(Conf.System.NetworkProxy.String()) + loadSnippets() } var langs = map[string]map[int]string{} @@ -659,3 +660,50 @@ func clearWorkspaceTemp() { logging.LogInfof("cleared workspace temp") } + +var Snippets []*conf.Snippet // js/css 代码片段配置 + +func loadSnippets() { + Snippets = []*conf.Snippet{} + + jsonPath := filepath.Join(util.DataDir, "snippets/js.json") + var data []byte + var err error + + if gulu.File.IsExist(jsonPath) { + data, err = filelock.ReadFile(jsonPath) + if nil != err { + logging.LogErrorf("load js snippets failed: %s", err) + } else { + var jsSnippets []*conf.Snippet + if err = gulu.JSON.UnmarshalJSON(data, &jsSnippets); nil != err { + logging.LogErrorf("unmarshal js snippets failed: %s", err) + } else { + if count := len(jsSnippets); 0 < count { + Snippets = append(Snippets, jsSnippets...) + logging.LogInfof("loaded js snippets [%d]", count) + } + } + } + } + + jsonPath = filepath.Join(util.DataDir, "snippets/css.json") + if gulu.File.IsExist(jsonPath) { + data, err = filelock.ReadFile(jsonPath) + + if nil != err { + logging.LogErrorf("load css snippets failed: %s", err) + } else { + var cssSnippets []*conf.Snippet + if err = gulu.JSON.UnmarshalJSON(data, &cssSnippets); nil != err { + logging.LogErrorf("unmarshal css snippets failed: %s", err) + } else { + if count := len(cssSnippets); 0 < count { + Snippets = append(Snippets, cssSnippets...) + logging.LogInfof("loaded css snippets [%d]", count) + } + } + } + } + return +}