({
- create(state: EditorState) {
- return Decoration.none;
- },
- update(effects: DecorationSet, tr: Transaction) {
- let text = "";
- const selection = tr.newSelection.main;
- if (selection.empty) {
- const textIter = tr.newDoc.iter();
- while (!textIter.done) {
- text = text + textIter.next().value;
- }
- } else {
- const textIter = tr.newDoc.iterRange(selection.from, selection.to);
- while (!textIter.done) {
- text = text + textIter.next().value;
- }
- }
-
- BetterWordCount.updateStatusBar(text);
-
- return effects;
- },
-
- provide: (f: any) => EditorView.decorations.from(f),
- });
-
- this.registerEditorExtension(cmStateField);
- }
-
- static updateStatusBar(text: string) {
- const words = this.getWordCount(text);
- const chars = this.getCharacterCount(text);
-
- this.statusBar.displayText(`${words} words ${chars} characters`);
- }
-
- static getWordCount(text: string): number {
- const spaceDelimitedChars =
- /A-Za-z\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC/
- .source;
- const nonSpaceDelimitedWords =
- /\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u4E00-\u9FD5/
- .source;
-
- const nonSpaceDelimitedWordsOther =
- /[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u4E00-\u9FD5]{1}/
- .source;
-
- const pattern = new RegExp(
- [
- `(?:[0-9]+(?:(?:,|\\.)[0-9]+)*|[\\-${spaceDelimitedChars}])+`,
- nonSpaceDelimitedWords,
- nonSpaceDelimitedWordsOther,
- ].join("|"),
- "g"
- );
- return (text.match(pattern) || []).length;
- }
-
- static getCharacterCount(text: string): number {
- return text.length;
- }
}
diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts
index 8acee55..d9b752d 100644
--- a/src/settings/Settings.ts
+++ b/src/settings/Settings.ts
@@ -1,19 +1,22 @@
export enum Counter {
fileWords,
fileChars,
+ fileSentences,
totalWords,
totalChars,
+ totalSentences,
+ totalNotes,
}
export interface StatusBarItem {
- start: string;
- end: string;
+ prefix: string;
+ suffix: string;
count: Counter;
}
export const BLANK_SB_ITEM: StatusBarItem = {
- start: "",
- end: "",
+ prefix: "",
+ suffix: "",
count: null,
};
@@ -26,13 +29,13 @@ export interface BetterWordCountSettings {
export const DEFAULT_SETTINGS: BetterWordCountSettings = {
statusBar: [
{
- start: "",
- end: " words",
+ prefix: "",
+ suffix: " words",
count: Counter.fileWords,
},
{
- start: " ",
- end: " characters",
+ prefix: " ",
+ suffix: " characters",
count: Counter.fileChars,
},
],
diff --git a/src/settings/SettingsTab.ts b/src/settings/SettingsTab.ts
index 66e5bb1..98a2e68 100644
--- a/src/settings/SettingsTab.ts
+++ b/src/settings/SettingsTab.ts
@@ -1,19 +1,8 @@
-import {
- App,
- DropdownComponent,
- PluginSettingTab,
- Setting,
- TextAreaComponent,
- ToggleComponent,
-} from "obsidian";
+import { App, PluginSettingTab, Setting, ToggleComponent } from "obsidian";
import type BetterWordCount from "src/main";
-import type { StatusBarItem } from "./Settings";
import { addStatusBarSettings } from "./StatusBarSettings";
-export const details = (text: string, parent: HTMLElement) =>
- parent.createEl("details", {}, (d) => d.createEl("summary", { text }));
-
-export class BetterWordCountSettingsTab extends PluginSettingTab {
+export default class BetterWordCountSettingsTab extends PluginSettingTab {
constructor(app: App, private plugin: BetterWordCount) {
super(app, plugin);
}
diff --git a/src/settings/StatusBarSettings.svelte b/src/settings/StatusBarSettings.svelte
index e4703db..9ca823b 100644
--- a/src/settings/StatusBarSettings.svelte
+++ b/src/settings/StatusBarSettings.svelte
@@ -16,12 +16,21 @@
case Counter.fileChars:
return "File Chars";
+ case Counter.fileSentences:
+ return "File Sentences";
+
case Counter.totalWords:
return "Total Words";
case Counter.totalChars:
return "Total Chars";
+ case Counter.totalSentences:
+ return "Total Sentences"
+
+ case Counter.totalNotes:
+ return "Total Notes";
+
default:
return "Select Options"
}
@@ -137,11 +146,23 @@
}}
>
-
-
-
-
-
+
+
+
+
+
+
diff --git a/src/stats/Stats.ts b/src/stats/Stats.ts
new file mode 100644
index 0000000..5209bb3
--- /dev/null
+++ b/src/stats/Stats.ts
@@ -0,0 +1,29 @@
+export interface VaultStatistics {
+ history: History;
+ modifiedFiles: ModifiedFiles;
+}
+
+export type History = Record;
+
+export interface Day {
+ words: number;
+ characters: number;
+ sentences: number;
+ files: number;
+ totalWords: number;
+ totalCharacters: number;
+ totalSentences: number;
+}
+
+export type ModifiedFiles = Record;
+
+export interface FileStat {
+ words: CountDiff;
+ characters: CountDiff;
+ sentences: CountDiff;
+}
+
+export interface CountDiff {
+ initial: number;
+ current: number;
+}
diff --git a/src/stats/StatsManager.ts b/src/stats/StatsManager.ts
new file mode 100644
index 0000000..0b4b451
--- /dev/null
+++ b/src/stats/StatsManager.ts
@@ -0,0 +1,193 @@
+import type { Vault, TFile, Workspace } from "obsidian";
+import { STATS_FILE } from "../constants";
+import type {
+ CountDiff,
+ Day,
+ VaultStatistics,
+ History,
+ FileStat,
+} from "./Stats";
+import moment from "moment";
+import {
+ getCharacterCount,
+ getSentenceCount,
+ getWordCount,
+} from "../utils/StatUtils";
+
+export default class StatsManager {
+ private vault: Vault;
+ private workspace: Workspace;
+ private vaultStats: VaultStatistics;
+ private today: string;
+ // public debounceChange: Debouncer<[file: TFile, data: string]>;
+
+ constructor(vault: Vault, workspace: Workspace) {
+ this.vault = vault;
+ this.workspace = workspace;
+
+ this.vault.adapter.exists(STATS_FILE).then(async (exists) => {
+ if (!exists) {
+ const vaultSt: VaultStatistics = {
+ history: {},
+ modifiedFiles: {},
+ };
+ await this.vault.adapter.write(STATS_FILE, JSON.stringify(vaultSt));
+ this.vaultStats = JSON.parse(await this.vault.adapter.read(STATS_FILE));
+ } else {
+ this.vaultStats = JSON.parse(await this.vault.adapter.read(STATS_FILE));
+ }
+
+ await this.updateToday();
+ });
+ }
+
+ async update(): Promise {
+ this.vault.adapter.write(STATS_FILE, JSON.stringify(this.vaultStats));
+ }
+
+ async updateToday(): Promise {
+ if (this.vaultStats.history.hasOwnProperty(moment().format("YYYY-MM-DD"))) {
+ this.today = moment().format("YYYY-MM-DD");
+ return;
+ }
+
+ this.today = moment().format("YYYY-MM-DD");
+ const totalWords = await this.calcTotalWords();
+ const totalCharacters = await this.calcTotalCharacters();
+ const totalSentences = await this.calcTotalSentences();
+ const totalFiles = this.getTotalFiles();
+
+ const newDay: Day = {
+ words: 0,
+ characters: 0,
+ sentences: 0,
+ files: 0,
+ totalWords: totalWords,
+ totalCharacters: totalCharacters,
+ totalSentences: totalSentences,
+ };
+
+ this.vaultStats.modifiedFiles = {};
+ this.vaultStats.history[this.today] = newDay;
+ await this.update();
+ }
+
+ public async change(text: string) {
+ const fileName = this.workspace.getActiveFile().path;
+ const currentWords = getWordCount(text);
+ const currentCharacters = getCharacterCount(text);
+ const currentSentences = getSentenceCount(text);
+ if (
+ this.vaultStats.history.hasOwnProperty(this.today) &&
+ this.today === moment().format("YYYY-MM-DD")
+ ) {
+ let modFiles = this.vaultStats.modifiedFiles;
+
+ if (modFiles.hasOwnProperty(fileName)) {
+ this.vaultStats.history[this.today].totalWords += currentWords - modFiles[fileName].words.current;
+ this.vaultStats.history[this.today].totalCharacters += currentCharacters - modFiles[fileName].characters.current;
+ this.vaultStats.history[this.today].totalSentences += currentSentences - modFiles[fileName].sentences.current;
+ modFiles[fileName].words.current = currentWords;
+ modFiles[fileName].characters.current = currentCharacters;
+ modFiles[fileName].sentences.current = currentSentences;
+
+
+ } else {
+ modFiles[fileName] = {
+ words: {
+ initial: currentWords,
+ current: currentWords,
+ },
+ characters: {
+ initial: currentCharacters,
+ current: currentCharacters,
+ },
+ sentences: {
+ initial: currentSentences,
+ current: currentSentences,
+ }
+ };
+ }
+
+ const words = Object.values(modFiles)
+ .map((counts) =>
+ Math.max(0, counts.words.current - counts.words.initial)
+ )
+ .reduce((a, b) => a + b, 0);
+ const characters = Object.values(modFiles)
+ .map((counts) =>
+ Math.max(0, counts.characters.current - counts.characters.initial)
+ )
+ .reduce((a, b) => a + b, 0);
+ const sentences = Object.values(modFiles)
+ .map((counts) =>
+ Math.max(0, counts.sentences.current - counts.sentences.initial)
+ )
+ .reduce((a, b) => a + b, 0);
+
+ this.vaultStats.history[this.today].words = words;
+ this.vaultStats.history[this.today].characters = characters;
+ this.vaultStats.history[this.today].sentences = sentences;
+ this.vaultStats.history[this.today].files = this.getTotalFiles();
+
+ await this.update();
+ } else {
+ this.updateToday();
+ }
+ }
+
+ private async calcTotalWords(): Promise {
+ let words = 0;
+
+ const files = this.vault.getFiles();
+ for (const i in files) {
+ const file = files[i];
+ if (file.extension === "md") {
+ words += getWordCount(await this.vault.cachedRead(file));
+ }
+ }
+
+ return words;
+ }
+
+ private async calcTotalCharacters(): Promise {
+ let characters = 0;
+ const files = this.vault.getFiles();
+ for (const i in files) {
+ const file = files[i];
+ if (file.extension === "md") {
+ characters += getCharacterCount(await this.vault.cachedRead(file));
+ }
+ }
+ return characters;
+ }
+
+ private async calcTotalSentences(): Promise {
+ let sentence = 0;
+ const files = this.vault.getFiles();
+ for (const i in files) {
+ const file = files[i];
+ if (file.extension === "md") {
+ sentence += getSentenceCount(await this.vault.cachedRead(file));
+ }
+ }
+
+ return sentence;
+ }
+
+ public getTotalFiles(): number {
+ return this.vault.getMarkdownFiles().length;
+ }
+
+ public getTotalWords(): number {
+ return this.vaultStats.history[this.today].totalWords;
+ }
+
+ public getTotalCharacters(): number {
+ return this.vaultStats.history[this.today].totalCharacters;
+ }
+
+ public getTotalSentences(): number {
+ return this.vaultStats.history[this.today].totalSentences;
+ }
+}
diff --git a/src/status/StatusBar.ts b/src/status/StatusBar.ts
new file mode 100644
index 0000000..d44ee3f
--- /dev/null
+++ b/src/status/StatusBar.ts
@@ -0,0 +1,57 @@
+import type BetterWordCount from "../main";
+
+export default class StatusBar {
+ private statusBarEl: HTMLElement;
+ private plugin: BetterWordCount;
+
+ constructor(statusBarEl: HTMLElement, plugin: BetterWordCount) {
+ this.statusBarEl = statusBarEl;
+ this.plugin = plugin;
+
+ this.statusBarEl.classList.add("mod-clickable");
+ this.statusBarEl.setAttribute("aria-label", "Open Stats View");
+ this.statusBarEl.setAttribute("aria-label-position", "top");
+ this.statusBarEl.addEventListener("click", (ev: MouseEvent) =>
+ this.onClick(ev)
+ );
+ }
+
+ onClick(ev: MouseEvent) {
+ ev;
+ }
+
+ displayText(text: string) {
+ this.statusBarEl.setText(text);
+ }
+
+ updateStatusBar() {
+ // switch (sbItem.count) {
+ // case Counter.fileWords:
+ // display = display + getWordCount(text);
+ // break;
+ // case Counter.fileChars:
+ // display = display + getCharacterCount(text);
+ // break;
+ // case Counter.fileSentences:
+ // display = display + getSentenceCount(text);
+ // break;
+ // case Counter.totalWords:
+ // display = display + BetterWordCount.statsManager.getTotalWords();
+ // break;
+ // case Counter.totalChars:
+ // display = display + BetterWordCount.statsManager.getTotalCharacters();
+ // break;
+ // case Counter.totalSentences:
+ // display = display + BetterWordCount.statsManager.getTotalSentences();
+ // break;
+ // case Counter.totalNotes:
+ // display = display + BetterWordCount.statsManager.getTotalFiles();
+ // break;
+ //
+ // default:
+ // break;
+ // }
+ //
+ // display = display + sbItem.suffix;
+ }
+}
diff --git a/src/status/bar.ts b/src/status/bar.ts
deleted file mode 100644
index 0694273..0000000
--- a/src/status/bar.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-export class StatusBar {
- private statusBarEl: HTMLElement;
-
- constructor(statusBarEl: HTMLElement) {
- this.statusBarEl = statusBarEl;
- }
-
- displayText(text: string) {
- this.statusBarEl.setText(text);
- }
-}
diff --git a/src/status/manager.ts b/src/status/manager.ts
deleted file mode 100644
index 7695e2e..0000000
--- a/src/status/manager.ts
+++ /dev/null
@@ -1,169 +0,0 @@
-import { MetadataCache, Vault, Debouncer, debounce } from "obsidian";
-import { DataCollector } from "src/data/collector";
-import { DataManager } from "src/data/manager";
-import type { TodayCounts } from "src/data/manager";
-import type { BetterWordCountSettings } from "src/settings/settings";
-import {
- getWordCount,
- getCharacterCount,
- getSentenceCount,
- cleanComments,
-} from "../data/stats";
-import type { StatusBar } from "./bar";
-import { Expression, parse } from "./parse";
-
-export class BarManager {
- private statusBar: StatusBar;
- private settings: BetterWordCountSettings;
- private vault: Vault;
- private dataCollector: DataCollector;
- private dataManager: DataManager;
- private deboucer: Debouncer<[text: string]>;
- private expression: Expression;
-
- constructor(
- statusBar: StatusBar,
- settings: BetterWordCountSettings,
- vault: Vault,
- metadataCache: MetadataCache
- ) {
- this.statusBar = statusBar;
- this.settings = settings;
- this.vault = vault;
- this.dataCollector = new DataCollector(vault, metadataCache);
- this.dataManager = new DataManager(vault, metadataCache);
- this.deboucer = debounce(
- (text: string) => this.updateStatusBar(text),
- 20,
- false
- );
- this.expression = parse(this.settings.statusBarQuery);
- }
-
- updateStatusBar(text: string): void {
- let newText = "";
-
- if (this.settings.collectStats) {
- this.dataManager.updateTodayCounts();
- }
- const todayCounts: TodayCounts = this.settings.collectStats
- ? this.dataManager.getTodayCounts()
- : { words: 0, characters: 0, sentences: 0 };
-
- let varsIndex = 0;
- for (const i in this.expression.parsed) {
- const e = this.expression.parsed[i];
- newText = newText + e;
- switch (this.expression.vars[varsIndex]) {
- case 0:
- newText = newText + getWordCount(text);
- break;
- case 1:
- newText = newText + getCharacterCount(text);
- break;
- case 2:
- newText = newText + getSentenceCount(text);
- break;
- case 3:
- newText = newText + this.dataManager.getTotalCounts().words;
- break;
- case 4:
- newText = newText + this.dataManager.getTotalCounts().characters;
- break;
- case 5:
- newText = newText + this.dataManager.getTotalCounts().sentences;
- break;
- case 6:
- newText = newText + this.dataCollector.getTotalFileCount();
- break;
- case 7:
- newText = newText + todayCounts.words;
- break;
- case 8:
- newText = newText + todayCounts.characters;
- break;
- case 9:
- newText = newText + todayCounts.sentences;
- break;
- }
- varsIndex++;
- }
-
- this.statusBar.displayText(newText);
- }
-
- async updateAltStatusBar(): Promise {
- let newText = "";
- const expression: Expression = parse(this.settings.statusBarAltQuery);
- if (this.settings.collectStats) {
- this.dataManager.updateTodayCounts();
- }
-
- const todayCounts: TodayCounts = this.settings.collectStats
- ? this.dataManager.getTodayCounts()
- : { words: 0, characters: 0, sentences: 0 };
-
- let varsIndex = 0;
- for (const i in expression.parsed) {
- const e = expression.parsed[i];
- newText = newText + e;
- switch (expression.vars[varsIndex]) {
- case 0:
- newText = newText + getWordCount("");
- break;
- case 1:
- newText = newText + getCharacterCount("");
- break;
- case 2:
- newText = newText + getSentenceCount("");
- break;
- case 3:
- newText = newText + (await this.dataCollector.getTotalWordCount());
- break;
- case 4:
- newText =
- newText + (await this.dataCollector.getTotalCharacterCount());
- break;
- case 5:
- newText =
- newText + (await this.dataCollector.getTotalSentenceCount());
- break;
- case 6:
- newText = newText + this.dataCollector.getTotalFileCount();
- break;
- case 7:
- newText = newText + todayCounts.words;
- break;
- case 8:
- newText = newText + todayCounts.characters;
- break;
- case 9:
- newText = newText + todayCounts.sentences;
- break;
- }
- varsIndex++;
- }
-
- this.statusBar.displayText(newText);
- }
-
- cursorActivity(cm: CodeMirror.Editor) {
- console.log("detected cursor activity");
- if (cm.somethingSelected()) {
- if (this.settings.countComments) {
- this.deboucer(cleanComments(cm.getSelection()));
- } else {
- this.deboucer(cm.getSelection());
- }
- } else {
- if (this.settings.collectStats) {
- this.dataManager.updateFromFile();
- }
- if (this.settings.countComments) {
- this.deboucer(cleanComments(cm.getValue()));
- } else {
- this.deboucer(cm.getValue());
- }
- }
- }
-}
diff --git a/src/status/parse.ts b/src/status/parse.ts
deleted file mode 100644
index f21808f..0000000
--- a/src/status/parse.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-const REGEX: RegExp = /{(.*?)}/g;
-export interface Expression {
- parsed: string[];
- vars: number[];
-}
-
-// Could be done better
-export function parse(query: string): Expression {
- let parsed: string[] = [];
- let vars: number[] = [];
-
- query.split(REGEX).forEach((s) => {
- switch (s) {
- case "word_count":
- vars.push(0);
- break;
- case "character_count":
- vars.push(1);
- break;
- case "sentence_count":
- vars.push(2);
- break;
- case "total_word_count":
- vars.push(3);
- break;
- case "total_character_count":
- vars.push(4);
- break;
- case "total_sentence_count":
- vars.push(5);
- break;
- case "file_count":
- vars.push(6);
- break;
- case "words_today":
- vars.push(7);
- break;
- case "characters_today":
- vars.push(8);
- break;
- case "sentences_today":
- vars.push(9);
- break;
-
- default:
- parsed.push(s);
- break;
- }
- });
-
- return {
- parsed: parsed,
- vars: vars,
- };
-}
-
-const varNames = {
- word_count: 0,
- charater_count: 1,
- sentence_count: 2,
- total_word_count: 3,
- total_charater_count: 4,
- total_sentence_count: 5,
- file_count: 6,
-};
diff --git a/src/data/stats.ts b/src/utils/StatUtils.ts
similarity index 97%
rename from src/data/stats.ts
rename to src/utils/StatUtils.ts
index 8a5b5dc..1ca959c 100644
--- a/src/data/stats.ts
+++ b/src/utils/StatUtils.ts
@@ -1,3 +1,4 @@
+import type { Vault } from "obsidian";
import { MATCH_HTML_COMMENT, MATCH_COMMENT } from "src/constants";
export function getWordCount(text: string): number {
@@ -36,6 +37,10 @@ export function getSentenceCount(text: string): number {
return sentences;
}
+export function getTotalFileCount(vault: Vault): number {
+ return vault.getMarkdownFiles().length;
+}
+
export function cleanComments(text: string): string {
return text.replace(MATCH_COMMENT, "").replace(MATCH_HTML_COMMENT, "");
}
diff --git a/tsconfig.json b/tsconfig.json
index 547e119..b655159 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -12,13 +12,6 @@
"importHelpers": true
// "lib": ["dom", "es5", "scripthost", "es2015"]
},
- "include": [
- "**/main.ts",
- "**/bar.ts",
- "**/Settings.ts",
- "**/SettingsTab.ts",
- "**/StatusBarSettings.ts",
- "**/StatusBarSettings.svelte"
- ],
+ "include": ["**/*.ts", "**/*.svelte"],
"exclude": ["node_modules/*"]
}