diff --git a/app/src/emoji/index.ts b/app/src/emoji/index.ts index 873ab323e..7e26cedf2 100644 --- a/app/src/emoji/index.ts +++ b/app/src/emoji/index.ts @@ -229,7 +229,12 @@ const renderEmojiContent = (previousIndex: string, previousContentElement: Eleme previousContentElement.removeAttribute("style"); }; -export const openEmojiPanel = (id: string, type: "doc" | "notebook" | "av", position: IPosition, callback?: (emoji: string) => void, dynamicImgElement?: HTMLElement) => { +export const openEmojiPanel = ( + id: string, + type: "doc" | "notebook" | "av", + position: IPosition, + callback?: (emoji: string) => void, + dynamicImgElement?: HTMLElement) => { if (type !== "av") { window.siyuan.menus.menu.remove(); } else { diff --git a/app/src/protyle/wysiwyg/index.ts b/app/src/protyle/wysiwyg/index.ts index 1f86663a2..51b1072a9 100644 --- a/app/src/protyle/wysiwyg/index.ts +++ b/app/src/protyle/wysiwyg/index.ts @@ -3036,6 +3036,37 @@ export class WYSIWYG { return; } + const calloutIconElement = hasTopClosestByClassName(event.target, "callout-icon"); + if (!protyle.disabled && !event.shiftKey && !ctrlIsPressed && calloutIconElement) { + const nodeElement = hasClosestBlock(calloutIconElement); + if (nodeElement) { + const emojiRect = calloutIconElement.getBoundingClientRect(); + openEmojiPanel("", "av", { + x: emojiRect.left, + y: emojiRect.bottom, + h: emojiRect.height, + w: emojiRect.width + }, (unicode) => { + const oldHTML = nodeElement.outerHTML; + let emojiHTML; + if (unicode.startsWith("api/icon/getDynamicIcon")) { + emojiHTML = ``; + } else if (unicode.indexOf(".") > -1) { + emojiHTML = ``; + } else { + emojiHTML = unicode2Emoji(unicode); + } + calloutIconElement.innerHTML = emojiHTML; + hideElements(["dialog"]); + updateTransaction(protyle, nodeElement.getAttribute("data-node-id"), nodeElement.outerHTML, oldHTML); + focusByWbr(nodeElement, range); + }, calloutIconElement.querySelector("img")); + } + event.preventDefault(); + event.stopPropagation(); + return; + } + const emojiElement = hasTopClosestByClassName(event.target, "emoji"); if (!protyle.disabled && !event.shiftKey && !ctrlIsPressed && emojiElement) { const nodeElement = hasClosestBlock(emojiElement);