From a379e24b3b50ed5407cc46c3cc7c621b65fa3a5d Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sun, 17 Dec 2023 11:47:40 +0800 Subject: [PATCH 1/3] :art: Find replace supports selecting element types https://github.com/siyuan-note/siyuan/issues/9895 --- kernel/model/storage.go | 47 ++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/kernel/model/storage.go b/kernel/model/storage.go index 05e6cc5de..c0e0f8cd8 100644 --- a/kernel/model/storage.go +++ b/kernel/model/storage.go @@ -160,16 +160,17 @@ func getRecentDocs() (ret []*RecentDoc, err error) { } type Criterion struct { - Name string `json:"name"` - Sort int `json:"sort"` // 0:按块类型(默认),1:按创建时间升序,2:按创建时间降序,3:按更新时间升序,4:按更新时间降序,5:按内容顺序(仅在按文档分组时) - Group int `json:"group"` // 0:不分组,1:按文档分组 - HasReplace bool `json:"hasReplace"` // 是否有替换 - Method int `json:"method"` // 0:文本,1:查询语法,2:SQL,3:正则表达式 - HPath string `json:"hPath"` - IDPath []string `json:"idPath"` - K string `json:"k"` // 搜索关键字 - R string `json:"r"` // 替换关键字 - Types *CriterionTypes `json:"types"` // 类型过滤选项 + Name string `json:"name"` + Sort int `json:"sort"` // 0:按块类型(默认),1:按创建时间升序,2:按创建时间降序,3:按更新时间升序,4:按更新时间降序,5:按内容顺序(仅在按文档分组时) + Group int `json:"group"` // 0:不分组,1:按文档分组 + HasReplace bool `json:"hasReplace"` // 是否有替换 + Method int `json:"method"` // 0:文本,1:查询语法,2:SQL,3:正则表达式 + HPath string `json:"hPath"` + IDPath []string `json:"idPath"` + K string `json:"k"` // 搜索关键字 + R string `json:"r"` // 替换关键字 + Types *CriterionTypes `json:"types"` // 类型过滤选项 + ReplaceTypes *CriterionReplaceTypes `json:"replaceTypes"` // 替换类型过滤选项 } type CriterionTypes struct { @@ -187,6 +188,32 @@ type CriterionTypes struct { EmbedBlock bool `json:"embedBlock"` } +type CriterionReplaceTypes struct { + Text bool `json:"text"` + ImgText bool `json:"img-text"` + ImgTitle bool `json:"img-title"` + ImgSrc bool `json:"img-src"` + AText bool `json:"a-text"` + ATitle bool `json:"a-title"` + AHref bool `json:"a-href"` + Code bool `json:"code"` + Em bool `json:"em"` + Strong bool `json:"strong"` + InlineMath bool `json:"inline-math"` + InlineMemo bool `json:"inline-memo"` + Kbd bool `json:"kbd"` + Mark bool `json:"mark"` + S bool `json:"s"` + Sub bool `json:"sub"` + Sup bool `json:"sup"` + Tag bool `json:"tag"` + U bool `json:"u"` + DocTitle bool `json:"doc-title"` + CodeBlock bool `json:"code-block"` + MathBlock bool `json:"math-block"` + HtmlBlock bool `json:"html-block"` +} + var criteriaLock = sync.Mutex{} func RemoveCriterion(name string) (err error) { From 7ff4356316a5fd4582f7448f3febb956d0086585 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sun, 17 Dec 2023 12:00:55 +0800 Subject: [PATCH 2/3] :art: Automatically fill in the filter result value when adding rows in the database table view https://github.com/siyuan-note/siyuan/issues/9905 --- kernel/av/av.go | 11 +++++++++++ kernel/av/value.go | 12 ++++++++++++ kernel/model/attribute_view.go | 26 ++++++++++++++++++++++++-- kernel/model/export.go | 2 +- kernel/model/template.go | 2 +- 5 files changed, 49 insertions(+), 4 deletions(-) diff --git a/kernel/av/av.go b/kernel/av/av.go index 929492583..9c0025aa5 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -313,6 +313,17 @@ func (av *AttributeView) GetBlockKeyValues() (ret *KeyValues) { return } +func (av *AttributeView) GetKeyValues(keyID string) (ret *KeyValues, err error) { + for _, kv := range av.KeyValues { + if kv.Key.ID == keyID { + ret = kv + return + } + } + err = ErrKeyNotFound + return +} + func (av *AttributeView) GetBlockKey() (ret *Key) { for _, kv := range av.KeyValues { if KeyTypeBlock == kv.Key.Type { diff --git a/kernel/av/value.go b/kernel/av/value.go index b86f6a8a6..7be46a3f1 100644 --- a/kernel/av/value.go +++ b/kernel/av/value.go @@ -160,6 +160,18 @@ func (value *Value) ToJSONString() string { return string(data) } +func (value *Value) Clone() (ret *Value) { + data, err := gulu.JSON.MarshalJSON(value) + if nil != err { + return + } + err = gulu.JSON.UnmarshalJSON(data, &ret) + if nil != err { + return + } + return +} + type ValueBlock struct { ID string `json:"id"` Content string `json:"content"` diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 0b21e1910..3f03154af 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -372,7 +372,7 @@ func renderAttributeView(attrView *av.AttributeView, viewID string, page, pageSi } view.Table.Sorts = tmpSorts - viewable, err = renderAttributeViewTable(attrView, view, page, pageSize) + viewable, err = renderAttributeViewTable(attrView, view) } viewable.FilterRows() @@ -463,7 +463,7 @@ func renderTemplateCol(ial map[string]string, tplContent string, rowValues []*av return buf.String() } -func renderAttributeViewTable(attrView *av.AttributeView, view *av.View, page, pageSize int) (ret *av.Table, err error) { +func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *av.Table, err error) { ret = &av.Table{ ID: view.ID, Icon: view.Icon, @@ -1107,6 +1107,28 @@ func addAttributeViewBlock(blockID string, operation *Operation, tree *parse.Tre value := &av.Value{ID: ast.NewNodeID(), KeyID: blockValues.Key.ID, BlockID: blockID, Type: av.KeyTypeBlock, IsDetached: operation.IsDetached, IsInitialized: false, Block: &av.ValueBlock{ID: blockID, Content: content, Created: now, Updated: now}} blockValues.Values = append(blockValues.Values, value) + // 如果存在过滤条件,则将过滤条件应用到新添加的块上 + view, _ := attrView.GetCurrentView() + if nil != view && 0 < len(view.Table.Filters) { + viewable, _ := renderAttributeViewTable(attrView, view) + if 0 < len(viewable.Rows) { + row := viewable.Rows[len(viewable.Rows)-1] + for _, filter := range view.Table.Filters { + for _, cell := range row.Cells { + if nil != cell.Value && cell.Value.KeyID == filter.Column { + newValue := cell.Value.Clone() + newValue.ID = ast.NewNodeID() + newValue.BlockID = blockID + newValue.IsDetached = operation.IsDetached + newValue.IsInitialized = false + values, _ := attrView.GetKeyValues(filter.Column) + values.Values = append(values.Values, newValue) + } + } + } + } + } + if !operation.IsDetached { attrs := parse.IAL2Map(node.KramdownIAL) diff --git a/kernel/model/export.go b/kernel/model/export.go index 01efc1705..84fb82bcd 100644 --- a/kernel/model/export.go +++ b/kernel/model/export.go @@ -1916,7 +1916,7 @@ func exportTree(tree *parse.Tree, wysiwyg, expandKaTexMacros, keepFold bool, return ast.WalkContinue } - table, err := renderAttributeViewTable(attrView, view, 1, -1) + table, err := renderAttributeViewTable(attrView, view) if nil != err { logging.LogErrorf("render attribute view [%s] table failed: %s", avID, err) return ast.WalkContinue diff --git a/kernel/model/template.go b/kernel/model/template.go index 8480c1232..bde68d3ca 100644 --- a/kernel/model/template.go +++ b/kernel/model/template.go @@ -333,7 +333,7 @@ func renderTemplate(p, id string, preview bool) (string, error) { return ast.WalkContinue } - table, renderErr := renderAttributeViewTable(attrView, view, 1, -1) + table, renderErr := renderAttributeViewTable(attrView, view) if nil != renderErr { logging.LogErrorf("render attribute view [%s] table failed: %s", n.AttributeViewID, renderErr) return ast.WalkContinue From b206a1a57084433b017124d7b1365d3b303d3576 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sun, 17 Dec 2023 12:11:59 +0800 Subject: [PATCH 3/3] :art: Automatically fill in the filter result value when adding rows in the database table view https://github.com/siyuan-note/siyuan/issues/9905 --- kernel/model/attribute_view.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 3f03154af..dc8f11472 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -1104,18 +1104,26 @@ func addAttributeViewBlock(blockID string, operation *Operation, tree *parse.Tre content = getNodeRefText(node) } now := time.Now().UnixMilli() - value := &av.Value{ID: ast.NewNodeID(), KeyID: blockValues.Key.ID, BlockID: blockID, Type: av.KeyTypeBlock, IsDetached: operation.IsDetached, IsInitialized: false, Block: &av.ValueBlock{ID: blockID, Content: content, Created: now, Updated: now}} - blockValues.Values = append(blockValues.Values, value) + blockValue := &av.Value{ID: ast.NewNodeID(), KeyID: blockValues.Key.ID, BlockID: blockID, Type: av.KeyTypeBlock, IsDetached: operation.IsDetached, IsInitialized: false, Block: &av.ValueBlock{ID: blockID, Content: content, Created: now, Updated: now}} + blockValues.Values = append(blockValues.Values, blockValue) // 如果存在过滤条件,则将过滤条件应用到新添加的块上 view, _ := attrView.GetCurrentView() if nil != view && 0 < len(view.Table.Filters) { viewable, _ := renderAttributeViewTable(attrView, view) + viewable.FilterRows() + viewable.SortRows() + if 0 < len(viewable.Rows) { row := viewable.Rows[len(viewable.Rows)-1] for _, filter := range view.Table.Filters { for _, cell := range row.Cells { if nil != cell.Value && cell.Value.KeyID == filter.Column { + if av.KeyTypeBlock == cell.ValueType { + blockValue.Block.Content = cell.Value.Block.Content + continue + } + newValue := cell.Value.Clone() newValue.ID = ast.NewNodeID() newValue.BlockID = blockID