From a36f1c9ed0e822a112ce39e8fc5d3beff7eecfe4 Mon Sep 17 00:00:00 2001 From: "Kritagya Bhattarai (CalfMoon)" Date: Tue, 31 Mar 2026 00:42:56 +0545 Subject: [PATCH] refactor: move calculation functions to new class --- src/calculator.ts | 67 +++++++++++++++++++++++++++++++++++++++++++++++ src/main.ts | 59 +++-------------------------------------- 2 files changed, 71 insertions(+), 55 deletions(-) create mode 100644 src/calculator.ts diff --git a/src/calculator.ts b/src/calculator.ts new file mode 100644 index 0000000..2d984cd --- /dev/null +++ b/src/calculator.ts @@ -0,0 +1,67 @@ +import { App } from "obsidian"; + +import { NodeFactorSettings, ObsidianNode } from "types"; + +export default class Calculations { + private app: App; + private settings: NodeFactorSettings; + + constructor(app: App, settings: NodeFactorSettings) { + this.app = app; + this.settings = settings; + } + + calcNodeWeight(node: ObsidianNode): number { + const settings = this.settings; + let weight = 0; + + const manualFileData = settings.manual.find( + (manualFileData) => manualFileData.id == node.id, + ); + if (manualFileData != null) { + return manualFileData.weight; + } + + weight += Object.keys(node.reverse).length * settings.bwdMultiplier; + if (settings.fwdTree) { + weight += + this.fwdNodeTreeSize(node, new Set()) * settings.fwdMultiplier; + } else { + weight += Object.keys(node.forward).length * settings.fwdMultiplier; + } + + if (settings.lettersPerWt != 0) { + weight += this.letterCount(node) / settings.lettersPerWt; + } + + return Math.round(weight); + } + + private letterCount(node: ObsidianNode): number { + const file = this.app.vault.getFileByPath(node.id); + if (file == null || file.extension != "md") return 0; + + return file.stat.size; + } + + private fwdNodeTreeSize( + node: ObsidianNode, + antiLoopSet: Set, + ): number { + let size = 0; + antiLoopSet.add(node.id); + + Object.entries(node.forward).forEach(([key, value]) => { + // @ts-ignore + const childNode: ObsidianNode = value.target; + + // Prevents looping if A -> B -> C -> D -> B + if (!antiLoopSet.has(key)) { + size++; + const childSize = this.fwdNodeTreeSize(childNode, antiLoopSet); + size += childSize; + } + }); + return size; + } +} diff --git a/src/main.ts b/src/main.ts index cd210f9..d389e01 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,6 +2,7 @@ import { Plugin } from "obsidian"; import { ObsidianNode, NodeFactorSettings, DEFAULT_SETTINGS } from "types"; import NodeFactorSettingTab from "settings"; +import Calculator from "calculator"; export default class NodeFactor extends Plugin { settings: NodeFactorSettings; @@ -56,12 +57,14 @@ export default class NodeFactor extends Plugin { // if graph view is initially opened when opening obsidian clearTimeout(this.timeoutId); this.timeoutId = setTimeout(() => { + const calculator = new Calculator(this.app, this.settings); + nodes.forEach((node, _i) => { let weight = 0; if (this.sizeCache.get(node.id) != undefined) { weight = this.sizeCache.get(node.id) as number; } else { - weight = this.calcNodeWeight(node); + calculator.calcNodeWeight(node); this.sizeCache.set(node.id, weight); } node.weight = weight; @@ -69,60 +72,6 @@ export default class NodeFactor extends Plugin { }, 500); } - private calcNodeWeight(node: ObsidianNode): number { - const settings = this.settings; - let weight = 0; - - const manualFileData = settings.manual.find( - (manualFileData) => manualFileData.id == node.id, - ); - if (manualFileData != null) { - return manualFileData.weight; - } - - weight += Object.keys(node.reverse).length * settings.bwdMultiplier; - if (settings.fwdTree) { - weight += - this.fwdNodeTreeSize(node, new Set()) * settings.fwdMultiplier; - } else { - weight += Object.keys(node.forward).length * settings.fwdMultiplier; - } - - if (settings.lettersPerWt != 0) { - weight += this.letterCount(node) / settings.lettersPerWt; - } - - return Math.round(weight); - } - - private letterCount(node: ObsidianNode): number { - const file = this.app.vault.getFileByPath(node.id); - if (file == null || file.extension != "md") return 0; - - return file.stat.size; - } - - private fwdNodeTreeSize( - node: ObsidianNode, - antiLoopSet: Set, - ): number { - let size = 0; - antiLoopSet.add(node.id); - - Object.entries(node.forward).forEach(([key, value]) => { - // @ts-ignore - const childNode: ObsidianNode = value.target; - - // Prevents looping if A -> B -> C -> D -> B - if (!antiLoopSet.has(key)) { - size++; - const childSize = this.fwdNodeTreeSize(childNode, antiLoopSet); - size += childSize; - } - }); - return size; - } - recalculateSize() { this.sizeCache.clear(); this.updateGraph();