refactor: move calculation functions to new class

This commit is contained in:
Kritagya Bhattarai (CalfMoon) 2026-03-31 00:42:56 +05:45
parent cd5f4c97c9
commit a36f1c9ed0
2 changed files with 71 additions and 55 deletions

67
src/calculator.ts Normal file
View file

@ -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<string>,
): 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;
}
}

View file

@ -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<string>,
): 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();