From d647335d6e132f197ccf3b52d87672123f5107f5 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Wed, 29 Nov 2023 09:44:48 +0800 Subject: [PATCH 1/3] :arrow_up: Upgrade kernel deps --- kernel/go.mod | 6 +++--- kernel/go.sum | 20 ++++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/kernel/go.mod b/kernel/go.mod index c31195a4f..1e2471150 100644 --- a/kernel/go.mod +++ b/kernel/go.mod @@ -38,7 +38,7 @@ require ( github.com/imroc/req/v3 v3.42.2 github.com/jinzhu/copier v0.4.0 github.com/json-iterator/go v1.1.12 - github.com/klippa-app/go-pdfium v1.8.2 + github.com/klippa-app/go-pdfium v1.9.0 github.com/mattn/go-sqlite3 v2.0.3+incompatible github.com/mitchellh/go-ps v1.0.0 github.com/mssola/useragent v1.0.0 @@ -78,7 +78,7 @@ require ( github.com/andybalholm/brotli v1.0.6 // indirect github.com/andybalholm/cascadia v1.3.2 // indirect github.com/asaskevich/EventBus v0.0.0-20200907212545-49d423059eef // indirect - github.com/aws/aws-sdk-go v1.48.6 // indirect + github.com/aws/aws-sdk-go v1.48.7 // indirect github.com/bytedance/sonic v1.10.2 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect @@ -143,7 +143,7 @@ require ( github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/shopspring/decimal v1.3.1 // indirect - github.com/spf13/cast v1.5.1 // indirect + github.com/spf13/cast v1.6.0 // indirect github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect github.com/tetratelabs/wazero v1.5.0 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect diff --git a/kernel/go.sum b/kernel/go.sum index fdc38c3fb..b7cc095d3 100644 --- a/kernel/go.sum +++ b/kernel/go.sum @@ -49,8 +49,8 @@ github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhP github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= github.com/asaskevich/EventBus v0.0.0-20200907212545-49d423059eef h1:2JGTg6JapxP9/R33ZaagQtAM4EkkSYnIAlOG5EI8gkM= github.com/asaskevich/EventBus v0.0.0-20200907212545-49d423059eef/go.mod h1:JS7hed4L1fj0hXcyEejnW57/7LCetXggd+vwrRnYeII= -github.com/aws/aws-sdk-go v1.48.6 h1:hnL/TE3eRigirDLrdRE9AWE1ALZSVLAsC4wK8TGsMqk= -github.com/aws/aws-sdk-go v1.48.6/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.48.7 h1:gDcOhmkohlNk20j0uWpko5cLBbwSkB+xpkshQO45F7Y= +github.com/aws/aws-sdk-go v1.48.7/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= github.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE= @@ -98,8 +98,8 @@ github.com/flopp/go-findfont v0.1.0 h1:lPn0BymDUtJo+ZkV01VS3661HL6F4qFlkhcJN55u6 github.com/flopp/go-findfont v0.1.0/go.mod h1:wKKxRDjD024Rh7VMwoU90i6ikQRCr+JTHB5n4Ejkqvw= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= @@ -229,8 +229,8 @@ github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgo github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/klippa-app/go-pdfium v1.8.2 h1:Iny6xfgeCskVwgeeByHpQELVelKGsDJRRuLENg0h11E= -github.com/klippa-app/go-pdfium v1.8.2/go.mod h1:/2rpgzjQbsqJm3+eeA3S1ziPHN+APRu/ipphM6zTO20= +github.com/klippa-app/go-pdfium v1.9.0 h1:kSRMwOLG7KqqqPrbAIL/PaowvUrEB97Mh8nBa0pvsTM= +github.com/klippa-app/go-pdfium v1.9.0/go.mod h1:Ud221yon8qJS/cfkUtzVb3iOoTs/PPo/1v3edMqTn/w= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -282,8 +282,8 @@ github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo/v2 v2.13.1 h1:LNGfMbR2OVGBfXjvRZIZ2YCTQdGKtPLvuI1rMCCj3OU= github.com/onsi/ginkgo/v2 v2.13.1/go.mod h1:XStQ8QcGwLyF4HdfcZB8SFOS/MWCgDuXMSBe6zrvLgM= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/open-spaced-repetition/go-fsrs v1.1.0 h1:0oqIRdLrfuI/PkXr6NikcIrNqnPxFzObJK6mZpuSfIs= github.com/open-spaced-repetition/go-fsrs v1.1.0/go.mod h1:WpbNs4TTKZChOHFO+ME0B9femUVZsepFT5mhAioszRg= github.com/otiai10/gosseract/v2 v2.4.1 h1:G8AyBpXEeSlcq8TI85LH/pM5SXk8Djy2GEXisgyblRw= @@ -375,8 +375,8 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1 github.com/smartystreets/goconvey v1.6.7 h1:I6tZjLXD2Q1kjvNbIzB1wvQBsXmKXiVrhpRE8ZjP5jY= github.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf h1:pvbZ0lM0XWPBqUKqFU8cmavspvIl9nulOYwdy6IFRRo= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM= github.com/steambap/captcha v1.4.1 h1:OmMdxLCWCqJvsFaFYwRpvMckIuvI6s8s1LsBrBw97P0= From a8625ca27d7eb32aecaa7bd33fc4db97ba61ea69 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Wed, 29 Nov 2023 10:07:52 +0800 Subject: [PATCH 2/3] :art: Automatically download network assets when the cloud inbox is moved to docs https://github.com/siyuan-note/siyuan/issues/9775 --- app/appearance/langs/en_US.json | 4 +- app/appearance/langs/es_ES.json | 4 +- app/appearance/langs/fr_FR.json | 4 +- app/appearance/langs/zh_CHT.json | 4 +- app/appearance/langs/zh_CN.json | 4 +- kernel/api/format.go | 19 ++++ kernel/api/router.go | 1 + kernel/model/assets.go | 158 +++++++++++++++++++++++++++++++ 8 files changed, 188 insertions(+), 10 deletions(-) diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json index ac1f404ab..43988e20a 100644 --- a/app/appearance/langs/en_US.json +++ b/app/appearance/langs/en_US.json @@ -1235,9 +1235,9 @@ "116": "Processing, please wait...", "117": "[%s] is not a valid Pandoc executable", "118": "The current settings do not allow the creation of sub-documents under a document 7 levels deep", - "119": "Downloading web image [%s]", + "119": "Downloading network file [%s]", "120": "Download complete, [%d] files total", - "121": "There is no network image in this document", + "121": "There is no network file in this document", "122": "This function needs to be configured on the SiYuan desktop. If you have already configured it, please refresh it in the top account settings", "123": "The synchronization function can only be activated after adding/selecting the cloud synchronization directory", "124": "Please enable cloud sync in [Settings - Enable Cloud Sync]", diff --git a/app/appearance/langs/es_ES.json b/app/appearance/langs/es_ES.json index ef3d6ea9a..7add10a26 100644 --- a/app/appearance/langs/es_ES.json +++ b/app/appearance/langs/es_ES.json @@ -1235,9 +1235,9 @@ "116": "Procesando, por favor espere...", "117": "[%s] no es un ejecutable válido de Pandoc", "118": "La configuración actual no permite la creación de subdocumentos bajo un documento de 7 niveles de profundidad", - "119": "Descargando imagen web [%s]", + "119": "Descargando archivo de red [%s]", "120": "Descarga completa, [%d] archivos en total", - "121": "No hay ninguna imagen de red en este documento", + "121": "No hay ningún archivo de red en este documento", "122": "Esta funci\u00f3n debe configurarse en el escritorio de SiYuan. Si ya la configur\u00f3, actualice en la configuraci\u00f3n de la cuenta superior", "123": "La función de sincronización solo puede activarse después de añadir/seleccionar el directorio de sincronización en la nube", "124": "Por favor, active la sincronización en la nube en [Configuración - Activar sincronización en la nube]", diff --git a/app/appearance/langs/fr_FR.json b/app/appearance/langs/fr_FR.json index 9277f209e..699f5d457 100644 --- a/app/appearance/langs/fr_FR.json +++ b/app/appearance/langs/fr_FR.json @@ -1235,9 +1235,9 @@ "116": "Traitement en cours, veuillez patienter...", "117": "[%s] n'est pas un exécutable Pandoc valide", "118": "Les paramètres actuels ne permettent pas la création de sous-documents sous un document de 7 niveaux de profondeur", - "119": "Téléchargement de l'image Web [%s]", + "119": "Téléchargement du fichier réseau [%s]", "120": "Téléchargement terminé, [%d] fichiers au total", - "121": "Il n'y a pas d'image réseau dans ce document", + "121": "Il n'y a aucun fichier réseau dans ce document", "122": "Cette fonction doit être configurée sur le bureau SiYuan. Si vous l'avez déjà configurée, veuillez l'actualiser dans les paramètres supérieurs du compte", "123": "Ajouter/sélectionner un répertoire de synchronisation Cloud avant d'activer la synchronisation", "124": "Veuillez activer la synchronisation cloud dans [Paramètres - Activer la synchronisation cloud]", diff --git a/app/appearance/langs/zh_CHT.json b/app/appearance/langs/zh_CHT.json index 3f09953fe..0b75f3e30 100644 --- a/app/appearance/langs/zh_CHT.json +++ b/app/appearance/langs/zh_CHT.json @@ -1235,10 +1235,10 @@ "116": "正在處理中,請稍等...", "117": "[%s] 不是有效的 Pandoc 可執行文件", "118": "當前設置不允許在 7 層深度的文檔下建立子文檔", - "119": "正在下載網絡圖片 [%s]", + "119": "正在下載網路檔案 [%s]", "120": "下載完畢,一共 [%d] 個文件", "122": "該功能需在思源桌面端進行配置。如果你已經配置,請在頂部賬號設置中進行重新整理", - "121": "該文檔中不存在網絡圖片", + "121": "該文件中不存在網路檔案", "123": "新增/選擇雲端同步目錄後才能啟用同步功能", "124": "請在 [設置 - 啟用雲端同步] 中開啟雲端同步", "125": "自動同步失敗次數過多,請嘗試手動觸發同步,如果還有問題請反饋", diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json index 10b645f60..72ad87541 100644 --- a/app/appearance/langs/zh_CN.json +++ b/app/appearance/langs/zh_CN.json @@ -1235,9 +1235,9 @@ "116": "正在处理中,请稍等...", "117": "[%s] 不是有效的 Pandoc 可执行文件", "118": "当前设置不允许在 7 层深度的文档下创建子文档", - "119": "正在下载网络图片 [%s]", + "119": "正在下载网络文件 [%s]", "120": "下载完毕,一共 [%d] 个文件", - "121": "该文档中不存在网络图片", + "121": "该文档中不存在网络文件", "122": "该功能需在思源桌面端进行配置。如果你已经配置,请在顶部账号设置中进行刷新", "123": "添加/选择云端同步目录后才能启用同步功能", "124": "请在 [设置 - 启用云端同步] 中开启云端同步", diff --git a/kernel/api/format.go b/kernel/api/format.go index e234a4938..dcc54c449 100644 --- a/kernel/api/format.go +++ b/kernel/api/format.go @@ -25,6 +25,25 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) +func netAssets2LocalAssets(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + id := arg["id"].(string) + err := model.NetAssets2LocalAssets(id) + if nil != err { + ret.Code = -1 + ret.Msg = err.Error() + ret.Data = map[string]interface{}{"closeTimeout": 5000} + return + } +} + func netImg2LocalAssets(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) diff --git a/kernel/api/router.go b/kernel/api/router.go index d6a2cf2a4..4ee8ae1ac 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -116,6 +116,7 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/format/autoSpace", model.CheckAuth, model.CheckReadonly, autoSpace) ginServer.Handle("POST", "/api/format/netImg2LocalAssets", model.CheckAuth, model.CheckReadonly, netImg2LocalAssets) + ginServer.Handle("POST", "/api/format/netAssets2LocalAssets", model.CheckAuth, model.CheckReadonly, netAssets2LocalAssets) ginServer.Handle("POST", "/api/history/getNotebookHistory", model.CheckAuth, getNotebookHistory) ginServer.Handle("POST", "/api/history/rollbackNotebookHistory", model.CheckAuth, model.CheckReadonly, rollbackNotebookHistory) diff --git a/kernel/model/assets.go b/kernel/model/assets.go index 89ebf1810..8dee9e5fc 100644 --- a/kernel/model/assets.go +++ b/kernel/model/assets.go @@ -220,6 +220,164 @@ func NetImg2LocalAssets(rootID, originalURL string) (err error) { return } +func NetAssets2LocalAssets(rootID string) (err error) { + tree, err := loadTreeByBlockID(rootID) + if nil != err { + return + } + + var files int + msgId := gulu.Rand.String(7) + + docDirLocalPath := filepath.Join(util.DataDir, tree.Box, path.Dir(tree.Path)) + assetsDirPath := getAssetsDir(filepath.Join(util.DataDir, tree.Box), docDirLocalPath) + if !gulu.File.IsExist(assetsDirPath) { + if err = os.MkdirAll(assetsDirPath, 0755); nil != err { + return + } + } + + browserClient := req.C(). + SetUserAgent(util.UserAgent). + SetTimeout(30 * time.Second). + EnableInsecureSkipVerify(). + SetProxy(httpclient.ProxyFromEnvironment) + + ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus { + if !entering || (ast.NodeLinkDest != n.Type && !n.IsTextMarkType("a")) { + return ast.WalkContinue + } + + var dest []byte + if ast.NodeLinkDest == n.Type { + dest = n.Tokens + } else { + dest = []byte(n.TextMarkAHref) + } + + if util.IsAssetLinkDest(dest) { + return ast.WalkContinue + } + + if bytes.HasPrefix(bytes.ToLower(dest), []byte("file://")) { // 处理本地文件链接 + u := string(dest)[7:] + if !gulu.File.IsExist(u) || gulu.File.IsDir(u) { + return ast.WalkContinue + } + + name := filepath.Base(u) + name = util.FilterFileName(name) + name = util.TruncateLenFileName(name) + name = "network-asset-" + name + name = util.AssetName(name) + writePath := filepath.Join(assetsDirPath, name) + if err = filelock.Copy(u, writePath); nil != err { + logging.LogErrorf("copy [%s] to [%s] failed: %s", u, writePath, err) + return ast.WalkContinue + } + + if ast.NodeLinkDest == n.Type { + n.Tokens = []byte("assets/" + name) + } else { + n.TextMarkAHref = "assets/" + name + } + files++ + return ast.WalkContinue + } + + if bytes.HasPrefix(bytes.ToLower(dest), []byte("https://")) || bytes.HasPrefix(bytes.ToLower(dest), []byte("http://")) { + u := string(dest) + if strings.Contains(u, "qpic.cn") { + // 改进 `网络图片转换为本地图片` 微信图片拉取 https://github.com/siyuan-note/siyuan/issues/5052 + if strings.Contains(u, "http://") { + u = strings.Replace(u, "http://", "https://", 1) + } + + // 改进 `网络图片转换为本地图片` 微信图片拉取 https://github.com/siyuan-note/siyuan/issues/6431 + // 下面这部分需要注释掉,否则会导致响应 400 + //if strings.HasSuffix(u, "/0") { + // u = strings.Replace(u, "/0", "/640", 1) + //} else if strings.Contains(u, "/0?") { + // u = strings.Replace(u, "/0?", "/640?", 1) + //} + } + util.PushUpdateMsg(msgId, fmt.Sprintf(Conf.Language(119), u), 15000) + request := browserClient.R() + request.SetRetryCount(1).SetRetryFixedInterval(3 * time.Second) + resp, reqErr := request.Get(u) + if nil != reqErr { + logging.LogErrorf("download network asset [%s] failed: %s", u, reqErr) + return ast.WalkContinue + } + if 200 != resp.StatusCode { + logging.LogErrorf("download network asset [%s] failed: %d", u, resp.StatusCode) + return ast.WalkContinue + } + + if 1024*1024*96 < resp.ContentLength { + logging.LogWarnf("network asset [%s]' size [%s] is large then [96 MB], ignore it", u, humanize.IBytes(uint64(resp.ContentLength))) + return ast.WalkContinue + } + + data, repErr := resp.ToBytes() + if nil != repErr { + logging.LogErrorf("download network asset [%s] failed: %s", u, repErr) + return ast.WalkContinue + } + var name string + if strings.Contains(u, "?") { + name = u[:strings.Index(u, "?")] + name = path.Base(name) + } else { + name = path.Base(u) + } + if strings.Contains(name, "#") { + name = name[:strings.Index(name, "#")] + } + name, _ = url.PathUnescape(name) + ext := path.Ext(name) + if "" == ext { + if mtype := mimetype.Detect(data); nil != mtype { + ext = mtype.Extension() + } + } + if "" == ext { + contentType := resp.Header.Get("Content-Type") + exts, _ := mime.ExtensionsByType(contentType) + if 0 < len(exts) { + ext = exts[0] + } + } + name = strings.TrimSuffix(name, ext) + name = util.FilterFileName(name) + name = util.TruncateLenFileName(name) + name = "network-asset-" + name + "-" + ast.NewNodeID() + ext + writePath := filepath.Join(assetsDirPath, name) + if err = filelock.WriteFile(writePath, data); nil != err { + logging.LogErrorf("write downloaded network asset [%s] to local asset [%s] failed: %s", u, writePath, err) + return ast.WalkContinue + } + + if ast.NodeLinkDest == n.Type { + n.Tokens = []byte("assets/" + name) + } else { + n.TextMarkAHref = "assets/" + name + } + files++ + } + return ast.WalkContinue + }) + + if 0 < files { + util.PushUpdateMsg(msgId, Conf.Language(113), 7000) + if err = writeJSONQueue(tree); nil != err { + return + } + util.PushUpdateMsg(msgId, fmt.Sprintf(Conf.Language(120), files), 5000) + } + return +} + func SearchAssetsByName(keyword string, exts []string) (ret []*cache.Asset) { ret = []*cache.Asset{} From 35a2bf50ba67525719274e866b6ca9a5cbc8f392 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Wed, 29 Nov 2023 10:31:53 +0800 Subject: [PATCH 3/3] :memo: Update WeChat assistant notes --- .../20230808120348-hynr7og.sy | 64 ++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/app/guide/20210808180117-czj9bvb/20200812220555-lj3enxa/20230805222417-2lj3dvk/20230808120348-orm8sjf/20230808120348-hynr7og.sy b/app/guide/20210808180117-czj9bvb/20200812220555-lj3enxa/20230805222417-2lj3dvk/20230808120348-orm8sjf/20230808120348-hynr7og.sy index 764bf5487..ed4e143a4 100644 --- a/app/guide/20210808180117-czj9bvb/20200812220555-lj3enxa/20230805222417-2lj3dvk/20230808120348-orm8sjf/20230808120348-hynr7og.sy +++ b/app/guide/20210808180117-czj9bvb/20200812220555-lj3enxa/20230805222417-2lj3dvk/20230808120348-orm8sjf/20230808120348-hynr7og.sy @@ -5,7 +5,7 @@ "Properties": { "id": "20230808120348-hynr7og", "title": "收集箱", - "updated": "20230802115243" + "updated": "20231129102919" }, "Children": [ { @@ -383,6 +383,68 @@ } ] }, + { + "ID": "20231129102819-rqksxav", + "Type": "NodeParagraph", + "Properties": { + "id": "20231129102819-rqksxav", + "updated": "20231129102825" + }, + "Children": [ + { + "Type": "NodeText", + "Data": "​" + }, + { + "Type": "NodeTextMark", + "TextMarkType": "tag", + "TextMarkTextContent": "注意" + }, + { + "Type": "NodeText", + "Data": "​:" + } + ] + }, + { + "ID": "20231129102826-1m9j1ih", + "Type": "NodeList", + "ListData": {}, + "Properties": { + "id": "20231129102826-1m9j1ih", + "updated": "20231129102919" + }, + "Children": [ + { + "ID": "20231129102829-s580zzl", + "Type": "NodeListItem", + "ListData": { + "BulletChar": 42, + "Marker": "Kg==" + }, + "Properties": { + "id": "20231129102829-s580zzl", + "updated": "20231129102919" + }, + "Children": [ + { + "ID": "20231129102829-sux4bg1", + "Type": "NodeParagraph", + "Properties": { + "id": "20231129102829-sux4bg1", + "updated": "20231129102919" + }, + "Children": [ + { + "Type": "NodeText", + "Data": "仅限订阅会员使用,未订阅或者订阅过期后联系人关系会被删除" + } + ] + } + ] + } + ] + }, { "ID": "20230808120348-nr87lcz", "Type": "NodeHeading",