Просмотр исходного кода

Merge remote-tracking branch 'origin/dev' into dev

Vanessa 8 месяцев назад
Родитель
Сommit
09115a9c9e
4 измененных файлов с 77 добавлено и 22 удалено
  1. 29 11
      app/src/layout/dock/Graph.ts
  2. 43 6
      kernel/model/backlink.go
  3. 1 1
      kernel/model/block.go
  4. 4 4
      kernel/model/blockinfo.go

+ 29 - 11
app/src/layout/dock/Graph.ts

@@ -574,6 +574,21 @@ export class Graph extends Model {
                 return;
                 return;
             }
             }
             const config = window.siyuan.config.graph[this.type === "global" ? "global" : "local"];
             const config = window.siyuan.config.graph[this.type === "global" ? "global" : "local"];
+            const timestep = 32 < this.graphData.nodes.length ? 0.1 : 0.5;
+            let maxVelocity = this.graphData.nodes.length;
+            if (this.graphData.nodes.length > 1024) {
+                maxVelocity = 1024;
+            }
+            if (this.graphData.nodes.length < 50) {
+                maxVelocity = 50;
+            }
+            let minVelocity = this.graphData.nodes.length;
+            if (this.graphData.nodes.length > 64) {
+                minVelocity = 64;
+            }
+            if (this.graphData.nodes.length < 16) {
+                minVelocity = 8;
+            }
             const options = {
             const options = {
                 autoResize: true,
                 autoResize: true,
                 interaction: {
                 interaction: {
@@ -624,25 +639,34 @@ export class Graph extends Model {
                         damping: 0.4,
                         damping: 0.4,
                         avoidOverlap: 0.5
                         avoidOverlap: 0.5
                     },
                     },
-                    maxVelocity: 512,
-                    minVelocity: 64,
+                    maxVelocity: maxVelocity,
+                    minVelocity: minVelocity,
                     solver: "forceAtlas2Based",
                     solver: "forceAtlas2Based",
                     stabilization: {
                     stabilization: {
                         enabled: true,
                         enabled: true,
                         iterations: 64,
                         iterations: 64,
                         updateInterval: 64,
                         updateInterval: 64,
                         onlyDynamicEdges: false,
                         onlyDynamicEdges: false,
-                        fit: false
+                        fit: true
                     },
                     },
-                    timestep: 0.5,
+                    timestep: timestep,
                     adaptiveTimestep: true,
                     adaptiveTimestep: true,
                     wind: {x: 0, y: 0}
                     wind: {x: 0, y: 0}
                 },
                 },
             };
             };
             let i = Math.max(Math.ceil(this.graphData.nodes.length * 0.1), 128);
             let i = Math.max(Math.ceil(this.graphData.nodes.length * 0.1), 128);
+            let j = Math.max(Math.ceil(this.graphData.links.length * 0.1), 128);
             const nodes = new vis.DataSet(this.graphData.nodes.slice(0, i));
             const nodes = new vis.DataSet(this.graphData.nodes.slice(0, i));
-            const edges = new vis.DataSet();
+            const edges = new vis.DataSet(this.graphData.links.slice(0, j));
             const network = new vis.Network(this.graphElement, {nodes, edges}, options);
             const network = new vis.Network(this.graphElement, {nodes, edges}, options);
+            const initialScale = Math.max(0.03, 1 - 0.3 * Math.floor(this.graphData.nodes.length / 128));
+            if (1 !== initialScale) {
+                network.moveTo({
+                    position: {x: 0, y: 0},
+                    scale: initialScale,
+                    animation: false
+                })
+            }
             const time = 256;
             const time = 256;
             const intervalNodeTime = Math.max(Math.ceil(time / 8), 32);
             const intervalNodeTime = Math.max(Math.ceil(time / 8), 32);
             let batch = this.graphData.nodes.length / time / 2;
             let batch = this.graphData.nodes.length / time / 2;
