From c39ff3f3e29fbc4d66aa7a9c37dfc7bb17f7224c Mon Sep 17 00:00:00 2001 From: Zsolt Viczian Date: Sun, 12 Dec 2021 13:44:36 +0100 Subject: [PATCH] 1.5.1 --- docs/ExcalidrawScriptsEngine.md | 9 ++++-- images/scripts-split-lines.jpg | Bin 0 -> 34006 bytes manifest.json | 2 +- package.json | 2 +- src/ExcalidrawAutomate.ts | 2 +- src/ExcalidrawView.ts | 8 ++--- src/Prompt.ts | 51 ++++++++++++++++++++++++++++++-- src/Scripts.ts | 17 ++++++++++- versions.json | 2 +- yarn.lock | 8 ++--- 10 files changed, 84 insertions(+), 17 deletions(-) create mode 100644 images/scripts-split-lines.jpg diff --git a/docs/ExcalidrawScriptsEngine.md b/docs/ExcalidrawScriptsEngine.md index a2cfd1b..6399303 100644 --- a/docs/ExcalidrawScriptsEngine.md +++ b/docs/ExcalidrawScriptsEngine.md @@ -20,8 +20,13 @@ This will allow you to assign hotkeys to your favorite scripts just like to any ## Script development An Excalidraw script will automatically receive two objects: - `ea`: The Script Enginge will initialize the `ea` object including setting the active view to the View from which the script was called. -- `utils`: There is currently only a single function published on `utils` - - `inputPrompt: (header: string, placeholder?: string, value?: string)`. You need to await the result of inputPrompt. See the example below for details. +- `utils`: I have borrowed functions exposed on utils from [QuickAdd](https://github.com/chhoumann/quickadd/blob/master/docs/QuickAddAPI.md), though currently not all QuickAdd utility functions are implemented in Excalidraw. As of now, these are the available functions. See the example below for details. + - `inputPrompt: (header: string, placeholder?: string, value?: string)` + - Opens a prompt that asks for an input. Returns a string with the input. + - You need to await the result of inputPrompt. + - `suggester: (displayItems: string[], actualItems: string[])` + - Opens a suggester. Displays the displayItems, but you map these the other values with actualItems. Returns the selected value. + - You need to await the result of suggester. --------- diff --git a/images/scripts-split-lines.jpg b/images/scripts-split-lines.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01766baab69f28a5ea727ab9be27ff26789ad80a GIT binary patch literal 34006 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 literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json index b0bae38..6b26782 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-excalidraw-plugin", "name": "Excalidraw", - "version": "1.5.0", + "version": "1.5.1", "minAppVersion": "0.12.16", "description": "An Obsidian plugin to edit and view Excalidraw drawings", "author": "Zsolt Viczian", diff --git a/package.json b/package.json index 384c80e..23914ef 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "author": "", "license": "MIT", "dependencies": { - "@zsviczian/excalidraw": "0.10.0-obsidian-18", + "@zsviczian/excalidraw": "0.10.0-obsidian-19", "monkey-around": "^2.2.0", "react": "^17.0.2", "react-dom": "^17.0.2", diff --git a/src/ExcalidrawAutomate.ts b/src/ExcalidrawAutomate.ts index 0cbd1a4..5d4a407 100644 --- a/src/ExcalidrawAutomate.ts +++ b/src/ExcalidrawAutomate.ts @@ -1028,7 +1028,7 @@ export async function initExcalidrawAutomate( appState: st, commitToHistory: true, }); - this.targetView.save(); + //this.targetView.save(); return true; }, getViewSelectedElement(): any { diff --git a/src/ExcalidrawView.ts b/src/ExcalidrawView.ts index ce58f3b..a40289d 100644 --- a/src/ExcalidrawView.ts +++ b/src/ExcalidrawView.ts @@ -1427,7 +1427,7 @@ export default class ExcalidrawView extends TextFileView { if ( document.fullscreenEnabled && document.fullscreenElement == this.contentEl && - e.keyCode == 27 + e.keyCode === 27 ) { document.exitFullscreen(); this.zoomToFit(); @@ -1822,7 +1822,7 @@ export default class ExcalidrawView extends TextFileView { await this.save(false); //this callback function will only be invoked if quick parse fails, i.e. there is a transclusion in the raw text //thus I only check if TextMode.parsed, text is always != with parseResult - if (this.textMode == TextMode.parsed) { + if (this.textMode === TextMode.parsed) { this.excalidrawAPI.history.clear(); } this.setupAutosaveTimer(); @@ -1831,7 +1831,7 @@ export default class ExcalidrawView extends TextFileView { if (parseResult) { //there were no transclusions in the raw text, quick parse was successful this.setupAutosaveTimer(); - if (this.textMode == TextMode.raw) { + if (this.textMode === TextMode.raw) { return; } //text is displayed in raw, no need to clear the history, undo will not create problems if (text == parseResult) { @@ -1843,7 +1843,7 @@ export default class ExcalidrawView extends TextFileView { return; } this.setupAutosaveTimer(); - if (this.textMode == TextMode.parsed) { + if (this.textMode === TextMode.parsed) { return this.excalidrawData.getParsedText(textElement.id); } }, diff --git a/src/Prompt.ts b/src/Prompt.ts index 248a590..9890b12 100644 --- a/src/Prompt.ts +++ b/src/Prompt.ts @@ -1,4 +1,4 @@ -import { App, ButtonComponent, Modal, TextComponent } from "obsidian"; +import { App, ButtonComponent, Modal, TextComponent,FuzzyMatch, FuzzySuggestModal } from "obsidian"; export class Prompt extends Modal { private promptEl: HTMLInputElement; @@ -55,7 +55,7 @@ export class Prompt extends Modal { } } -export default class GenericInputPrompt extends Modal { +export class GenericInputPrompt extends Modal { public waitForClose: Promise; private resolvePromise: (input: string) => void; @@ -203,3 +203,50 @@ export default class GenericInputPrompt extends Modal { this.removeInputListener(); } } + +export class GenericSuggester extends FuzzySuggestModal{ + private resolvePromise: (value: string) => void; + private rejectPromise: (reason?: any) => void; + public promise: Promise; + private resolved: boolean; + + public static Suggest(app: App, displayItems: string[], items: string[]) { + const newSuggester = new GenericSuggester(app, displayItems, items); + return newSuggester.promise; + } + + public constructor(app: App, private displayItems: string[], private items: string[]) { + super(app); + + this.promise = new Promise( + (resolve, reject) => {(this.resolvePromise = resolve); (this.rejectPromise = reject)} + ); + + this.open(); + } + + getItemText(item: string): string { + return this.displayItems[this.items.indexOf(item)]; + } + + getItems(): string[] { + return this.items; + } + + selectSuggestion(value: FuzzyMatch, evt: MouseEvent | KeyboardEvent) { + this.resolved = true; + super.selectSuggestion(value, evt); + } + + onChooseItem(item: string, evt: MouseEvent | KeyboardEvent): void { + this.resolved = true; + this.resolvePromise(item); + } + + onClose() { + super.onClose(); + + if (!this.resolved) + this.rejectPromise("no input given."); + } +} \ No newline at end of file diff --git a/src/Scripts.ts b/src/Scripts.ts index 5407066..c23aee8 100644 --- a/src/Scripts.ts +++ b/src/Scripts.ts @@ -2,7 +2,7 @@ import { App, TAbstractFile, TFile } from "obsidian"; import { VIEW_TYPE_EXCALIDRAW } from "./constants"; import ExcalidrawView from "./ExcalidrawView"; import ExcalidrawPlugin from "./main"; -import GenericInputPrompt from "./Prompt"; +import { GenericInputPrompt, GenericSuggester} from "./Prompt"; import { splitFolderAndFilename } from "./Utils"; export class ScriptEngine { @@ -135,6 +135,8 @@ export class ScriptEngine { return await new AsyncFunction("ea", "utils", script)(this.plugin.ea, { inputPrompt: (header: string, placeholder?: string, value?: string) => ScriptEngine.inputPrompt(this.plugin.app, header, placeholder, value), + suggester: (displayItems: string[], items: string[]) => + ScriptEngine.suggester(this.plugin.app, displayItems, items), }); } @@ -150,4 +152,17 @@ export class ScriptEngine { return undefined; } } + + public static async suggester( + app: App, + displayItems: string[], + items: string[] + ) { + try { + return await GenericSuggester.Suggest(app, displayItems,items); + } catch { + return undefined; + } + } + } diff --git a/versions.json b/versions.json index f15e0a9..b5baad3 100644 --- a/versions.json +++ b/versions.json @@ -1,4 +1,4 @@ { - "1.5.0": "0.12.16", + "1.5.1": "0.12.16", "1.4.2": "0.11.13" } diff --git a/yarn.lock b/yarn.lock index 4de1078..ad045a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1202,10 +1202,10 @@ "@typescript-eslint/types" "5.6.0" "eslint-visitor-keys" "^3.0.0" -"@zsviczian/excalidraw@0.10.0-obsidian-18": - "integrity" "sha512-hnlDZUVVOMSgIoKRTu6gGe6mQVg4ggExWqB/DyaWJkv9DoFigMUYvPYA8xz3t1hWqtRHKTWOyA1CiFJFK/Zt8w==" - "resolved" "https://registry.npmjs.org/@zsviczian/excalidraw/-/excalidraw-0.10.0-obsidian-18.tgz" - "version" "0.10.0-obsidian-18" +"@zsviczian/excalidraw@0.10.0-obsidian-19": + "integrity" "sha512-sARr3HG4PaFNhvX3ekcFW8fPH9ixKLzs3bZ5tnUeEmQBDfgDV5FMaKMNRHieqcPBGfG5nquIM4oXFAf4ms1RXQ==" + "resolved" "https://registry.npmjs.org/@zsviczian/excalidraw/-/excalidraw-0.10.0-obsidian-19.tgz" + "version" "0.10.0-obsidian-19" dependencies: "dotenv" "10.0.0"