From 8f8f3bd465ed7e5c47108374106b8ec6ec2bd072 Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Sat, 10 Sep 2022 10:46:59 +0200 Subject: [PATCH] Insert symbols overlay (#2051) * Add flag for enabling insert symbols feature * Add symbols overlay directory * Detect if :xy is inserted into editable * Allow naive updating of overlay, and special handling of ':' * First step towards better Virtual Element support * Update floating to reference range on insert text * Position SymbolsOverlay always on top or bottom * Add a data-provider to emulate API * Show correct suggestions in symbols overlay * Rename to replacementLength * Allow replacing via clicking in menu * Optionally remove inline padding of Popover * Hide Symbols overlay on blur of content editable * Add specialKey to inputHandler and generalize how arrow movement is detected - This way macOS users can use Ctrl-N to mean down, etc. * Detect special key from within SymbolsOverlay * Implement full backwards search while typing * Allow navigating symbol menu and accepting with enter * Add some entries to data-provider * Satisfy eslint * Generate symbolsTable from sources * Use other github source, allow multiple names In return, symbol must be unique * Automatically scroll in symbols dropdown * Use from npm packages rather than downloading from URL * Remove console.log * Remove print * Add pointerDown event to input-handler - so that SymbolsOverlay can reset on field click * Make tab do the same as enter * Make font a bit smaller but increase relative icon size * Satisfy type requirement of handlerlist * Revert changing default size of DropdownItems * Remove some now unused code for bootstrap dropdowns --- package.json | 2 + qt/aqt/editor.py | 5 +- ts/components/Badge.svelte | 8 +- ts/components/DropdownItem.svelte | 22 +- ts/components/LabelButton.svelte | 8 +- ts/components/Popover.svelte | 4 +- ts/components/WithFloating.svelte | 32 +- ts/components/dropdown.ts | 7 - ts/editable/content-editable.ts | 10 +- ts/editor/BUILD.bazel | 2 + ts/editor/NoteEditor.svelte | 11 + ts/editor/editor-toolbar/BlockButtons.svelte | 3 +- .../editor-toolbar/RemoveFormatButton.svelte | 3 +- .../mathjax-overlay/MathjaxEditor.svelte | 5 +- .../symbols-overlay/SymbolsOverlay.svelte | 297 ++++++++++++++++++ ts/editor/symbols-overlay/data-provider.ts | 60 ++++ ts/editor/symbols-overlay/index.ts | 6 + ts/editor/tsconfig.json | 1 + ts/lib/keys.ts | 33 ++ ts/licenses.json | 18 ++ ts/sveltelib/handler-list.ts | 10 + ts/sveltelib/input-handler.ts | 66 +++- ts/sveltelib/position/auto-update.ts | 8 +- ts/sveltelib/position/position-algorithm.d.ts | 4 +- ts/sveltelib/position/position-floating.ts | 15 +- ts/sveltelib/position/position-overlay.ts | 3 +- ts/tag-editor/TagEditor.svelte | 21 +- ts/tag-editor/TagInput.svelte | 35 +-- ts/tag-editor/WithAutocomplete.svelte | 2 +- yarn.lock | 10 + 30 files changed, 614 insertions(+), 97 deletions(-) delete mode 100644 ts/components/dropdown.ts create mode 100644 ts/editor/symbols-overlay/SymbolsOverlay.svelte create mode 100644 ts/editor/symbols-overlay/data-provider.ts create mode 100644 ts/editor/symbols-overlay/index.ts diff --git a/package.json b/package.json index c28b5efaf..d453004f2 100644 --- a/package.json +++ b/package.json @@ -64,12 +64,14 @@ "@types/marked": "^4.0.1", "bootstrap": "=5.0.2", "bootstrap-icons": "^1.4.0", + "character-entities": "^2.0.2", "codemirror": "^5.63.1", "css-browser-selector": "^0.6.5", "d3": "^7.0.0", "eslint-plugin-import": "^2.25.4", "eslint-plugin-simple-import-sort": "^7.0.0", "eslint-plugin-svelte3": "^3.4.0", + "gemoji": "^7.1.0", "intl-pluralrules": "^1.2.2", "jquery": "^3.5.1", "jquery-ui-dist": "^1.12.1", diff --git a/qt/aqt/editor.py b/qt/aqt/editor.py index f55eef4e3..89262ae21 100644 --- a/qt/aqt/editor.py +++ b/qt/aqt/editor.py @@ -533,7 +533,7 @@ require("anki/ui").loaded.then(() => require("anki/NoteEditor").instances[0].too setNoteId({}); setColorButtons({}); setTags({}); - setMathjaxEnabled({}); + setMathjaxEnabled({}); """.format( json.dumps(data), json.dumps(collapsed), @@ -551,6 +551,9 @@ require("anki/ui").loaded.then(() => require("anki/NoteEditor").instances[0].too sticky = [field["sticky"] for field in self.note.note_type()["flds"]] js += " setSticky(%s);" % json.dumps(sticky) + if os.getenv("ANKI_EDITOR_INSERT_SYMBOLS"): + js += " setInsertSymbolsEnabled();" + js = gui_hooks.editor_will_load_note(js, self.note, self) self.web.evalWithCallback( f'require("anki/ui").loaded.then(() => {{ {js} }})', oncallback diff --git a/ts/components/Badge.svelte b/ts/components/Badge.svelte index f68a665ba..d395bdbb7 100644 --- a/ts/components/Badge.svelte +++ b/ts/components/Badge.svelte @@ -3,10 +3,8 @@ Copyright: Ankitects Pty Ltd and contributors License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html -->