@churchapps/apphelper-markdown
Version:
ChurchApps markdown/lexical editor components
42 lines (31 loc) • 1.24 kB
text/typescript
import { EmojiNode, $isEmojiNode, $createEmojiNode } from './EmojiNode';
import materialIcons from '../../IconNamesList';
import type { TextMatchTransformer } from "@lexical/markdown";
import { TextNode, $isTextNode } from "lexical";
const EMOJI_NODE_MARKDOWN_REGEX_QUERY = /:[A-Za-z_]+:$/;
export const EMOJI_NODE_MARKDOWN_REGEX = new RegExp(EMOJI_NODE_MARKDOWN_REGEX_QUERY);
const replaceEmojiMarkdownWithNode = (textNode: TextNode) => {
const emojiNode = $createEmojiNode(
textNode.__text.replaceAll(':', '')
);
textNode.replace(emojiNode);
return emojiNode;
};
export const EMOJI_NODE_MARKDOWN_TRANSFORM: TextMatchTransformer = {
dependencies: [EmojiNode],
export: (node, exportChildren, exportFormat) => {
if (!($isEmojiNode(node) || $isTextNode(node))) {
return null;
}
if (!materialIcons || !materialIcons.includes(node.getTextContent().replaceAll(':', ''))) {
return null;
}
const linkContent = ':' + node.__text.replaceAll(':', '') + ':';
return linkContent;
},
importRegExp: EMOJI_NODE_MARKDOWN_REGEX,
regExp: EMOJI_NODE_MARKDOWN_REGEX,
replace: replaceEmojiMarkdownWithNode,
trigger: ":",
type: "text-match"
};