diff --git a/manifest.json b/manifest.json index 4470743..8ff6d98 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "solo-rpg-toolkit", "name": "Solo RPG Toolkit", - "version": "0.7.12", + "version": "0.7.13", "minAppVersion": "1.5.11", "description": "Random generator tools geared towards solo TTRPG gameplay", "author": "Alex Kurowski", diff --git a/package-lock.json b/package-lock.json index 8aba8c7..1ec0808 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "alexkurowski/solo-toolkit", - "version": "0.5.0", + "version": "0.7.13", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "alexkurowski/solo-toolkit", - "version": "0.4.0", + "version": "0.7.13", "license": "MIT", "devDependencies": { "@codemirror/language": "^6.10.1", @@ -41,18 +41,26 @@ } }, "node_modules/@codemirror/state": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", - "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==", - "dev": true + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.0.tgz", + "integrity": "sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } }, "node_modules/@codemirror/view": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.26.3.tgz", - "integrity": "sha512-gmqxkPALZjkgSxIeeweY/wGQXBfwTUaLs8h7OKtSwfbj9Ct3L11lD+u1sS7XHppxFQoMDiMDp07P9f3I2jWOHw==", + "version": "6.38.6", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.6.tgz", + "integrity": "sha512-qiS0z1bKs5WOvHIAC0Cybmv4AJSkAXgX5aD6Mqd2epSLlVJsQl8NG23jCVouIgkh4All/mrbdsf2UOLFnJw0tw==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@codemirror/state": "^6.4.0", + "@codemirror/state": "^6.5.0", + "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } @@ -537,6 +545,13 @@ "@lezer/common": "^1.0.0" } }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "dev": true, + "license": "MIT" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -652,6 +667,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz", "integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==", "dev": true, + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.29.0", "@typescript-eslint/types": "5.29.0", @@ -809,6 +825,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1030,6 +1047,13 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "dev": true, + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1527,6 +1551,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -2238,17 +2263,18 @@ } }, "node_modules/obsidian": { - "version": "1.5.7-1", - "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.5.7-1.tgz", - "integrity": "sha512-T5ZRuQ1FnfXqEoakTTHVDYvzUEEoT8zSPnQCW31PVgYwG4D4tZCQfKHN2hTz1ifnCe8upvwa6mBTAP2WUA5Vng==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.12.3.tgz", + "integrity": "sha512-HxWqe763dOqzXjnNiHmAJTRERN8KILBSqxDSEqbeSr7W8R8Jxezzbca+nz1LiiqXnMpM8lV2jzAezw3CZ4xNUw==", "dev": true, + "license": "MIT", "dependencies": { "@types/codemirror": "5.60.8", "moment": "2.29.4" }, "peerDependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.38.6" } }, "node_modules/once": { @@ -2685,6 +2711,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true, + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2759,6 +2786,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", "dev": true, + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "7.8.0", "@typescript-eslint/types": "7.8.0", @@ -3013,18 +3041,24 @@ } }, "@codemirror/state": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", - "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==", - "dev": true + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.0.tgz", + "integrity": "sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw==", + "dev": true, + "peer": true, + "requires": { + "@marijn/find-cluster-break": "^1.0.0" + } }, "@codemirror/view": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.26.3.tgz", - "integrity": "sha512-gmqxkPALZjkgSxIeeweY/wGQXBfwTUaLs8h7OKtSwfbj9Ct3L11lD+u1sS7XHppxFQoMDiMDp07P9f3I2jWOHw==", + "version": "6.38.6", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.6.tgz", + "integrity": "sha512-qiS0z1bKs5WOvHIAC0Cybmv4AJSkAXgX5aD6Mqd2epSLlVJsQl8NG23jCVouIgkh4All/mrbdsf2UOLFnJw0tw==", "dev": true, + "peer": true, "requires": { - "@codemirror/state": "^6.4.0", + "@codemirror/state": "^6.5.0", + "crelt": "^1.0.6", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } @@ -3279,6 +3313,12 @@ "@lezer/common": "^1.0.0" } }, + "@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "dev": true + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3369,6 +3409,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz", "integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==", "dev": true, + "peer": true, "requires": { "@typescript-eslint/scope-manager": "5.29.0", "@typescript-eslint/types": "5.29.0", @@ -3452,7 +3493,8 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true + "dev": true, + "peer": true }, "acorn-jsx": { "version": "5.3.2", @@ -3611,6 +3653,12 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3884,6 +3932,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "peer": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -4424,9 +4473,9 @@ "dev": true }, "obsidian": { - "version": "1.5.7-1", - "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.5.7-1.tgz", - "integrity": "sha512-T5ZRuQ1FnfXqEoakTTHVDYvzUEEoT8zSPnQCW31PVgYwG4D4tZCQfKHN2hTz1ifnCe8upvwa6mBTAP2WUA5Vng==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.12.3.tgz", + "integrity": "sha512-HxWqe763dOqzXjnNiHmAJTRERN8KILBSqxDSEqbeSr7W8R8Jxezzbca+nz1LiiqXnMpM8lV2jzAezw3CZ4xNUw==", "dev": true, "requires": { "@types/codemirror": "5.60.8", @@ -4717,7 +4766,8 @@ "version": "4.7.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true + "dev": true, + "peer": true }, "typescript-eslint": { "version": "7.8.0", @@ -4754,6 +4804,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", "dev": true, + "peer": true, "requires": { "@typescript-eslint/scope-manager": "7.8.0", "@typescript-eslint/types": "7.8.0", diff --git a/package.json b/package.json index cbca197..665bf26 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "alexkurowski/solo-toolkit", - "version": "0.7.12", + "version": "0.7.13", "description": "Solo RPG toolkit for Obsidian (https://obsidian.md)", "main": "./dist/api.js", "scripts": { diff --git a/src/inline/base/clock.ts b/src/inline/base/clock.ts index 7a5fbf0..d662676 100644 --- a/src/inline/base/clock.ts +++ b/src/inline/base/clock.ts @@ -113,7 +113,7 @@ export class ClockWidgetBase implements BaseWidget { centerY: number, size: number, index: number, - step: number + step: number, ): string { const angleA = -index * step + 90; const angleB = (-index - 1) * step + 90; @@ -205,31 +205,31 @@ export class ClockWidgetBase implements BaseWidget { const menu = createMenu([ { title: "Advance", - onClick: () => { + onClick: (event) => { this.addValue(1); - onChange?.(); + onChange?.(event); }, }, { title: "Subtract", - onClick: () => { + onClick: (event) => { this.addValue(-1); - onChange?.(); + onChange?.(event); }, }, "-", { title: "Fill", - onClick: () => { + onClick: (event) => { this.setValue(this.max); - onChange?.(); + onChange?.(event); }, }, { title: "Reset", - onClick: () => { + onClick: (event) => { this.setValue(0); - onChange?.(); + onChange?.(event); }, }, "-", @@ -239,17 +239,17 @@ export class ClockWidgetBase implements BaseWidget { { title: "Default", checked: this.color === "", - onClick: () => { + onClick: (event) => { this.color = ""; - onChange?.(); + onChange?.(event); }, }, ...KNOWN_COLORS.map((color) => ({ title: capitalize(color), checked: this.color === color, - onClick: () => { + onClick: (event: MouseEvent) => { this.color = color; - onChange?.(); + onChange?.(event); }, })), ], @@ -260,40 +260,40 @@ export class ClockWidgetBase implements BaseWidget { { title: "Default", checked: this.size === SIZE_DEFAULT, - onClick: () => { + onClick: (event) => { this.size = SIZE_DEFAULT; - onChange?.(); + onChange?.(event); }, }, { title: "Small", checked: this.size === SIZE_SMALL, - onClick: () => { + onClick: (event) => { this.size = SIZE_SMALL; - onChange?.(); + onChange?.(event); }, }, { title: "Large", checked: this.size === SIZE_LARGE, - onClick: () => { + onClick: (event) => { this.size = SIZE_LARGE; - onChange?.(); + onChange?.(event); }, }, "-", { title: "Increase", - onClick: () => { + onClick: (event) => { this.size += 8; - onChange?.(); + onChange?.(event); }, }, { title: "Decrease", - onClick: () => { + onClick: (event) => { this.size -= 8; - onChange?.(); + onChange?.(event); }, }, ], @@ -317,7 +317,7 @@ export class ClockWidgetBase implements BaseWidget { } else { this.addValue(-1); } - onChange?.(); + onChange?.(event); }; this.btnEl.oncontextmenu = (event) => { event.preventDefault(); diff --git a/src/inline/base/count.ts b/src/inline/base/count.ts index ee10b07..1dac4ce 100644 --- a/src/inline/base/count.ts +++ b/src/inline/base/count.ts @@ -56,13 +56,13 @@ export class CountWidgetBase implements BaseWidget { } else { this.addValue(-1); } - onChange?.(); + onChange?.(event); }; this.minusEl.oncontextmenu = (event) => { event.preventDefault(); event.stopPropagation(); this.addValue(-10); - onChange?.(); + onChange?.(event); }; this.plusEl.onclick = (event) => { @@ -73,13 +73,13 @@ export class CountWidgetBase implements BaseWidget { } else { this.addValue(1); } - onChange?.(); + onChange?.(event); }; this.plusEl.oncontextmenu = (event) => { event.preventDefault(); event.stopPropagation(); this.addValue(10); - onChange?.(); + onChange?.(event); }; } } diff --git a/src/inline/base/countlimit.ts b/src/inline/base/countlimit.ts index 1c34a81..75be8fa 100644 --- a/src/inline/base/countlimit.ts +++ b/src/inline/base/countlimit.ts @@ -71,9 +71,9 @@ export class CountLimitWidgetBase implements BaseWidget { title: "Add value", subMenu: NUMBERS.map((add: number) => ({ title: `+${add}`, - onClick: () => { + onClick: (event) => { this.addValue(add); - onChange?.(); + onChange?.(event); }, })), }, @@ -81,9 +81,9 @@ export class CountLimitWidgetBase implements BaseWidget { title: "Subtract value", subMenu: NUMBERS.map((add: number) => ({ title: `-${add}`, - onClick: () => { + onClick: (event) => { this.addValue(-add); - onChange?.(); + onChange?.(event); }, })), }, @@ -91,9 +91,9 @@ export class CountLimitWidgetBase implements BaseWidget { title: "Add max", subMenu: NUMBERS.map((add: number) => ({ title: `+${add}`, - onClick: () => { + onClick: (event) => { this.addMax(add); - onChange?.(); + onChange?.(event); }, })), }, @@ -101,40 +101,40 @@ export class CountLimitWidgetBase implements BaseWidget { title: "Subtract max", subMenu: NUMBERS.map((add: number) => ({ title: `-${add}`, - onClick: () => { + onClick: (event) => { this.addMax(-add); - onChange?.(); + onChange?.(event); }, })), }, "-", { title: "Reset", - onClick: () => { + onClick: (event) => { this.setValue(this.max); - onChange?.(); + onChange?.(event); }, }, { title: "Drain", - onClick: () => { + onClick: (event) => { this.setValue(0); - onChange?.(); + onChange?.(event); }, }, "-", { title: "Make clock", - onClick: () => { + onClick: (event) => { this.prefix = "clock: "; - onChange?.(); + onChange?.(event); }, }, { title: "Make boxes", - onClick: () => { + onClick: (event) => { this.prefix = "boxes: "; - onChange?.(); + onChange?.(event); }, }, onFocus ? "-" : undefined, @@ -165,7 +165,7 @@ export class CountLimitWidgetBase implements BaseWidget { } else { this.addValue(-1); } - onChange?.(); + onChange?.(event); }; this.minusEl.oncontextmenu = (event) => { event.preventDefault(); @@ -175,7 +175,7 @@ export class CountLimitWidgetBase implements BaseWidget { } else { this.addMax(-1); } - onChange?.(); + onChange?.(event); }; this.plusEl.onclick = (event) => { @@ -186,7 +186,7 @@ export class CountLimitWidgetBase implements BaseWidget { } else { this.addValue(1); } - onChange?.(); + onChange?.(event); }; this.plusEl.oncontextmenu = (event) => { event.preventDefault(); @@ -196,7 +196,7 @@ export class CountLimitWidgetBase implements BaseWidget { } else { this.addMax(1); } - onChange?.(); + onChange?.(event); }; } } diff --git a/src/inline/base/dice.ts b/src/inline/base/dice.ts index dc24380..3de7a04 100644 --- a/src/inline/base/dice.ts +++ b/src/inline/base/dice.ts @@ -52,7 +52,7 @@ export class DiceWidgetBase implements BaseWidget { // Split text into parts const [controlWithParams, value] = normalized.split( - normalized.includes("=") ? " = " : ": " + normalized.includes("=") ? " = " : ": ", ); const separator = controlWithParams.includes("|") ? "|" : ","; const params: string[] = controlWithParams.split(separator); @@ -298,17 +298,17 @@ export class DiceWidgetBase implements BaseWidget { { title: "Default", checked: this.color === "", - onClick: () => { + onClick: (event) => { this.color = ""; - onChange?.(); + onChange?.(event); }, }, ...KNOWN_COLORS.map((color) => ({ title: capitalize(color), checked: this.color === color, - onClick: () => { + onClick: (event: MouseEvent) => { this.color = color; - onChange?.(); + onChange?.(event); }, })), ], @@ -319,40 +319,40 @@ export class DiceWidgetBase implements BaseWidget { { title: "Default", checked: this.size === SIZE_DEFAULT, - onClick: () => { + onClick: (event) => { this.size = SIZE_DEFAULT; - onChange?.(); + onChange?.(event); }, }, { title: "Small", checked: this.size === SIZE_SMALL, - onClick: () => { + onClick: (event) => { this.size = SIZE_SMALL; - onChange?.(); + onChange?.(event); }, }, { title: "Large", checked: this.size === SIZE_LARGE, - onClick: () => { + onClick: (event) => { this.size = SIZE_LARGE; - onChange?.(); + onChange?.(event); }, }, "-", { title: "Increase", - onClick: () => { + onClick: (event) => { this.size += 8; - onChange?.(); + onChange?.(event); }, }, { title: "Decrease", - onClick: () => { + onClick: (event) => { this.size -= 8; - onChange?.(); + onChange?.(event); }, }, ], @@ -360,17 +360,17 @@ export class DiceWidgetBase implements BaseWidget { { title: "Show dice", checked: this.explicit, - onClick: () => { + onClick: (event) => { this.toggleExplicit(); - onChange?.(); + onChange?.(event); }, }, { title: "Lock", checked: this.disabled, - onClick: () => { + onClick: (event) => { this.toggleDisable(); - onChange?.(); + onChange?.(event); }, }, onFocus ? "-" : undefined, @@ -385,15 +385,15 @@ export class DiceWidgetBase implements BaseWidget { ]); let i = 0; - const reroll = () => { + const reroll = (event: MouseEvent) => { this.roll(); i++; if (rollIntervals[i]) { - setTimeout(reroll, rollIntervals[i] * 0.5); + setTimeout(() => reroll(event), rollIntervals[i] * 0.5); } else { i = 0; - onChange?.(); + onChange?.(event); rollLock = false; } }; @@ -403,7 +403,7 @@ export class DiceWidgetBase implements BaseWidget { if (this.disabled) return; if (rollLock) return; rollLock = true; - setTimeout(reroll, rollIntervals[i]); + setTimeout(() => reroll(event), rollIntervals[i]); setTimeout(() => { rollLock = false; }, 320); diff --git a/src/inline/base/index.ts b/src/inline/base/index.ts index e3466e4..ce67c6f 100644 --- a/src/inline/base/index.ts +++ b/src/inline/base/index.ts @@ -4,3 +4,4 @@ export * from "./countlimit"; export * from "./dice"; export * from "./space"; export * from "./track"; +export * from "./utils"; diff --git a/src/inline/base/shared.ts b/src/inline/base/shared.ts index a0b5668..238377a 100644 --- a/src/inline/base/shared.ts +++ b/src/inline/base/shared.ts @@ -5,7 +5,7 @@ type MenuItemOption = { title: string; checked?: boolean; disabled?: boolean; - onClick?: () => void; + onClick?: (event: MouseEvent) => void; subMenu?: MenuItemBlueprint[]; }; diff --git a/src/inline/base/track.ts b/src/inline/base/track.ts index 0d56dcb..18ca382 100644 --- a/src/inline/base/track.ts +++ b/src/inline/base/track.ts @@ -155,31 +155,31 @@ export class TrackWidgetBase implements BaseWidget { const menu = createMenu([ { title: "Advance", - onClick: () => { + onClick: (event) => { this.addValue(1); - onChange?.(); + onChange?.(event); }, }, { title: "Subtract", - onClick: () => { + onClick: (event) => { this.addValue(-1); - onChange?.(); + onChange?.(event); }, }, "-", { title: "Fill", - onClick: () => { + onClick: (event) => { this.setValueTo(this.max); - onChange?.(); + onChange?.(event); }, }, { title: "Reset", - onClick: () => { + onClick: (event) => { this.setValueTo(0); - onChange?.(); + onChange?.(event); }, }, "-", @@ -189,17 +189,17 @@ export class TrackWidgetBase implements BaseWidget { { title: "Default", checked: this.color === "", - onClick: () => { + onClick: (event) => { this.color = ""; - onChange?.(); + onChange?.(event); }, }, ...KNOWN_COLORS.map((color) => ({ title: capitalize(color), checked: this.color === color, - onClick: () => { + onClick: (event: MouseEvent) => { this.color = color; - onChange?.(); + onChange?.(event); }, })), ], @@ -210,40 +210,40 @@ export class TrackWidgetBase implements BaseWidget { { title: "Default", checked: this.size === SIZE_DEFAULT, - onClick: () => { + onClick: (event) => { this.size = SIZE_DEFAULT; - onChange?.(); + onChange?.(event); }, }, { title: "Small", checked: this.size === SIZE_SMALL, - onClick: () => { + onClick: (event) => { this.size = SIZE_SMALL; - onChange?.(); + onChange?.(event); }, }, { title: "Large", checked: this.size === SIZE_LARGE, - onClick: () => { + onClick: (event) => { this.size = SIZE_LARGE; - onChange?.(); + onChange?.(event); }, }, "-", { title: "Increase", - onClick: () => { + onClick: (event) => { this.size += 8; - onChange?.(); + onChange?.(event); }, }, { title: "Decrease", - onClick: () => { + onClick: (event) => { this.size -= 8; - onChange?.(); + onChange?.(event); }, }, ], @@ -254,17 +254,17 @@ export class TrackWidgetBase implements BaseWidget { { title: "Box", checked: this.shape === "boxes", - onClick: () => { + onClick: (event) => { this.shape = "boxes"; - onChange?.(); + onChange?.(event); }, }, { title: "Circle", checked: this.shape === "circles", - onClick: () => { + onClick: (event) => { this.shape = "circles"; - onChange?.(); + onChange?.(event); }, }, ], @@ -288,13 +288,13 @@ export class TrackWidgetBase implements BaseWidget { btnEl.classList.add( "clickable-icon", "srt-track-btn", - `srt-track-${this.shape}` + `srt-track-${this.shape}`, ); btnEl.onclick = (event) => { event.preventDefault(); event.stopPropagation(); this.setValue(i); - onChange?.(); + onChange?.(event); }; setTooltip(btnEl, (i + 1).toString(), { delay: 0 }); this.btnEls.push(btnEl); diff --git a/src/inline/base/types.ts b/src/inline/base/types.ts index fd4dbf4..9d25688 100644 --- a/src/inline/base/types.ts +++ b/src/inline/base/types.ts @@ -2,7 +2,7 @@ import { Menu, MenuItem } from "obsidian"; export type DomOptions = { onFocus?: () => void; - onChange?: () => void; + onChange?: (event?: MouseEvent) => void; }; export interface BaseWidget { diff --git a/src/inline/base/utils.ts b/src/inline/base/utils.ts new file mode 100644 index 0000000..8e0684a --- /dev/null +++ b/src/inline/base/utils.ts @@ -0,0 +1,43 @@ +import { App, Editor, MarkdownView } from "obsidian"; + +type EditorWithPosAtMouse = Editor & { + posAtMouse?: (event: MouseEvent) => { line: number; ch: number }; +}; + +const findParentWidgetLines = ({ + app, + event, +}: { + app: App; + event: MouseEvent; +}): [number, number] => { + let lineStart = -1; + let lineEnd = -1; + + // FIXME: read plugins in edit mode don't provide section info, so this is the only + // somewhat working solution for finding element position inside the document + const view = app.workspace.getActiveViewOfType(MarkdownView); + if (view) { + const editor = view.editor as EditorWithPosAtMouse; + if (editor?.posAtMouse && typeof editor?.posAtMouse === "function") { + const position = editor.posAtMouse(event); + if (position) { + lineStart = position.line; + lineEnd = lineStart + 500; // Dunno how many lines the parent element will be, we'll hope for the best here + } + } + } + + return [lineStart, lineEnd]; +}; + +export const getWidgetLines = ( + { lineStart, lineEnd, app }: { lineStart: number; lineEnd: number; app: App }, + event: MouseEvent, +): [number, number] => { + if ((lineStart === -1 || lineEnd === -1) && event) { + return findParentWidgetLines({ app, event }); + } else { + return [lineStart, lineEnd]; + } +}; diff --git a/src/inline/live/index.ts b/src/inline/live/index.ts index 375c2d9..3eadcbe 100644 --- a/src/inline/live/index.ts +++ b/src/inline/live/index.ts @@ -72,7 +72,7 @@ class TrackPlugin implements PluginValue { const from = node.from - 1; const to = node.to + 1; - if (this.isRangeSelected(from, to, selection)) { + if (this.isRangeSelected(from + 1, to - 1, selection)) { return; } @@ -90,7 +90,7 @@ class TrackPlugin implements PluginValue { originalNode: node.node, originalText: text, }), - }) + }), ); } @@ -105,7 +105,7 @@ class TrackPlugin implements PluginValue { originalNode: node.node, originalText: text, }), - }) + }), ); } @@ -120,7 +120,7 @@ class TrackPlugin implements PluginValue { originalNode: node.node, originalText: text, }), - }) + }), ); } @@ -135,7 +135,7 @@ class TrackPlugin implements PluginValue { originalNode: node.node, originalText: text, }), - }) + }), ); } @@ -150,7 +150,7 @@ class TrackPlugin implements PluginValue { originalNode: node.node, originalText: text, }), - }) + }), ); } @@ -174,7 +174,7 @@ class TrackPlugin implements PluginValue { this.spaceStoreIndex[thisWidgetIndex] = width; }, }), - }) + }), ); widgetIndex++; } @@ -191,10 +191,10 @@ class TrackPlugin implements PluginValue { isRangeSelected( from: number, to: number, - selection: EditorSelection + selection: EditorSelection, ): boolean { return !!selection.ranges.find( - (range: SelectionRange) => range.from <= to && range.to >= from + (range: SelectionRange) => range.from <= to && range.to >= from, ); } diff --git a/src/inline/read/clock.ts b/src/inline/read/clock.ts index 089bba2..3c8a744 100644 --- a/src/inline/read/clock.ts +++ b/src/inline/read/clock.ts @@ -1,6 +1,11 @@ import { TFile, App } from "obsidian"; import { replaceInFile } from "src/utils/plugin"; -import { ClockWidgetBase, CLOCK_REGEX, CLOCK_REGEX_G } from "../base"; +import { + ClockWidgetBase, + CLOCK_REGEX, + CLOCK_REGEX_G, + getWidgetLines, +} from "../base"; export { CLOCK_REGEX }; @@ -29,13 +34,15 @@ export class ClockWidget { this.index = opts.index; } - updateDoc() { + updateDoc(event: MouseEvent) { + const [lineStart, lineEnd] = getWidgetLines(this, event); + replaceInFile({ vault: this.app.vault, file: this.file, regex: CLOCK_REGEX_G, - lineStart: this.lineStart, - lineEnd: this.lineEnd, + lineStart, + lineEnd, newValue: this.base.getText("`"), replaceIndex: this.index, }); @@ -43,7 +50,7 @@ export class ClockWidget { toDOM(): HTMLElement { this.base.generateDOM({ - onChange: () => this.updateDoc(), + onChange: (event: MouseEvent) => this.updateDoc(event), }); return this.base.el; diff --git a/src/inline/read/count.ts b/src/inline/read/count.ts index 9935f04..e5a2400 100644 --- a/src/inline/read/count.ts +++ b/src/inline/read/count.ts @@ -1,6 +1,11 @@ import { TFile, App } from "obsidian"; import { replaceInFile } from "src/utils/plugin"; -import { CountWidgetBase, COUNT_REGEX, COUNT_REGEX_G } from "../base"; +import { + CountWidgetBase, + COUNT_REGEX, + COUNT_REGEX_G, + getWidgetLines, +} from "../base"; export { COUNT_REGEX }; @@ -29,13 +34,15 @@ export class CountWidget { this.index = opts.index; } - updateDoc() { + updateDoc(event: MouseEvent) { + const [lineStart, lineEnd] = getWidgetLines(this, event); + replaceInFile({ vault: this.app.vault, file: this.file, regex: COUNT_REGEX_G, - lineStart: this.lineStart, - lineEnd: this.lineEnd, + lineStart, + lineEnd, newValue: this.base.getText("`"), replaceIndex: this.index, }); @@ -43,7 +50,7 @@ export class CountWidget { toDOM(): HTMLElement { this.base.generateDOM({ - onChange: () => this.updateDoc(), + onChange: (event: MouseEvent) => this.updateDoc(event), }); return this.base.el; diff --git a/src/inline/read/countlimit.ts b/src/inline/read/countlimit.ts index 6063c62..997604c 100644 --- a/src/inline/read/countlimit.ts +++ b/src/inline/read/countlimit.ts @@ -4,6 +4,7 @@ import { CountLimitWidgetBase, COUNT_LIMIT_REGEX, COUNT_LIMIT_REGEX_G, + getWidgetLines, } from "../base"; export { COUNT_LIMIT_REGEX }; @@ -33,13 +34,15 @@ export class CountLimitWidget { this.index = opts.index; } - updateDoc() { + updateDoc(event: MouseEvent) { + const [lineStart, lineEnd] = getWidgetLines(this, event); + replaceInFile({ vault: this.app.vault, file: this.file, regex: COUNT_LIMIT_REGEX_G, - lineStart: this.lineStart, - lineEnd: this.lineEnd, + lineStart, + lineEnd, newValue: this.base.getText("`"), replaceIndex: this.index, }); @@ -47,7 +50,7 @@ export class CountLimitWidget { toDOM(): HTMLElement { this.base.generateDOM({ - onChange: () => this.updateDoc(), + onChange: (event: MouseEvent) => this.updateDoc(event), }); return this.base.el; diff --git a/src/inline/read/dice.ts b/src/inline/read/dice.ts index 6f5eee9..3a8b429 100644 --- a/src/inline/read/dice.ts +++ b/src/inline/read/dice.ts @@ -1,6 +1,11 @@ import { TFile, App } from "obsidian"; import { replaceInFile } from "src/utils/plugin"; -import { DiceWidgetBase, DICE_REGEX, DICE_REGEX_G } from "../base"; +import { + DiceWidgetBase, + DICE_REGEX, + DICE_REGEX_G, + getWidgetLines, +} from "../base"; export { DICE_REGEX }; @@ -29,13 +34,15 @@ export class DiceWidget { this.index = opts.index; } - updateDoc() { + updateDoc(event: MouseEvent) { + const [lineStart, lineEnd] = getWidgetLines(this, event); + replaceInFile({ vault: this.app.vault, file: this.file, regex: DICE_REGEX_G, - lineStart: this.lineStart, - lineEnd: this.lineEnd, + lineStart, + lineEnd, newValue: this.base.getText("`"), replaceIndex: this.index, }); @@ -43,7 +50,7 @@ export class DiceWidget { toDOM(): HTMLElement { this.base.generateDOM({ - onChange: () => this.updateDoc(), + onChange: (event: MouseEvent) => this.updateDoc(event), }); return this.base.el; diff --git a/src/inline/read/index.ts b/src/inline/read/index.ts index 07f5d16..6611c5b 100644 --- a/src/inline/read/index.ts +++ b/src/inline/read/index.ts @@ -19,10 +19,10 @@ export const soloToolkitPostprocessor = (plugin: Plugin) => { const file = plugin.app.vault.getAbstractFileByPath(ctx.sourcePath); if (!(file instanceof TFile)) return; const section = ctx.getSectionInfo(element); - if (!section) return; + // if (!section) return; - const lineStart = section.lineStart; - const lineEnd = section.lineEnd; + const lineStart = section?.lineStart || -1; + const lineEnd = section?.lineEnd || -1; const indexMap = { count: 0, countLimit: 0, diff --git a/src/inline/read/track.ts b/src/inline/read/track.ts index b504bc2..68f2a4c 100644 --- a/src/inline/read/track.ts +++ b/src/inline/read/track.ts @@ -1,6 +1,11 @@ import { App, TFile } from "obsidian"; import { replaceInFile } from "src/utils/plugin"; -import { TrackWidgetBase, TRACK_REGEX, TRACK_REGEX_G } from "../base"; +import { + TrackWidgetBase, + TRACK_REGEX, + TRACK_REGEX_G, + getWidgetLines, +} from "../base"; export { TRACK_REGEX }; @@ -29,13 +34,15 @@ export class TrackWidget { this.index = opts.index; } - updateDoc() { + updateDoc(event: MouseEvent) { + const [lineStart, lineEnd] = getWidgetLines(this, event); + replaceInFile({ vault: this.app.vault, file: this.file, regex: TRACK_REGEX_G, - lineStart: this.lineStart, - lineEnd: this.lineEnd, + lineStart, + lineEnd, newValue: this.base.getText("`"), replaceIndex: this.index, }); @@ -43,7 +50,7 @@ export class TrackWidget { toDOM(): HTMLElement { this.base.generateDOM({ - onChange: () => this.updateDoc(), + onChange: (event: MouseEvent) => this.updateDoc(event), }); return this.base.el; diff --git a/src/utils/plugin.ts b/src/utils/plugin.ts index 73d3b2f..19021d1 100644 --- a/src/utils/plugin.ts +++ b/src/utils/plugin.ts @@ -9,9 +9,10 @@ export const replaceInFile = (opts: { newValue: string; replaceIndex: number; }) => { + if (opts.lineStart === -1 || opts.lineEnd === -1) return; + opts.vault.process(opts.file, (content: string): string => { const lines = content.split("\n"); - const regex = new RegExp(opts.regex, "g"); let matchIndex = 0; @@ -33,8 +34,6 @@ export const replaceInFile = (opts: { } } } - - // console.error("Match index not found") } return lines.join("\n"); diff --git a/src/view/word/parser.ts b/src/view/word/parser.ts index 5688f81..59f3a31 100644 --- a/src/view/word/parser.ts +++ b/src/view/word/parser.ts @@ -186,7 +186,7 @@ export const parseFileContent = ( } } - // Remove template based on prefix + // Remove templates based on prefix if (templates.length && settings.templatePrefix) { const templatesWithPrefix = templates.filter((template) => template.key.startsWith(settings.templatePrefix)