From aabb85d8956256d061dcd986874001acd1ad12dd Mon Sep 17 00:00:00 2001
From: Daniel <845765@qq.com>
Date: Wed, 20 Aug 2025 19:02:55 +0800
Subject: [PATCH 1/4] :art: Parse `
` tags when pasting
https://github.com/siyuan-note/siyuan/issues/15464
---
kernel/model/import.go | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/kernel/model/import.go b/kernel/model/import.go
index 51c78876d..e00aac816 100644
--- a/kernel/model/import.go
+++ b/kernel/model/import.go
@@ -1374,6 +1374,15 @@ func htmlBlock2Inline(tree *parse.Tree) {
img.AppendChild(&ast.Node{Type: ast.NodeLinkTitle})
}
img.AppendChild(&ast.Node{Type: ast.NodeCloseParen})
+ if width := domAttrValue(htmlImg, "width"); "" != width {
+ if util2.IsDigit(width) {
+ width += "px"
+ }
+ style := "width: " + width + ";"
+ ial := &ast.Node{Type: ast.NodeKramdownSpanIAL, Tokens: parse.IAL2Tokens([][]string{{"style", style}})}
+ img.SetIALAttr("style", style)
+ img.InsertAfter(ial)
+ }
if nil != n.Parent && ast.NodeText == n.Type {
// 行级 HTML 会被解析为文本,所以这里要在父级段落前面插入,避免形成段落嵌套 https://github.com/siyuan-note/siyuan/issues/13080
From 752457b888194dbe1a646969cad08bc9dd02bdcf Mon Sep 17 00:00:00 2001
From: Daniel <845765@qq.com>
Date: Wed, 20 Aug 2025 19:34:19 +0800
Subject: [PATCH 2/4] :art: The database template field supports using other
template fields https://github.com/siyuan-note/siyuan/issues/15517
---
kernel/av/av.go | 23 ++++++++++++++++-------
kernel/sql/av.go | 2 +-
2 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/kernel/av/av.go b/kernel/av/av.go
index 17dcbff4e..e29ac5375 100644
--- a/kernel/av/av.go
+++ b/kernel/av/av.go
@@ -26,6 +26,7 @@ import (
"github.com/88250/gulu"
"github.com/88250/lute/ast"
+ "github.com/jinzhu/copier"
jsoniter "github.com/json-iterator/go"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/logging"
@@ -34,13 +35,14 @@ import (
// AttributeView 描述了属性视图的结构。
type AttributeView struct {
- Spec int `json:"spec"` // 格式版本
- ID string `json:"id"` // 属性视图 ID
- Name string `json:"name"` // 属性视图名称
- KeyValues []*KeyValues `json:"keyValues"` // 属性视图属性键值
- KeyIDs []string `json:"keyIDs"` // 属性视图属性键 ID,用于排序
- ViewID string `json:"viewID"` // 当前视图 ID
- Views []*View `json:"views"` // 视图
+ Spec int `json:"spec"` // 格式版本
+ ID string `json:"id"` // 属性视图 ID
+ Name string `json:"name"` // 属性视图名称
+ KeyValues []*KeyValues `json:"keyValues"` // 属性视图属性键值
+ OriginalKeyValues []*KeyValues `json:"-"` // 原始属性视图属性键值
+ KeyIDs []string `json:"keyIDs"` // 属性视图属性键 ID,用于排序
+ ViewID string `json:"viewID"` // 当前视图 ID
+ Views []*View `json:"views"` // 视图
}
// KeyValues 描述了属性视图属性键值列表的结构。
@@ -470,6 +472,13 @@ func ParseAttributeView(avID string) (ret *AttributeView, err error) {
return
}
}
+
+ ret.OriginalKeyValues = []*KeyValues{}
+ for _, keyValues := range ret.KeyValues {
+ cloned := &KeyValues{}
+ copier.CopyWithOption(cloned, keyValues, copier.Option{DeepCopy: true})
+ ret.OriginalKeyValues = append(ret.OriginalKeyValues, cloned)
+ }
return
}
diff --git a/kernel/sql/av.go b/kernel/sql/av.go
index 015377f50..2054acd15 100644
--- a/kernel/sql/av.go
+++ b/kernel/sql/av.go
@@ -249,7 +249,7 @@ func RenderTemplateField(ial map[string]string, keyValues []*av.KeyValues, tplCo
func generateAttrViewItems(attrView *av.AttributeView, view *av.View) (ret map[string][]*av.KeyValues) {
ret = map[string][]*av.KeyValues{}
- for _, keyValues := range attrView.KeyValues {
+ for _, keyValues := range attrView.OriginalKeyValues {
for _, val := range keyValues.Values {
values := ret[val.BlockID]
if nil == values {
From 8934856d75b6d48310c6ffcb1bf0b25e4a4ec5be Mon Sep 17 00:00:00 2001
From: Daniel <845765@qq.com>
Date: Wed, 20 Aug 2025 19:36:08 +0800
Subject: [PATCH 3/4] :art: Parse `
` tags when pasting
https://github.com/siyuan-note/siyuan/issues/15464
---
kernel/model/import.go | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/kernel/model/import.go b/kernel/model/import.go
index e00aac816..7ead15023 100644
--- a/kernel/model/import.go
+++ b/kernel/model/import.go
@@ -1382,6 +1382,14 @@ func htmlBlock2Inline(tree *parse.Tree) {
ial := &ast.Node{Type: ast.NodeKramdownSpanIAL, Tokens: parse.IAL2Tokens([][]string{{"style", style}})}
img.SetIALAttr("style", style)
img.InsertAfter(ial)
+ } else if height := domAttrValue(htmlImg, "height"); "" != height {
+ if util2.IsDigit(height) {
+ height += "px"
+ }
+ style := "height: " + height + ";"
+ ial := &ast.Node{Type: ast.NodeKramdownSpanIAL, Tokens: parse.IAL2Tokens([][]string{{"style", style}})}
+ img.SetIALAttr("style", style)
+ img.InsertAfter(ial)
}
if nil != n.Parent && ast.NodeText == n.Type {
From 916c00e714cf696e79a341c63cae56a79e11645c Mon Sep 17 00:00:00 2001
From: Daniel <845765@qq.com>
Date: Thu, 21 Aug 2025 09:55:11 +0800
Subject: [PATCH 4/4] :art: The database template field supports using other
template fields https://github.com/siyuan-note/siyuan/issues/15517
---
kernel/av/av.go | 23 +++++++----------------
kernel/sql/av.go | 18 +++++++++++++-----
kernel/sql/av_gallery.go | 2 +-
kernel/sql/av_table.go | 2 +-
4 files changed, 22 insertions(+), 23 deletions(-)
diff --git a/kernel/av/av.go b/kernel/av/av.go
index e29ac5375..17dcbff4e 100644
--- a/kernel/av/av.go
+++ b/kernel/av/av.go
@@ -26,7 +26,6 @@ import (
"github.com/88250/gulu"
"github.com/88250/lute/ast"
- "github.com/jinzhu/copier"
jsoniter "github.com/json-iterator/go"
"github.com/siyuan-note/filelock"
"github.com/siyuan-note/logging"
@@ -35,14 +34,13 @@ import (
// AttributeView 描述了属性视图的结构。
type AttributeView struct {
- Spec int `json:"spec"` // 格式版本
- ID string `json:"id"` // 属性视图 ID
- Name string `json:"name"` // 属性视图名称
- KeyValues []*KeyValues `json:"keyValues"` // 属性视图属性键值
- OriginalKeyValues []*KeyValues `json:"-"` // 原始属性视图属性键值
- KeyIDs []string `json:"keyIDs"` // 属性视图属性键 ID,用于排序
- ViewID string `json:"viewID"` // 当前视图 ID
- Views []*View `json:"views"` // 视图
+ Spec int `json:"spec"` // 格式版本
+ ID string `json:"id"` // 属性视图 ID
+ Name string `json:"name"` // 属性视图名称
+ KeyValues []*KeyValues `json:"keyValues"` // 属性视图属性键值
+ KeyIDs []string `json:"keyIDs"` // 属性视图属性键 ID,用于排序
+ ViewID string `json:"viewID"` // 当前视图 ID
+ Views []*View `json:"views"` // 视图
}
// KeyValues 描述了属性视图属性键值列表的结构。
@@ -472,13 +470,6 @@ func ParseAttributeView(avID string) (ret *AttributeView, err error) {
return
}
}
-
- ret.OriginalKeyValues = []*KeyValues{}
- for _, keyValues := range ret.KeyValues {
- cloned := &KeyValues{}
- copier.CopyWithOption(cloned, keyValues, copier.Option{DeepCopy: true})
- ret.OriginalKeyValues = append(ret.OriginalKeyValues, cloned)
- }
return
}
diff --git a/kernel/sql/av.go b/kernel/sql/av.go
index 2054acd15..9eaa242de 100644
--- a/kernel/sql/av.go
+++ b/kernel/sql/av.go
@@ -249,7 +249,7 @@ func RenderTemplateField(ial map[string]string, keyValues []*av.KeyValues, tplCo
func generateAttrViewItems(attrView *av.AttributeView, view *av.View) (ret map[string][]*av.KeyValues) {
ret = map[string][]*av.KeyValues{}
- for _, keyValues := range attrView.OriginalKeyValues {
+ for _, keyValues := range attrView.KeyValues {
for _, val := range keyValues.Values {
values := ret[val.BlockID]
if nil == values {
@@ -533,17 +533,25 @@ func fillAttributeViewTemplateValues(attrView *av.AttributeView, view *av.View,
func fillAttributeViewKeyValues(attrView *av.AttributeView, collection av.Collection) {
fieldValues := map[string][]*av.Value{}
- for _, card := range collection.GetItems() {
- for _, val := range card.GetValues() {
+ for _, item := range collection.GetItems() {
+ for _, val := range item.GetValues() {
keyID := val.KeyID
fieldValues[keyID] = append(fieldValues[keyID], val)
}
}
for keyID, values := range fieldValues {
keyValues, _ := attrView.GetKeyValues(keyID)
- keyValues.Values = nil
for _, val := range values {
- keyValues.Values = append(keyValues.Values, val)
+ exist := false
+ for _, kv := range keyValues.Values {
+ if kv.ID == val.ID {
+ exist = true
+ break
+ }
+ }
+ if !exist {
+ keyValues.Values = append(keyValues.Values, val)
+ }
}
}
}
diff --git a/kernel/sql/av_gallery.go b/kernel/sql/av_gallery.go
index 2a0835858..cf9c6fe9a 100644
--- a/kernel/sql/av_gallery.go
+++ b/kernel/sql/av_gallery.go
@@ -120,7 +120,7 @@ func RenderAttributeViewGallery(attrView *av.AttributeView, view *av.View, query
// 渲染自动生成的字段值,比如关联、汇总、创建时间和更新时间
fillAttributeViewAutoGeneratedValues(attrView, ret, ials, depth, renderedAttrViews)
- // 最后单独渲染模板字段,这样模板就可以使用汇总、关联、创建时间和更新时间的值了
+ // 最后渲染模板字段,这样模板就可以使用汇总、关联、创建时间和更新时间的值了
renderTemplateErr := fillAttributeViewTemplateValues(attrView, view, ret, ials)
if nil != renderTemplateErr {
util.PushErrMsg(fmt.Sprintf(util.Langs[util.Lang][44], util.EscapeHTML(renderTemplateErr.Error())), 30000)
diff --git a/kernel/sql/av_table.go b/kernel/sql/av_table.go
index 138a8832f..a4ec11293 100644
--- a/kernel/sql/av_table.go
+++ b/kernel/sql/av_table.go
@@ -113,7 +113,7 @@ func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query s
// 渲染自动生成的字段值,比如关联、汇总、创建时间和更新时间
fillAttributeViewAutoGeneratedValues(attrView, ret, ials, depth, renderedAttrViews)
- // 最后单独渲染模板字段,这样模板就可以使用汇总、关联、创建时间和更新时间的值了
+ // 最后渲染模板字段,这样模板就可以使用汇总、关联、创建时间和更新时间的值了
renderTemplateErr := fillAttributeViewTemplateValues(attrView, view, ret, ials)
if nil != renderTemplateErr {
util.PushErrMsg(fmt.Sprintf(util.Langs[util.Lang][44], util.EscapeHTML(renderTemplateErr.Error())), 30000)