/// const base = `${window.config.relative_path}/plugins/nodebb-plugin-emoji`; const buster = window.config['cache-buster']; export { base, buster }; export function buildEmoji(emoji: StoredEmoji, defer?: boolean) { const whole = `:${emoji.name}:`; const deferClass = defer ? ' defer' : ''; if (emoji.image) { return `${emoji.character}`; } return `${emoji.character}`; } export let table: MetaData.table; export let fuse: Fuse; export const strategy = { match: /\B:([^\s\n:]*)?$/, search: (term: string, callback: Callback) => { if (!term) { callback(Object.keys(table).map(key => table[key])); return; } callback(fuse.search(term)); }, index: 1, replace: (emoji: StoredEmoji) => { return ':' + emoji.name + ': '; }, template: (emoji: StoredEmoji) => { return buildEmoji(emoji) + ' ' + emoji.name; }, cache: true, }; let initialized = false; export function init(callback?: Callback) { if (initialized) { return; } initialized = true; Promise.all([ import('Fuse'), import('composer/formatting'), Promise.resolve($.getJSON(`${base}/emoji/table.json?${buster}`)) as Promise, ]).then(([Fuse, formatting, tableData]) => { // tslint:disable-line variable-name table = tableData; const all = Object.keys(table).map(name => table[name]); fuse = new Fuse(all, { shouldSort: true, threshold: 0.3, location: 0, distance: 100, maxPatternLength: 32, keys: ['name', 'aliases', 'keywords'], }); formatting.addButtonDispatch( 'emoji-add-emoji', (textarea: HTMLTextAreaElement) => { import('emoji-dialog').then(({ openForInsert }) => { openForInsert(textarea); }); }, ); if (callback) { setTimeout(callback, 0); } }).catch((err) => { const e = Error('[[emoji:meta-load-failed]]'); console.error(e); window.app.alertError(e); throw err; }); }