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
+}