diff --git a/Commands/CountNotesExoCommand.ts b/Commands/CountNotesExoCommand.ts new file mode 100644 index 0000000..accd6b5 --- /dev/null +++ b/Commands/CountNotesExoCommand.ts @@ -0,0 +1,16 @@ +import ExoCommand from "./ExoCommand"; +import {App, Notice} from "obsidian"; +import NoteRepository from "../Domain/NoteRepository"; + +export default class CountNotesExoCommand implements ExoCommand { + name: string = "Количество заметок"; + + constructor(private app: App) { + } + + async execute(): Promise { + const noteRepository = new NoteRepository(this.app); + const count = noteRepository.all().length; + new Notice(`Vault has ${count} notes`); + } +} diff --git a/Commands/ExoCommands.ts b/Commands/ExoCommands.ts index a113270..b64edae 100644 --- a/Commands/ExoCommands.ts +++ b/Commands/ExoCommands.ts @@ -1,10 +1,13 @@ import OpenRandomNoteExoCommand from "./OpenRandomNoteExoCommand"; import ExoCommand from "./ExoCommand"; +import CountNotesExoCommand from "./CountNotesExoCommand"; +import {App} from "obsidian"; export default class ExoCommands { - static all(): ExoCommand[] { + static all(app: App): ExoCommand[] { return [ - new OpenRandomNoteExoCommand() + new OpenRandomNoteExoCommand(), + new CountNotesExoCommand(app) ]; } } diff --git a/Commands/ExoCommandsModal.ts b/Commands/ExoCommandsModal.ts index 3b971e6..50c0d3e 100644 --- a/Commands/ExoCommandsModal.ts +++ b/Commands/ExoCommandsModal.ts @@ -5,7 +5,7 @@ import ExoCommands from "./ExoCommands"; export class ExoCommandsModal extends FuzzySuggestModal { getItems(): ExoCommand[] { - return ExoCommands.all(); + return ExoCommands.all(this.app); } getItemText(cmd: ExoCommand): string { diff --git a/Commands/OpenRandomNoteExoCommand.ts b/Commands/OpenRandomNoteExoCommand.ts index 75aa31e..a7e4cf8 100644 --- a/Commands/OpenRandomNoteExoCommand.ts +++ b/Commands/OpenRandomNoteExoCommand.ts @@ -5,6 +5,7 @@ export default class OpenRandomNoteExoCommand implements ExoCommand { name: string = "Рандомная заметка из прошлого"; async execute(app: App): Promise { + const files = app.vault.getFiles(); const today = new Date(); const lastMonth = new Date(today.getFullYear(), today.getMonth() - 1, today.getDate()).setHours(0, 0, 0, 0); // Дата месяц назад без времени diff --git a/Domain/Note.ts b/Domain/Note.ts new file mode 100644 index 0000000..8343d4f --- /dev/null +++ b/Domain/Note.ts @@ -0,0 +1,10 @@ +import {TFile} from "obsidian"; + +export default class Note { + constructor(private tfile: TFile) { + } + + name(): string { + return this.tfile.basename; + } +} diff --git a/Domain/NoteRepository.ts b/Domain/NoteRepository.ts new file mode 100644 index 0000000..83ee069 --- /dev/null +++ b/Domain/NoteRepository.ts @@ -0,0 +1,15 @@ +import Note from "./Note"; +import {App} from "obsidian"; + +export default class NoteRepository { + private app: App; + + constructor(app: App) { + this.app = app; + } + + all(): Note[] { + const files = this.app.vault.getFiles(); + return files.map(f => new Note(f)); + } +} diff --git a/main.ts b/main.ts index 9b14c7d..032856d 100644 --- a/main.ts +++ b/main.ts @@ -1,5 +1,6 @@ import {Plugin} from 'obsidian'; import {ExoCommandsModal} from "./Commands/ExoCommandsModal"; +import "localforage"; export default class ExoPlugin extends Plugin { async onload() { diff --git a/package-lock.json b/package-lock.json index 9d39bac..0c214b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,24 +8,44 @@ "name": "obsidian-sample-plugin", "version": "1.0.0", "license": "MIT", + "dependencies": { + "compare-versions": "^6.1.1" + }, "devDependencies": { + "@types/luxon": "^3.4.2", "@types/node": "^16.11.6", + "@types/parsimmon": "^1.10.9", "@typescript-eslint/eslint-plugin": "5.29.0", "@typescript-eslint/parser": "5.29.0", "builtin-modules": "3.3.0", "esbuild": "0.17.3", "obsidian": "latest", + "obsidian-dataview": "^0.5.67", + "parsimmon": "^1.18.1", "tslib": "2.4.0", "typescript": "4.7.4" } }, + "node_modules/@codemirror/language": { + "version": "6.10.3", + "resolved": "git+ssh://git@github.com/lishid/cm-language.git#be84c19d93fa87ac4e43c1a5874b1d228b5b2a89", + "dev": true, + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.1.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, "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, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@codemirror/view": { "version": "6.35.0", @@ -33,7 +53,6 @@ "integrity": "sha512-I0tYy63q5XkaWsJ8QRv5h6ves7kvtrBWjBcnf/bzohFJQc5c14a1AQRdE8QpPF9eMp5Mq2FMm59TCj1gDfE7kw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@codemirror/state": "^6.4.0", "style-mod": "^4.1.0", @@ -522,6 +541,33 @@ "license": "BSD-3-Clause", "peer": true }, + "node_modules/@lezer/common": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", + "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@lezer/highlight": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", + "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", + "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -584,6 +630,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/luxon": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", + "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "16.18.121", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.121.tgz", @@ -591,6 +644,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/parsimmon": { + "version": "1.10.9", + "resolved": "https://registry.npmjs.org/@types/parsimmon/-/parsimmon-1.10.9.tgz", + "integrity": "sha512-O2M2x1w+m7gWLen8i5DOy6tWRnbRcsW6Pke3j3HAsJUrPb4g0MgjksIUm2aqUtCYxy7Qjr3CzjjwQBzhiGn46A==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/tern": { "version": "0.23.9", "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", @@ -987,6 +1047,12 @@ "license": "MIT", "peer": true }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1064,6 +1130,13 @@ "node": ">=6.0.0" } }, + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, "node_modules/esbuild": { "version": "0.17.3", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.3.tgz", @@ -1599,6 +1672,13 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "license": "MIT" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -1765,6 +1845,26 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -1790,6 +1890,16 @@ "license": "MIT", "peer": true }, + "node_modules/luxon": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", + "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -1868,6 +1978,79 @@ "@codemirror/view": "^6.0.0" } }, + "node_modules/obsidian-calendar-ui": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/obsidian-calendar-ui/-/obsidian-calendar-ui-0.3.12.tgz", + "integrity": "sha512-hdoRqCPnukfRgCARgArXaqMQZ+Iai0eY7f0ZsFHHfywpv4gKg3Tx5p47UsLvRO5DD+4knlbrL7Gel57MkfcLTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "obsidian-daily-notes-interface": "0.8.4", + "svelte": "3.35.0", + "tslib": "2.1.0" + } + }, + "node_modules/obsidian-calendar-ui/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true, + "license": "0BSD" + }, + "node_modules/obsidian-daily-notes-interface": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/obsidian-daily-notes-interface/-/obsidian-daily-notes-interface-0.8.4.tgz", + "integrity": "sha512-REKQtAuIOKDbvNH/th1C1gWmJWCP5tRn9T/mfZGZt4Zncgko7McXK0aSKFtEInipvgbZJ2nScivvyLdiWluSMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "obsidian": "github:obsidianmd/obsidian-api#master", + "tslib": "2.1.0" + }, + "bin": { + "obsidian-daily-notes-interface": "dist/main.js" + } + }, + "node_modules/obsidian-daily-notes-interface/node_modules/obsidian": { + "version": "1.7.2", + "resolved": "git+ssh://git@github.com/obsidianmd/obsidian-api.git#23947b58d372ea02225324308e31d36b4aa95869", + "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" + } + }, + "node_modules/obsidian-daily-notes-interface/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true, + "license": "0BSD" + }, + "node_modules/obsidian-dataview": { + "version": "0.5.67", + "resolved": "https://registry.npmjs.org/obsidian-dataview/-/obsidian-dataview-0.5.67.tgz", + "integrity": "sha512-nLQrjvZ6Ny5s6mCfi+rv0TsdYkKTV4YfDqyLNixxNkyLCqgE9AXKJlJNnkv3Ic1brGOw2m/0SgtdWykKzobwMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@codemirror/language": "git+https://github.com/lishid/cm-language.git", + "@codemirror/state": "^6.0.1", + "@codemirror/view": "^6.0.1", + "emoji-regex": "^10.0.0", + "localforage": "^1.10.0", + "luxon": "^3.2.0", + "obsidian-calendar-ui": "^0.3.12", + "papaparse": "^5.3.1", + "parsimmon": "^1.18.0", + "preact": "^10.6.5" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1932,6 +2115,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/papaparse": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", + "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==", + "dev": true, + "license": "MIT" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -1946,6 +2136,13 @@ "node": ">=6" } }, + "node_modules/parsimmon": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/parsimmon/-/parsimmon-1.18.1.tgz", + "integrity": "sha512-u7p959wLfGAhJpSDJVYXoyMCXWYwHia78HhRBWqk7AIbxdmlrfdp5wX0l3xv/iTSH5HvhN9K7o26hwwpgS5Nmw==", + "dev": true, + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2002,6 +2199,17 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/preact": { + "version": "10.25.4", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.4.tgz", + "integrity": "sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2203,8 +2411,7 @@ "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/supports-color": { "version": "7.2.0", @@ -2220,6 +2427,16 @@ "node": ">=8" } }, + "node_modules/svelte": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.35.0.tgz", + "integrity": "sha512-gknlZkR2sXheu/X+B7dDImwANVvK1R0QGQLd8CNIfxxGPeXBmePnxfzb6fWwTQRsYQG7lYkZXvpXJvxvpsoB7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -2329,8 +2546,7 @@ "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/which": { "version": "2.0.2", diff --git a/package.json b/package.json index 6a00766..10eab67 100644 --- a/package.json +++ b/package.json @@ -12,13 +12,20 @@ "author": "", "license": "MIT", "devDependencies": { + "@types/luxon": "^3.4.2", "@types/node": "^16.11.6", + "@types/parsimmon": "^1.10.9", "@typescript-eslint/eslint-plugin": "5.29.0", "@typescript-eslint/parser": "5.29.0", "builtin-modules": "3.3.0", "esbuild": "0.17.3", "obsidian": "latest", + "obsidian-dataview": "^0.5.67", + "parsimmon": "^1.18.1", "tslib": "2.4.0", "typescript": "4.7.4" + }, + "dependencies": { + "compare-versions": "^6.1.1" } } diff --git a/tsconfig.json b/tsconfig.json index c44b729..d859db7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,24 +1,36 @@ { - "compilerOptions": { - "baseUrl": ".", - "inlineSourceMap": true, - "inlineSources": true, - "module": "ESNext", - "target": "ES6", - "allowJs": true, - "noImplicitAny": true, - "moduleResolution": "node", - "importHelpers": true, - "isolatedModules": true, - "strictNullChecks": true, - "lib": [ - "DOM", - "ES5", - "ES6", - "ES7" - ] - }, - "include": [ - "**/*.ts" - ] + "compilerOptions": { + "baseUrl": ".", + "inlineSourceMap": true, + "inlineSources": true, + "module": "ESNext", + "target": "ES6", + "allowJs": true, + "noImplicitAny": true, + "moduleResolution": "node", + "importHelpers": true, + "isolatedModules": true, + "strictNullChecks": true, + "lib": [ + "DOM", + "ES5", + "ES6", + "ES7" + ], + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "typeRoots": [ + "./node_modules/@types", + "./types", + "./node_modules/obsidian-dataview" + ], + "paths": { + "*": [ + "./node_modules/obsidian-dataview/lib/*" + ] + } + }, + "include": [ + "**/*.ts" + ] }