///
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 ``;
}
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;
});
}