🎨 Upload asset files to cloud supports focus use https://github.com/siyuan-note/siyuan/issues/15462

This commit is contained in:
Daniel 2025-08-07 11:09:07 +08:00
parent 0d3a2479cb
commit 3fda003401
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
4 changed files with 35 additions and 27 deletions

View file

@ -363,7 +363,7 @@ ${padHTML}
click() { click() {
if (!needSubscribe()) { if (!needSubscribe()) {
confirmDialog("📦 " + window.siyuan.languages.uploadAssets2CDN, window.siyuan.languages.uploadAssets2CDNConfirmTip, () => { confirmDialog("📦 " + window.siyuan.languages.uploadAssets2CDN, window.siyuan.languages.uploadAssets2CDNConfirmTip, () => {
fetchPost("/api/asset/uploadCloud", {id: protyle.block.parentID}); fetchPost("/api/asset/uploadCloud", {id: protyle.block.id});
}); });
} }
} }

View file

@ -386,8 +386,8 @@ func uploadCloud(c *gin.Context) {
return return
} }
rootID := arg["id"].(string) id := arg["id"].(string)
count, err := model.UploadAssets2Cloud(rootID) count, err := model.UploadAssets2Cloud(id)
if err != nil { if err != nil {
ret.Code = -1 ret.Code = -1
ret.Msg = err.Error() ret.Msg = err.Error()

View file

@ -148,7 +148,7 @@ func DocAssets(rootID string) (ret []string, err error) {
return return
} }
ret = assetsLinkDestsInTree(tree) ret = getAssetsLinkDests(tree.Root)
return return
} }
@ -469,19 +469,32 @@ func GetAssetAbsPath(relativePath string) (ret string, err error) {
return "", errors.New(fmt.Sprintf(Conf.Language(12), relativePath)) return "", errors.New(fmt.Sprintf(Conf.Language(12), relativePath))
} }
func UploadAssets2Cloud(rootID string) (count int, err error) { func UploadAssets2Cloud(id string) (count int, err error) {
if !IsSubscriber() { if !IsSubscriber() {
return return
} }
tree, err := LoadTreeByBlockID(rootID) tree, err := LoadTreeByBlockID(id)
if err != nil { if err != nil {
return return
} }
assets := assetsLinkDestsInTree(tree) node := treenode.GetNodeInTree(tree, id)
embedAssets := assetsLinkDestsInQueryEmbedNodes(tree) if nil == node {
assets = append(assets, embedAssets...) err = ErrBlockNotFound
return
}
nodes := []*ast.Node{node}
if ast.NodeHeading == node.Type {
nodes = append(nodes, treenode.HeadingChildren(node)...)
}
var assets []string
for _, n := range nodes {
assets = append(assets, getAssetsLinkDests(n)...)
assets = append(assets, getQueryEmbedNodesAssetsLinkDests(n)...)
}
assets = gulu.Str.RemoveDuplicatedElem(assets) assets = gulu.Str.RemoveDuplicatedElem(assets)
count, err = uploadAssets2Cloud(assets, bizTypeUploadAssets) count, err = uploadAssets2Cloud(assets, bizTypeUploadAssets)
if err != nil { if err != nil {
@ -864,7 +877,7 @@ func UnusedAssets() (ret []string) {
trees = append(trees, tree) trees = append(trees, tree)
} }
for _, tree := range trees { for _, tree := range trees {
for _, d := range assetsLinkDestsInTree(tree) { for _, d := range getAssetsLinkDests(tree.Root) {
dests[d] = true dests[d] = true
} }
@ -1027,7 +1040,7 @@ func MissingAssets() (ret []string) {
trees = append(trees, tree) trees = append(trees, tree)
} }
for _, tree := range trees { for _, tree := range trees {
for _, d := range assetsLinkDestsInTree(tree) { for _, d := range getAssetsLinkDests(tree.Root) {
dests[d] = true dests[d] = true
} }
@ -1108,11 +1121,11 @@ func emojisInTree(tree *parse.Tree) (ret []string) {
return return
} }
func assetsLinkDestsInQueryEmbedNodes(tree *parse.Tree) (ret []string) { func getQueryEmbedNodesAssetsLinkDests(node *ast.Node) (ret []string) {
// The images in the embed blocks are not uploaded to the community hosting https://github.com/siyuan-note/siyuan/issues/10042 // The images in the embed blocks are not uploaded to the community hosting https://github.com/siyuan-note/siyuan/issues/10042
ret = []string{} ret = []string{}
ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus { ast.Walk(node, func(n *ast.Node, entering bool) ast.WalkStatus {
if !entering || ast.NodeBlockQueryEmbedScript != n.Type { if !entering || ast.NodeBlockQueryEmbedScript != n.Type {
return ast.WalkContinue return ast.WalkContinue
} }
@ -1131,7 +1144,7 @@ func assetsLinkDestsInQueryEmbedNodes(tree *parse.Tree) (ret []string) {
continue continue
} }
ret = append(ret, assetsLinkDestsInNode(embedNode)...) ret = append(ret, getAssetsLinkDests(embedNode)...)
} }
return ast.WalkContinue return ast.WalkContinue
}) })
@ -1139,12 +1152,7 @@ func assetsLinkDestsInQueryEmbedNodes(tree *parse.Tree) (ret []string) {
return return
} }
func assetsLinkDestsInTree(tree *parse.Tree) (ret []string) { func getAssetsLinkDests(node *ast.Node) (ret []string) {
ret = assetsLinkDestsInNode(tree.Root)
return
}
func assetsLinkDestsInNode(node *ast.Node) (ret []string) {
ret = []string{} ret = []string{}
ast.Walk(node, func(n *ast.Node, entering bool) ast.WalkStatus { ast.Walk(node, func(n *ast.Node, entering bool) ast.WalkStatus {
if n.IsBlock() { if n.IsBlock() {

View file

@ -218,8 +218,8 @@ func Export2Liandi(id string) (err error) {
return errors.New(Conf.Language(204)) return errors.New(Conf.Language(204))
} }
assets := assetsLinkDestsInTree(tree) assets := getAssetsLinkDests(tree.Root)
embedAssets := assetsLinkDestsInQueryEmbedNodes(tree) embedAssets := getQueryEmbedNodesAssetsLinkDests(tree.Root)
assets = append(assets, embedAssets...) assets = append(assets, embedAssets...)
assets = gulu.Str.RemoveDuplicatedElem(assets) assets = gulu.Str.RemoveDuplicatedElem(assets)
_, err = uploadAssets2Cloud(assets, bizTypeExport2Liandi) _, err = uploadAssets2Cloud(assets, bizTypeExport2Liandi)
@ -716,7 +716,7 @@ func ExportMarkdownHTML(id, savePath string, docx, merge bool) (name, dom string
return return
} }
assets := assetsLinkDestsInTree(tree) assets := getAssetsLinkDests(tree.Root)
for _, asset := range assets { for _, asset := range assets {
if strings.HasPrefix(asset, "assets/") { if strings.HasPrefix(asset, "assets/") {
if strings.Contains(asset, "?") { if strings.Contains(asset, "?") {
@ -879,7 +879,7 @@ func ExportHTML(id, savePath string, pdf, image, keepFold, merge bool) (name, do
return return
} }
assets := assetsLinkDestsInTree(tree) assets := getAssetsLinkDests(tree.Root)
for _, asset := range assets { for _, asset := range assets {
if strings.Contains(asset, "?") { if strings.Contains(asset, "?") {
asset = asset[:strings.LastIndex(asset, "?")] asset = asset[:strings.LastIndex(asset, "?")]
@ -1037,7 +1037,7 @@ func ProcessPDF(id, p string, merge, removeAssets, watermark bool) (err error) {
} }
var headings []*ast.Node var headings []*ast.Node
assetDests := assetsLinkDestsInTree(tree) assetDests := getAssetsLinkDests(tree.Root)
ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus { ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus {
if !entering { if !entering {
return ast.WalkContinue return ast.WalkContinue
@ -1741,7 +1741,7 @@ func exportSYZip(boxID, rootDirPath, baseFolderName string, docPaths []string) (
copiedAssets := hashset.New() copiedAssets := hashset.New()
for _, tree := range trees { for _, tree := range trees {
var assets []string var assets []string
assets = append(assets, assetsLinkDestsInTree(tree)...) assets = append(assets, getAssetsLinkDests(tree.Root)...)
titleImgPath := treenode.GetDocTitleImgPath(tree.Root) // Export .sy.zip doc title image is not exported https://github.com/siyuan-note/siyuan/issues/8748 titleImgPath := treenode.GetDocTitleImgPath(tree.Root) // Export .sy.zip doc title image is not exported https://github.com/siyuan-note/siyuan/issues/8748
if "" != titleImgPath { if "" != titleImgPath {
if util.IsAssetLinkDest([]byte(titleImgPath)) { if util.IsAssetLinkDest([]byte(titleImgPath)) {
@ -3183,7 +3183,7 @@ func exportPandocConvertZip(baseFolderName string, docPaths, defBlockIDs []strin
// 解析导出后的标准 Markdown汇总 assets // 解析导出后的标准 Markdown汇总 assets
tree = parse.Parse("", gulu.Str.ToBytes(md), luteEngine.ParseOptions) tree = parse.Parse("", gulu.Str.ToBytes(md), luteEngine.ParseOptions)
var assets []string var assets []string
assets = append(assets, assetsLinkDestsInTree(tree)...) assets = append(assets, getAssetsLinkDests(tree.Root)...)
for _, asset := range assets { for _, asset := range assets {
asset = string(html.DecodeDestination([]byte(asset))) asset = string(html.DecodeDestination([]byte(asset)))
if strings.Contains(asset, "?") { if strings.Contains(asset, "?") {