From 04d5324e156a88910629456f273067be51c55085 Mon Sep 17 00:00:00 2001 From: "Kritagya Bhattarai (CalfMoon)" Date: Sun, 9 Mar 2025 18:49:03 +0545 Subject: [PATCH] feat(calc): add fwd node tree as factor effecting node size --- src/main.ts | 74 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 66 insertions(+), 8 deletions(-) diff --git a/src/main.ts b/src/main.ts index 75c0615..3b228b8 100644 --- a/src/main.ts +++ b/src/main.ts @@ -21,26 +21,84 @@ export default class NodeFactor extends Plugin { const nodes: ObsidianNode[] = leaf.view.renderer.nodes; if (nodes.length === 0) return; - setInterval(() => { - nodes.forEach((node) => { - const weight = this.calcNodeWeight(node); - node.weight = weight; - }); - }, 1); + const start = performance.now(); + + const treeOptimizeMap: Map = new Map(); + + nodes.forEach((node) => { + const weight = this.calcNodeWeight(node, treeOptimizeMap); + node.weight = weight; + }); + + // setInterval(() => { + // const treeOptimizeMap: Map = new Map(); + // nodes.forEach((node) => { + // const weight = this.calcNodeWeight( + // node, + // treeOptimizeMap, + // ); + // node.weight = weight; + // }); + // }, 10); + + console.log(performance.now() - start); }), ); } - private calcNodeWeight(node: ObsidianNode): number { + private calcNodeWeight( + node: ObsidianNode, + treeOptimizeMap: Map, + ): number { const settings = this.settings; let weight = 0; weight += Object.keys(node.reverse).length * settings.bwdMultiplier; - weight += Object.keys(node.forward).length * settings.fwdMultiplier; + if (settings.fwdTree) { + weight += + this.fwdNodeTreeSize(node, node.id, treeOptimizeMap) * + settings.fwdMultiplier; + } else { + weight += Object.keys(node.forward).length * settings.fwdMultiplier; + } return weight; } + private fwdNodeTreeSize( + node: ObsidianNode, + id: string, + treeOptimizeMap: Map, + ): number { + let size = 0; + + const sizeMap = treeOptimizeMap.get(node.id); + + // the block below + if (sizeMap !== undefined) { + return sizeMap as number; + } + + Object.entries(node.forward).forEach(([key, value]) => { + // @ts-ignore + const childNode: ObsidianNode = value.target; + + // Prevents looping if A -> B -> C -> A + if (key === id) return size; + + size++; + const childSize = this.fwdNodeTreeSize( + childNode, + id, + treeOptimizeMap, + ); + size += childSize; + }); + + treeOptimizeMap.set(node.id, size); + return size; + } + async loadSettings() { this.settings = Object.assign( {},