Anki/ts/editor/symbols-overlay/data-provider.ts
Henrik Giesel 8f8f3bd465
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
2022-09-10 18:46:59 +10:00

60 lines
1.5 KiB
TypeScript

// Copyright: Ankitects Pty Ltd and contributors
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import { characterEntities } from "character-entities";
import { gemoji } from "gemoji";
interface SymbolsEntry {
symbol: string;
names: string[];
tags: string[];
containsHTML?: boolean;
autoInsert?: boolean;
}
export type SymbolsTable = SymbolsEntry[];
const symbolsTable: SymbolsTable = [];
const characterTable: Record<string, string[]> = {};
// Not all characters work well in the editor field
delete characterEntities["Tab"];
for (const [name, character] of Object.entries(characterEntities)) {
if (character in characterTable) {
characterTable[character].push(name);
} else {
characterTable[character] = [name];
}
}
for (const [character, names] of Object.entries(characterTable)) {
symbolsTable.push({
symbol: character,
names,
tags: [],
});
}
for (const { emoji, names, tags } of gemoji) {
symbolsTable.push({
symbol: emoji,
names,
tags,
});
}
export async function getSymbols(query: string): Promise<SymbolsTable> {
return symbolsTable.filter(
({ names, tags }) =>
names.some((name) => name.includes(query)) ||
tags.some((tag) => tag.includes(query)),
);
}
export async function getSymbolExact(query: string): Promise<string | null> {
const found = symbolsTable.find(({ names }) => names.includes(query));
return found ? found.symbol : null;
}