import { Node, mergeAttributes, nodeInputRule, } from '@tiptap/core' import { emojiRegEx, getEmojiAttributes } from '~/config/emojis' export const Emoji = Node.create({ name: 'em-emoji', inline: () => true, group: () => 'inline', draggable: false, parseHTML() { return [ { tag: 'img.iconify-emoji', }, ] }, addAttributes() { return { alt: { default: null, }, src: { default: null, }, class: { default: null, }, } }, renderHTML(args) { return ['img', mergeAttributes(this.options.HTMLAttributes, args.HTMLAttributes)] }, addCommands() { return { insertEmoji: code => ({ commands }) => { return commands.insertContent({ type: this.name, attrs: getEmojiAttributes(code), }) }, } }, addInputRules() { const inputRule = nodeInputRule({ find: emojiRegEx as RegExp, type: this.type, getAttributes: (match) => { const [native] = match return getEmojiAttributes(native) }, }) // Error catch for unsupported emoji const handler = inputRule.handler.bind(inputRule) inputRule.handler = (...args) => { try { return handler(...args) } catch (e) { return null } } return [ inputRule, ] }, })