// eslint-disable-next-line spaced-comment /// const base = `${window.config.relative_path}/plugins/nodebb-plugin-emoji-niuniu`; 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}`; } /* eslint-disable import/no-mutable-exports */ export let table: MetaData.Table; export let search: (term: string) => StoredEmoji[]; export const strategy = { match: /\B:([^\s\n:]+)$/, search: (term: string, callback: Callback) => { callback(search(term.toLowerCase().replace(/[_-]/g, '')).slice(0, 10)); }, index: 1, replace: (emoji: StoredEmoji) => `:${emoji.name}: `, template: (emoji: StoredEmoji) => `${buildEmoji(emoji)} ${emoji.name}`, cache: true, }; let initialized = false; export function init(callback?: Callback) { if (initialized) { if (callback) { setTimeout(callback, 0); } return; } initialized = true; Promise.all([ import('fuzzysearch'), import('leven'), import('composer/formatting'), $.getJSON(`${base}/emoji/table.json?${buster}`) as PromiseLike, ]).then(([fuzzy, leven, formatting, tableData]) => { table = tableData; const all: (StoredEmoji & { score?: number })[] = Object.keys(table).map((name) => { const emoji = table[name]; return { name, aliases: emoji.aliases, keywords: emoji.keywords, character: emoji.character, image: emoji.image, pack: emoji.pack, }; }); function fuzzyFind(term: string, arr: string[]) { const l = arr.length; for (let i = 0; i < l; i += 1) { if (fuzzy(term, arr[i])) { return arr[i]; } } return null; } function fuzzySearch(term: string) { function score(match: string, weight: number) { const weighted = weight * (1 + leven(term, match)); return match.startsWith(term) ? weighted - 2 : weighted; } return all.filter((obj) => { if (fuzzy(term, obj.name)) { obj.score = score(obj.name, 1); return true; } const aliasMatch = fuzzyFind(term, obj.aliases); if (aliasMatch) { obj.score = score(aliasMatch, 3); return true; } const keywordMatch = fuzzyFind(term, obj.keywords); if (keywordMatch) { obj.score = score(keywordMatch, 7); return true; } return false; }).sort((a, b) => a.score - b.score).sort((a, b) => { const aPrefixed = +a.name.startsWith(term); const bPrefixed = +b.name.startsWith(term); return bPrefixed - aPrefixed; }); } search = fuzzySearch; formatting.addButtonDispatch( 'emoji-add-emoji', (textarea: HTMLTextAreaElement, start: number, end: number, event: JQuery.ClickEvent) => { import('emoji-dialog') .then(({ toggleForInsert }) => toggleForInsert(textarea, start, end, event)); } ); if (callback) { setTimeout(callback, 0); } }).catch((err) => { const e = Error('[[emoji:meta-load-failed]]'); console.error(e); window.app.alertError(e); throw err; }); }