diff --git a/kernel/av/layout_gallery.go b/kernel/av/layout_gallery.go index 1fc42ab37..885ddb585 100644 --- a/kernel/av/layout_gallery.go +++ b/kernel/av/layout_gallery.go @@ -77,6 +77,7 @@ const ( CoverFromNone CoverFrom = iota // 无封面 CoverFromContentImage // 内容图 CoverFromAssetField // 资源字段 + CoverFromContentBlock // 内容块 ) // ViewGalleryCardField 描述了画廊卡片字段的结构。 diff --git a/kernel/sql/av_gallery.go b/kernel/sql/av_gallery.go index 51bd4229f..d9b494b5e 100644 --- a/kernel/sql/av_gallery.go +++ b/kernel/sql/av_gallery.go @@ -195,19 +195,7 @@ func fillAttributeViewGalleryCardCover(attrView *av.AttributeView, view *av.View }) if "" == galleryCard.CoverURL { - isDoc := ast.NodeDocument == node.Type - if isDoc { - node = node.FirstChild - } - - buf := bytes.Buffer{} - for c := node; nil != c; c = c.Next { - buf.WriteString(renderBlockDOMByNode(c, luteEngine)) - if !isDoc || 1024*4 < buf.Len() { - break - } - } - galleryCard.CoverContent = buf.String() + galleryCard.CoverContent = renderCoverContentBlock(node, luteEngine) return } case av.CoverFromAssetField: @@ -222,9 +210,40 @@ func fillAttributeViewGalleryCardCover(attrView *av.AttributeView, view *av.View galleryCard.CoverURL = assetValue.MAsset[0].Content return + case av.CoverFromContentBlock: + blockValue := getBlockValue(cardValues) + if blockValue.IsDetached { + break + } + + tree := trees[blockValue.BlockID] + if nil == tree { + break + } + node := treenode.GetNodeInTree(tree, blockValue.BlockID) + if nil == node { + break + } + galleryCard.CoverContent = renderCoverContentBlock(node, luteEngine) } } +func renderCoverContentBlock(node *ast.Node, luteEngine *lute.Lute) string { + isDoc := ast.NodeDocument == node.Type + if isDoc { + node = node.FirstChild + } + + buf := bytes.Buffer{} + for c := node; nil != c; c = c.Next { + buf.WriteString(renderBlockDOMByNode(c, luteEngine)) + if !isDoc || 1024*4 < buf.Len() { + break + } + } + return buf.String() +} + 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)