From 5c95e9870a372116a65c9ac85790d28fe7b2acc4 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Mon, 9 Jun 2025 22:10:05 +0800 Subject: [PATCH] :art: Database gallery view https://github.com/siyuan-note/siyuan/issues/10414 --- kernel/av/layout_gallery.go | 3 ++- kernel/sql/av_gallery.go | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/kernel/av/layout_gallery.go b/kernel/av/layout_gallery.go index cd6a48e40..762441614 100644 --- a/kernel/av/layout_gallery.go +++ b/kernel/av/layout_gallery.go @@ -72,7 +72,8 @@ type GalleryCard struct { ID string `json:"id"` // 卡片 ID Values []*GalleryFieldValue `json:"values"` // 卡片字段值 - CoverURL string `json:"coverURL"` // 卡片封面超链接 + CoverURL string `json:"coverURL"` // 卡片封面超链接 + CoverContent string `json:"coverContent"` // 卡片封面文本内容 } // GalleryField 描述了画廊实例卡片字段的结构。 diff --git a/kernel/sql/av_gallery.go b/kernel/sql/av_gallery.go index 35136d797..8393668ff 100644 --- a/kernel/sql/av_gallery.go +++ b/kernel/sql/av_gallery.go @@ -6,7 +6,10 @@ import ( "strings" "time" + "github.com/88250/lute" "github.com/88250/lute/ast" + "github.com/88250/lute/parse" + "github.com/88250/lute/render" "github.com/siyuan-note/siyuan/kernel/av" "github.com/siyuan-note/siyuan/kernel/treenode" "github.com/siyuan-note/siyuan/kernel/util" @@ -153,7 +156,7 @@ func RenderAttributeViewGallery(attrView *av.AttributeView, view *av.View, query galleryCard.Values = append(galleryCard.Values, fieldValue) } - fillGalleryCardCover(attrView, view, cardValues, galleryCard, cardID) + fillGalleryCardCover(attrView, view, cardValues, galleryCard, cardID, luteEngine) ret.Cards = append(ret.Cards, &galleryCard) } @@ -391,7 +394,7 @@ func RenderAttributeViewGallery(attrView *av.AttributeView, view *av.View, query return } -func fillGalleryCardCover(attrView *av.AttributeView, view *av.View, cardValues []*av.KeyValues, galleryCard av.GalleryCard, cardID string) { +func fillGalleryCardCover(attrView *av.AttributeView, view *av.View, cardValues []*av.KeyValues, galleryCard av.GalleryCard, cardID string, luteEngine *lute.Lute) { switch view.Gallery.CoverFrom { case av.CoverFromNone: case av.CoverFromContentImage: @@ -429,6 +432,16 @@ func fillGalleryCardCover(attrView *av.AttributeView, view *av.View, cardValues galleryCard.CoverURL = dest.TokensStr() return ast.WalkStop }) + + if "" == galleryCard.CoverURL { + if ast.NodeDocument == node.Type { + galleryCard.CoverContent = node.IALAttr("title") + return + } + + galleryCard.CoverContent = renderBlockDOMByNode(node, luteEngine) + return + } } case av.CoverFromAssetField: if "" == view.Gallery.CoverFromAssetKeyID { @@ -441,5 +454,20 @@ func fillGalleryCardCover(attrView *av.AttributeView, view *av.View, cardValues } galleryCard.CoverURL = assetValue.MAsset[0].Content + return } } + +func renderBlockDOMByNode(node *ast.Node, luteEngine *lute.Lute) string { + tree := &parse.Tree{Root: &ast.Node{Type: ast.NodeDocument}, Context: &parse.Context{ParseOption: luteEngine.ParseOptions}} + blockRenderer := render.NewProtyleRenderer(tree, luteEngine.RenderOptions) + ast.Walk(node, func(node *ast.Node, entering bool) ast.WalkStatus { + rendererFunc := blockRenderer.RendererFuncs[node.Type] + return rendererFunc(node, entering) + }) + h := strings.TrimSpace(blockRenderer.Writer.String()) + if strings.HasPrefix(h, "