{"version":3,"file":"plugin.mjs","sources":["../../../../../../package/components/msg-editor/src/plugin.ts"],"sourcesContent":["/**\n * @description variable plugin\n */\nimport { DomEditor, IDomEditor, SlateNode } from \"@wangeditor/editor\";\nimport { isString } from \"lodash-es\";\nimport emitter from \"./mitt\";\n\nfunction getNumber(str: string) {\n  const matches = str.match(/\\d+(\\.\\d+)?/);\n  const number = matches ? parseFloat(matches[0]) : 0;\n  return number;\n}\n\nexport function getLeftAndTop(editor: IDomEditor, node?: SlateNode) {\n  const { width, height } = editor.getEditableContainer().getBoundingClientRect();\n  const pos = node ? editor.getNodePosition(node) : editor.getSelectionPosition();\n  const lineHeight = window.getComputedStyle(editor.getEditableContainer()).lineHeight;\n  let __left: number = 0,\n    __top: number = 0;\n  if (isString(pos.left)) __left = getNumber(pos.left);\n  if (isString(pos.top)) __top = getNumber(pos.top);\n  if (isString(pos.bottom)) __top = height - getNumber(pos.bottom) + getNumber(lineHeight);\n  if (isString(pos.right)) __left = width - getNumber(pos.right);\n  // return node ? editor.getNodePosition(node) : editor.getSelectionPosition();\n  return {\n    left: __left,\n    top: __top,\n    isRight: !!pos.right\n  };\n}\n\nfunction withVariable<T extends IDomEditor>(editor: T) {\n  const { insertText, isInline, isVoid } = editor;\n  const newEditor = editor;\n\n  // 重写 insertText\n  newEditor.insertText = (t) => {\n    // 选过选中了 void 元素\n    const elems = DomEditor.getSelectedElems(newEditor);\n    const isSelectedVoidElem = elems.some((elem) => newEditor.isVoid(elem));\n    if (isSelectedVoidElem) {\n      insertText(t);\n      return;\n    }\n\n    // variable 相关配置\n    if (t === \"$\" || t === \"￥\") {\n      setTimeout(() => {\n        // 展示 modal （异步，以便准确获取光标位置）\n        emitter.emit(\"show\", getLeftAndTop(newEditor));\n\n        // 监听，隐藏 modal（异步，等待 modal 渲染后再监听）\n        setTimeout(() => {\n          function _hide() {\n            // if (hide) hide(newEditor);\n            emitter.emit(\"hide\", newEditor);\n          }\n          newEditor.once(\"fullScreen\", _hide);\n          newEditor.once(\"unFullScreen\", _hide);\n          newEditor.once(\"scroll\", _hide);\n          newEditor.once(\"modalOrPanelShow\", _hide);\n          newEditor.once(\"modalOrPanelHide\", _hide);\n\n          function hideOnChange() {\n            if (newEditor.selection != null) {\n              _hide();\n              newEditor.off(\"change\", hideOnChange); // 及时解绑\n            }\n          }\n          newEditor.on(\"change\", hideOnChange);\n        });\n      });\n    }\n\n    // 非 '@' 则执行默认行为\n    insertText(t);\n  };\n\n  // 重写 isInline\n  newEditor.isInline = (elem) => {\n    const type = DomEditor.getNodeType(elem);\n    if (type === \"variable\") {\n      return true;\n    }\n\n    return isInline(elem);\n  };\n\n  // 重写 isVoid\n  newEditor.isVoid = (elem) => {\n    const type = DomEditor.getNodeType(elem);\n    if (type === \"variable\") {\n      return true;\n    }\n\n    return isVoid(elem);\n  };\n\n  return newEditor;\n}\n\nexport default withVariable;\n"],"names":[],"mappings":"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"}