@@ -652,7 +676,6 @@ export class Graph extends Model {
             if (batch > 256) {
             if (batch > 256) {
                 batch = 256;
                 batch = 256;
             }
             }
-            let count = 0;
             const intervalNode = setInterval(() => {
             const intervalNode = setInterval(() => {
                 if (!network.images) {
                 if (!network.images) {
                     clearInterval(intervalEdge);
                     clearInterval(intervalEdge);
@@ -665,12 +688,7 @@ export class Graph extends Model {
                 }
                 }
                 network.body.data.nodes.add(nodesAdded);
                 network.body.data.nodes.add(nodesAdded);
                 i += batch;
                 i += batch;
-                count++;
-                if (0 === count % (batch / 128)) {
-                    network.fit({animation: false});
-                }
             }, intervalNodeTime);
             }, intervalNodeTime);
-            let j = 0;
             const intervalEdge = setInterval(() => {
             const intervalEdge = setInterval(() => {
                 if (!network.images) {
                 if (!network.images) {
                     clearInterval(intervalEdge);
                     clearInterval(intervalEdge);

+ 43 - 6
kernel/model/backlink.go

@@ -109,6 +109,7 @@ func GetBackmentionDoc(defID, refTreeID, keyword string, containChildren bool) (
 
 
 	if 0 < len(trees) {
 	if 0 < len(trees) {
 		sortBacklinks(ret, refTree)
 		sortBacklinks(ret, refTree)
+		ret = mergeNeighborBacklinks(ret)
 		filterBlockPaths(ret)
 		filterBlockPaths(ret)
 	}
 	}
 	return
 	return
@@ -152,6 +153,7 @@ func GetBacklinkDoc(defID, refTreeID, keyword string, containChildren bool) (ret
 	}
 	}
 
 
 	sortBacklinks(ret, refTree)
 	sortBacklinks(ret, refTree)
+	ret = mergeNeighborBacklinks(ret)
 	filterBlockPaths(ret)
 	filterBlockPaths(ret)
 
 
 	for i := len(ret) - 1; 0 < i; i-- {
 	for i := len(ret) - 1; 0 < i; i-- {
@@ -165,10 +167,48 @@ func GetBacklinkDoc(defID, refTreeID, keyword string, containChildren bool) (ret
 	return
 	return
 }
 }
 
 
+func mergeNeighborBacklinks(blockLinks []*Backlink) (ret []*Backlink) {
+	// 如果反链中的节点是相邻的,则合并
+	for i := len(blockLinks) - 1; 0 < i; i-- {
+		if isPrevious(blockLinks[i].node, blockLinks[i-1].node) {
+			blockLinks[i-1].DOM += blockLinks[i].DOM
+			blockLinks[i] = nil
+			continue
+		}
+	}
+
+	for _, b := range blockLinks {
+		if nil != b {
+			ret = append(ret, b)
+		}
+	}
+	return
+}
+
+func isPrevious(cur, prev *ast.Node) bool {
+	if nil == cur || nil == prev {
+		return false
+	}
+	if cur.Previous == prev {
+		return true
+	}
+	for prevParent := prev.Parent; nil != prevParent; prevParent = prevParent.Parent {
+		if prev.Next == cur {
+			return true
+		}
+	}
+	for curParent := cur.Parent; nil != curParent; curParent = curParent.Parent {
+		if prev.Next == curParent {
+			return true
+		}
+	}
+	return false
+}
+
 func filterBlockPaths(blockLinks []*Backlink) {
 func filterBlockPaths(blockLinks []*Backlink) {
 	for _, b := range blockLinks {
 	for _, b := range blockLinks {
-		if 1 == len(b.BlockPaths) && "NodeDocument" == b.BlockPaths[0].Type {
-			// 如果只有根文档这一层则不显示
+		if 2 == len(b.BlockPaths) {
+			// 根下只有一层则不显示
 			b.BlockPaths = []*BlockPath{}
 			b.BlockPaths = []*BlockPath{}
 		}
 		}
 	}
 	}
@@ -246,10 +286,7 @@ func buildBacklink(refID string, refTree *parse.Tree, keywords []string, luteEng
 	dom := renderBlockDOMByNodes(renderNodes, luteEngine)
 	dom := renderBlockDOMByNodes(renderNodes, luteEngine)
 	var blockPaths []*BlockPath
 	var blockPaths []*BlockPath
 	if (nil != n.Parent && ast.NodeDocument != n.Parent.Type) || (ast.NodeHeading != n.Type && 0 < treenode.HeadingLevel(n)) {
 	if (nil != n.Parent && ast.NodeDocument != n.Parent.Type) || (ast.NodeHeading != n.Type && 0 < treenode.HeadingLevel(n)) {
-		// 仅在多于一层时才显示面包屑,这样界面展示更加简洁
-		// The backlink panel no longer displays breadcrumbs of the first-level blocks https://github.com/siyuan-note/siyuan/issues/12862
-		// Improve the backlink panel breadcrumb and block sorting https://github.com/siyuan-note/siyuan/issues/13008
-		blockPaths = buildBlockBreadcrumb(n, nil, false)
+		blockPaths = buildBlockBreadcrumb(n, nil)
 	}
 	}
 	if 1 > len(blockPaths) {
 	if 1 > len(blockPaths) {
 		blockPaths = []*BlockPath{}
 		blockPaths = []*BlockPath{}

+ 1 - 1
kernel/model/block.go

@@ -887,7 +887,7 @@ func getEmbeddedBlock(trees map[string]*parse.Tree, sqlBlock *sql.Block, heading
 	}
 	}
 
 
 	if breadcrumb {
 	if breadcrumb {
-		blockPaths = buildBlockBreadcrumb(def, nil, true)
+		blockPaths = buildBlockBreadcrumb(def, nil)
 	}
 	}
 	if 1 > len(blockPaths) {
 	if 1 > len(blockPaths) {
 		blockPaths = []*BlockPath{}
 		blockPaths = []*BlockPath{}

+ 4 - 4
kernel/model/blockinfo.go

@@ -416,11 +416,11 @@ func BuildBlockBreadcrumb(id string, excludeTypes []string) (ret []*BlockPath, e
 		return
 		return
 	}
 	}
 
 
-	ret = buildBlockBreadcrumb(node, excludeTypes, true)
+	ret = buildBlockBreadcrumb(node, excludeTypes)
 	return
 	return
 }
 }
 
 
-func buildBlockBreadcrumb(node *ast.Node, excludeTypes []string, displayCurrentNode bool) (ret []*BlockPath) {
+func buildBlockBreadcrumb(node *ast.Node, excludeTypes []string) (ret []*BlockPath) {
 	ret = []*BlockPath{}
 	ret = []*BlockPath{}
 	if nil == node {
 	if nil == node {
 		return
 		return
@@ -481,8 +481,8 @@ func buildBlockBreadcrumb(node *ast.Node, excludeTypes []string, displayCurrentN
 		name = strings.ReplaceAll(name, editor.Caret, "")
 		name = strings.ReplaceAll(name, editor.Caret, "")
 		name = util.EscapeHTML(name)
 		name = util.EscapeHTML(name)
 
 
-		if parent == node && !displayCurrentNode {
-			add = false
+		if parent == node {
+			name = ""
 		}
 		}
 
 
 		if add {
 		if add {