2020-11-10 14:19:55 +00:00
|
|
|
import { MarkdownView, Plugin, TFile } from "obsidian";
|
2020-11-09 13:33:44 +00:00
|
|
|
import { StatusBar } from "./status-bar";
|
|
|
|
|
|
|
|
export default class BetterWordCount extends Plugin {
|
|
|
|
public recentlyTyped: boolean;
|
|
|
|
public statusBar: StatusBar;
|
|
|
|
|
|
|
|
onload() {
|
|
|
|
let statusBarEl = this.addStatusBarItem();
|
|
|
|
this.statusBar = new StatusBar(statusBarEl);
|
|
|
|
|
|
|
|
this.recentlyTyped = false;
|
|
|
|
|
|
|
|
this.registerEvent(
|
|
|
|
this.app.workspace.on("file-open", this.onFileOpen, this)
|
|
|
|
);
|
|
|
|
|
|
|
|
this.registerEvent(
|
|
|
|
this.app.workspace.on("quick-preview", this.onQuickPreview, this)
|
|
|
|
);
|
|
|
|
|
2020-11-10 14:19:55 +00:00
|
|
|
this.registerInterval(
|
|
|
|
window.setInterval(async () => {
|
|
|
|
let activeLeaf = this.app.workspace.activeLeaf;
|
|
|
|
let files: TFile[] = this.app.vault.getMarkdownFiles();
|
|
|
|
let currentFile: TFile;
|
|
|
|
|
|
|
|
files.forEach((file) => {
|
|
|
|
if ((file.basename = activeLeaf.getDisplayText())) {
|
|
|
|
currentFile = file;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
if (!activeLeaf || !(activeLeaf.view instanceof MarkdownView)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
let editor = activeLeaf.view.sourceMode.cmEditor;
|
|
|
|
if (editor.somethingSelected()) {
|
|
|
|
let content: string = editor.getSelection();
|
|
|
|
this.updateWordCount(content);
|
|
|
|
this.recentlyTyped = false;
|
|
|
|
} else if (
|
|
|
|
currentFile &&
|
|
|
|
currentFile.extension === "md" &&
|
|
|
|
!this.recentlyTyped
|
|
|
|
) {
|
|
|
|
const contents = await this.app.vault.read(currentFile);
|
|
|
|
this.updateWordCount(contents);
|
|
|
|
} else if (!this.recentlyTyped) {
|
|
|
|
this.updateWordCount("");
|
|
|
|
}
|
|
|
|
}, 500)
|
|
|
|
);
|
|
|
|
|
2020-11-09 13:33:44 +00:00
|
|
|
let activeLeaf = this.app.workspace.activeLeaf;
|
|
|
|
let files: TFile[] = this.app.vault.getMarkdownFiles();
|
|
|
|
|
|
|
|
files.forEach((file) => {
|
|
|
|
if ((file.basename = activeLeaf.getDisplayText())) {
|
|
|
|
this.onFileOpen(file);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async onFileOpen(file: TFile) {
|
|
|
|
if (file && file.extension === "md") {
|
|
|
|
const contents = await this.app.vault.cachedRead(file);
|
2020-11-10 14:19:55 +00:00
|
|
|
this.recentlyTyped = true;
|
2020-11-09 13:33:44 +00:00
|
|
|
this.updateWordCount(contents);
|
|
|
|
} else {
|
|
|
|
this.updateWordCount("");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
onQuickPreview(file: TFile, contents: string) {
|
|
|
|
const leaf = this.app.workspace.activeLeaf;
|
|
|
|
if (leaf && leaf.view.getViewType() === "markdown") {
|
|
|
|
this.recentlyTyped = true;
|
|
|
|
this.updateWordCount(contents);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
updateWordCount(text: string) {
|
|
|
|
let words = 0;
|
|
|
|
|
|
|
|
const matches = text.match(
|
|
|
|
/[a-zA-Z0-9_\u0392-\u03c9\u00c0-\u00ff\u0600-\u06ff]+|[\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff\u3040-\u309f\uac00-\ud7af]+/gm
|
|
|
|
);
|
|
|
|
|
|
|
|
if (matches) {
|
|
|
|
for (let i = 0; i < matches.length; i++) {
|
|
|
|
if (matches[i].charCodeAt(0) > 19968) {
|
|
|
|
words += matches[i].length;
|
|
|
|
} else {
|
|
|
|
words += 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
this.statusBar.displayText(`${words} words ` + `${text.length} characters`);
|
|
|
|
}
|
|
|
|
}
|